UpdraftPlus WordPress Backup Plugin - Version 1.13.6

Version Description

  • 05/Sep/2017 =

  • FEATURE: Google Drive authorisation now goes via an officially registered app for easier connections to Google Drive.

  • FEATURE: Include commands for UpdraftCentral's (https://updraftcentral.com) Google Analytics management facility (check the changelog for the release)

  • FIX: Correct handling of OneDrive folder names featuring spaces (possibly a regression/change in the handling at OneDrive's end)

  • TWEAK: Prevent messy layout when the last log message is very long

  • TWEAK: Log catchable fatal errors and exceptions during backup in PHP 7

  • TWEAK: Log catchable fatal errors and exceptions during restore in PHP 7

  • TWEAK: Log catchable fatal errors and exceptions during backup download in PHP 7

  • TWEAK: Reduce amount of database logging during existing zip analysis, database backup and pruning stages

  • TWEAK: In AJAX/JSON responses, automatically detect and handle corrupted output (e.g. setups where PHP debugging notices are configured to come to the browser)

  • TWEAK: Catches and more elegantly handles errors when a settings import file cannot be JSON-parsed

  • TWEAK: Request list of available add-ons (paid versions) from the mothership in current format

  • TWEAK: Added custom backup message parameter backupnow_message in function updraft_backupnow_inpage_go()

  • TWEAK: General code tidy-up, making older code conform to our current standards

  • TWEAK: Add the possibility of passing back associated data with test results, and log it in the browser console

  • TWEAK: When carrying out a remote storage test, pass the state of the 'debug' setting

  • TWEAK: When testing SFTP settings, if debug is activated, activate debug logging and pass the results back in the event of test failure

  • TWEAK: Optimise away a database query in the case of no UpdraftCentral keys existing

  • TWEAK: Removed "Reduced Redundancy" storage class from Amazon S3 remote storage options, because Amazon are deprecating it (and it now costs more, for inferior redundancy - https://updraftplus.com/forums/topic/amazon-is-phasing-out-reduced-redundancy-storage/)

  • TWEAK: Backup files missing error message corrected

  • TWEAK: Add the handlebars-js and xamin/handlebars.php libraries

  • TWEAK: The FTP storage module has been ported to outputing its configuration via a template

  • TWEAK: Introduce internal API and port all job data saved in storage modules to be instance-local

Download this release

Release Info

Developer DavidAnderson
Plugin Icon 128x128 UpdraftPlus WordPress Backup Plugin
Version 1.13.6
Comparing to
See all releases

Code changes from version 1.13.5 to 1.13.6

admin.php CHANGED
@@ -21,10 +21,10 @@ class UpdraftPlus_Admin {
21
  // wp_normalize_path is not present before WP 3.9
22
  if (function_exists('wp_normalize_path')) return wp_normalize_path($path);
23
  // Taken from WP 4.6
24
- $path = str_replace( '\\', '/', $path );
25
- $path = preg_replace( '|(?<=.)/+|', '/', $path );
26
- if ( ':' === substr( $path, 1, 1 ) ) {
27
- $path = ucfirst( $path );
28
  }
29
  return $path;
30
  }
@@ -111,13 +111,17 @@ class UpdraftPlus_Admin {
111
  $updraftplus->log_wp_error($settings, true, true);
112
  } elseif (!empty($settings['settings'])) {
113
  foreach ($settings['settings'] as $instance_id => $storage_options) {
114
- if (!empty($storage_options['clientid'])) {
115
- $clientid = $storage_options['clientid'];
116
- $token = empty($storage_options['token']) ? '' : $storage_options['token'];
 
 
 
 
 
 
 
117
  }
118
- if (!empty($clientid) && '' == $token) add_action('all_admin_notices', array($this,'show_admin_warning_googledrive'));
119
- unset($clientid);
120
- unset($token);
121
  }
122
  }
123
  }
@@ -168,12 +172,12 @@ class UpdraftPlus_Admin {
168
  foreach ($settings['settings'] as $instance_id => $storage_options) {
169
  if((defined('UPDRAFTPLUS_CUSTOM_ONEDRIVE_APP') && UPDRAFTPLUS_CUSTOM_ONEDRIVE_APP)){
170
  if(!empty($storage_options['clientid']) && !empty($storage_options['secret']) && empty($storage_options['refresh_token'])) {
171
- add_action('all_admin_notices', array($this,'show_admin_warning_onedrive') );
172
  } elseif (empty($storage_options['refresh_token'])) {
173
- add_action('all_admin_notices', array($this,'show_admin_warning_onedrive') );
174
  }
175
  } else{
176
- if(empty($storage_options['refresh_token']))add_action('all_admin_notices', array($this,'show_admin_warning_onedrive') );
177
  }
178
  }
179
  }
@@ -190,7 +194,7 @@ class UpdraftPlus_Admin {
190
  } elseif (!empty($settings['settings'])) {
191
  foreach ($settings['settings'] as $instance_id => $storage_options) {
192
  if (empty($storage_options['token']) && empty($storage_options['email'])) {
193
- add_action('all_admin_notices', array($this,'show_admin_warning_updraftvault') );
194
  }
195
  }
196
  }
@@ -350,7 +354,7 @@ class UpdraftPlus_Admin {
350
  $installed_for = time() - $installed;
351
 
352
  if (($installed && time() > $dismissed_until && $installed_for > 28*86400 && !defined('UPDRAFTPLUS_NOADS_B')) || (defined('UPDRAFTPLUS_FORCE_DASHNOTICE') && UPDRAFTPLUS_FORCE_DASHNOTICE)) {
353
- add_action('all_admin_notices', array($this, 'show_admin_notice_upgradead') );
354
  }
355
  }
356
 
@@ -732,7 +736,8 @@ class UpdraftPlus_Admin {
732
  'testing_settings' => __('Testing %s Settings...', 'updraftplus'),
733
  'settings_test_result' => __('%s settings test result:', 'updraftplus'),
734
  'nothing_yet_logged' => __('Nothing yet logged', 'updraftplus'),
735
- 'import_select_file' => __('You have not yet selected a file to import.', 'updraftplus'),
 
736
  'updraft_settings_url' => UpdraftPlus_Options::admin_page_url().'?page=updraftplus',
737
  'network_site_url' => network_site_url(),
738
  'importing' => __('Importing...', 'updraftplus'),
@@ -896,7 +901,7 @@ class UpdraftPlus_Admin {
896
  $dismissed_until = UpdraftPlus_Options::get_updraft_option('updraftplus_dismissedautobackup', 0);
897
  if ($dismissed_until > time()) return;
898
 
899
- if ( 'upgrade-plugin' == $_GET['action'] ) {
900
  $title = __('Update Plugin');
901
  $parent_file = 'plugins.php';
902
  $submenu_file = 'plugins.php';
@@ -1211,8 +1216,24 @@ class UpdraftPlus_Admin {
1211
 
1212
  $objname = "UpdraftPlus_BackupModule_${service}";
1213
  if (method_exists($objname, "download")) {
1214
- $remote_obj = new $objname;
1215
- return $remote_obj->download($file);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1216
  } else {
1217
  $updraftplus->log("Automatic backup restoration is not available with the method: $service.");
1218
  $updraftplus->log("$file: ".sprintf(__("The backup archive for this file could not be found. The remote storage method in use (%s) does not allow us to retrieve files. To perform any restoration using UpdraftPlus, you will need to obtain a copy of this file and place it inside UpdraftPlus's working folder", 'updraftplus'), $service)." (".$this->prune_updraft_dir_prefix($updraftplus->backups_dir_location()).")", 'error');
@@ -1307,8 +1328,15 @@ class UpdraftPlus_Admin {
1307
 
1308
  }
1309
 
1310
- // This echoes output; so, you will need to do output buffering if you want to capture it
1311
- public function do_credentials_test($test_settings) {
 
 
 
 
 
 
 
1312
 
1313
  $method = (!empty($test_settings['method']) && preg_match("/^[a-z0-9]+$/", $test_settings['method'])) ? $test_settings['method'] : "";
1314
 
@@ -1320,19 +1348,28 @@ class UpdraftPlus_Admin {
1320
 
1321
  if (!class_exists($objname)) include_once(UPDRAFTPLUS_DIR."/methods/$method.php");
1322
 
 
 
 
1323
  # TODO: Add action for WP HTTP SSL stuff
1324
  if (method_exists($objname, "credentials_test")) {
1325
  $obj = new $objname;
1326
- $obj->credentials_test($test_settings);
 
 
1327
  }
1328
 
1329
  if (count($this->logged) >0) {
1330
- echo "\n\n".__('Messages:', 'updraftplus')."\n";
1331
  foreach ($this->logged as $err) {
1332
- echo "* $err\n";
1333
  }
 
1334
  }
1335
  restore_error_handler();
 
 
 
1336
  }
1337
 
1338
  // Relevant options (array keys): backup_timestamp, delete_remote, [remote_delete_limit]
@@ -1787,7 +1824,7 @@ class UpdraftPlus_Admin {
1787
 
1788
  private function download_status($timestamp, $type, $findex) {
1789
  global $updraftplus;
1790
- $response = array( 'm' => $updraftplus->jobdata_get('dlmessage_'.$timestamp.'_'.$type.'_'.$findex).'<br>' );
1791
  if ($file = $updraftplus->jobdata_get('dlfile_'.$timestamp.'_'.$type.'_'.$findex)) {
1792
  if ('failed' == $file) {
1793
  $response['e'] = __('Download failed', 'updraftplus').'<br>';
@@ -1978,7 +2015,7 @@ class UpdraftPlus_Admin {
1978
  add_filter('sanitize_file_name', array($this, 'sanitize_file_name'));
1979
  // handle file upload
1980
 
1981
- $farray = array( 'test_form' => true, 'action' => 'plupload_action2' );
1982
 
1983
  $farray['test_type'] = false;
1984
  $farray['ext'] = 'crypt';
@@ -2329,7 +2366,7 @@ class UpdraftPlus_Admin {
2329
  if (isset($restore_jobdata['job_type']) && 'restore' == $restore_jobdata['job_type'] && isset($restore_jobdata['second_loop_entities']) && !empty($restore_jobdata['second_loop_entities']) && isset($restore_jobdata['job_time_ms']) && (time() - $restore_jobdata['job_time_ms'] > 120 || (defined('UPDRAFTPLUS_RESTORE_PROGRESS_ALWAYS_SHOW') && UPDRAFTPLUS_RESTORE_PROGRESS_ALWAYS_SHOW)) && time() - $restore_jobdata['job_time_ms'] < 86400 && (empty($_REQUEST['action']) || ('updraft_restore' != $_REQUEST['action'] && 'updraft_restore_continue' != $_REQUEST['action']))) {
2330
  $restore_jobdata['jobid'] = $restore_in_progress;
2331
  $this->restore_in_progress_jobdata = $restore_jobdata;
2332
- add_action('all_admin_notices', array($this, 'show_admin_restore_in_progress_notice') );
2333
  }
2334
  }
2335
  }
@@ -2382,7 +2419,7 @@ class UpdraftPlus_Admin {
2382
 
2383
  $premium_link = apply_filters('updraftplus_com_link','https://updraftplus.com/landing/updraftplus-premium');
2384
 
2385
- $free_ret = '<em>'.__('All WordPress tables will be backed up.', 'updraftplus').' <a href="'.$premium_link.'">'. __('With UpdraftPlus Premium, you can choose to backup non-WordPress tables, backup only specified tables, and backup other databases too.','updraftplus').'</a></em>';
2386
 
2387
  $ret .= apply_filters('updraft_backupnow_database_showmoreoptions', $free_ret, '') . '</p>';
2388
 
@@ -2826,7 +2863,7 @@ class UpdraftPlus_Admin {
2826
  return false;
2827
  }
2828
 
2829
- if ( ! WP_Filesystem($credentials) ) {
2830
  // our credentials were no good, ask the user for them again
2831
  request_filesystem_credentials(UpdraftPlus_Options::admin_page().'?page=updraftplus&action=updraft_create_backup_dir&nonce='.wp_create_nonce('create_backup_dir'), '', true);
2832
  return false;
@@ -2840,8 +2877,8 @@ class UpdraftPlus_Admin {
2840
 
2841
  if (!$wp_filesystem->is_dir($default_backup_dir) && !$wp_filesystem->mkdir($default_backup_dir, 0775)) {
2842
  $wperr = new WP_Error;
2843
- if ( $wp_filesystem->errors->get_error_code() ) {
2844
- foreach ( $wp_filesystem->errors->get_error_messages() as $message ) {
2845
  $wperr->add('mkdir_error', $message);
2846
  }
2847
  return $wperr;
@@ -3507,7 +3544,14 @@ ENDHERE;
3507
  }
3508
  }
3509
 
3510
- // Return values: false = 'not yet' (not necessarily terminal); WP_Error = terminal failure; true = success
 
 
 
 
 
 
 
3511
  private function restore_backup($timestamp, $continuation_data = null) {
3512
 
3513
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
@@ -3544,9 +3588,9 @@ ENDHERE;
3544
 
3545
  $credentials = request_filesystem_credentials(UpdraftPlus_Options::admin_page()."?page=updraftplus&action=updraft_restore&backup_timestamp=$timestamp", '', false, false, $extra_fields);
3546
  WP_Filesystem($credentials);
3547
- if ( $wp_filesystem->errors->get_error_code() ) {
3548
  echo '<p><em><a href="'.apply_filters('updraftplus_com_link', "https://updraftplus.com/faqs/asked-ftp-details-upon-restorationmigration-updates/").'">'.__('Why am I seeing this?', 'updraftplus').'</a></em></p>';
3549
- foreach ( $wp_filesystem->errors->get_error_messages() as $message ) show_message($message);
3550
  exit;
3551
  }
3552
 
@@ -3619,8 +3663,8 @@ ENDHERE;
3619
  set_error_handler(array($updraftplus, 'php_error'), E_ALL & ~E_STRICT);
3620
 
3621
  /*
3622
- $_POST['updraft_restore'] is typically something like: array( 0=>'db', 1=>'plugins', 2=>'themes'), etc.
3623
- i.e. array ( 'db', 'plugins', themes')
3624
  */
3625
 
3626
  if (empty($restore_options)) {
@@ -3821,9 +3865,24 @@ ENDHERE;
3821
  if (is_string($files)) $files = array($files);
3822
  foreach ($files as $fkey => $file) {
3823
  $last_one = (1 == count($second_loop) && 1 == count($files));
3824
-
3825
- $val = $updraftplus_restorer->restore_backup($file, $type, $info, $last_one);
3826
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3827
  if (is_wp_error($val)) {
3828
  $codes = $val->get_error_codes();
3829
  if (is_array($codes) && in_array('not_found', $codes) && !empty($updraftplus_restorer->ud_foreign) && apply_filters('updraftplus_foreign_allow_missing_entity', false, $type, $updraftplus_restorer->ud_foreign)) {
@@ -4188,7 +4247,7 @@ ENDHERE;
4188
 
4189
  // These aren't in get_settings_keys() because they are always in the options table, regardless of context
4190
  global $wpdb;
4191
- $wpdb->query("DELETE FROM $wpdb->options WHERE ( option_name LIKE 'updraftplus_unlocked_%' OR option_name LIKE 'updraftplus_locked_%' OR option_name LIKE 'updraftplus_last_lock_time_%' OR option_name LIKE 'updraftplus_semaphore_%' OR option_name LIKE 'updraft_jobdata_%' OR option_name LIKE 'updraft_last_scheduled_%' )");
4192
 
4193
  $site_options = array('updraft_oneshotnonce');
4194
  foreach ($site_options as $s) delete_site_option($s);
21
  // wp_normalize_path is not present before WP 3.9
22
  if (function_exists('wp_normalize_path')) return wp_normalize_path($path);
23
  // Taken from WP 4.6
24
+ $path = str_replace('\\', '/', $path);
25
+ $path = preg_replace('|(?<=.)/+|', '/', $path);
26
+ if (':' === substr($path, 1, 1)) {
27
+ $path = ucfirst($path);
28
  }
29
  return $path;
30
  }
111
  $updraftplus->log_wp_error($settings, true, true);
112
  } elseif (!empty($settings['settings'])) {
113
  foreach ($settings['settings'] as $instance_id => $storage_options) {
114
+ if ((defined('UPDRAFTPLUS_CUSTOM_GOOGLEDRIVE_APP') && UPDRAFTPLUS_CUSTOM_GOOGLEDRIVE_APP) || !empty($storage_options['clientid'])) {
115
+ if (!empty($storage_options['clientid'])) {
116
+ $clientid = $storage_options['clientid'];
117
+ $token = empty($storage_options['token']) ? '' : $storage_options['token'];
118
+ }
119
+ if (!empty($clientid) && '' == $token) add_action('all_admin_notices', array($this, 'show_admin_warning_googledrive'));
120
+ unset($clientid);
121
+ unset($token);
122
+ } else {
123
+ if (empty($storage_options['user_id'])) add_action('all_admin_notices', array($this, 'show_admin_warning_googledrive'));
124
  }
 
 
 
125
  }
126
  }
127
  }
172
  foreach ($settings['settings'] as $instance_id => $storage_options) {
173
  if((defined('UPDRAFTPLUS_CUSTOM_ONEDRIVE_APP') && UPDRAFTPLUS_CUSTOM_ONEDRIVE_APP)){
174
  if(!empty($storage_options['clientid']) && !empty($storage_options['secret']) && empty($storage_options['refresh_token'])) {
175
+ add_action('all_admin_notices', array($this,'show_admin_warning_onedrive'));
176
  } elseif (empty($storage_options['refresh_token'])) {
177
+ add_action('all_admin_notices', array($this,'show_admin_warning_onedrive'));
178
  }
179
  } else{
180
+ if(empty($storage_options['refresh_token']))add_action('all_admin_notices', array($this,'show_admin_warning_onedrive'));
181
  }
182
  }
183
  }
194
  } elseif (!empty($settings['settings'])) {
195
  foreach ($settings['settings'] as $instance_id => $storage_options) {
196
  if (empty($storage_options['token']) && empty($storage_options['email'])) {
197
+ add_action('all_admin_notices', array($this,'show_admin_warning_updraftvault'));
198
  }
199
  }
200
  }
354
  $installed_for = time() - $installed;
355
 
356
  if (($installed && time() > $dismissed_until && $installed_for > 28*86400 && !defined('UPDRAFTPLUS_NOADS_B')) || (defined('UPDRAFTPLUS_FORCE_DASHNOTICE') && UPDRAFTPLUS_FORCE_DASHNOTICE)) {
357
+ add_action('all_admin_notices', array($this, 'show_admin_notice_upgradead'));
358
  }
359
  }
360
 
736
  'testing_settings' => __('Testing %s Settings...', 'updraftplus'),
737
  'settings_test_result' => __('%s settings test result:', 'updraftplus'),
738
  'nothing_yet_logged' => __('Nothing yet logged', 'updraftplus'),
739
+ 'import_select_file' => __('You have not yet selected a file to import.', 'updraftplus'),
740
+ 'import_invalid_json_file' => __('Error: The chosen file is corrupt. Please choose a valid UpdraftPlus export file.', 'updraftplus'),
741
  'updraft_settings_url' => UpdraftPlus_Options::admin_page_url().'?page=updraftplus',
742
  'network_site_url' => network_site_url(),
743
  'importing' => __('Importing...', 'updraftplus'),
901
  $dismissed_until = UpdraftPlus_Options::get_updraft_option('updraftplus_dismissedautobackup', 0);
902
  if ($dismissed_until > time()) return;
903
 
904
+ if ('upgrade-plugin' == $_GET['action']) {
905
  $title = __('Update Plugin');
906
  $parent_file = 'plugins.php';
907
  $submenu_file = 'plugins.php';
1216
 
1217
  $objname = "UpdraftPlus_BackupModule_${service}";
1218
  if (method_exists($objname, "download")) {
1219
+
1220
+ try {
1221
+ $remote_obj = new $objname;
1222
+ return $remote_obj->download($file);
1223
+ } catch (Exception $e) {
1224
+ $log_message = 'Exception ('.get_class($e).') occurred during download: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
1225
+ $updraftplus->log($log_message);
1226
+ error_log($log_message);
1227
+ $updraftplus->log(sprintf(__('A PHP exception (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage()), 'error');
1228
+ return false;
1229
+ // @codingStandardsIgnoreLine
1230
+ } catch (Error $e) {
1231
+ $log_message = 'PHP Fatal error ('.get_class($e).') has occurred. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
1232
+ $updraftplus->log($log_message);
1233
+ error_log($log_message);
1234
+ $updraftplus->log(sprintf(__('A PHP fatal error (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage()), 'error');
1235
+ return false;
1236
+ }
1237
  } else {
1238
  $updraftplus->log("Automatic backup restoration is not available with the method: $service.");
1239
  $updraftplus->log("$file: ".sprintf(__("The backup archive for this file could not be found. The remote storage method in use (%s) does not allow us to retrieve files. To perform any restoration using UpdraftPlus, you will need to obtain a copy of this file and place it inside UpdraftPlus's working folder", 'updraftplus'), $service)." (".$this->prune_updraft_dir_prefix($updraftplus->backups_dir_location()).")", 'error');
1328
 
1329
  }
1330
 
1331
+ /**
1332
+ * Run a credentials test for the indicated remote storage module
1333
+ *
1334
+ * @param Array $test_settings - the test parameters, including the method itself indicated in the key 'method'
1335
+ * @param Boolean $return_instead_of_echo - whether to return or echo the results. N.B. More than just the results to echo will be returned
1336
+ *
1337
+ * @return Array|Void - the results, if they are being returned (rather than echoed). Keys: 'output' (the output), 'data' (other data)
1338
+ */
1339
+ public function do_credentials_test($test_settings, $return_instead_of_echo = false) {
1340
 
1341
  $method = (!empty($test_settings['method']) && preg_match("/^[a-z0-9]+$/", $test_settings['method'])) ? $test_settings['method'] : "";
1342
 
1348
 
1349
  if (!class_exists($objname)) include_once(UPDRAFTPLUS_DIR."/methods/$method.php");
1350
 
1351
+ $ret = '';
1352
+ $data = null;
1353
+
1354
  # TODO: Add action for WP HTTP SSL stuff
1355
  if (method_exists($objname, "credentials_test")) {
1356
  $obj = new $objname;
1357
+ if ($return_instead_of_echo) ob_start();
1358
+ $data = $obj->credentials_test($test_settings);
1359
+ if ($return_instead_of_echo) $ret .= ob_get_clean();
1360
  }
1361
 
1362
  if (count($this->logged) >0) {
1363
+ $ret .= "\n\n".__('Messages:', 'updraftplus')."\n";
1364
  foreach ($this->logged as $err) {
1365
+ $ret .= "* $err\n";
1366
  }
1367
+ if (!$return_instead_of_echo) echo $ret;
1368
  }
1369
  restore_error_handler();
1370
+
1371
+ if ($return_instead_of_echo) return array('output' => $ret, 'data' => $data);
1372
+
1373
  }
1374
 
1375
  // Relevant options (array keys): backup_timestamp, delete_remote, [remote_delete_limit]
1824
 
1825
  private function download_status($timestamp, $type, $findex) {
1826
  global $updraftplus;
1827
+ $response = array('m' => $updraftplus->jobdata_get('dlmessage_'.$timestamp.'_'.$type.'_'.$findex).'<br>');
1828
  if ($file = $updraftplus->jobdata_get('dlfile_'.$timestamp.'_'.$type.'_'.$findex)) {
1829
  if ('failed' == $file) {
1830
  $response['e'] = __('Download failed', 'updraftplus').'<br>';
2015
  add_filter('sanitize_file_name', array($this, 'sanitize_file_name'));
2016
  // handle file upload
2017
 
2018
+ $farray = array('test_form' => true, 'action' => 'plupload_action2');
2019
 
2020
  $farray['test_type'] = false;
2021
  $farray['ext'] = 'crypt';
2366
  if (isset($restore_jobdata['job_type']) && 'restore' == $restore_jobdata['job_type'] && isset($restore_jobdata['second_loop_entities']) && !empty($restore_jobdata['second_loop_entities']) && isset($restore_jobdata['job_time_ms']) && (time() - $restore_jobdata['job_time_ms'] > 120 || (defined('UPDRAFTPLUS_RESTORE_PROGRESS_ALWAYS_SHOW') && UPDRAFTPLUS_RESTORE_PROGRESS_ALWAYS_SHOW)) && time() - $restore_jobdata['job_time_ms'] < 86400 && (empty($_REQUEST['action']) || ('updraft_restore' != $_REQUEST['action'] && 'updraft_restore_continue' != $_REQUEST['action']))) {
2367
  $restore_jobdata['jobid'] = $restore_in_progress;
2368
  $this->restore_in_progress_jobdata = $restore_jobdata;
2369
+ add_action('all_admin_notices', array($this, 'show_admin_restore_in_progress_notice'));
2370
  }
2371
  }
2372
  }
2419
 
2420
  $premium_link = apply_filters('updraftplus_com_link','https://updraftplus.com/landing/updraftplus-premium');
2421
 
2422
+ $free_ret = '<em>'.__('All WordPress tables will be backed up.', 'updraftplus').' <a href="'.$premium_link.'">'. __('With UpdraftPlus Premium, you can choose to backup non-WordPress tables, backup only specified tables, and backup other databases too.', 'updraftplus').'</a></em>';
2423
 
2424
  $ret .= apply_filters('updraft_backupnow_database_showmoreoptions', $free_ret, '') . '</p>';
2425
 
2863
  return false;
2864
  }
2865
 
2866
+ if (!WP_Filesystem($credentials)) {
2867
  // our credentials were no good, ask the user for them again
2868
  request_filesystem_credentials(UpdraftPlus_Options::admin_page().'?page=updraftplus&action=updraft_create_backup_dir&nonce='.wp_create_nonce('create_backup_dir'), '', true);
2869
  return false;
2877
 
2878
  if (!$wp_filesystem->is_dir($default_backup_dir) && !$wp_filesystem->mkdir($default_backup_dir, 0775)) {
2879
  $wperr = new WP_Error;
2880
+ if ($wp_filesystem->errors->get_error_code()) {
2881
+ foreach ($wp_filesystem->errors->get_error_messages() as $message) {
2882
  $wperr->add('mkdir_error', $message);
2883
  }
2884
  return $wperr;
3544
  }
3545
  }
3546
 
3547
+ /**
3548
+ * Carry out the restore process
3549
+ *
3550
+ * @param Integer $timestamp - identifying the backup to be restored
3551
+ * @param Array|Null $continuation_data - for continuing a multi-stage restore (code believed to be incomplete)
3552
+ *
3553
+ * @return Boolean|WP_Error - WP_Error indicates a terminal failure; false indicates not-yet complete (not necessarily terminal); true indicates complete.
3554
+ */
3555
  private function restore_backup($timestamp, $continuation_data = null) {
3556
 
3557
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
3588
 
3589
  $credentials = request_filesystem_credentials(UpdraftPlus_Options::admin_page()."?page=updraftplus&action=updraft_restore&backup_timestamp=$timestamp", '', false, false, $extra_fields);
3590
  WP_Filesystem($credentials);
3591
+ if ($wp_filesystem->errors->get_error_code()) {
3592
  echo '<p><em><a href="'.apply_filters('updraftplus_com_link', "https://updraftplus.com/faqs/asked-ftp-details-upon-restorationmigration-updates/").'">'.__('Why am I seeing this?', 'updraftplus').'</a></em></p>';
3593
+ foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message);
3594
  exit;
3595
  }
3596
 
3663
  set_error_handler(array($updraftplus, 'php_error'), E_ALL & ~E_STRICT);
3664
 
3665
  /*
3666
+ $_POST['updraft_restore'] is typically something like: array(0=>'db', 1=>'plugins', 2=>'themes'), etc.
3667
+ i.e. array ('db', 'plugins', themes')
3668
  */
3669
 
3670
  if (empty($restore_options)) {
3865
  if (is_string($files)) $files = array($files);
3866
  foreach ($files as $fkey => $file) {
3867
  $last_one = (1 == count($second_loop) && 1 == count($files));
3868
+ try {
3869
+ $val = $updraftplus_restorer->restore_backup($file, $type, $info, $last_one);
3870
+ } catch (Exception $e) {
3871
+ $log_message = 'Exception ('.get_class($e).') occurred during restore: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
3872
+ error_log($log_message);
3873
+ $display_log_message = sprintf(__('A PHP exception (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage());
3874
+ $updraftplus->log($log_message);
3875
+ $updraftplus->log($display_log_message, 'notice-restore');
3876
+ die();
3877
+ // @codingStandardsIgnoreLine
3878
+ } catch (Error $e) {
3879
+ $log_message = 'PHP Fatal error ('.get_class($e).') has occurred. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
3880
+ error_log($log_message);
3881
+ $display_log_message = sprintf(__('A PHP fatal error (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage());
3882
+ $updraftplus->log($log_message);
3883
+ $updraftplus->log($display_log_message, 'notice-restore');
3884
+ die();
3885
+ }
3886
  if (is_wp_error($val)) {
3887
  $codes = $val->get_error_codes();
3888
  if (is_array($codes) && in_array('not_found', $codes) && !empty($updraftplus_restorer->ud_foreign) && apply_filters('updraftplus_foreign_allow_missing_entity', false, $type, $updraftplus_restorer->ud_foreign)) {
4247
 
4248
  // These aren't in get_settings_keys() because they are always in the options table, regardless of context
4249
  global $wpdb;
4250
+ $wpdb->query("DELETE FROM $wpdb->options WHERE (option_name LIKE 'updraftplus_unlocked_%' OR option_name LIKE 'updraftplus_locked_%' OR option_name LIKE 'updraftplus_last_lock_time_%' OR option_name LIKE 'updraftplus_semaphore_%' OR option_name LIKE 'updraft_jobdata_%' OR option_name LIKE 'updraft_last_scheduled_%' )");
4251
 
4252
  $site_options = array('updraft_oneshotnonce');
4253
  foreach ($site_options as $s) delete_site_option($s);
backup.php CHANGED
@@ -412,7 +412,35 @@ class UpdraftPlus_Backup {
412
  return array(array('sets' => $backup_history, 'process_order' => 'keep_newest'));
413
  }
414
 
415
- // $services *must* be an array
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
416
  public function prune_retained_backups($services) {
417
 
418
  global $updraftplus, $wpdb;
@@ -484,6 +512,8 @@ class UpdraftPlus_Backup {
484
  }
485
  $updraftplus->log("Number of backup sets in history: ".count($backup_history)."; groups (db): ".count($backup_db_groups));
486
 
 
 
487
  foreach ($backup_db_groups as $group_id => $group) {
488
 
489
  // The array returned by UpdraftPlus::get_backup_history() is already sorted, with most-recent first
@@ -505,13 +535,7 @@ class UpdraftPlus_Backup {
505
 
506
  // $backup_to_examine is an array of file names, keyed on db/plugins/themes/uploads
507
  // The new backup_history array is saved afterwards, so remember to unset the ones that are to be deleted
508
- $updraftplus->log(sprintf("Examining (for databases) backup set with group_id=$group_id, nonce=%s, datestamp=%s (%s)", $nonce, $backup_datestamp, gmdate('M d Y H:i:s', $backup_datestamp)));
509
-
510
- // This was already done earlier
511
- // if (isset($backup_to_examine['native']) && false == $backup_to_examine['native']) {
512
- // $updraftplus->log("This backup set was imported from a remote location, so will not be counted or pruned. Skipping.");
513
- // continue;
514
- // }
515
 
516
  // Auto-backups are only counted or deleted once we have reached the retain limit - before that, they are skipped
517
  $is_autobackup = !empty($backup_to_examine['autobackup']);
@@ -527,20 +551,20 @@ class UpdraftPlus_Backup {
527
  if (empty($database_backups_found[$key])) $database_backups_found[$key] = 0;
528
 
529
  if ($nonce == $updraftplus->nonce) {
530
- $updraftplus->log("This backup set is the backup set just made, so will not be deleted.");
531
  $database_backups_found[$key]++;
532
  continue;
533
  }
534
 
535
  if ($is_autobackup) {
536
  if ($any_deleted_via_filter_yet) {
537
- $updraftplus->log("This backup set ($backup_datestamp) was an automatic backup, but we have previously deleted a backup due to a limit, so it will be pruned (but not counted towards numerical limits).");
538
  $prune_it = true;
539
  } elseif ($database_backups_found[$key] < $updraft_retain_db) {
540
- $updraftplus->log("This backup set ($backup_datestamp) was an automatic backup, and we have not yet reached any retain limits, so it will not be counted or pruned. Skipping.");
541
  continue;
542
  } else {
543
- $updraftplus->log("This backup set ($backup_datestamp) was an automatic backup, and we have already reached retain limits, so it will be pruned.");
544
  $prune_it = true;
545
  }
546
  } else {
@@ -549,7 +573,7 @@ class UpdraftPlus_Backup {
549
 
550
  if ($remote_sent) {
551
  $prune_it = true;
552
- $updraftplus->log("$backup_datestamp: $key: was sent to remote site; will remove from local record (only)");
553
  }
554
 
555
  // All non-auto backups must be run through this filter (in date order) regardless of the current state of $prune_it - so that filters are able to track state.
@@ -563,10 +587,10 @@ class UpdraftPlus_Backup {
563
  if ($database_backups_found[$key] + 1 > $updraft_retain_db) {
564
  $prune_it = true;
565
 
566
- $fname = (is_string($data)) ? $data : $data[0];
567
- $updraftplus->log("$backup_datestamp: $key: this set includes a database (".$fname."); db count is now ".$database_backups_found[$key]);
568
 
569
- $updraftplus->log("$backup_datestamp: $key: over retain limit ($updraft_retain_db); will delete this database");
570
  }
571
 
572
  }
@@ -629,13 +653,7 @@ class UpdraftPlus_Backup {
629
 
630
  // $backup_to_examine is an array of file names, keyed on db/plugins/themes/uploads
631
  // The new backup_history array is saved afterwards, so remember to unset the ones that are to be deleted
632
- $updraftplus->log(sprintf("Examining (for files) backup set with nonce=%s, datestamp=%s (%s)", $nonce, $backup_datestamp, gmdate('M d Y H:i:s', $backup_datestamp)));
633
-
634
- // This was already done earlier
635
- // if (isset($backup_to_examine['native']) && false == $backup_to_examine['native']) {
636
- // $updraftplus->log("This backup set was imported from a remote location, so will not be counted or pruned. Skipping.");
637
- // continue;
638
- // }
639
 
640
  // Auto-backups are only counted or deleted once we have reached the retain limit - before that, they are skipped
641
  $is_autobackup = !empty($backup_to_examine['autobackup']);
@@ -659,13 +677,13 @@ class UpdraftPlus_Backup {
659
 
660
  if ($is_autobackup) {
661
  if ($any_deleted_via_filter_yet) {
662
- $updraftplus->log("This backup set was an automatic backup, but we have previously deleted a backup due to a limit, so it will be pruned (but not counted towards numerical limits).");
663
  $prune_it = true;
664
  } elseif ($file_entities_backups_found[$entity] < $updraft_retain) {
665
- $updraftplus->log("This backup set ($backup_datestamp) was an automatic backup, and we have not yet reached any retain limits, so it will not be counted or pruned. Skipping.");
666
  continue;
667
  } else {
668
- $updraftplus->log("This backup set ($backup_datestamp) was an automatic backup, and we have already reached retain limits, so it will be pruned.");
669
  $prune_it = true;
670
  }
671
  } else {
@@ -683,7 +701,7 @@ class UpdraftPlus_Backup {
683
  // The "more than maximum to keep?" counter should not be increased until we actually know that the set is being kept. Before verison 1.11.22, we checked this before running the filter, which resulted in the counter being increased for sets that got pruned via the filter (i.e. not kept) - and too many backups were thus deleted
684
  if (!$prune_it && !$is_autobackup) {
685
  if ($file_entities_backups_found[$entity] >= $updraft_retain) {
686
- $updraftplus->log("$entity: over retain limit ($updraft_retain); will delete this file entity");
687
  $prune_it = true;
688
  }
689
  }
@@ -940,8 +958,8 @@ class UpdraftPlus_Backup {
940
 
941
  $body = apply_filters('updraft_report_body',
942
  __('Backup of:', 'updraftplus').' '.site_url()."\r\n".
943
- "UpdraftPlus ".__('WordPress backup is complete','updraftplus').".\r\n".
944
- __('Backup contains:','updraftplus')." $backup_contains\r\n".
945
  __('Latest status:', 'updraftplus').' '.$final_message."\r\n".
946
  $extra_msg.
947
  "\r\n".
@@ -1428,7 +1446,7 @@ class UpdraftPlus_Backup {
1428
 
1429
  if (!$updraftplus->really_is_writable($this->updraft_dir)) {
1430
  $updraftplus->log("The backup directory (".$this->updraft_dir.") could not be written to (could be account/disk space full, or wrong permissions).");
1431
- $updraftplus->log($this->updraft_dir.": ".__('The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail.','updraftplus'), 'warning');
1432
  # Why not just fail now? We saw a bizarre case when the results of really_is_writable() changed during the run.
1433
  }
1434
 
@@ -1467,8 +1485,8 @@ class UpdraftPlus_Backup {
1467
  $updraftplus->log("Table $table: corresponding file already exists; moving on", 'notice', false, $skip_dblog);
1468
  $stitch_files[] = $table_file_prefix;
1469
  } else {
1470
- # === is needed, otherwise 'false' matches (i.e. prefix does not match)
1471
- if (empty($this->table_prefix) || ($this->duplicate_tables_exist == false && stripos($table, $this->table_prefix) === 0 ) || ($this->duplicate_tables_exist == true && strpos($table, $this->table_prefix) === 0 ) ) {
1472
 
1473
  if (!apply_filters('updraftplus_backup_table', true, $table, $this->table_prefix, $whichdb, $dbinfo)) {
1474
  $updraftplus->log("Skipping table (filtered): $table");
@@ -1510,7 +1528,7 @@ class UpdraftPlus_Backup {
1510
  }
1511
  }
1512
 
1513
- # Don't include the job data for any backups - so that when the database is restored, it doesn't continue an apparently incomplete backup
1514
  if ('wp' == $this->whichdb && (!empty($this->table_prefix) && strtolower($this->table_prefix.'sitemeta') == strtolower($table))) {
1515
  $where = 'meta_key NOT LIKE "updraft_jobdata_%"';
1516
  } elseif ('wp' == $this->whichdb && (!empty($this->table_prefix) && strtolower($this->table_prefix.'options') == strtolower($table))) {
@@ -1527,10 +1545,10 @@ class UpdraftPlus_Backup {
1527
  $where = '';
1528
  }
1529
 
1530
- # If no check-in last time, then we could in future try the other method (but - any point in retrying slow method on large tables??)
1531
 
1532
- # New Jul 2014: This attempt to use bindump instead at a lower threshold is quite conservative - only if the last successful run was exactly two resumptions ago - may be useful to expand
1533
- $bindump_threshold = (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && ($updraftplus->current_resumption - $updraftplus->last_successful_resumption == 2 )) ? 1000 : 8000;
1534
 
1535
  $bindump = (isset($rows) && ($rows>$bindump_threshold || (defined('UPDRAFTPLUS_ALWAYS_TRY_MYSQLDUMP') && UPDRAFTPLUS_ALWAYS_TRY_MYSQLDUMP)) && is_string($binsqldump)) ? $this->backup_table_bindump($binsqldump, $table, $where) : false;
1536
  if (true !== $bindump) $this->backup_table($table, $where, 'none', $table_type);
@@ -1539,7 +1557,7 @@ class UpdraftPlus_Backup {
1539
 
1540
  $this->close();
1541
 
1542
- $updraftplus->log("Table $table: finishing file (${table_file_prefix}.gz - ".round(filesize($this->updraft_dir.'/'.$table_file_prefix.'.tmp.gz')/1024,1)." KB)");
1543
 
1544
  rename($db_temp_file, $this->updraft_dir.'/'.$table_file_prefix.'.gz');
1545
  $updraftplus->something_useful_happened();
@@ -1618,11 +1636,11 @@ class UpdraftPlus_Backup {
1618
  if ($sind % 100 == 0) $updraftplus->something_useful_happened();
1619
  }
1620
 
1621
- if (@constant("DB_CHARSET")) {
1622
  $this->stow("/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n");
1623
  }
1624
 
1625
- $updraftplus->log($file_base.'-db'.$this->whichdb_suffix.'.gz: finished writing out complete database file ('.round(filesize($backup_final_file_name)/1024,1).' KB)');
1626
  if (!$this->close()) {
1627
  $updraftplus->log('An error occurred whilst closing the final database file');
1628
  $updraftplus->log(__('An error occurred whilst closing the final database file', 'updraftplus'), 'error');
@@ -1634,7 +1652,7 @@ class UpdraftPlus_Backup {
1634
  if ($errors > 0) {
1635
  return false;
1636
  } else {
1637
- # We no longer encrypt here - because the operation can take long, we made it resumable and moved it to the upload loop
1638
  $updraftplus->jobdata_set('jobstatus', 'dbcreated'.$this->whichdb_suffix);
1639
 
1640
  $checksums = $updraftplus->which_checksums();
@@ -1708,7 +1726,7 @@ class UpdraftPlus_Backup {
1708
  $updraftplus->log("Binary mysqldump error: bindump popen failed");
1709
  }
1710
 
1711
- # Clean temporary files
1712
  @unlink($this->updraft_dir.'/'.$pfile);
1713
 
1714
  return $ret;
@@ -1721,8 +1739,10 @@ class UpdraftPlus_Backup {
1721
  * Website: http://restkultur.ch/personal/wolf/scripts/db_backup/
1722
  * Modified by Scott Merrill (http://www.skippy.net/)
1723
  * to use the WordPress $wpdb object
1724
- * @param string $table
1725
- * @param string $segment
 
 
1726
  * @return void
1727
  */
1728
  private function backup_table($table, $where = '', $segment = 'none', $table_type = 'BASE TABLE') {
@@ -1735,12 +1755,12 @@ class UpdraftPlus_Backup {
1735
  $dump_as_table = ($this->duplicate_tables_exist == false && stripos($table, $this->table_prefix) === 0 && strpos($table, $this->table_prefix) !== 0) ? $this->table_prefix.substr($table, strlen($this->table_prefix)) : $table;
1736
 
1737
  $table_structure = $this->wpdb_obj->get_results("DESCRIBE ".$updraftplus->backquote($table));
1738
- if (! $table_structure) {
1739
  //$updraftplus->log(__('Error getting table details','wp-db-backup') . ": $table", 'error');
1740
  return false;
1741
  }
1742
 
1743
- if($segment == 'none' || $segment == 0) {
1744
  // Add SQL statement to drop existing table
1745
  $this->stow("\n# Delete any existing table ".$updraftplus->backquote($table)."\n\n");
1746
  $this->stow("DROP TABLE IF EXISTS " . $updraftplus->backquote($dump_as_table) . ";\n");
@@ -1782,7 +1802,7 @@ class UpdraftPlus_Backup {
1782
  }
1783
 
1784
  // Comment in SQL-file
1785
- $this->stow("\n\n# " . sprintf("Data contents of $description %s", $updraftplus->backquote($table)) . "\n\n");
1786
 
1787
  }
1788
 
@@ -1797,14 +1817,14 @@ class UpdraftPlus_Backup {
1797
  }
1798
 
1799
  // In UpdraftPlus, segment is always 'none'
1800
- if('VIEW' != $table_type && ($segment == 'none' || $segment >= 0)) {
1801
  $defs = array();
1802
  $integer_fields = array();
1803
  // $table_structure was from "DESCRIBE $table"
1804
  foreach ($table_structure as $struct) {
1805
- if ( (0 === strpos($struct->Type, 'tinyint')) || (0 === strpos(strtolower($struct->Type), 'smallint')) ||
1806
  (0 === strpos(strtolower($struct->Type), 'mediumint')) || (0 === strpos(strtolower($struct->Type), 'int')) || (0 === strpos(strtolower($struct->Type), 'bigint')) ) {
1807
- $defs[strtolower($struct->Field)] = ( null === $struct->Default ) ? 'NULL' : $struct->Default;
1808
  $integer_fields[strtolower($struct->Field)] = "1";
1809
  }
1810
  }
@@ -1814,10 +1834,10 @@ class UpdraftPlus_Backup {
1814
  $increment = 1000;
1815
  if (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && ($updraftplus->current_resumption - $updraftplus->last_successful_resumption > 1)) {
1816
  # This used to be fixed at 500; but we (after a long time) saw a case that looked like an out-of-memory even at this level. We must be careful about going too low, though - otherwise we increase the risks of timeouts.
1817
- $increment = ( $updraftplus->current_resumption - $updraftplus->last_successful_resumption > 2 ) ? 350 : 500;
1818
  }
1819
 
1820
- if($segment == 'none') {
1821
  $row_start = 0;
1822
  $row_inc = $increment;
1823
  } else {
@@ -1834,7 +1854,7 @@ class UpdraftPlus_Backup {
1834
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
1835
 
1836
  $table_data = $this->wpdb_obj->get_results("SELECT * FROM ".$updraftplus->backquote($table)." $where LIMIT {$row_start}, {$row_inc}", ARRAY_A);
1837
- $entries = 'INSERT INTO ' . $updraftplus->backquote($dump_as_table) . ' VALUES ';
1838
  // \x08\\x09, not required
1839
  if($table_data) {
1840
  $thisentry = "";
@@ -1845,8 +1865,8 @@ class UpdraftPlus_Backup {
1845
  if (isset($integer_fields[strtolower($key)])) {
1846
  // make sure there are no blank spots in the insert syntax,
1847
  // yet try to avoid quotation marks around integers
1848
- $value = ( null === $value || '' === $value) ? $defs[strtolower($key)] : $value;
1849
- $values[] = ( '' === $value ) ? "''" : $value;
1850
  } else {
1851
  $values[] = (null === $value) ? 'NULL' : "'" . str_replace($search, $replace, str_replace('\'', '\\\'', str_replace('\\', '\\\\', $value))) . "'";
1852
  }
@@ -1863,19 +1883,16 @@ class UpdraftPlus_Backup {
1863
  if ($thisentry) $this->stow(" \n".$entries.$thisentry.';');
1864
  $row_start += $row_inc;
1865
  }
1866
- } while(count($table_data) > 0 && 'none' == $segment);
1867
  }
1868
 
1869
- if(($segment == 'none') || ($segment < 0)) {
1870
  // Create footer/closing comment in SQL-file
1871
- $this->stow("\n");
1872
- $this->stow("# End of data contents of table ".$updraftplus->backquote($table) . "\n");
1873
- $this->stow("\n");
1874
  }
1875
- $updraftplus->log("Table $table: Total rows added: $total_rows in ".sprintf("%.02f",max(microtime(true)-$microtime,0.00001))." seconds");
1876
-
1877
- } // end backup_table()
1878
 
 
1879
 
1880
  /*END OF WP-DB-BACKUP BLOCK */
1881
 
@@ -1918,14 +1935,21 @@ class UpdraftPlus_Backup {
1918
  return $this->dbhandle;
1919
  }
1920
 
 
 
 
 
 
 
 
1921
  public function stow($query_line) {
1922
  if ($this->dbhandle_isgz) {
1923
- if(false == ($ret = @gzwrite($this->dbhandle, $query_line))) {
1924
- //$updraftplus->log(__('There was an error writing a line to the backup script:','wp-db-backup') . ' ' . $query_line . ' ' . $php_errormsg, 'error');
1925
  }
1926
  } else {
1927
- if(false == ($ret = @fwrite($this->dbhandle, $query_line))) {
1928
- //$updraftplus->log(__('There was an error writing a line to the backup script:','wp-db-backup') . ' ' . $query_line . ' ' . $php_errormsg, 'error');
1929
  }
1930
  }
1931
  return $ret;
@@ -1933,8 +1957,8 @@ class UpdraftPlus_Backup {
1933
 
1934
  private function backup_db_header() {
1935
 
1936
- @include(ABSPATH.WPINC.'/version.php');
1937
  global $wp_version, $updraftplus;
 
1938
 
1939
  $mysql_version = $this->wpdb_obj->db_version();
1940
  # (function_exists('mysql_get_server_info')) ? @mysql_get_server_info() : '?';
@@ -2150,7 +2174,7 @@ class UpdraftPlus_Backup {
2150
  // This test, of course, won't catch everything - it just aims to make things better by default
2151
  $updraftplus->log("Directory excluded for looking like a sub-site's internal UpdraftPlus directory (enable by defining UPDRAFTPLUS_WPCORE_INCLUDE_UPDRAFT_DIRS): ".$use_path_when_storing.'/'.$e);
2152
  } else {
2153
- // no need to addEmptyDir here, as it gets done when we recurse
2154
  $this->makezip_recursive_add($fullpath.'/'.$e, $use_path_when_storing.'/'.$e, $original_fullpath, $startlevels, $exclude);
2155
  }
2156
  }
@@ -2665,8 +2689,8 @@ class UpdraftPlus_Backup {
2665
  # TODO: Is this really what we want? Always go all-in-one for < 500MB???? Should be more conservative? Or, is it always faster to go all-in-one? What about situations where we might want to auto-split because of slowness - check that that is still working.
2666
  # TODO: Test this new method for PclZip - are we still getting the performance gains? Test for ZipArchive too.
2667
  if ('UpdraftPlus_PclZip' == $this->use_zip_object && ($this->makezip_recursive_batchedbytes < 512*1048576 || (defined('UPDRAFTPLUS_PCLZIP_FORCEALLINONE') && UPDRAFTPLUS_PCLZIP_FORCEALLINONE == true && 'UpdraftPlus_PclZip' == $this->use_zip_object))) {
2668
- $updraftplus->log("Only one archive required (".$this->use_zip_object.") - will attempt to do in single operation (data: ".round($this->makezip_recursive_batchedbytes/1024,1)." KB, split: ".round($this->zip_split_every/1024, 1)." KB)");
2669
- // $updraftplus->log("PclZip, and only one archive required - will attempt to do in single operation (data: ".round($this->makezip_recursive_batchedbytes/1024,1)." KB, split: ".round($this->zip_split_every/1024, 1)." KB)");
2670
  $force_allinone = true;
2671
  // if(!class_exists('PclZip')) require_once(ABSPATH.'/wp-admin/includes/class-pclzip.php');
2672
  // $zip = new PclZip($zipfile);
@@ -2767,7 +2791,7 @@ class UpdraftPlus_Backup {
2767
 
2768
  # Add 10% margin. It only really matters when the OS has a file size limit, exceeding which causes failure (e.g. 2GB on 32-bit)
2769
  # Since we don't test before the file has been created (so that zip_last_ratio has meaningful data), we rely on max_zip_batch being less than zip_split_every - which should always be the case
2770
- $reaching_split_limit = ( $this->zip_last_ratio > 0 && $original_size>0 && ($original_size + 1.1*$data_added_since_reopen*$this->zip_last_ratio) > $this->zip_split_every) ? true : false;
2771
 
2772
  if (!$force_allinone && ($zipfiles_added_thisbatch > UPDRAFTPLUS_MAXBATCHFILES || $reaching_split_limit || $data_added_since_reopen > $maxzipbatch || (time() - $this->zipfiles_lastwritetime) > 2)) {
2773
 
@@ -2776,13 +2800,13 @@ class UpdraftPlus_Backup {
2776
 
2777
  if ($data_added_since_reopen > $maxzipbatch) {
2778
  $something_useful_sizetest = true;
2779
- $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over ".round($maxzipbatch/1048576,1)." MB added on this batch (".round($data_added_since_reopen/1048576,1)." MB, ".count($this->zipfiles_batched)." files batched, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") added so far); re-opening (prior size: ".round($original_size/1024,1).' KB)');
2780
  } elseif ($zipfiles_added_thisbatch > UPDRAFTPLUS_MAXBATCHFILES) {
2781
- $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over ".UPDRAFTPLUS_MAXBATCHFILES." files added on this batch (".round($data_added_since_reopen/1048576,1)." MB, ".count($this->zipfiles_batched)." files batched, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") added so far); re-opening (prior size: ".round($original_size/1024,1).' KB)');
2782
  } elseif (!$reaching_split_limit) {
2783
- $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over 2.0 seconds have passed since the last write (".round($data_added_since_reopen/1048576,1)." MB, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") files added so far); re-opening (prior size: ".round($original_size/1024,1).' KB)');
2784
  } else {
2785
- $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): possibly approaching split limit (".round($data_added_since_reopen/1048576,1)." MB, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") files added so far); last ratio: ".round($this->zip_last_ratio,4)."; re-opening (prior size: ".round($original_size/1024,1).' KB)');
2786
  }
2787
 
2788
  if (!$zip->close()) {
@@ -2851,7 +2875,7 @@ class UpdraftPlus_Backup {
2851
  $max_time = -1;
2852
  }
2853
 
2854
- if ($normalised_time_since_began<6 || ($updraftplus->current_resumption >=1 && $run_times_known >=1 && $time_since_began < 0.6*$max_time )) {
2855
 
2856
  // How much can we increase it by?
2857
  if ($normalised_time_since_began <6) {
@@ -2862,16 +2886,11 @@ class UpdraftPlus_Backup {
2862
  );
2863
  } else {
2864
  # Maximum of 200MB in a batch
2865
- $new_maxzipbatch = min( floor($maxzipbatch*6/$normalised_time_since_began),
2866
- 200*1024*1024
2867
- );
2868
  }
2869
  } else {
2870
  // Use up to 60% of available time
2871
- $new_maxzipbatch = min(
2872
- floor($maxzipbatch*((0.6*$max_time)/$normalised_time_since_began)),
2873
- 200*1024*1024
2874
- );
2875
  }
2876
 
2877
  # Throttle increases - don't increase by more than 2x in one go - ???
@@ -2943,13 +2962,16 @@ class UpdraftPlus_Backup {
2943
  } elseif (0 == $this->zipfiles_added_thisrun) {
2944
  // Update lastwritetime, because otherwise the 2.0-second-activity detection can fire prematurely (e.g. if it takes >2.0 seconds to process the previously-written files, then the detector fires after 1 file. This then can have the knock-on effect of having something_useful_happened() called, but then a subsequent attempt to write out a lot of meaningful data fails, and the maximum batch is not then reduced.
2945
  // Testing shows that calling time() 1000 times takes negligible time
2946
- $this->zipfiles_lastwritetime=time();
2947
  }
2948
 
2949
  $this->zipfiles_added++;
2950
 
2951
  // Don't call something_useful_happened() here - nothing necessarily happens until close() is called
2952
- if ($this->zipfiles_added % 100 == 0) $updraftplus->log("Zip: ".basename($zipfile).": ".$this->zipfiles_added." files added (on-disk size: ".round(@filesize($zipfile)/1024,1)." KB)");
 
 
 
2953
 
2954
  if ($bump_index) {
2955
  $updraftplus->log(sprintf("Zip size is at/near split limit (%s MB / %s MB) - bumping index (from: %d)", $bumped_at, round($this->zip_split_every/1048576, 1), $this->index));
@@ -2996,7 +3018,7 @@ class UpdraftPlus_Backup {
2996
 
2997
  clearstatcache();
2998
 
2999
- return ($ret == false) ? false : $nret;
3000
  }
3001
 
3002
  private function record_zip_error($files_zipadded_since_open, $msg, $warn = true) {
@@ -3018,7 +3040,7 @@ class UpdraftPlus_Backup {
3018
 
3019
  // Always warn of this
3020
  if (strpos($msg, 'File Size Limit Exceeded') !== false && 'UpdraftPlus_BinZip' == $this->use_zip_object) {
3021
- $updraftplus->log(sprintf(__('The zip engine returned the message: %s.', 'updraftplus'), 'File Size Limit Exceeded'). __('Go here for more information.','updraftplus').' https://updraftplus.com/what-should-i-do-if-i-see-the-message-file-size-limit-exceeded/', 'warning', 'zipcloseerror-filesizelimit');
3022
  } elseif ($warn) {
3023
  $warn_msg = __('A zip error occurred', 'updraftplus').' - ';
3024
  if (!empty($quota_low)) {
@@ -3032,7 +3054,7 @@ class UpdraftPlus_Backup {
3032
  $updraftplus->log("The attempt to close the zip file returned an error ($msg). List of files we were trying to add follows (check their permissions).");
3033
 
3034
  foreach ($files_zipadded_since_open as $ffile) {
3035
- $updraftplus->log("File: ".$ffile['addas']." (exists: ".(int)@file_exists($ffile['file']).", is_readable: ".(int)@is_readable($ffile['file'])." size: ".@filesize($ffile['file']).')', 'notice', false, true);
3036
  }
3037
  }
3038
 
@@ -3042,7 +3064,7 @@ class UpdraftPlus_Backup {
3042
 
3043
  $timetaken = max(microtime(true)-$this->zip_microtime_start, 0.000001);
3044
 
3045
- $itext = ($this->index == 0) ? '' : ($this->index+1);
3046
  $full_path = $this->zip_basename.$itext.'.zip';
3047
 
3048
  $checksums = $updraftplus->which_checksums();
@@ -3059,7 +3081,7 @@ class UpdraftPlus_Backup {
3059
  }
3060
 
3061
  $next_full_path = $this->zip_basename.($this->index+2).'.zip';
3062
- # We touch the next zip before renaming the temporary file; this indicates that the backup for the entity is not *necessarily* finished
3063
  touch($next_full_path.'.tmp');
3064
 
3065
  if (file_exists($full_path.'.tmp') && filesize($full_path.'.tmp') > 0) {
@@ -3072,10 +3094,10 @@ class UpdraftPlus_Backup {
3072
 
3073
  $kbsize = filesize($full_path)/1024;
3074
  $rate = round($kbsize/$timetaken, 1);
3075
- $updraftplus->log("Created ".$this->whichone." zip (".$this->index.") - ".round($kbsize,1)." KB in ".round($timetaken,1)." s ($rate KB/s) (checksums: $checksum_description)");
3076
  $this->zip_microtime_start = microtime(true);
3077
 
3078
- # No need to add $itext here - we can just delete any temporary files for this zip
3079
  $updraftplus->clean_temporary_files('_'.$updraftplus->nonce."-".$youwhat, 600);
3080
 
3081
  $this->index++;
@@ -3115,21 +3137,26 @@ class UpdraftPlus_Backup {
3115
  private function cb_get_name($a) {
3116
  return $a['name'];
3117
  }
3118
-
3119
  }
3120
 
3121
  class UpdraftPlus_WPDB_OtherDB extends wpdb {
3122
- // This adjusted bail() does two things: 1) Never dies and 2) logs in the UD log
3123
- public function bail( $message, $error_code = '500' ) {
 
 
 
 
 
 
3124
  global $updraftplus;
3125
  if ('db_connect_fail' == $error_code) $message = 'Connection failed: check your access details, that the database server is up, and that the network connection is not firewalled.';
3126
  $updraftplus->log("WPDB_OtherDB error: $message ($error_code)");
3127
- # Now do the things that would have been done anyway
3128
- if ( class_exists( 'WP_Error' ) )
3129
  $this->error = new WP_Error($error_code, $message);
3130
- else
3131
  $this->error = $message;
 
3132
  return false;
3133
  }
3134
  }
3135
-
412
  return array(array('sets' => $backup_history, 'process_order' => 'keep_newest'));
413
  }
414
 
415
+ /**
416
+ * Logs a message; with the message being logged to the database also only if that has not been done in the last 3 seconds. Useful for better overall performance on slow database servers with rapid logging.
417
+ *
418
+ * @uses UpdraftPlus::log()
419
+ *
420
+ * @param String $message - the message to log
421
+ * @param String $level - the log level
422
+ */
423
+ private function log_with_db_occasionally($message, $level = 'notice') {
424
+ global $updraftplus;
425
+ static $last_db = false;
426
+
427
+ if (time() > $last_db + 3) {
428
+ $last_db = time();
429
+ $skip_dblog = false;
430
+ } else {
431
+ $skip_dblog = true;
432
+ }
433
+
434
+ return $updraftplus->log($message, $level, false, $skip_dblog);
435
+ }
436
+
437
+ /**
438
+ * Prunes historical backups, according to the user's settings
439
+ *
440
+ * @param Array $services - a list of services to prune on. This must be an array (i.e. it is not flexible like some other places)
441
+ *
442
+ * @return void
443
+ */
444
  public function prune_retained_backups($services) {
445
 
446
  global $updraftplus, $wpdb;
512
  }
513
  $updraftplus->log("Number of backup sets in history: ".count($backup_history)."; groups (db): ".count($backup_db_groups));
514
 
515
+ $started_main_prune_loop_at = time();
516
+
517
  foreach ($backup_db_groups as $group_id => $group) {
518
 
519
  // The array returned by UpdraftPlus::get_backup_history() is already sorted, with most-recent first
535
 
536
  // $backup_to_examine is an array of file names, keyed on db/plugins/themes/uploads
537
  // The new backup_history array is saved afterwards, so remember to unset the ones that are to be deleted
538
+ $this->log_with_db_occasionally(sprintf("Examining (for databases) backup set with group_id=$group_id, nonce=%s, datestamp=%s (%s)", $nonce, $backup_datestamp, gmdate('M d Y H:i:s', $backup_datestamp)));
 
 
 
 
 
 
539
 
540
  // Auto-backups are only counted or deleted once we have reached the retain limit - before that, they are skipped
541
  $is_autobackup = !empty($backup_to_examine['autobackup']);
551
  if (empty($database_backups_found[$key])) $database_backups_found[$key] = 0;
552
 
553
  if ($nonce == $updraftplus->nonce) {
554
+ $this->log_with_db_occasionally("This backup set is the backup set just made, so will not be deleted.");
555
  $database_backups_found[$key]++;
556
  continue;
557
  }
558
 
559
  if ($is_autobackup) {
560
  if ($any_deleted_via_filter_yet) {
561
+ $this->log_with_db_occasionally("This backup set ($backup_datestamp) was an automatic backup, but we have previously deleted a backup due to a limit, so it will be pruned (but not counted towards numerical limits).");
562
  $prune_it = true;
563
  } elseif ($database_backups_found[$key] < $updraft_retain_db) {
564
+ $this->log_with_db_occasionally("This backup set ($backup_datestamp) was an automatic backup, and we have not yet reached any retain limits, so it will not be counted or pruned. Skipping.");
565
  continue;
566
  } else {
567
+ $this->log_with_db_occasionally("This backup set ($backup_datestamp) was an automatic backup, and we have already reached retain limits, so it will be pruned.");
568
  $prune_it = true;
569
  }
570
  } else {
573
 
574
  if ($remote_sent) {
575
  $prune_it = true;
576
+ $this->log_with_db_occasionally("$backup_datestamp: $key: was sent to remote site; will remove from local record (only)");
577
  }
578
 
579
  // All non-auto backups must be run through this filter (in date order) regardless of the current state of $prune_it - so that filters are able to track state.
587
  if ($database_backups_found[$key] + 1 > $updraft_retain_db) {
588
  $prune_it = true;
589
 
590
+ $fname = is_string($data) ? $data : $data[0];
591
+ $this->log_with_db_occasionally("$backup_datestamp: $key: this set includes a database (".$fname."); db count is now ".$database_backups_found[$key]);
592
 
593
+ $this->log_with_db_occasionally("$backup_datestamp: $key: over retain limit ($updraft_retain_db); will delete this database");
594
  }
595
 
596
  }
653
 
654
  // $backup_to_examine is an array of file names, keyed on db/plugins/themes/uploads
655
  // The new backup_history array is saved afterwards, so remember to unset the ones that are to be deleted
656
+ $this->log_with_db_occasionally(sprintf("Examining (for files) backup set with nonce=%s, datestamp=%s (%s)", $nonce, $backup_datestamp, gmdate('M d Y H:i:s', $backup_datestamp)));
 
 
 
 
 
 
657
 
658
  // Auto-backups are only counted or deleted once we have reached the retain limit - before that, they are skipped
659
  $is_autobackup = !empty($backup_to_examine['autobackup']);
677
 
678
  if ($is_autobackup) {
679
  if ($any_deleted_via_filter_yet) {
680
+ $this->log_with_db_occasionally("This backup set was an automatic backup, but we have previously deleted a backup due to a limit, so it will be pruned (but not counted towards numerical limits).");
681
  $prune_it = true;
682
  } elseif ($file_entities_backups_found[$entity] < $updraft_retain) {
683
+ $this->log_with_db_occasionally("This backup set ($backup_datestamp) was an automatic backup, and we have not yet reached any retain limits, so it will not be counted or pruned. Skipping.");
684
  continue;
685
  } else {
686
+ $this->log_with_db_occasionally("This backup set ($backup_datestamp) was an automatic backup, and we have already reached retain limits, so it will be pruned.");
687
  $prune_it = true;
688
  }
689
  } else {
701
  // The "more than maximum to keep?" counter should not be increased until we actually know that the set is being kept. Before verison 1.11.22, we checked this before running the filter, which resulted in the counter being increased for sets that got pruned via the filter (i.e. not kept) - and too many backups were thus deleted
702
  if (!$prune_it && !$is_autobackup) {
703
  if ($file_entities_backups_found[$entity] >= $updraft_retain) {
704
+ $this->log_with_db_occasionally("$entity: over retain limit ($updraft_retain); will delete this file entity");
705
  $prune_it = true;
706
  }
707
  }
958
 
959
  $body = apply_filters('updraft_report_body',
960
  __('Backup of:', 'updraftplus').' '.site_url()."\r\n".
961
+ "UpdraftPlus ".__('WordPress backup is complete', 'updraftplus').".\r\n".
962
+ __('Backup contains:', 'updraftplus')." $backup_contains\r\n".
963
  __('Latest status:', 'updraftplus').' '.$final_message."\r\n".
964
  $extra_msg.
965
  "\r\n".
1446
 
1447
  if (!$updraftplus->really_is_writable($this->updraft_dir)) {
1448
  $updraftplus->log("The backup directory (".$this->updraft_dir.") could not be written to (could be account/disk space full, or wrong permissions).");
1449
+ $updraftplus->log($this->updraft_dir.": ".__('The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail.', 'updraftplus'), 'warning');
1450
  # Why not just fail now? We saw a bizarre case when the results of really_is_writable() changed during the run.
1451
  }
1452
 
1485
  $updraftplus->log("Table $table: corresponding file already exists; moving on", 'notice', false, $skip_dblog);
1486
  $stitch_files[] = $table_file_prefix;
1487
  } else {
1488
+ // === is needed, otherwise 'false' matches (i.e. prefix does not match)
1489
+ if (empty($this->table_prefix) || ($this->duplicate_tables_exist == false && stripos($table, $this->table_prefix) === 0 ) || ($this->duplicate_tables_exist == true && strpos($table, $this->table_prefix) === 0)) {
1490
 
1491
  if (!apply_filters('updraftplus_backup_table', true, $table, $this->table_prefix, $whichdb, $dbinfo)) {
1492
  $updraftplus->log("Skipping table (filtered): $table");
1528
  }
1529
  }
1530
 
1531
+ // Don't include the job data for any backups - so that when the database is restored, it doesn't continue an apparently incomplete backup
1532
  if ('wp' == $this->whichdb && (!empty($this->table_prefix) && strtolower($this->table_prefix.'sitemeta') == strtolower($table))) {
1533
  $where = 'meta_key NOT LIKE "updraft_jobdata_%"';
1534
  } elseif ('wp' == $this->whichdb && (!empty($this->table_prefix) && strtolower($this->table_prefix.'options') == strtolower($table))) {
1545
  $where = '';
1546
  }
1547
 
1548
+ // If no check-in last time, then we could in future try the other method (but - any point in retrying slow method on large tables??)
1549
 
1550
+ // New Jul 2014: This attempt to use bindump instead at a lower threshold is quite conservative - only if the last successful run was exactly two resumptions ago - may be useful to expand
1551
+ $bindump_threshold = (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && ($updraftplus->current_resumption - $updraftplus->last_successful_resumption == 2)) ? 1000 : 8000;
1552
 
1553
  $bindump = (isset($rows) && ($rows>$bindump_threshold || (defined('UPDRAFTPLUS_ALWAYS_TRY_MYSQLDUMP') && UPDRAFTPLUS_ALWAYS_TRY_MYSQLDUMP)) && is_string($binsqldump)) ? $this->backup_table_bindump($binsqldump, $table, $where) : false;
1554
  if (true !== $bindump) $this->backup_table($table, $where, 'none', $table_type);
1557
 
1558
  $this->close();
1559
 
1560
+ $updraftplus->log("Table $table: finishing file (${table_file_prefix}.gz - ".round(filesize($this->updraft_dir.'/'.$table_file_prefix.'.tmp.gz')/1024, 1)." KB)", 'notice', false, false);
1561
 
1562
  rename($db_temp_file, $this->updraft_dir.'/'.$table_file_prefix.'.gz');
1563
  $updraftplus->something_useful_happened();
1636
  if ($sind % 100 == 0) $updraftplus->something_useful_happened();
1637
  }
1638
 
1639
+ if (defined('DB_CHARSET') && DB_CHARSET) {
1640
  $this->stow("/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n");
1641
  }
1642
 
1643
+ $updraftplus->log($file_base.'-db'.$this->whichdb_suffix.'.gz: finished writing out complete database file ('.round(filesize($backup_final_file_name)/1024, 1).' KB)');
1644
  if (!$this->close()) {
1645
  $updraftplus->log('An error occurred whilst closing the final database file');
1646
  $updraftplus->log(__('An error occurred whilst closing the final database file', 'updraftplus'), 'error');
1652
  if ($errors > 0) {
1653
  return false;
1654
  } else {
1655
+ // We no longer encrypt here - because the operation can take long, we made it resumable and moved it to the upload loop
1656
  $updraftplus->jobdata_set('jobstatus', 'dbcreated'.$this->whichdb_suffix);
1657
 
1658
  $checksums = $updraftplus->which_checksums();
1726
  $updraftplus->log("Binary mysqldump error: bindump popen failed");
1727
  }
1728
 
1729
+ // Clean temporary files
1730
  @unlink($this->updraft_dir.'/'.$pfile);
1731
 
1732
  return $ret;
1739
  * Website: http://restkultur.ch/personal/wolf/scripts/db_backup/
1740
  * Modified by Scott Merrill (http://www.skippy.net/)
1741
  * to use the WordPress $wpdb object
1742
+ * @param String $table
1743
+ * @param String $where
1744
+ * @param String $segment
1745
+ * @param String $table_type
1746
  * @return void
1747
  */
1748
  private function backup_table($table, $where = '', $segment = 'none', $table_type = 'BASE TABLE') {
1755
  $dump_as_table = ($this->duplicate_tables_exist == false && stripos($table, $this->table_prefix) === 0 && strpos($table, $this->table_prefix) !== 0) ? $this->table_prefix.substr($table, strlen($this->table_prefix)) : $table;
1756
 
1757
  $table_structure = $this->wpdb_obj->get_results("DESCRIBE ".$updraftplus->backquote($table));
1758
+ if (!$table_structure) {
1759
  //$updraftplus->log(__('Error getting table details','wp-db-backup') . ": $table", 'error');
1760
  return false;
1761
  }
1762
 
1763
+ if ('none' == $segment|| 0 == $segment) {
1764
  // Add SQL statement to drop existing table
1765
  $this->stow("\n# Delete any existing table ".$updraftplus->backquote($table)."\n\n");
1766
  $this->stow("DROP TABLE IF EXISTS " . $updraftplus->backquote($dump_as_table) . ";\n");
1802
  }
1803
 
1804
  // Comment in SQL-file
1805
+ $this->stow("\n\n# ".sprintf("Data contents of $description %s", $updraftplus->backquote($table))."\n\n");
1806
 
1807
  }
1808
 
1817
  }
1818
 
1819
  // In UpdraftPlus, segment is always 'none'
1820
+ if ('VIEW' != $table_type && ('none' == $segment|| 0 <= $segment)) {
1821
  $defs = array();
1822
  $integer_fields = array();
1823
  // $table_structure was from "DESCRIBE $table"
1824
  foreach ($table_structure as $struct) {
1825
+ if ((0 === strpos($struct->Type, 'tinyint')) || (0 === strpos(strtolower($struct->Type), 'smallint')) ||
1826
  (0 === strpos(strtolower($struct->Type), 'mediumint')) || (0 === strpos(strtolower($struct->Type), 'int')) || (0 === strpos(strtolower($struct->Type), 'bigint')) ) {
1827
+ $defs[strtolower($struct->Field)] = (null === $struct->Default ) ? 'NULL' : $struct->Default;
1828
  $integer_fields[strtolower($struct->Field)] = "1";
1829
  }
1830
  }
1834
  $increment = 1000;
1835
  if (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && ($updraftplus->current_resumption - $updraftplus->last_successful_resumption > 1)) {
1836
  # This used to be fixed at 500; but we (after a long time) saw a case that looked like an out-of-memory even at this level. We must be careful about going too low, though - otherwise we increase the risks of timeouts.
1837
+ $increment = ($updraftplus->current_resumption - $updraftplus->last_successful_resumption > 2) ? 350 : 500;
1838
  }
1839
 
1840
+ if ('none' == $segment) {
1841
  $row_start = 0;
1842
  $row_inc = $increment;
1843
  } else {
1854
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
1855
 
1856
  $table_data = $this->wpdb_obj->get_results("SELECT * FROM ".$updraftplus->backquote($table)." $where LIMIT {$row_start}, {$row_inc}", ARRAY_A);
1857
+ $entries = 'INSERT INTO '.$updraftplus->backquote($dump_as_table).' VALUES ';
1858
  // \x08\\x09, not required
1859
  if($table_data) {
1860
  $thisentry = "";
1865
  if (isset($integer_fields[strtolower($key)])) {
1866
  // make sure there are no blank spots in the insert syntax,
1867
  // yet try to avoid quotation marks around integers
1868
+ $value = (null === $value || '' === $value) ? $defs[strtolower($key)] : $value;
1869
+ $values[] = ('' === $value) ? "''" : $value;
1870
  } else {
1871
  $values[] = (null === $value) ? 'NULL' : "'" . str_replace($search, $replace, str_replace('\'', '\\\'', str_replace('\\', '\\\\', $value))) . "'";
1872
  }
1883
  if ($thisentry) $this->stow(" \n".$entries.$thisentry.';');
1884
  $row_start += $row_inc;
1885
  }
1886
+ } while (count($table_data) > 0 && 'none' == $segment);
1887
  }
1888
 
1889
+ if ($segment == 'none' || $segment < 0) {
1890
  // Create footer/closing comment in SQL-file
1891
+ $this->stow("\n# End of data contents of table ".$updraftplus->backquote($table)."\n\n");
 
 
1892
  }
1893
+ $updraftplus->log("Table $table: Total rows added: $total_rows in ".sprintf("%.02f", max(microtime(true)-$microtime, 0.00001))." seconds");
 
 
1894
 
1895
+ }
1896
 
1897
  /*END OF WP-DB-BACKUP BLOCK */
1898
 
1935
  return $this->dbhandle;
1936
  }
1937
 
1938
+ /**
1939
+ * Adds a line to the database backup
1940
+ *
1941
+ * @param String $query_line - the line to log
1942
+ *
1943
+ * @return Integer|Boolean - the number of octets written, or false for a failure (as returned by gzwrite() / fwrite)
1944
+ */
1945
  public function stow($query_line) {
1946
  if ($this->dbhandle_isgz) {
1947
+ if (false == ($ret = @gzwrite($this->dbhandle, $query_line))) {
1948
+ //$updraftplus->log(__('There was an error writing a line to the backup script:','wp-db-backup').' '.$query_line.' '.$php_errormsg, 'error');
1949
  }
1950
  } else {
1951
+ if (false == ($ret = @fwrite($this->dbhandle, $query_line))) {
1952
+ //$updraftplus->log(__('There was an error writing a line to the backup script:','wp-db-backup').' '.$query_line.' '.$php_errormsg, 'error');
1953
  }
1954
  }
1955
  return $ret;
1957
 
1958
  private function backup_db_header() {
1959
 
 
1960
  global $wp_version, $updraftplus;
1961
+ include(ABSPATH.WPINC.'/version.php');
1962
 
1963
  $mysql_version = $this->wpdb_obj->db_version();
1964
  # (function_exists('mysql_get_server_info')) ? @mysql_get_server_info() : '?';
2174
  // This test, of course, won't catch everything - it just aims to make things better by default
2175
  $updraftplus->log("Directory excluded for looking like a sub-site's internal UpdraftPlus directory (enable by defining UPDRAFTPLUS_WPCORE_INCLUDE_UPDRAFT_DIRS): ".$use_path_when_storing.'/'.$e);
2176
  } else {
2177
+ // no need to add_empty_dir here, as it gets done when we recurse
2178
  $this->makezip_recursive_add($fullpath.'/'.$e, $use_path_when_storing.'/'.$e, $original_fullpath, $startlevels, $exclude);
2179
  }
2180
  }
2689
  # TODO: Is this really what we want? Always go all-in-one for < 500MB???? Should be more conservative? Or, is it always faster to go all-in-one? What about situations where we might want to auto-split because of slowness - check that that is still working.
2690
  # TODO: Test this new method for PclZip - are we still getting the performance gains? Test for ZipArchive too.
2691
  if ('UpdraftPlus_PclZip' == $this->use_zip_object && ($this->makezip_recursive_batchedbytes < 512*1048576 || (defined('UPDRAFTPLUS_PCLZIP_FORCEALLINONE') && UPDRAFTPLUS_PCLZIP_FORCEALLINONE == true && 'UpdraftPlus_PclZip' == $this->use_zip_object))) {
2692
+ $updraftplus->log("Only one archive required (".$this->use_zip_object.") - will attempt to do in single operation (data: ".round($this->makezip_recursive_batchedbytes/1024, 1)." KB, split: ".round($this->zip_split_every/1024, 1)." KB)");
2693
+ // $updraftplus->log("PclZip, and only one archive required - will attempt to do in single operation (data: ".round($this->makezip_recursive_batchedbytes/1024, 1)." KB, split: ".round($this->zip_split_every/1024, 1)." KB)");
2694
  $force_allinone = true;
2695
  // if(!class_exists('PclZip')) require_once(ABSPATH.'/wp-admin/includes/class-pclzip.php');
2696
  // $zip = new PclZip($zipfile);
2791
 
2792
  # Add 10% margin. It only really matters when the OS has a file size limit, exceeding which causes failure (e.g. 2GB on 32-bit)
2793
  # Since we don't test before the file has been created (so that zip_last_ratio has meaningful data), we rely on max_zip_batch being less than zip_split_every - which should always be the case
2794
+ $reaching_split_limit = ($this->zip_last_ratio > 0 && $original_size>0 && ($original_size + 1.1*$data_added_since_reopen*$this->zip_last_ratio) > $this->zip_split_every) ? true : false;
2795
 
2796
  if (!$force_allinone && ($zipfiles_added_thisbatch > UPDRAFTPLUS_MAXBATCHFILES || $reaching_split_limit || $data_added_since_reopen > $maxzipbatch || (time() - $this->zipfiles_lastwritetime) > 2)) {
2797
 
2800
 
2801
  if ($data_added_since_reopen > $maxzipbatch) {
2802
  $something_useful_sizetest = true;
2803
+ $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over ".round($maxzipbatch/1048576,1)." MB added on this batch (".round($data_added_since_reopen/1048576,1)." MB, ".count($this->zipfiles_batched)." files batched, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
2804
  } elseif ($zipfiles_added_thisbatch > UPDRAFTPLUS_MAXBATCHFILES) {
2805
+ $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over ".UPDRAFTPLUS_MAXBATCHFILES." files added on this batch (".round($data_added_since_reopen/1048576,1)." MB, ".count($this->zipfiles_batched)." files batched, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
2806
  } elseif (!$reaching_split_limit) {
2807
+ $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over 2.0 seconds have passed since the last write (".round($data_added_since_reopen/1048576,1)." MB, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") files added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
2808
  } else {
2809
+ $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): possibly approaching split limit (".round($data_added_since_reopen/1048576,1)." MB, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") files added so far); last ratio: ".round($this->zip_last_ratio,4)."; re-opening (prior size: ".round($original_size/1024, 1).' KB)');
2810
  }
2811
 
2812
  if (!$zip->close()) {
2875
  $max_time = -1;
2876
  }
2877
 
2878
+ if ($normalised_time_since_began<6 || ($updraftplus->current_resumption >=1 && $run_times_known >=1 && $time_since_began < 0.6*$max_time)) {
2879
 
2880
  // How much can we increase it by?
2881
  if ($normalised_time_since_began <6) {
2886
  );
2887
  } else {
2888
  # Maximum of 200MB in a batch
2889
+ $new_maxzipbatch = min(floor($maxzipbatch*6/$normalised_time_since_began), 200*1024*1024);
 
 
2890
  }
2891
  } else {
2892
  // Use up to 60% of available time
2893
+ $new_maxzipbatch = min(floor($maxzipbatch*((0.6*$max_time)/$normalised_time_since_began)), 200*1024*1024);
 
 
 
2894
  }
2895
 
2896
  # Throttle increases - don't increase by more than 2x in one go - ???
2962
  } elseif (0 == $this->zipfiles_added_thisrun) {
2963
  // Update lastwritetime, because otherwise the 2.0-second-activity detection can fire prematurely (e.g. if it takes >2.0 seconds to process the previously-written files, then the detector fires after 1 file. This then can have the knock-on effect of having something_useful_happened() called, but then a subsequent attempt to write out a lot of meaningful data fails, and the maximum batch is not then reduced.
2964
  // Testing shows that calling time() 1000 times takes negligible time
2965
+ $this->zipfiles_lastwritetime = time();
2966
  }
2967
 
2968
  $this->zipfiles_added++;
2969
 
2970
  // Don't call something_useful_happened() here - nothing necessarily happens until close() is called
2971
+ if (0 == $this->zipfiles_added % 100) {
2972
+ $skip_dblog = ($this->zipfiles_added_thisrun > 0 || 0 == $this->zipfiles_added % 1000) ? false : true;
2973
+ $updraftplus->log("Zip: ".basename($zipfile).": ".$this->zipfiles_added." files added (on-disk size: ".round(@filesize($zipfile)/1024, 1)." KB)", 'notice', false, $skip_dblog);
2974
+ }
2975
 
2976
  if ($bump_index) {
2977
  $updraftplus->log(sprintf("Zip size is at/near split limit (%s MB / %s MB) - bumping index (from: %d)", $bumped_at, round($this->zip_split_every/1048576, 1), $this->index));
3018
 
3019
  clearstatcache();
3020
 
3021
+ return (false == $ret) ? false : $nret;
3022
  }
3023
 
3024
  private function record_zip_error($files_zipadded_since_open, $msg, $warn = true) {
3040
 
3041
  // Always warn of this
3042
  if (strpos($msg, 'File Size Limit Exceeded') !== false && 'UpdraftPlus_BinZip' == $this->use_zip_object) {
3043
+ $updraftplus->log(sprintf(__('The zip engine returned the message: %s.', 'updraftplus'), 'File Size Limit Exceeded'). __('Go here for more information.', 'updraftplus').' https://updraftplus.com/what-should-i-do-if-i-see-the-message-file-size-limit-exceeded/', 'warning', 'zipcloseerror-filesizelimit');
3044
  } elseif ($warn) {
3045
  $warn_msg = __('A zip error occurred', 'updraftplus').' - ';
3046
  if (!empty($quota_low)) {
3054
  $updraftplus->log("The attempt to close the zip file returned an error ($msg). List of files we were trying to add follows (check their permissions).");
3055
 
3056
  foreach ($files_zipadded_since_open as $ffile) {
3057
+ $updraftplus->log("File: ".$ffile['addas']." (exists: ".(int) @file_exists($ffile['file']).", is_readable: ".(int) @is_readable($ffile['file'])." size: ".@filesize($ffile['file']).')', 'notice', false, true);
3058
  }
3059
  }
3060
 
3064
 
3065
  $timetaken = max(microtime(true)-$this->zip_microtime_start, 0.000001);
3066
 
3067
+ $itext = (0 == $this->index) ? '' : ($this->index+1);
3068
  $full_path = $this->zip_basename.$itext.'.zip';
3069
 
3070
  $checksums = $updraftplus->which_checksums();
3081
  }
3082
 
3083
  $next_full_path = $this->zip_basename.($this->index+2).'.zip';
3084
+ // We touch the next zip before renaming the temporary file; this indicates that the backup for the entity is not *necessarily* finished
3085
  touch($next_full_path.'.tmp');
3086
 
3087
  if (file_exists($full_path.'.tmp') && filesize($full_path.'.tmp') > 0) {
3094
 
3095
  $kbsize = filesize($full_path)/1024;
3096
  $rate = round($kbsize/$timetaken, 1);
3097
+ $updraftplus->log("Created ".$this->whichone." zip (".$this->index.") - ".round($kbsize, 1)." KB in ".round($timetaken, 1)." s ($rate KB/s) (checksums: $checksum_description)");
3098
  $this->zip_microtime_start = microtime(true);
3099
 
3100
+ // No need to add $itext here - we can just delete any temporary files for this zip
3101
  $updraftplus->clean_temporary_files('_'.$updraftplus->nonce."-".$youwhat, 600);
3102
 
3103
  $this->index++;
3137
  private function cb_get_name($a) {
3138
  return $a['name'];
3139
  }
 
3140
  }
3141
 
3142
  class UpdraftPlus_WPDB_OtherDB extends wpdb {
3143
+ /**
3144
+ * This adjusted bail() does two things: 1) Never dies and 2) logs in the UD log
3145
+ *
3146
+ * @param string $message Error message
3147
+ * @param string $error_code Error Code
3148
+ * @return boolean
3149
+ */
3150
+ public function bail($message, $error_code = '500') {
3151
  global $updraftplus;
3152
  if ('db_connect_fail' == $error_code) $message = 'Connection failed: check your access details, that the database server is up, and that the network connection is not firewalled.';
3153
  $updraftplus->log("WPDB_OtherDB error: $message ($error_code)");
3154
+ // Now do the things that would have been done anyway
3155
+ if (class_exists('WP_Error')) {
3156
  $this->error = new WP_Error($error_code, $message);
3157
+ } else {
3158
  $this->error = $message;
3159
+ }
3160
  return false;
3161
  }
3162
  }
 
central/bootstrap.php CHANGED
@@ -25,8 +25,12 @@ class UpdraftPlus_UpdraftCentral_Main {
25
  'users' => 'UpdraftCentral_Users_Commands',
26
  'comments' => 'UpdraftCentral_Comments_Commands',
27
  'updraftvault' => 'UpdraftCentral_UpdraftVault_Commands',
 
28
  ));
29
 
 
 
 
30
  // Remote control keys
31
  // These are different from the remote send keys, which are set up in the Migrator add-on
32
  $our_keys = UpdraftPlus_Options::get_updraft_option('updraft_central_localkeys');
@@ -74,6 +78,11 @@ class UpdraftPlus_UpdraftCentral_Main {
74
  die;
75
  }
76
 
 
 
 
 
 
77
  private function receive_public_key() {
78
 
79
  if (!is_user_logged_in()) {
25
  'users' => 'UpdraftCentral_Users_Commands',
26
  'comments' => 'UpdraftCentral_Comments_Commands',
27
  'updraftvault' => 'UpdraftCentral_UpdraftVault_Commands',
28
+ 'analytics' => 'UpdraftCentral_Analytics_Commands'
29
  ));
30
 
31
+ // If nothing was POSTed, then there is no incoming message, so no need to set up a listener. This avoids a DB SELECT query on the option below in the case where it didn't get autoloaded, which is the case when there are no keys.
32
+ if (empty($_POST)) return;
33
+
34
  // Remote control keys
35
  // These are different from the remote send keys, which are set up in the Migrator add-on
36
  $our_keys = UpdraftPlus_Options::get_updraft_option('updraft_central_localkeys');
78
  die;
79
  }
80
 
81
+ /**
82
+ * Checks _wpnonce, and if successful, saves the public key found in $_GET
83
+ *
84
+ * @return Array - with keys responsetype (can be 'error' or 'ok') and code, indicating whether the parse was successful
85
+ */
86
  private function receive_public_key() {
87
 
88
  if (!is_user_logged_in()) {
central/classes/class-automatic-upgrader-skin.php CHANGED
@@ -8,6 +8,9 @@ if (!defined('ABSPATH')) die('No direct access.');
8
  /**
9
  * Upgrader Skin for Automatic WordPress Upgrades
10
  *
 
 
 
11
  * This skin is designed to be used when no output is intended, all output
12
  * is captured and stored for the caller to process and log/email/discard.
13
  *
@@ -16,89 +19,87 @@ if (!defined('ABSPATH')) die('No direct access.');
16
  * @since 3.7.0
17
  */
18
  class Automatic_Upgrader_Skin extends WP_Upgrader_Skin {
 
19
  protected $messages = array();
20
 
21
  /**
 
22
  *
23
- * @param bool $error
24
- * @param string $context
25
- * @param bool $allow_relaxed_file_ownership
26
  * @return bool
27
  */
28
- public function request_filesystem_credentials( $error = false, $context = '', $allow_relaxed_file_ownership = false ) {
29
- if ( $context ) {
30
  $this->options['context'] = $context;
31
  }
32
  // TODO: fix up request_filesystem_credentials(), or split it, to allow us to request a no-output version
33
  // This will output a credentials form in event of failure, We don't want that, so just hide with a buffer
34
  ob_start();
35
- $result = parent::request_filesystem_credentials( $error, $context, $allow_relaxed_file_ownership );
36
  ob_end_clean();
37
  return $result;
38
  }
39
 
40
  /**
41
- * @access public
42
  *
43
- * @return array
44
  */
45
  public function get_upgrade_messages() {
46
  return $this->messages;
47
  }
48
 
49
  /**
50
- * @param string|array|WP_Error $data
 
 
51
  */
52
- public function feedback( $data ) {
53
- if ( is_wp_error( $data ) ) {
54
  $string = $data->get_error_message();
55
- } elseif ( is_array( $data ) ) {
56
  return;
57
  } else {
58
  $string = $data;
59
  }
60
- if ( ! empty( $this->upgrader->strings[ $string ] ) )
61
- $string = $this->upgrader->strings[ $string ];
62
 
63
- if ( strpos( $string, '%' ) !== false ) {
64
  $args = func_get_args();
65
- $args = array_splice( $args, 1 );
66
- if ( ! empty( $args ) )
67
- $string = vsprintf( $string, $args );
68
  }
69
 
70
- $string = trim( $string );
71
 
72
  // Only allow basic HTML in the messages, as it'll be used in emails/logs rather than direct browser output.
73
- $string = wp_kses( $string, array(
74
  'a' => array(
75
  'href' => true
76
  ),
77
  'br' => true,
78
  'em' => true,
79
  'strong' => true,
80
- ) );
81
 
82
- if ( empty( $string ) )
83
  return;
84
 
85
  $this->messages[] = $string;
86
  }
87
 
88
- /**
89
- * @access public
90
- */
91
  public function header() {
92
  ob_start();
93
  }
94
 
95
- /**
96
- * @access public
97
- */
98
  public function footer() {
99
  $output = ob_get_clean();
100
- if ( ! empty( $output ) )
101
- $this->feedback( $output );
102
  }
103
 
104
  /**
@@ -106,9 +107,6 @@ class Automatic_Upgrader_Skin extends WP_Upgrader_Skin {
106
  */
107
  public function bulk_header() {}
108
 
109
- /**
110
- * @access public
111
- */
112
- public function bulk_footer() {}
113
-
114
  }
8
  /**
9
  * Upgrader Skin for Automatic WordPress Upgrades
10
  *
11
+ * Extracted from 4.5.2/wordpress/wp-admin/includes/class-wp-upgrader-skins.php; with the bulk_*() methods added since they are not in the base class on all WP versions.
12
+ * Needed only on WP < 3.7
13
+ *
14
  * This skin is designed to be used when no output is intended, all output
15
  * is captured and stored for the caller to process and log/email/discard.
16
  *
19
  * @since 3.7.0
20
  */
21
  class Automatic_Upgrader_Skin extends WP_Upgrader_Skin {
22
+
23
  protected $messages = array();
24
 
25
  /**
26
+ * Request filesystem credentials
27
  *
28
+ * @param bool $error Check if there is an error: default is false
29
+ * @param string $context Context for credentails
30
+ * @param bool $allow_relaxed_file_ownership Check if relaxed file ownership is allowed
31
  * @return bool
32
  */
33
+ public function request_filesystem_credentials($error = false, $context = '', $allow_relaxed_file_ownership = false) {
34
+ if ($context) {
35
  $this->options['context'] = $context;
36
  }
37
  // TODO: fix up request_filesystem_credentials(), or split it, to allow us to request a no-output version
38
  // This will output a credentials form in event of failure, We don't want that, so just hide with a buffer
39
  ob_start();
40
+ $result = parent::request_filesystem_credentials($error, $context, $allow_relaxed_file_ownership);
41
  ob_end_clean();
42
  return $result;
43
  }
44
 
45
  /**
46
+ * Get update message
47
  *
48
+ * @return array reti=urns an array of messages
49
  */
50
  public function get_upgrade_messages() {
51
  return $this->messages;
52
  }
53
 
54
  /**
55
+ * Feedback
56
+ *
57
+ * @param string|array|WP_Error $data THis is the data to be used for the feedback
58
  */
59
+ public function feedback($data) {
60
+ if (is_wp_error($data)) {
61
  $string = $data->get_error_message();
62
+ } elseif (is_array($data)) {
63
  return;
64
  } else {
65
  $string = $data;
66
  }
67
+ if (!empty($this->upgrader->strings[$string]))
68
+ $string = $this->upgrader->strings[$string];
69
 
70
+ if (false !== strpos($string, '%')) {
71
  $args = func_get_args();
72
+ $args = array_splice($args, 1);
73
+ if (!empty($args))
74
+ $string = vsprintf($string, $args);
75
  }
76
 
77
+ $string = trim($string);
78
 
79
  // Only allow basic HTML in the messages, as it'll be used in emails/logs rather than direct browser output.
80
+ $string = wp_kses($string, array(
81
  'a' => array(
82
  'href' => true
83
  ),
84
  'br' => true,
85
  'em' => true,
86
  'strong' => true,
87
+ ));
88
 
89
+ if (empty($string))
90
  return;
91
 
92
  $this->messages[] = $string;
93
  }
94
 
 
 
 
95
  public function header() {
96
  ob_start();
97
  }
98
 
 
 
 
99
  public function footer() {
100
  $output = ob_get_clean();
101
+ if (!empty($output))
102
+ $this->feedback($output);
103
  }
104
 
105
  /**
107
  */
108
  public function bulk_header() {}
109
 
110
+ public function bulk_footer() {
111
+ }
 
 
 
112
  }
central/listener.php CHANGED
@@ -93,7 +93,7 @@ class UpdraftPlus_UpdraftCentral_Listener {
93
  /**
94
  * Do verification before calling this method
95
  *
96
- * @param WP_User|Object $user user object
97
  * @param boolean $redirect_url Redirect URL
98
  */
99
  private function autologin_user($user, $redirect_url = false) {
93
  /**
94
  * Do verification before calling this method
95
  *
96
+ * @param WP_User|Object $user user object for autologin
97
  * @param boolean $redirect_url Redirect URL
98
  */
99
  private function autologin_user($user, $redirect_url = false) {
central/modules/analytics.php ADDED
@@ -0,0 +1,344 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
+
5
+ /**
6
+ * Handles Analytics Commands
7
+ *
8
+ * @method array ga_checker()
9
+ * @method array get_access_token()
10
+ * @method array set_authorization_code()
11
+ */
12
+ class UpdraftCentral_Analytics_Commands extends UpdraftCentral_Commands {
13
+
14
+ private $scope = 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/analytics.readonly';
15
+
16
+ private $endpoint = 'https://accounts.google.com/o/oauth2/auth';
17
+
18
+ private $token_info_endpoint = 'https://www.googleapis.com/oauth2/v1/tokeninfo';
19
+
20
+ private $access_key = 'updraftcentral_auth_server_access';
21
+
22
+ private $auth_endpoint;
23
+
24
+ private $client_id;
25
+
26
+ private $view_key = 'updraftcentral_analytics_views';
27
+
28
+ private $tracking_id_key = 'updraftcentral_analytics_tracking_id';
29
+
30
+ private $expiration;
31
+
32
+ /**
33
+ * Constructor
34
+ */
35
+ public function __construct() {
36
+ $this->auth_endpoint = defined('UPDRAFTPLUS_GOOGLECLOUD_CALLBACK_URL') ? UPDRAFTPLUS_GOOGLECLOUD_CALLBACK_URL : 'https://auth.updraftplus.com/auth/googleanalytics';
37
+ $this->client_id = defined('UPDRAFTPLUS_GOOGLECLOUD_CLIENT_ID') ? UPDRAFTPLUS_GOOGLECLOUD_CLIENT_ID : '306245874349-6s896c3tjpra26ns3dpplhqcl6rv6qlb.apps.googleusercontent.com';
38
+
39
+ // Set transient expiration - default for 24 hours
40
+ $this->expiration = 86400;
41
+ }
42
+
43
+ /**
44
+ * Checks whether Google Analytics (GA) is installed or setup
45
+ *
46
+ * N.B. This check assumes GA is installed either using "wp_head" or "wp_footer" (e.g. attached
47
+ * to the <head/> or somewhere before </body>). It does not recursively check all the pages
48
+ * of the website to find if GA is installed on each or one of those pages, but only on the main/root page.
49
+ *
50
+ * @return array $result An array containing "ga_installed" property which returns "true" if GA (Google Analytics) is installed, "false" otherwise.
51
+ */
52
+ public function ga_checker() {
53
+
54
+ try {
55
+
56
+ // Retrieves the tracking code/id if available
57
+ $tracking_id = $this->get_tracking_id();
58
+ $installed = true;
59
+
60
+ // If tracking code/id is currently not available then we
61
+ // parse the needed information from the buffered content through
62
+ // the "wp_head" and "wp_footer" hooks.
63
+ if (false === $tracking_id) {
64
+
65
+ // Retrieve header content
66
+ ob_start();
67
+ do_action('wp_head');
68
+ $header_content = ob_get_clean();
69
+
70
+ // Extract analytics information if available.
71
+ $output = $this->parse_content($header_content);
72
+ $installed = $output['installed'];
73
+ $tracking_id = $output['tracking_id'];
74
+
75
+ // If it was not found, then now try the footer
76
+ if (empty($tracking_id)) {
77
+ // Retrieve footer content
78
+ ob_start();
79
+ do_action('wp_footer');
80
+ $footer_content = ob_get_clean();
81
+ $output = $this->parse_content($footer_content);
82
+ $installed = $output['installed'];
83
+ $tracking_id = $output['tracking_id'];
84
+ }
85
+
86
+ if (!empty($tracking_id)) {
87
+ set_site_transient($this->tracking_id_key, $tracking_id, $this->expiration);
88
+ }
89
+ }
90
+
91
+ // Wrap and combined information for the requesting
92
+ // client's consumption
93
+ $result = array(
94
+ 'ga_installed' => $installed,
95
+ 'tracking_id' => $tracking_id,
96
+ 'client_id' => $this->client_id,
97
+ 'redirect_uri' => $this->auth_endpoint,
98
+ 'scope' => $this->scope,
99
+ 'access_token' => $this->_get_token(),
100
+ 'endpoint' => $this->endpoint
101
+ );
102
+
103
+ } catch (Exception $e) {
104
+ $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage()));
105
+ }
106
+
107
+ return $this->_response($result);
108
+ }
109
+
110
+ /**
111
+ * Gets access token
112
+ *
113
+ * Validates whether the system currently have a valid token to use when connecting to Google Analytics API.
114
+ * If not, then it will send a token request based on the authorization code we stored during the
115
+ * authorization phase. Otherwise, it will return an empty token.
116
+ *
117
+ * @return array $result An array containing the Google Analytics API access token.
118
+ */
119
+ public function get_access_token() {
120
+
121
+ try {
122
+
123
+ // Loads or request a valid token to use
124
+ $access_token = $this->_get_token();
125
+
126
+ if (!empty($access_token)) {
127
+ $result = array('access_token' => $access_token);
128
+ } else {
129
+ $result = array('error' => true, 'message' => 'ga_token_retrieval_failed', 'values' => array());
130
+ }
131
+
132
+ } catch (Exception $e) {
133
+ $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage()));
134
+ }
135
+
136
+ return $this->_response($result);
137
+ }
138
+
139
+ /**
140
+ * Saves user is and access token received from the auth server
141
+ *
142
+ * @param array $query Parameter array containing the user id and access token from the auth server.
143
+ * @return array $result An array containing a "success" or "failure" message as a result of the current process.
144
+ */
145
+ public function save_user_access($query) {
146
+
147
+ try {
148
+
149
+ $token = get_option($this->access_key, false);
150
+ $result = array();
151
+
152
+ if (false === $token || empty($token['access_token'])) {
153
+ $token = array(
154
+ 'user_id' => base64_decode(urldecode($query['user_id'])),
155
+ 'access_token' => base64_decode(urldecode($query['access_token']))
156
+ );
157
+
158
+ if (false !== update_option($this->access_key, $token)) {
159
+ $result = array('error' => false, 'message' => 'ga_access_saved', 'values' => array());
160
+ } else {
161
+ $result = array('error' => true, 'message' => 'ga_access_saving_failed', 'values' => array($query['access_token']));
162
+ }
163
+ }
164
+
165
+ } catch (Exception $e) {
166
+ $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage()));
167
+ }
168
+
169
+ return $this->_response($result);
170
+ }
171
+
172
+ /**
173
+ * Saves the tracking code/id manually (user input)
174
+ *
175
+ * @param array $query Parameter array containing the tracking code/id to save.
176
+ * @return array $result An array containing the result of the process.
177
+ */
178
+ public function save_tracking_id($query) {
179
+ try {
180
+ $tracking_id = $query['tracking_id'];
181
+ $saved = false;
182
+
183
+ if (!empty($tracking_id)) {
184
+ $saved = set_site_transient($this->tracking_id_key, $tracking_id, $this->expiration);
185
+ }
186
+
187
+ $result = array('saved' => $saved);
188
+ } catch (Exception $e) {
189
+ $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($e->getMessage()));
190
+ }
191
+
192
+ return $this->_response($result);
193
+ }
194
+
195
+ /**
196
+ * Retrieves any available access token either previously saved info or
197
+ * from a new request from the Google Server.
198
+ *
199
+ * @internal
200
+ * @return string $authorization_code
201
+ */
202
+ private function _get_token() {
203
+
204
+ // Retrieves the tracking code/id if available
205
+ $tracking_id = $this->get_tracking_id();
206
+ $access_token = '';
207
+
208
+ $token = get_option($this->access_key, false);
209
+ if (false !== $token) {
210
+ $access_token = isset($token['access_token']) ? $token['access_token'] : '';
211
+ $user_id = isset($token['user_id']) ? $token['user_id'] : '';
212
+
213
+ if ((!empty($access_token) && !$this->_token_valid($access_token)) || (!empty($user_id) && empty($access_token) && !empty($tracking_id))) {
214
+ if (!empty($user_id)) {
215
+ $args = array(
216
+ 'headers' => apply_filters('updraftplus_auth_headers', array())
217
+ );
218
+
219
+ $response = wp_remote_get($this->auth_endpoint.'?user_id='.$user_id.'&code=ud_googleanalytics_code', $args);
220
+ if (is_wp_error($response)) {
221
+ throw new Exception($response->get_error_message());
222
+ } else {
223
+ if (is_array($response)) {
224
+
225
+ $body = json_decode($response['body'], true);
226
+ $token_response = array();
227
+
228
+ if (is_array($body)) {
229
+ $token_response = json_decode(base64_decode($body[0]), true);
230
+ }
231
+
232
+ if (is_array($token_response) && isset($token_response['access_token'])) {
233
+ $access_token = $token_response['access_token'];
234
+ } else {
235
+ // If we don't get any valid response then that would mean that the
236
+ // permission was already revoked. Thus, we need to re-authorize the
237
+ // user before using the analytics feature once again.
238
+ $access_token = '';
239
+ }
240
+
241
+ $token['access_token'] = $access_token;
242
+ update_option($this->access_key, $token);
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
248
+
249
+ return $access_token;
250
+ }
251
+
252
+ /**
253
+ * Verifies whether the access token is still valid for use
254
+ *
255
+ * @internal
256
+ * @param string $token The access token to be check and validated
257
+ * @return bool
258
+ * @throws Exception If an error has occurred while connecting to the Google Server.
259
+ */
260
+ private function _token_valid($token) {
261
+
262
+ $response = wp_remote_get($this->token_info_endpoint.'?access_token='.$token);
263
+ if (is_wp_error($response)) {
264
+ throw new Exception($response->get_error_message());
265
+ } else {
266
+ if (is_array($response)) {
267
+ $response = json_decode($response['body'], true);
268
+ if (!empty($response)) {
269
+ if (!isset($response['error']) && !isset($response['error_description'])) {
270
+ return true;
271
+ }
272
+ }
273
+ }
274
+ }
275
+
276
+ return false;
277
+ }
278
+
279
+ /**
280
+ * Parses and extracts the google analytics information (NEEDED)
281
+ *
282
+ * @internal
283
+ * @param string $content The content to parse
284
+ * @return array An array containing the status of the process along with the tracking code/id
285
+ */
286
+ private function parse_content($content) {
287
+
288
+ $installed = false;
289
+ $gtm_installed = false;
290
+ $tracking_id = '';
291
+ $script_file_found = false;
292
+ $tracking_id_found = false;
293
+
294
+ // Pull google analytics script file(s)
295
+ preg_match_all('/<script\b[^>]*>([\s\S]*?)<\/script>/i', $content, $scripts);
296
+ for ($i=0; $i < count($scripts[0]); $i++) {
297
+ // Check for Google Analytics file
298
+ if (stristr($scripts[0][$i], 'ga.js') || stristr($scripts[0][$i], 'analytics.js')) {
299
+ $script_file_found = true;
300
+ }
301
+
302
+ // Check for Google Tag Manager file
303
+ // N.B. We are not checking for GTM but this check will be useful when
304
+ // showing the notice to the user if we haven't found Google Analytics
305
+ // directly being installed on the page.
306
+ if (stristr($scripts[0][$i], 'gtm.js')) {
307
+ $gtm_installed = true;
308
+ }
309
+ }
310
+
311
+ // Pull tracking code
312
+ preg_match_all('/UA-[0-9]{5,}-[0-9]{1,}/i', $content, $codes);
313
+ if (count($codes) > 0) {
314
+ if (!empty($codes[0])) {
315
+ $tracking_id_found = true;
316
+ $tracking_id = $codes[0][0];
317
+ }
318
+ }
319
+
320
+ // If we found both the script and the tracking code then it is safe
321
+ // to say that Google Analytics (GA) is installed. Thus, we're returning
322
+ // "true" as a response.
323
+ if ($script_file_found && $tracking_id_found) {
324
+ $installed = true;
325
+ }
326
+
327
+ // Return result of process.
328
+ return array(
329
+ 'installed' => $installed,
330
+ 'gtm_installed' => $gtm_installed,
331
+ 'tracking_id' => $tracking_id
332
+ );
333
+ }
334
+
335
+ /**
336
+ * Retrieves the "analytics_tracking_id" option
337
+ *
338
+ * @internal
339
+ * @return mixed Returns the value of the saved option. Returns "false" if the option does not exist.
340
+ */
341
+ private function get_tracking_id() {
342
+ return get_site_transient($this->tracking_id_key);
343
+ }
344
+ }
central/modules/comments.php CHANGED
@@ -761,8 +761,8 @@ class UpdraftCentral_Comments_Commands extends UpdraftCentral_Commands {
761
  if ($parent_comment) $comment->in_reply_to = $parent_comment->comment_author;
762
  }
763
 
764
- //We're formatting the comment_date to be exactly the same
765
- //with that of WP Comments table (e.g. 2016/12/21 at 10:30 PM)
766
 
767
  $comment->comment_date = date('Y/m/d \a\t g:i a', strtotime($comment->comment_date));
768
 
761
  if ($parent_comment) $comment->in_reply_to = $parent_comment->comment_author;
762
  }
763
 
764
+ // We're formatting the comment_date to be exactly the same
765
+ // with that of WP Comments table (e.g. 2016/12/21 at 10:30 PM)
766
 
767
  $comment->comment_date = date('Y/m/d \a\t g:i a', strtotime($comment->comment_date));
768
 
central/modules/users.php CHANGED
@@ -456,9 +456,9 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
456
  }
457
 
458
  if (wp_delete_user($user_id, $assign_user_id)) {
459
- $result = array("error" => false, "message" => "user_deleted");
460
  } else {
461
- $result = array("error" => true, "message" => "user_delete_failed");
462
  }
463
 
464
  // Here, we're restoring to the current (default) blog before we
456
  }
457
 
458
  if (wp_delete_user($user_id, $assign_user_id)) {
459
+ $result = array("error" => false, "message" => "user_deleted");
460
  } else {
461
+ $result = array("error" => true, "message" => "user_delete_failed");
462
  }
463
 
464
  // Here, we're restoring to the current (default) blog before we
class-updraftplus.php CHANGED
@@ -28,22 +28,30 @@ class UpdraftPlus {
28
  );
29
 
30
  public $errors = array();
 
31
  public $nonce;
 
32
  public $logfile_name = "";
 
33
  public $logfile_handle = false;
 
34
  public $backup_time;
 
35
  public $job_time_ms;
36
 
37
  public $opened_log_time;
 
38
  private $backup_dir;
39
 
40
  private $jobdata;
41
 
42
  public $something_useful_happened = false;
 
43
  public $have_addons = false;
44
 
45
  // Used to schedule resumption attempts beyond the tenth, if needed
46
  public $current_resumption;
 
47
  public $newresumption_scheduled = false;
48
 
49
  public $cpanel_quota_readable = false;
@@ -64,51 +72,56 @@ class UpdraftPlus {
64
  fclose($fp);
65
  }
66
 
67
- # Create admin page
68
  add_action('init', array($this, 'handle_url_actions'));
69
  // Run earlier than default - hence earlier than other components
70
  // admin_menu runs earlier, and we need it because options.php wants to use $updraftplus_admin before admin_init happens
71
  add_action(apply_filters('updraft_admin_menu_hook', 'admin_menu'), array($this, 'admin_menu'), 9);
72
- # Not a mistake: admin-ajax.php calls only admin_init and not admin_menu
73
  add_action('admin_init', array($this, 'admin_menu'), 9);
74
 
75
- # The two actions which we schedule upon
76
  add_action('updraft_backup', array($this, 'backup_files'));
77
  add_action('updraft_backup_database', array($this, 'backup_database'));
78
 
79
- # The three actions that can be called from "Backup Now"
80
  add_action('updraft_backupnow_backup', array($this, 'backupnow_files'));
81
  add_action('updraft_backupnow_backup_database', array($this, 'backupnow_database'));
82
  add_action('updraft_backupnow_backup_all', array($this, 'backup_all'));
83
 
84
- # backup_all as an action is legacy (Oct 2013) - there may be some people who wrote cron scripts to use it
85
  add_action('updraft_backup_all', array($this, 'backup_all'));
86
 
87
- # This is our runs-after-backup event, whose purpose is to see if it succeeded or failed, and resume/mom-up etc.
88
  add_action('updraft_backup_resume', array($this, 'backup_resume'), 10, 3);
89
 
90
- # If files + db are on different schedules but are scheduled for the same time, then combine them
91
  add_filter('schedule_event', array($this, 'schedule_event'));
92
 
93
  add_action('plugins_loaded', array($this, 'plugins_loaded'));
94
 
95
- # Prevent iThemes Security from telling people that they have no backups (and advertising them another product on that basis!)
96
  add_filter('itsec_has_external_backup', '__return_true', 999);
97
  add_filter('itsec_external_backup_link', array($this, 'itsec_external_backup_link'), 999);
98
  add_filter('itsec_scheduled_external_backup', array($this, 'itsec_scheduled_external_backup'), 999);
99
 
100
- # register_deactivation_hook(__FILE__, array($this, 'deactivation'));
101
  if (!empty($_POST) && !empty($_GET['udm_action']) && 'vault_disconnect' == $_GET['udm_action'] && !empty($_POST['udrpc_message']) && !empty($_POST['reset_hash'])) {
102
  add_action('wp_loaded', array($this, 'wp_loaded_vault_disconnect'), 1);
103
  }
104
 
105
  }
106
 
107
- public function itsec_scheduled_external_backup($x) { return (!wp_next_scheduled('updraft_backup')) ? false : true; }
108
- public function itsec_external_backup_link($x) { return UpdraftPlus_Options::admin_page_url().'?page=updraftplus'; }
 
 
 
 
109
 
110
  /**
111
  * This method will disconnect UpdraftVault accounts.
 
112
  * @return Array - returns the saved options if an error is encountered.
113
  */
114
  public function wp_loaded_vault_disconnect() {
@@ -130,7 +143,7 @@ class UpdraftPlus {
130
  $hash = hash('sha256', $site_id.':::'.$storage_options['token']);
131
  if ($hash == $_POST['reset_hash']) {
132
  $this->log('This site has been remotely disconnected from UpdraftPlus Vault');
133
- require_once(UPDRAFTPLUS_DIR.'/methods/updraftvault.php');
134
  $vault = new UpdraftPlus_BackupModule_updraftvault();
135
  $vault->ajax_vault_disconnect();
136
  // Die, as the vault method has already sent output
@@ -139,15 +152,20 @@ class UpdraftPlus {
139
  $this->log('An invalid request was received to disconnect this site from UpdraftPlus Vault');
140
  }
141
  }
142
- echo json_encode(array('disconnected' => 0));
143
  }
144
  }
145
  die;
146
  }
147
 
148
- // Gets an RPC object, and sets some defaults on it that we always want
 
 
 
 
 
149
  public function get_udrpc($indicator_name = 'migrator.updraftplus.com') {
150
- if (!class_exists('UpdraftPlus_Remote_Communications')) require_once(apply_filters('updraftplus_class_udrpc_path', UPDRAFTPLUS_DIR.'/includes/class-udrpc.php', $this->version));
151
  $ud_rpc = new UpdraftPlus_Remote_Communications($indicator_name);
152
  $ud_rpc->set_can_generate(true);
153
  return $ud_rpc;
@@ -171,12 +189,14 @@ class UpdraftPlus {
171
  if (false === strpos(get_include_path(), $phpseclib_dir)) set_include_path(get_include_path().PATH_SEPARATOR.$phpseclib_dir);
172
  if (is_string($class_paths)) $class_paths = array($class_paths);
173
  foreach ($class_paths as $cp) {
174
- require_once($phpseclib_dir.'/'.$cp.'.php');
175
  }
176
  }
177
  }
178
 
179
- // Ugly, but necessary to prevent debug output breaking the conversation when the user has debug turned on
 
 
180
  private function no_deprecation_warnings_on_php7() {
181
  // PHP_MAJOR_VERSION is defined in PHP 5.2.7+
182
  // We don't test for PHP > 7 because the specific deprecated element will be removed in PHP 8 - and so no warning should come anyway (and we shouldn't suppress other stuff until we know we need to).
@@ -207,10 +227,10 @@ class UpdraftPlus {
207
  *
208
  * N.B. Don't actually call this on any particular method's options
209
  * until the functions which read the options can cope!
210
- *
211
  * N.B. Until the UI is changed (DOM changed), saving settings will
212
  * revert to the previous format. But that does not break anything.
213
- *
214
  * Don't call for settings that aren't array-style. You may lose
215
  * the settings if you do.
216
  *
@@ -218,7 +238,7 @@ class UpdraftPlus {
218
  * already updated.
219
  *
220
  * @param String $method - the method identifier
221
- *
222
  * @returns Array|WP_Error - returns the new options, or a WP_Error if it failed
223
  */
224
  public function update_remote_storage_options_format($method) {
@@ -282,8 +302,10 @@ class UpdraftPlus {
282
  return $new_setting;
283
  }
284
 
285
- // Returns the number of bytes free, if it can be detected; otherwise, false
286
- // Presently, we only detect CPanel. If you know of others, then feel free to contribute!
 
 
287
  public function get_hosting_disk_quota_free() {
288
  if (!@is_dir('/usr/local/cpanel') || $this->detect_safe_mode() || !function_exists('popen') || (!@is_executable('/usr/local/bin/perl') && !@is_executable('/usr/local/cpanel/3rdparty/bin/perl')) || (defined('UPDRAFTPLUS_SKIP_CPANEL_QUOTA_CHECK') && UPDRAFTPLUS_SKIP_CPANEL_QUOTA_CHECK)) return false;
289
 
@@ -299,13 +321,15 @@ class UpdraftPlus {
299
  while (false === $found && !feof($handle) && $lines<100) {
300
  $lines++;
301
  $w = fgets($handle);
302
- # Used, limit, remain
303
- if (preg_match('/RESULT: (\d+) (\d+) (\d+) /', $w, $matches)) { $found = true; }
 
 
304
  }
305
  $ret = pclose($handle);
306
- if (false === $found ||$ret != 0) return false;
307
 
308
- if ((int)$matches[2]<100 || ($matches[1] + $matches[3] != $matches[2])) return false;
309
 
310
  $this->cpanel_quota_readable = true;
311
 
@@ -337,13 +361,15 @@ class UpdraftPlus {
337
  return array($mod_time, $log_file, $nonce);
338
  }
339
 
340
- // This function may get called multiple times, so write accordingly
 
 
341
  public function admin_menu() {
342
  // We are in the admin area: now load all that code
343
  global $updraftplus_admin;
344
- if (empty($updraftplus_admin)) require_once(UPDRAFTPLUS_DIR.'/admin.php');
345
 
346
- if (isset($_GET['wpnonce']) && isset($_GET['page']) && isset($_GET['action']) && $_GET['page'] == 'updraftplus' && $_GET['action'] == 'downloadlatestmodlog' && wp_verify_nonce($_GET['wpnonce'], 'updraftplus_download')) {
347
 
348
  list ($mod_time, $log_file, $nonce) = $this->last_modified_log();
349
 
@@ -353,10 +379,10 @@ class UpdraftPlus {
353
  readfile($log_file);
354
  exit;
355
  } else {
356
- add_action('all_admin_notices', array($this,'show_admin_warning_unreadablelog') );
357
  }
358
  } else {
359
- add_action('all_admin_notices', array($this,'show_admin_warning_nolog') );
360
  }
361
  }
362
 
@@ -374,9 +400,13 @@ class UpdraftPlus {
374
 
375
  }
376
 
377
- // Handle actions passed on to method plugins; e.g. Google OAuth 2.0 - ?action=updraftmethod-googledrive-auth&page=updraftplus
378
- // Nov 2013: Google's new cloud console, for reasons as yet unknown, only allows you to enter a redirect_uri with a single URL parameter... thus, we put page second, and re-add it if necessary. Apr 2014: Bitcasa already do this, so perhaps it is part of the OAuth2 standard or best practice somewhere.
379
- // Also handle action=downloadlog
 
 
 
 
380
  public function handle_url_actions() {
381
 
382
  // First, basic security check: must be an admin page, with ability to manage options, with the right parameters
@@ -386,7 +416,7 @@ class UpdraftPlus {
386
  $_GET['page'] = 'updraftplus';
387
  $_REQUEST['page'] = 'updraftplus';
388
  $method = $matches[1];
389
- require_once(UPDRAFTPLUS_DIR.'/methods/'.$method.'.php');
390
  $call_class = "UpdraftPlus_BackupModule_".$method;
391
  $call_method = "action_".$matches[2];
392
  $backup_obj = new $call_class;
@@ -399,7 +429,7 @@ class UpdraftPlus {
399
  $this->log(sprintf(__("%s error: %s", 'updraftplus'), $method, $e->getMessage().' ('.$e->getCode().')', 'error'));
400
  }
401
  remove_action('http_request_args', array($this, 'modify_http_options'));
402
- } elseif (isset( $_GET['page'] ) && $_GET['page'] == 'updraftplus' && $_GET['action'] == 'downloadlog' && isset($_GET['updraftplus_backup_nonce']) && preg_match("/^[0-9a-f]{12}$/",$_GET['updraftplus_backup_nonce']) && UpdraftPlus_Options::user_can_manage()) {
403
  // No WordPress nonce is needed here or for the next, since the backup is already nonce-based
404
  $updraft_dir = $this->backups_dir_location();
405
  $log_file = $updraft_dir.'/log.'.$_GET['updraftplus_backup_nonce'].'.txt';
@@ -409,9 +439,9 @@ class UpdraftPlus {
409
  readfile($log_file);
410
  exit;
411
  } else {
412
- add_action('all_admin_notices', array($this,'show_admin_warning_unreadablelog') );
413
  }
414
- } elseif (isset( $_GET['page'] ) && $_GET['page'] == 'updraftplus' && $_GET['action'] == 'downloadfile' && isset($_GET['updraftplus_file']) && preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-db([0-9]+)?+\.(gz\.crypt)$/i', $_GET['updraftplus_file']) && UpdraftPlus_Options::user_can_manage()) {
415
  // Though this (venerable) code uses the action 'downloadfile', in fact, it's not that general: it's just for downloading a decrypted copy of encrypted databases, and nothing else
416
  $updraft_dir = $this->backups_dir_location();
417
  $file = $_GET['updraftplus_file'];
@@ -421,13 +451,13 @@ class UpdraftPlus {
421
  $this->spool_file($spool_file, $dkey);
422
  exit;
423
  } else {
424
- add_action('all_admin_notices', array($this,'show_admin_warning_unreadablefile') );
425
  }
426
- } elseif ($_GET['action'] == 'updraftplus_spool_file' && !empty($_GET['what']) && !empty($_GET['backup_timestamp']) && is_numeric($_GET['backup_timestamp']) && UpdraftPlus_Options::user_can_manage()) {
427
  // At some point, it may be worth merging this with the previous section
428
  $updraft_dir = $this->backups_dir_location();
429
 
430
- $findex = isset($_GET['findex']) ? (int)$_GET['findex'] : 0;
431
  $backup_timestamp = $_GET['backup_timestamp'];
432
  $what = $_GET['what'];
433
 
@@ -448,7 +478,7 @@ class UpdraftPlus {
448
  }
449
  }
450
  if (empty($filename) || !is_readable($updraft_dir.'/'.basename($filename))) {
451
- echo json_encode(array('result' => __('UpdraftPlus notice:','updraftplus').' '.__('The given file was not found, or could not be read.','updraftplus')));
452
  exit;
453
  }
454
 
@@ -464,7 +494,7 @@ class UpdraftPlus {
464
  public function get_table_prefix($allow_override = false) {
465
  global $wpdb;
466
  if (is_multisite() && !defined('MULTISITE')) {
467
- # In this case (which should only be possible on installs upgraded from pre WP 3.0 WPMU), $wpdb->get_blog_prefix() cannot be made to return the right thing. $wpdb->base_prefix is not explicitly marked as public, so we prefer to use get_blog_prefix if we can, for future compatibility.
468
  $prefix = $wpdb->base_prefix;
469
  } else {
470
  $prefix = $wpdb->get_blog_prefix(0);
@@ -483,17 +513,17 @@ class UpdraftPlus {
483
 
484
  public function show_admin_warning_unreadablelog() {
485
  global $updraftplus_admin;
486
- $updraftplus_admin->show_admin_warning('<strong>'.__('UpdraftPlus notice:','updraftplus').'</strong> '.__('The log file could not be read.','updraftplus'));
487
  }
488
 
489
  public function show_admin_warning_nolog() {
490
  global $updraftplus_admin;
491
- $updraftplus_admin->show_admin_warning('<strong>'.__('UpdraftPlus notice:','updraftplus').'</strong> '.__('No log files were found.','updraftplus'));
492
  }
493
 
494
  public function show_admin_warning_unreadablefile() {
495
  global $updraftplus_admin;
496
- $updraftplus_admin->show_admin_warning('<strong>'.__('UpdraftPlus notice:','updraftplus').'</strong> '.__('The given file was not found, or could not be read.','updraftplus'));
497
  }
498
 
499
  public function plugins_loaded() {
@@ -502,47 +532,64 @@ class UpdraftPlus {
502
  load_plugin_textdomain('updraftplus', false, basename(dirname(__FILE__)).'/languages/');
503
 
504
  // The Google Analyticator plugin does something horrible: loads an old version of the Google SDK on init, always - which breaks us
505
- if ((defined('DOING_CRON') && DOING_CRON) || (defined('DOING_AJAX') && DOING_AJAX && isset($_REQUEST['subaction']) && 'backupnow' == $_REQUEST['subaction']) || (isset($_GET['page']) && $_GET['page'] == 'updraftplus')) {
506
  remove_action('init', 'ganalyticator_stats_init');
507
  // Appointments+ does the same; but provides a cleaner way to disable it
508
  @define('APP_GCAL_DISABLE', true);
509
  }
510
 
511
  if (file_exists(UPDRAFTPLUS_DIR.'/central/bootstrap.php')) {
512
- add_action('updraftplus_remotecontrol_command_classes', array($this, 'updraftplus_remotecontrol_command_classes'));
513
  add_action('updraftcentral_command_class_wanted', array($this, 'updraftcentral_command_class_wanted'));
514
- require_once(UPDRAFTPLUS_DIR.'/central/bootstrap.php');
515
  }
516
 
517
  }
518
 
519
- // Register our class
 
 
 
 
 
 
520
  public function updraftplus_remotecontrol_command_classes($command_classes) {
521
  if (is_array($command_classes)) $command_classes['updraftplus'] = 'UpdraftCentral_UpdraftPlus_Commands';
522
  return $command_classes;
523
  }
524
 
525
- // Load the class when required
 
 
 
 
526
  public function updraftcentral_command_class_wanted($command_php_class) {
527
  if ('UpdraftCentral_UpdraftPlus_Commands' == $command_php_class) {
528
- require_once(UPDRAFTPLUS_DIR.'/includes/class-updraftcentral-updraftplus-commands.php');
529
  }
530
  }
531
 
532
- // Cleans up temporary files found in the updraft directory (and some in the site root - pclzip)
533
- // Always cleans up temporary files over 12 hours old.
534
- // With parameters, also cleans up those.
535
- // Also cleans out old job data older than 12 hours old (immutable value)
536
- // include_cachelist also looks to match any files of cached file analysis data
 
 
 
 
 
 
 
537
  public function clean_temporary_files($match = '', $older_than = 43200, $include_cachelist = false) {
538
- # Clean out old job data
539
  if ($older_than > 10000) {
540
  global $wpdb;
541
 
542
  $all_jobs = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE 'updraft_jobdata_%'", ARRAY_A);
543
  foreach ($all_jobs as $job) {
544
  $val = maybe_unserialize($job['option_value']);
545
- # TODO: Can simplify this after a while (now all jobs use job_time_ms) - 1 Jan 2014
546
  $delete = false;
547
  if (!empty($val['next_increment_start_scheduled_for'])) {
548
  if (time() > $val['next_increment_start_scheduled_for'] + 86400) $delete = true;
@@ -557,7 +604,8 @@ class UpdraftPlus {
557
  }
558
  }
559
  $updraft_dir = $this->backups_dir_location();
560
- $now_time=time();
 
561
  if ($handle = opendir($updraft_dir)) {
562
  while (false !== ($entry = readdir($handle))) {
563
  $manifest_match = preg_match("/^udmanifest$match\.json$/i", $entry);
@@ -567,25 +615,27 @@ class UpdraftPlus {
567
  $binzip_match = preg_match("/^zi([A-Za-z0-9]){6}$/", $entry);
568
  $cachelist_match = ($include_cachelist) ? preg_match("/$match-cachelist-.*.tmp$/i", $entry) : false;
569
  $browserlog_match = preg_match('/^log\.[0-9a-f]+-browser\.txt$/', $entry);
570
- # Temporary files from the database dump process - not needed, as is caught by the catch-all
571
- # $table_match = preg_match("/${match}-table-(.*)\.table(\.tmp)?\.gz$/i", $entry);
572
- # The gz goes in with the txt, because we *don't* want to reap the raw .txt files
573
  if ((preg_match("/$match\.(tmp|table|txt\.gz)(\.gz)?$/i", $entry) || $cachelist_match || $ziparchive_match || $binzip_match || $manifest_match || $browserlog_match) && is_file($updraft_dir.'/'.$entry)) {
574
  // We delete if a parameter was specified (and either it is a ZipArchive match or an order to delete of whatever age), or if over 12 hours old
575
  if (($match && ($ziparchive_match || $binzip_match || $cachelist_match || $manifest_match || 0 == $older_than) && $now_time-filemtime($updraft_dir.'/'.$entry) >= $older_than) || $now_time-filemtime($updraft_dir.'/'.$entry)>43200) {
576
- $this->log("Deleting old temporary file: $entry");
 
577
  @unlink($updraft_dir.'/'.$entry);
 
578
  }
579
  }
580
  }
581
  @closedir($handle);
582
  }
583
- # Depending on the PHP setup, the current working directory could be ABSPATH or wp-admin - scan both
584
- # Since 1.9.32, we set them to go into $updraft_dir, so now we must check there too. Checking the old ones doesn't hurt, as other backup plugins might leave their temporary files around can cause issues with huge files.
585
  foreach (array(ABSPATH, ABSPATH.'wp-admin/', $updraft_dir.'/') as $path) {
586
  if ($handle = opendir($path)) {
587
  while (false !== ($entry = readdir($handle))) {
588
- # With the old pclzip temporary files, there is no need to keep them around after they're not in use - so we don't use $older_than here - just go for 15 minutes
589
  if (preg_match("/^pclzip-[a-z0-9]+.tmp$/", $entry) && $now_time-filemtime($path.$entry) >= 900) {
590
  $this->log("Deleting old PclZip temporary file: $entry");
591
  @unlink($path.$entry);
@@ -616,14 +666,14 @@ class UpdraftPlus {
616
 
617
  /**
618
  * Opens the log file, writes a standardised header, and stores the resulting name and handle in the class variables logfile_name/logfile_handle/opened_log_time (and possibly backup_is_already_complete)
619
- *
620
  * @param string $nonce - Used in the log file name to distinguish it from other log files. Should be the job nonce.
621
  * @returns void
622
  */
623
  public function logfile_open($nonce) {
624
 
625
  $updraft_dir = $this->backups_dir_location();
626
- $this->logfile_name = $updraft_dir."/log.$nonce.txt";
627
 
628
  if (file_exists($this->logfile_name)) {
629
  $seek_to = max((filesize($this->logfile_name) - 340), 1);
@@ -632,9 +682,9 @@ class UpdraftPlus {
632
  // Returns 0 on success
633
  if (0 === @fseek($handle, $seek_to)) {
634
  $bytes_back = filesize($this->logfile_name) - $seek_to;
635
- # Return to the end of the file
636
  $read_recent = fread($handle, $bytes_back);
637
- # Move to end of file - ought to be redundant
638
  if (false !== strpos($read_recent, ') The backup apparently succeeded') && false !== strpos($read_recent, 'and is now complete')) {
639
  $this->backup_is_already_complete = true;
640
  }
@@ -653,7 +703,7 @@ class UpdraftPlus {
653
 
654
  /**
655
  * Writes a standardised header to the log file, using the specified logging function, which needs to be compatible with (or to be) UpdraftPlus::log()
656
- *
657
  * @param callable $logging_function
658
  */
659
  public function write_log_header($logging_function) {
@@ -674,7 +724,7 @@ class UpdraftPlus {
674
 
675
  // Attempt to raise limit to avoid false positives
676
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
677
- $max_execution_time = (int)@ini_get("max_execution_time");
678
 
679
  $logline = "UpdraftPlus WordPress backup plugin (https://updraftplus.com): ".$this->version." WP: ".$wp_version." PHP: ".phpversion()." (".PHP_SAPI.", ".@php_uname().") MySQL: $mysql_version WPLANG: ".get_locale()." Server: ".$_SERVER["SERVER_SOFTWARE"]." safe_mode: $safe_mode max_execution_time: $max_execution_time memory_limit: $memory_limit (used: ${memory_usage}M | ${memory_usage2}M) multisite: ".(is_multisite() ? 'Y' : 'N')." openssl: ".(defined('OPENSSL_VERSION_TEXT') ? OPENSSL_VERSION_TEXT : 'N')." mcrypt: ".(function_exists('mcrypt_encrypt') ? 'Y' : 'N')." LANG: ".getenv('LANG')." ZipArchive::addFile: ";
680
 
@@ -711,8 +761,8 @@ class UpdraftPlus {
711
  }
712
 
713
  $disk_free_space = @disk_free_space($updraft_dir);
714
- # == rather than === here is deliberate; support experience shows that a result of (int)0 is not reliable. i.e. 0 can be returned when the real result should be false.
715
- if ($disk_free_space == false) {
716
  call_user_func($logging_function, "Free space on disk containing Updraft's temporary directory: Unknown".$quota_free);
717
  } else {
718
  call_user_func($logging_function, "Free space on disk containing Updraft's temporary directory: ".round($disk_free_space/1048576, 1)." MB".$quota_free);
@@ -722,16 +772,19 @@ class UpdraftPlus {
722
 
723
  }
724
 
725
- /* Logs the given line, adding (relative) time stamp and newline
726
- Note these subtleties of log handling:
727
- - Messages at level 'error' are not logged to file - it is assumed that a separate call to log() at another level will take place. This is because at level 'error', messages are translated; whereas the log file is for developers who may not know the translated language. Messages at level 'error' are for the user.
728
- - Messages at level 'error' do not persist through the job (they are only saved with save_backup_history(), and never restored from there - so only the final save_backup_history() errors persist); we presume that either a) they will be cleared on the next attempt, or b) they will occur again on the final attempt (at which point they will go to the user). But...
729
- - ... messages at level 'warning' persist. These are conditions that are unlikely to be cleared, not-fatal, but the user should be informed about. The $uniq_id field (which should not be numeric) can then be used for warnings that should only be logged once
730
- $skip_dblog = true is suitable when there's a risk of excessive logging, and the information is not important for the user to see in the browser on the settings page
731
-
732
- The uniq_id field is also used with PHP event detection - it is set then to 'php_event' - which is useful for anything hooking the action to detect
733
- */
734
-
 
 
 
735
  public function verify_free_memory($how_many_bytes_needed) {
736
  // This returns in MB
737
  $memory_limit = $this->memory_check_current();
@@ -743,12 +796,15 @@ class UpdraftPlus {
743
  return false;
744
  }
745
 
746
- /*
747
- $line - the log line
748
- $level - the log level: notice, warning, error. If suffixed with a hypen and a destination, then the default destination is changed too.
749
- $uniq_id - (string)each of these will only be logged once
750
- $skip_dblog - if true, then do not write to the database
751
- */
 
 
 
752
  public function log($line, $level = 'notice', $uniq_id = false, $skip_dblog = false) {
753
 
754
  $destination = 'default';
@@ -764,9 +820,9 @@ class UpdraftPlus {
764
  } else {
765
  $this->errors[] = array('level' => $level, 'message' => $line);
766
  }
767
- # Errors are logged separately
768
  if ('error' == $level) return;
769
- # It's a warning
770
  $warnings = $this->jobdata_get('warnings');
771
  if (!is_array($warnings)) $warnings = array();
772
  if ($uniq_id) {
@@ -780,41 +836,49 @@ class UpdraftPlus {
780
  if (false === ($line = apply_filters('updraftplus_logline', $line, $this->nonce, $level, $uniq_id, $destination))) return;
781
 
782
  if ($this->logfile_handle) {
783
- # Record log file times relative to the backup start, if possible
784
  $rtime = (!empty($this->job_time_ms)) ? microtime(true)-$this->job_time_ms : microtime(true)-$this->opened_log_time;
785
  fwrite($this->logfile_handle, sprintf("%08.03f", round($rtime, 3))." (".$this->current_resumption.") ".(('notice' != $level) ? '['.ucfirst($level).'] ' : '').$line."\n");
786
  }
787
 
788
  switch ($this->jobdata_get('job_type')) {
789
  case 'download':
790
- // Download messages are keyed on the job (since they could be running several), and type
791
- // The values of the POST array were checked before
792
- $findex = empty($_POST['findex']) ? 0 : $_POST['findex'];
793
-
794
- if (!empty($_POST['timestamp']) && !empty($_POST['type'])) $this->jobdata_set('dlmessage_'.$_POST['timestamp'].'_'.$_POST['type'].'_'.$findex, $line);
795
 
 
796
  break;
 
797
  case 'restore':
798
- #if ('debug' != $level) echo $line."\n";
799
  break;
 
800
  default:
801
- if (!$skip_dblog && 'debug' != $level) UpdraftPlus_Options::update_updraft_option('updraft_lastmessage', $line." (".date_i18n('M d H:i:s').")", false);
802
  break;
803
  }
804
 
805
- if (defined('UPDRAFTPLUS_CONSOLELOG')) print $line."\n";
806
- if (defined('UPDRAFTPLUS_BROWSERLOG')) print htmlentities($line)."<br>\n";
807
  }
808
 
809
  public function log_removewarning($uniq_id) {
810
  $warnings = $this->jobdata_get('warnings');
811
- if (!is_array($warnings)) $warnings=array();
812
  unset($warnings[$uniq_id]);
813
  $this->jobdata_set('warnings', $warnings);
814
  unset($this->errors[$uniq_id]);
815
  }
816
 
817
- # For efficiency, you can also feed false or a string into this function
 
 
 
 
 
 
 
818
  public function log_wp_error($err, $echo = false, $logerror = false) {
819
  if (false === $err) return false;
820
  if (is_string($err)) {
@@ -838,37 +902,41 @@ class UpdraftPlus {
838
  }
839
  }
840
  }
841
- # Returns false so that callers can return with false more efficiently if they wish
842
  return false;
843
  }
844
 
845
  public function get_max_packet_size() {
846
  global $wpdb;
847
- $mp = (int)$wpdb->get_var("SELECT @@session.max_allowed_packet");
848
- # Default to 1MB
849
  $mp = (is_numeric($mp) && $mp > 0) ? $mp : 1048576;
850
- # 32MB
851
  if ($mp < 33554432) {
852
  $save = $wpdb->show_errors(false);
853
  $req = @$wpdb->query("SET GLOBAL max_allowed_packet=33554432");
854
  $wpdb->show_errors($save);
855
- if (!$req) $this->log("Tried to raise max_allowed_packet from ".round($mp/1048576,1)." MB to 32 MB, but failed (".$wpdb->last_error.", ".serialize($req).")");
856
- $mp = (int)$wpdb->get_var("SELECT @@session.max_allowed_packet");
857
- # Default to 1MB
858
  $mp = (is_numeric($mp) && $mp > 0) ? $mp : 1048576;
859
  }
860
  $this->log("Max packet size: ".round($mp/1048576, 1)." MB");
861
  return $mp;
862
  }
863
 
864
- # Q. Why is this abstracted into a separate function? A. To allow poedit and other parsers to pick up the need to translate strings passed to it (and not pick up all of those passed to log()).
865
- # 1st argument = the line to be logged (obligatory)
866
- # Further arguments = parameters for sprintf()
 
 
 
 
867
  public function log_e() {
868
  $args = func_get_args();
869
- # Get first argument
870
  $pre_line = array_shift($args);
871
- # Log it whilst still in English
872
  if (is_wp_error($pre_line)) {
873
  $this->log_wp_error($pre_line);
874
  } else {
@@ -879,7 +947,15 @@ class UpdraftPlus {
879
  }
880
  }
881
 
882
- // This function is used by cloud methods to provide standardised logging, but more importantly to help us detect that meaningful activity took place during a resumption run, so that we can schedule further resumptions if it is worthwhile
 
 
 
 
 
 
 
 
883
  public function record_uploaded_chunk($percent, $extra = '', $file_path = false, $log_it = true) {
884
 
885
  // Touch the original file, which helps prevent overlapping runs
@@ -908,14 +984,15 @@ class UpdraftPlus {
908
  /**
909
  * Method for helping remote storage methods to upload files in chunks without needing to duplicate all the overhead
910
  *
911
- * @param string $file the full path to the file
912
- * @param object $caller the object to call back to do the actual network API calls; needs to have a chunked_upload() method.
913
- * @param string $cloudpath this is passed back to the callback function; within this function, it is used only for logging
914
- * @param string $logname the prefix used on log lines. Also passed back to the callback function.
915
- * @param integer $chunk_size the size, in bytes, of each upload chunk
916
- * @param integer $uploaded_size how many bytes have already been uploaded. This is passed back to the callback function; within this method, it is only used for logging.
917
- * @param boolean $singletons when the file, given the chunk size, would only have one chunk, should that be uploaded (true), or instead should 1 be returned (false) ?
918
- */
 
919
  public function chunked_upload($caller, $file, $cloudpath, $logname, $chunk_size, $uploaded_size, $singletons = false) {
920
 
921
  $fullpath = $this->backups_dir_location().'/'.$file;
@@ -936,7 +1013,7 @@ class UpdraftPlus {
936
 
937
  if (false == ($fp = @fopen($fullpath, 'rb'))) {
938
  $this->log("$logname: failed to open file: $fullpath");
939
- $this->log("$file: ".sprintf(__('%s Error: Failed to open local file','updraftplus'), $logname), 'error');
940
  return false;
941
  }
942
 
@@ -1007,14 +1084,17 @@ class UpdraftPlus {
1007
  if ($uploaded) {
1008
  $perc = round(100*($upload_end + 1)/max($orig_file_size, 1), 1);
1009
  // Consumers use a return value of (int)1 (rather than (bool)true) to suppress logging
1010
- $log_it = ($uploaded === 1) ? false : true;
1011
  $this->record_uploaded_chunk($perc, $chunk_index, $fullpath, $log_it);
1012
 
1013
  // $uploaded_bytes = $upload_end + 1;
1014
 
1015
  } else {
1016
  $errors_so_far++;
1017
- if ($errors_so_far >= 3) { @fclose($fp); return false; }
 
 
 
1018
  }
1019
 
1020
  $chunk_index++;
@@ -1039,7 +1119,7 @@ class UpdraftPlus {
1039
  }
1040
  if ($ret) {
1041
  $this->log("$logname upload: success");
1042
- # UpdraftPlus_RemoteStorage_Addons_Base calls this itself
1043
  if (!is_a($caller, 'UpdraftPlus_RemoteStorage_Addons_Base')) $this->uploaded_file($file);
1044
  }
1045
 
@@ -1050,13 +1130,13 @@ class UpdraftPlus {
1050
 
1051
  /**
1052
  * Provides a convenience function allowing remote storage methods to download a file in chunks, without duplicated overhead.
1053
- *
1054
- * @param string $file - The basename of the file being downloaded
1055
- * @param object $method - This remote storage method object needs to have a chunked_download() method to call back
1056
- * @param integer $remote_size - The size, in bytes, of the object being downloaded
1057
  * @param boolean $manually_break_up - Whether to break the download into multiple network operations (rather than just issuing a GET with a range beginning at the end of the already-downloaded data, and carrying on until it times out)
1058
- * @param * $passback - A value to pass back to the callback function
1059
- * @param integer $chunk_size - Break up the download into chunks of this number of bytes. Should be set if and only if $manually_break_up is true.
1060
  */
1061
  public function chunked_download($file, $method, $remote_size, $manually_break_up = false, $passback = null, $chunk_size = 1048576) {
1062
 
@@ -1074,13 +1154,13 @@ class UpdraftPlus {
1074
  // N.B. We use ftell(), which precludes us from using open in append-only ('a') mode - see https://php.net/manual/en/function.fopen.php
1075
  if (!($fh = fopen($fullpath, 'c'))) {
1076
  $this->log("Error opening local file: $fullpath");
1077
- $this->log($file.": ".__("Error",'updraftplus').": ".__('Error opening local file: Failed to download','updraftplus'), 'error');
1078
  return false;
1079
  }
1080
 
1081
- $last_byte = ($manually_break_up) ? min($remote_size, $start_offset + $chunk_size ) : $remote_size;
1082
 
1083
- # This only affects logging
1084
  $expected_bytes_delivered_so_far = true;
1085
 
1086
  while ($start_offset < $remote_size) {
@@ -1118,7 +1198,7 @@ class UpdraftPlus {
1118
  // fseek returns - on success
1119
  if (false == ($fh = fopen($fullpath, 'c')) || 0 !== fseek($fh, $ret)) {
1120
  $this->log("Error opening local file: $fullpath");
1121
- $this->log($file.": ".__("Error",'updraftplus').": ".__('Error opening local file: Failed to download','updraftplus'), 'error');
1122
  return false;
1123
  }
1124
  }
@@ -1140,9 +1220,9 @@ class UpdraftPlus {
1140
 
1141
  }
1142
 
1143
- } catch(Exception $e) {
1144
  $this->log('Error ('.get_class($e).') - failed to download the file ('.$e->getCode().', '.$e->getMessage().')');
1145
- $this->log("$file: ".__('Error - failed to download the file', 'updraftplus').' ('.$e->getCode().', '.$e->getMessage().')' ,'error');
1146
  return false;
1147
  }
1148
 
@@ -1153,8 +1233,9 @@ class UpdraftPlus {
1153
 
1154
  /**
1155
  * This will decrypt an encryped db file
1156
- * @param string $fullpath This is the full path to the encrypted file location
1157
- * @param string $key This is the key (satling) to be used when decrypting
 
1158
  * @param boolean $to_temporary_file Use if the resulting file is not intended to be kept
1159
  * @return array This bring back an array of full decrypted path
1160
  */
@@ -1170,14 +1251,14 @@ class UpdraftPlus {
1170
  }
1171
  }
1172
 
1173
- //open file to read
1174
  if (false === ($file_handle = fopen($fullpath, 'rb'))) return false;
1175
 
1176
  $decrypted_path = dirname($fullpath).'/decrypt_'.basename($fullpath).'.tmp';
1177
- //open new file from new path
1178
  if (false === ($decrypted_handle = fopen($decrypted_path, 'wb+'))) return false;
1179
 
1180
- //setup encryption
1181
  $rijndael = new Crypt_Rijndael();
1182
  $rijndael->setKey($key);
1183
  $rijndael->disablePadding();
@@ -1187,16 +1268,16 @@ class UpdraftPlus {
1187
  $bytes_decrypted = 0;
1188
  $buffer_size = defined('UPDRAFTPLUS_CRYPT_BUFFER_SIZE') ? UPDRAFTPLUS_CRYPT_BUFFER_SIZE : 2097152;
1189
 
1190
- //loop around the file
1191
  while ($bytes_decrypted < $file_size) {
1192
- //read buffer sized amount from file
1193
  if (false === ($file_part = fread($file_handle, $buffer_size))) return false;
1194
- //check to ensure padding is needed before decryption
1195
  $length = strlen($file_part);
1196
- if ($length % 16 != 0) {
1197
  $pad = 16 - ($length % 16);
1198
  $file_part = str_pad($file_part, $length + $pad, chr($pad));
1199
- // $file_part = str_pad($file_part, $length + $pad, chr(0));
1200
  }
1201
 
1202
  $decrypted_data = $rijndael->decrypt($file_part);
@@ -1209,7 +1290,7 @@ class UpdraftPlus {
1209
  $last_byte = ord(substr($decrypted_data, -1, 1));
1210
  if ($last_byte < 16) {
1211
  $is_padding = true;
1212
- for ($j = 1 ; $j<=$last_byte; $j++) {
1213
  if (substr($decrypted_data, -$j, 1) != chr($last_byte)) $is_padding = false;
1214
  }
1215
  }
@@ -1222,12 +1303,12 @@ class UpdraftPlus {
1222
  $bytes_decrypted += $buffer_size;
1223
  }
1224
 
1225
- //close the main file handle
1226
  fclose($decrypted_handle);
1227
- //close original file
1228
  fclose($file_handle);
1229
 
1230
- //remove the crypt extension from the end as this causes issues when opening
1231
  $fullpath_new = preg_replace('/\.crypt$/', '', $fullpath, 1);
1232
  // //need to replace original file with tmp file
1233
 
@@ -1242,7 +1323,7 @@ class UpdraftPlus {
1242
 
1243
  if (false === rename($decrypted_path, $fullpath_new)) return false;
1244
 
1245
- //need to send back the new decrypted path
1246
  $decrypt_return = array(
1247
  'fullpath' => $fullpath_new,
1248
  'basename' => $fullpath_basename
@@ -1252,6 +1333,7 @@ class UpdraftPlus {
1252
  }
1253
 
1254
  public function detect_safe_mode() {
 
1255
  return (@ini_get('safe_mode') && strtolower(@ini_get('safe_mode')) != "off") ? 1 : 0;
1256
  }
1257
 
@@ -1263,7 +1345,7 @@ class UpdraftPlus {
1263
  return false;
1264
  }
1265
  $existing = $this->jobdata_get('binsqldump', null);
1266
- # Theoretically, we could have moved machines, due to a migration
1267
  if (null !== $existing && (!is_string($existing) || @is_executable($existing))) return $existing;
1268
 
1269
  $updraft_dir = $this->backups_dir_location();
@@ -1304,12 +1386,12 @@ class UpdraftPlus {
1304
  $output = '';
1305
  }
1306
  $ret = pclose($handle);
1307
- if ($ret !=0) {
1308
  if ($logit) {
1309
  $this->log("Binary mysqldump: error (code: $ret)");
1310
  }
1311
  } else {
1312
- // $dumped = file_get_contents($updraft_dir.'/'.$tmp_file, false, null, 0, 4096);
1313
  if (stripos($output, 'insert into') !== false) {
1314
  if ($logit) $this->log("Working binary mysqldump found: $potsql");
1315
  $result = $potsql;
@@ -1329,7 +1411,13 @@ class UpdraftPlus {
1329
  return $result;
1330
  }
1331
 
1332
- // We require -@ and -u -r to work - which is the usual Linux binzip
 
 
 
 
 
 
1333
  public function find_working_bin_zip($logit = true, $cacheit = true) {
1334
  if ($this->detect_safe_mode()) return false;
1335
  // The hosting provider may have explicitly disabled the popen or proc_open functions
@@ -1339,7 +1427,7 @@ class UpdraftPlus {
1339
  }
1340
 
1341
  $existing = $this->jobdata_get('binzip', null);
1342
- # Theoretically, we could have moved machines, due to a migration
1343
  if (null !== $existing && (!is_string($existing) || @is_executable($existing))) return $existing;
1344
 
1345
  $updraft_dir = $this->backups_dir_location();
@@ -1347,8 +1435,8 @@ class UpdraftPlus {
1347
  if (!@is_executable($potzip)) continue;
1348
  if ($logit) $this->log("Testing: $potzip");
1349
 
1350
- # Test it, see if it is compatible with Info-ZIP
1351
- # If you have another kind of zip, then feel free to tell me about it
1352
  @mkdir($updraft_dir.'/binziptest/subdir1/subdir2', 0777, true);
1353
 
1354
  if (!file_exists($updraft_dir.'/binziptest/subdir1/subdir2')) return false;
@@ -1369,7 +1457,7 @@ class UpdraftPlus {
1369
  if ($w && $logit) $this->log("Output: ".trim($w));
1370
  }
1371
  $ret = pclose($handle);
1372
- if ($ret !=0) {
1373
  if ($logit) $this->log("Binary zip: error (code: $ret)");
1374
  $all_ok = false;
1375
  }
@@ -1378,7 +1466,7 @@ class UpdraftPlus {
1378
  $all_ok = false;
1379
  }
1380
 
1381
- # Now test -@
1382
  if (true == $all_ok) {
1383
  file_put_contents($updraft_dir.'/binziptest/subdir1/subdir2/test2.html', '<html><body><a href="https://updraftplus.com">UpdraftPlus is a really great backup and restoration plugin for WordPress.</a></body></html>');
1384
 
@@ -1386,7 +1474,7 @@ class UpdraftPlus {
1386
  if (defined('UPDRAFTPLUS_BINZIP_OPTS') && UPDRAFTPLUS_BINZIP_OPTS) $exec .= ' '.UPDRAFTPLUS_BINZIP_OPTS;
1387
  $exec .= " -v -@ binziptest/test.zip";
1388
 
1389
- $all_ok=true;
1390
 
1391
  $descriptorspec = array(
1392
  0 => array('pipe', 'r'),
@@ -1415,7 +1503,7 @@ class UpdraftPlus {
1415
  fclose($pipes[2]);
1416
 
1417
  $ret = proc_close($handle);
1418
- if ($ret !=0) {
1419
  if ($logit) $this->log("Binary zip: error (code: $ret)");
1420
  $all_ok = false;
1421
  }
@@ -1435,13 +1523,13 @@ class UpdraftPlus {
1435
  $found_second = false;
1436
  if ($all_ok && file_exists($updraft_dir.'/binziptest/test.zip')) {
1437
  if (function_exists('gzopen')) {
1438
- if(!class_exists('PclZip')) require_once(ABSPATH.'/wp-admin/includes/class-pclzip.php');
1439
  $zip = new PclZip($updraft_dir.'/binziptest/test.zip');
1440
  $foundit = 0;
1441
  if (($list = $zip->listContent()) != 0) {
1442
  foreach ($list as $obj) {
1443
- if ($obj['filename'] && !empty($obj['stored_filename']) && 'binziptest/subdir1/subdir2/test.html' == $obj['stored_filename'] && $obj['size']==131) $found_first=true;
1444
- if ($obj['filename'] && !empty($obj['stored_filename']) && 'binziptest/subdir1/subdir2/test2.html' == $obj['stored_filename'] && $obj['size']==138) $found_second=true;
1445
  }
1446
  }
1447
  } else {
@@ -1477,7 +1565,11 @@ class UpdraftPlus {
1477
  @rmdir($updraft_dir.'/binziptest');
1478
  }
1479
 
1480
- // This function is purely for timing - we just want to know the maximum run-time; not whether we have achieved anything during it
 
 
 
 
1481
  public function record_still_alive() {
1482
  // Update the record of maximum detected runtime on each run
1483
  $time_passed = $this->jobdata_get('run_times');
@@ -1490,8 +1582,8 @@ class UpdraftPlus {
1490
  $resume_interval = $this->jobdata_get('resume_interval');
1491
  if ($time_this_run + 30 > $resume_interval) {
1492
  $new_interval = ceil($time_this_run + 30);
1493
- set_site_transient('updraft_initial_resume_interval', (int)$new_interval, 8*86400);
1494
- $this->log("The time we have been running (".round($time_this_run,1).") is approaching the resumption interval ($resume_interval) - increasing resumption interval to $new_interval");
1495
  $this->jobdata_set('resume_interval', $new_interval);
1496
  }
1497
 
@@ -1544,7 +1636,8 @@ class UpdraftPlus {
1544
  'nonce' => $matches[3],
1545
  'type' => $matches[4],
1546
  'index' => (empty($matches[5]) ? 0 : $matches[5]-1),
1547
- 'extension' => $matches[6]);
 
1548
  } else {
1549
  return false;
1550
  }
@@ -1552,22 +1645,32 @@ class UpdraftPlus {
1552
 
1553
  /**
1554
  * Indicate which checksums to take for backup files. Abstracted for extensibilty and future changes.
1555
- *
1556
  * @returns array - a list of hashing algorithms, as understood by PHP's hash() function
1557
  */
1558
  public function which_checksums() {
1559
  return apply_filters('updraftplus_which_checksums', array('sha1', 'sha256'));
1560
  }
1561
 
1562
- // Pretty printing
1563
- public function printfile($description, $history, $entity, $checksums, $jobdata, $smaller=false) {
 
 
 
 
 
 
 
 
 
 
1564
 
1565
  if (empty($history[$entity])) return;
1566
 
1567
  if ($smaller) {
1568
- $pfiles = "<strong>".$description." (".sprintf(__('files: %s', 'updraftplus'), count($history[$entity])).")</strong><br>\n";
1569
  } else {
1570
- $pfiles = "<h3>".$description." (".sprintf(__('files: %s', 'updraftplus'), count($history[$entity])).")</h3>\n\n";
1571
  }
1572
 
1573
  $pfiles .= '<ul>';
@@ -1608,7 +1711,7 @@ class UpdraftPlus {
1608
  }
1609
  }
1610
 
1611
- #if ($meta) $meta = " ($meta)";
1612
  if ($meta) $meta = "<br><em>$meta</em>";
1613
  $pfiles .= '<li>'.$op.$meta."\n</li>\n";
1614
  }
@@ -1619,16 +1722,22 @@ class UpdraftPlus {
1619
 
1620
  }
1621
 
1622
- // This important function returns a list of file entities that can potentially be backed up (subject to users settings), and optionally further meta-data about them
 
 
 
 
 
 
1623
  public function get_backupable_file_entities($include_others = true, $full_info = false) {
1624
 
1625
  $wp_upload_dir = $this->wp_upload_dir();
1626
 
1627
  if ($full_info) {
1628
  $arr = array(
1629
- 'plugins' => array('path' => untrailingslashit(WP_PLUGIN_DIR), 'description' => __('Plugins','updraftplus')),
1630
- 'themes' => array('path' => WP_CONTENT_DIR.'/themes', 'description' => __('Themes','updraftplus')),
1631
- 'uploads' => array('path' => untrailingslashit($wp_upload_dir['basedir']), 'description' => __('Uploads','updraftplus'))
1632
  );
1633
  } else {
1634
  $arr = array(
@@ -1656,33 +1765,72 @@ class UpdraftPlus {
1656
 
1657
  }
1658
 
1659
- # This is just a long-winded way of forcing WP to get the value afresh from the db, instead of using the auto-loaded/cached value (which can be out of date, especially since backups are, by their nature, long-running)
 
 
 
 
 
1660
  public function filter_updraft_backup_history($v) {
1661
  global $wpdb;
1662
- $row = $wpdb->get_row( $wpdb->prepare("SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", 'updraft_backup_history' ) );
1663
- if (is_object($row )) return maybe_unserialize($row->option_value);
1664
  return false;
1665
  }
1666
 
1667
  public function php_error_to_logline($errno, $errstr, $errfile, $errline) {
1668
  switch ($errno) {
1669
- case 1: $e_type = 'E_ERROR'; break;
1670
- case 2: $e_type = 'E_WARNING'; break;
1671
- case 4: $e_type = 'E_PARSE'; break;
1672
- case 8: $e_type = 'E_NOTICE'; break;
1673
- case 16: $e_type = 'E_CORE_ERROR'; break;
1674
- case 32: $e_type = 'E_CORE_WARNING'; break;
1675
- case 64: $e_type = 'E_COMPILE_ERROR'; break;
1676
- case 128: $e_type = 'E_COMPILE_WARNING'; break;
1677
- case 256: $e_type = 'E_USER_ERROR'; break;
1678
- case 512: $e_type = 'E_USER_WARNING'; break;
1679
- case 1024: $e_type = 'E_USER_NOTICE'; break;
1680
- case 2048: $e_type = 'E_STRICT'; break;
1681
- case 4096: $e_type = 'E_RECOVERABLE_ERROR'; break;
1682
- case 8192: $e_type = 'E_DEPRECATED'; break;
1683
- case 16384: $e_type = 'E_USER_DEPRECATED'; break;
1684
- case 30719: $e_type = 'E_ALL'; break;
1685
- default: $e_type = "E_UNKNOWN ($errno)"; break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1686
  }
1687
 
1688
  if (!is_string($errstr)) $errstr = serialize($errstr);
@@ -1731,7 +1879,7 @@ class UpdraftPlus {
1731
  $this->backup_time = $this->jobdata_get('backup_time');
1732
  $this->job_time_ms = $this->jobdata_get('job_time_ms');
1733
 
1734
- # Get the warnings before opening the log file, as opening the log file may generate new ones (which then leads to $this->errors having duplicate entries when they are copied over below)
1735
  $warnings = $this->jobdata_get('warnings');
1736
 
1737
  $this->logfile_open($bnonce);
@@ -1744,7 +1892,7 @@ class UpdraftPlus {
1744
  }
1745
 
1746
  $runs_started = $this->jobdata_get('runs_started');
1747
- if (!is_array($runs_started)) $runs_started=array();
1748
  $time_passed = $this->jobdata_get('run_times');
1749
  if (!is_array($time_passed)) $time_passed = array();
1750
 
@@ -1831,12 +1979,12 @@ class UpdraftPlus {
1831
 
1832
  if ($resumption_no > 0 && isset($runs_started[$prev_resumption])) {
1833
  $our_expected_start = $runs_started[$prev_resumption] + $resume_interval;
1834
- # If the previous run increased the resumption time, then it is timed from the end of the previous run, not the start
1835
  if (isset($time_passed[$prev_resumption]) && $time_passed[$prev_resumption]>0) $our_expected_start += $time_passed[$prev_resumption];
1836
  $our_expected_start = apply_filters('updraftplus_expected_start', $our_expected_start, $job_type);
1837
- # More than 12 minutes late?
1838
  if ($time_now > $our_expected_start + 720) {
1839
- $this->log('Long time past since expected resumption time: approx expected='.round($our_expected_start,1).", now=".round($time_now, 1).", diff=".round($time_now-$our_expected_start,1));
1840
  $this->log(__('Your website is visited infrequently and UpdraftPlus is not getting the resources it hoped for; please read this page:', 'updraftplus').' https://updraftplus.com/faqs/why-am-i-getting-warnings-about-my-site-not-having-enough-visitors/', 'warning', 'infrequentvisits');
1841
  }
1842
  }
@@ -1851,7 +1999,7 @@ class UpdraftPlus {
1851
  // $time_passed is set earlier
1852
  list($max_time, $timings_string, $run_times_known) = $this->max_time_passed($time_passed, $resumption_no - 1, $first_run);
1853
 
1854
- # Do this on resumption 8, or the first time that we have 6 data points
1855
  if (($first_run + 8 == $resumption_no && $run_times_known >= 6) || (6 == $run_times_known && !empty($time_passed[$prev_resumption]))) {
1856
  $this->log("Time passed on previous resumptions: $timings_string (known: $run_times_known, max: $max_time)");
1857
  // Remember that 30 seconds is used as the 'perhaps something is still running' detection threshold, and that 45 seconds is used as the 'the next resumption is approaching - reschedule!' interval
@@ -1912,29 +2060,42 @@ class UpdraftPlus {
1912
 
1913
  global $updraftplus_backup;
1914
  // Bring in all the backup routines
1915
- require_once(UPDRAFTPLUS_DIR.'/backup.php');
1916
  $updraftplus_backup = new UpdraftPlus_Backup($backup_files, apply_filters('updraftplus_files_altered_since', -1, $job_type));
1917
 
1918
  $undone_files = array();
1919
-
1920
  if ('no' == $backup_files) {
1921
  $this->log("This backup run is not intended for files - skipping");
1922
  $our_files = array();
1923
  } else {
1924
-
1925
- // This should be always called; if there were no files in this run, it returns us an empty array
1926
- $backup_array = $updraftplus_backup->resumable_backup_of_files($resumption_no);
1927
-
1928
- // This save, if there was something, is then immediately picked up again
1929
- if (is_array($backup_array)) {
1930
- $this->log('Saving backup status to database (elements: '.count($backup_array).")");
1931
- $this->save_backup_history($backup_array);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1932
  }
1933
 
1934
- // Switch of variable name is purely vestigial
1935
- $our_files = $backup_array;
1936
- if (!is_array($our_files)) $our_files = array();
1937
-
1938
  }
1939
 
1940
  $backup_databases = $this->jobdata_get('backup_database');
@@ -1982,9 +2143,25 @@ class UpdraftPlus {
1982
  continue;
1983
  }
1984
 
1985
- $db_backup = $updraftplus_backup->backup_db($backup_database, $whichdb, $dbinfo);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1986
 
1987
- if(is_array($our_files) && is_string($db_backup)) $our_files[$tindex] = $db_backup;
1988
 
1989
  if ('encrypted' != $backup_database) {
1990
  $backup_databases[$whichdb] = array('status' => 'finished', 'dbinfo' => $dbinfo);
@@ -2100,9 +2277,24 @@ class UpdraftPlus {
2100
  }
2101
 
2102
  $this->log("Requesting upload of the files that have not yet been successfully uploaded (".count($undone_files).")");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2103
 
2104
- $updraftplus_backup->cloud_backup($undone_files);
2105
-
2106
  $this->log("Resume backup ($bnonce, $resumption_no): finish run");
2107
  if (is_array($our_files)) $this->save_last_backup($our_files);
2108
  $this->backup_finish($next_resumption, true, true, $resumption_no);
@@ -2130,11 +2322,11 @@ class UpdraftPlus {
2130
  for ($i=$first_run; $i<=$upto; $i++) {
2131
  $timings_string .= "$i:";
2132
  if (isset($time_passed[$i])) {
2133
- $timings_string .= round($time_passed[$i], 1).' ';
2134
  $run_times_known++;
2135
  if ($time_passed[$i] > $max_time) $max_time = round($time_passed[$i]);
2136
  } else {
2137
- $timings_string .= '? ';
2138
  }
2139
  }
2140
  return array($max_time, $timings_string, $run_times_known);
@@ -2149,7 +2341,11 @@ class UpdraftPlus {
2149
  if (!empty($this->nonce)) update_site_option("updraft_jobdata_".$this->nonce, $this->jobdata);
2150
  }
2151
 
2152
- // This works with any amount of settings, but we provide also a jobdata_set for efficiency as normally there's only one setting
 
 
 
 
2153
  public function jobdata_set_multi() {
2154
  if (!is_array($this->jobdata)) $this->jobdata = array();
2155
 
@@ -2235,12 +2431,12 @@ class UpdraftPlus {
2235
  }
2236
 
2237
  public function backup_files() {
2238
- # Note that the "false" for database gets over-ridden automatically if they turn out to have the same schedules
2239
  $this->boot_backup(true, false);
2240
  }
2241
 
2242
  public function backup_database() {
2243
- # Note that nothing will happen if the file backup had the same schedule
2244
  $this->boot_backup(false, true);
2245
  }
2246
 
@@ -2259,8 +2455,18 @@ class UpdraftPlus {
2259
  $this->boot_backup(0, 1, false, false, ($skip_cloud) ? 'none' : false, $options);
2260
  }
2261
 
2262
- // This procedure initiates a backup run
2263
- // $backup_files/$backup_database: true/false = yes/no (over-write allowed); 1/0 = yes/no (force)
 
 
 
 
 
 
 
 
 
 
2264
  public function boot_backup($backup_files, $backup_database, $restrict_files_to_override = false, $one_shot = false, $service = false, $options = array()) {
2265
 
2266
  @ignore_user_abort(true);
@@ -2276,7 +2482,7 @@ class UpdraftPlus {
2276
 
2277
  if (!is_file($this->logfile_name)) {
2278
  $this->log('Failed to open log file ('.$this->logfile_name.') - you need to check your UpdraftPlus settings (your chosen directory for creating files in is not writable, or you ran out of disk space). Backup aborted.');
2279
- $this->log(__('Could not create files in the backup directory. Backup aborted - check your UpdraftPlus settings.','updraftplus'), 'error');
2280
  return false;
2281
  }
2282
 
@@ -2288,8 +2494,8 @@ class UpdraftPlus {
2288
 
2289
  // The is_bool() check here is confirming that we're allowed to adjust the parameters
2290
  if (false === $one_shot && is_bool($backup_database)) {
2291
- # If the files and database schedules are the same, and if this the file one, then we rope in database too.
2292
- # On the other hand, if the schedules were the same and this was the database run, then there is nothing to do.
2293
 
2294
  $files_schedule = UpdraftPlus_Options::get_updraft_option('updraft_interval');
2295
  $db_schedule = UpdraftPlus_Options::get_updraft_option('updraft_interval_database');
@@ -2299,7 +2505,7 @@ class UpdraftPlus {
2299
  if ('manual' != $files_schedule) {
2300
  if ($files_schedule == $db_schedule || UpdraftPlus_Options::get_updraft_option('updraft_interval_database', 'xyz') == 'xyz') {
2301
  $sched_log_extra = 'Combining jobs from identical schedules. ';
2302
- $backup_database = ($backup_files == true) ? true : false;
2303
  } elseif ($files_schedule && $db_schedule && $files_schedule != $db_schedule) {
2304
 
2305
  // This stored value is the earliest of the two apparently-close jobs
@@ -2352,7 +2558,7 @@ class UpdraftPlus {
2352
  if (!is_array($service)) $service = array('none');
2353
 
2354
  if (!empty($options['extradata']) && preg_match('#services=remotesend/(\d+)#', $options['extradata'])) {
2355
- if ($service === array('none')) $service = array();
2356
  $service[] = 'remotesend';
2357
  }
2358
 
@@ -2402,7 +2608,7 @@ class UpdraftPlus {
2402
  }
2403
  update_option("updraft_last_scheduled_$semaphore", time());
2404
 
2405
- require_once(UPDRAFTPLUS_DIR.'/includes/class-semaphore.php');
2406
  $this->semaphore = UpdraftPlus_Semaphore::factory();
2407
  $this->semaphore->lock_name = $semaphore;
2408
 
@@ -2423,9 +2629,9 @@ class UpdraftPlus {
2423
  if (defined('UPDRAFTPLUS_INITIAL_RESUME_INTERVAL') && is_numeric(UPDRAFTPLUS_INITIAL_RESUME_INTERVAL)) {
2424
  $resume_interval = UPDRAFTPLUS_INITIAL_RESUME_INTERVAL;
2425
  } else {
2426
- $resume_interval = (int)min(max(300, get_site_transient('updraft_initial_resume_interval')), 600);
2427
  }
2428
- # We delete it because we only want to know about behaviour found during the very last backup run (so, if you move servers then old data is not retained)
2429
  delete_site_transient('updraft_initial_resume_interval');
2430
 
2431
  $job_file_entities = array();
@@ -2446,19 +2652,32 @@ class UpdraftPlus {
2446
  $split_every = max(intval(UpdraftPlus_Options::get_updraft_option('updraft_split_every', 400)), UPDRAFTPLUS_SPLIT_MIN);
2447
 
2448
  $initial_jobdata = array(
2449
- 'resume_interval', $resume_interval,
2450
- 'job_type', 'backup',
2451
- 'jobstatus', 'begun',
2452
- 'backup_time', $this->backup_time,
2453
- 'job_time_ms', $this->job_time_ms,
2454
- 'service', $service,
2455
- 'split_every', $split_every,
2456
- 'maxzipbatch', 26214400, #25MB
2457
- 'job_file_entities', $job_file_entities,
2458
- 'option_cache', $option_cache,
2459
- 'uploaded_lastreset', 9,
2460
- 'one_shot', $one_shot,
2461
- 'followsups_allowed', $followups_allowed
 
 
 
 
 
 
 
 
 
 
 
 
 
2462
  );
2463
 
2464
  if ($one_shot) update_site_option('updraft_oneshotnonce', $this->nonce);
@@ -2497,12 +2716,16 @@ class UpdraftPlus {
2497
 
2498
  }
2499
 
2500
- // This function examines inside the updraft directory to see if any new archives have been uploaded. If so, it adds them to the backup set. (Non-present items are also removed, only if the service is 'none').
2501
- // If $remotescan is set, then remote storage is also scanned
2502
- // $only_add_this_file : an array with keys 'name' and (optionally) 'label'
 
 
 
 
2503
  public function rebuild_backup_history($remotescan = false, $only_add_this_file = false) {
2504
 
2505
- # TODO: Make compatible with incremental naming scheme
2506
 
2507
  $messages = array();
2508
  $gmt_offset = get_option('gmt_offset');
@@ -2521,20 +2744,21 @@ class UpdraftPlus {
2521
  if (!is_dir($updraft_dir)) return;
2522
 
2523
  $accept = apply_filters('updraftplus_accept_archivename', array());
 
2524
  if (!is_array($accept)) $accept = array();
2525
- // Process what is known from the database backup history; this means populating $known_files and $known_nonces
2526
  foreach ($backup_history as $btime => $bdata) {
2527
  $found_file = false;
2528
  foreach ($bdata as $key => $values) {
2529
  if ('db' != $key && !isset($backupable_entities[$key])) continue;
2530
  // Record which set this file is found in
2531
- if (!is_array($values)) $values=array($values);
2532
  foreach ($values as $val) {
2533
  if (!is_string($val)) continue;
2534
  if (preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+)?+(\.(zip|gz|gz\.crypt))?$/i', $val, $matches)) {
2535
  $nonce = $matches[2];
2536
- if (isset($bdata['service']) && ($bdata['service'] === 'none' || (is_array($bdata['service']) && (array('none') === $bdata['service'] || (1 == count($bdata['service']) && isset($bdata['service'][0]) && empty($bdata['service'][0]))))) && !is_file($updraft_dir.'/'.$val)) {
2537
- # File without remote storage is no longer present
2538
  } else {
2539
  $found_file = true;
2540
  $known_files[$val] = $nonce;
@@ -2547,7 +2771,7 @@ class UpdraftPlus {
2547
  }
2548
  if (!empty($accepted) && (false != ($btime = apply_filters('updraftplus_foreign_gettime', false, $accepted, $val))) && $btime > 0) {
2549
  $found_file = true;
2550
- # Generate a nonce; this needs to be deterministic and based on the filename only
2551
  $nonce = substr(md5($val), 0, 12);
2552
  $known_files[$val] = $nonce;
2553
  $known_nonces[$nonce] = (empty($known_nonces[$nonce]) || $known_nonces[$nonce]<100) ? $btime : min($btime, $known_nonces[$nonce]);
@@ -2556,7 +2780,7 @@ class UpdraftPlus {
2556
  }
2557
  }
2558
  if (!$found_file) {
2559
- # File recorded as being without remote storage is no longer present - though it may in fact exist in remote storage, and this will be picked up later
2560
  unset($backup_history[$btime]);
2561
  $changes = true;
2562
  }
@@ -2564,44 +2788,68 @@ class UpdraftPlus {
2564
 
2565
  $remotefiles = array();
2566
  $remotesizes = array();
2567
- # Scan remote storage and get back lists of files and their sizes
2568
- # TODO: Make compatible with incremental naming
2569
  if ($remotescan) {
2570
  add_action('http_request_args', array($this, 'modify_http_options'));
2571
- foreach ($this->backup_methods as $method => $method_description) {
2572
- require_once(UPDRAFTPLUS_DIR.'/methods/'.$method.'.php');
2573
- $objname = 'UpdraftPlus_BackupModule_'.$method;
2574
- if (!class_exists($objname)) {
2575
- error_log("UpdraftPlus: backup class does not exist: $objname");
 
 
 
 
 
2576
  continue;
2577
  }
2578
- $obj = new $objname;
2579
- if (!method_exists($obj, 'listfiles')) continue;
2580
- $files = $obj->listfiles('backup_');
2581
- if (is_array($files)) {
2582
- foreach ($files as $entry) {
2583
- $n = $entry['name'];
2584
- if (!preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-([\-a-z]+)([0-9]+)?(\.(zip|gz|gz\.crypt))?$/i', $n, $matches)) continue;
2585
- if (isset($remotefiles[$n])) {
2586
- $remotefiles[$n][] = $method;
2587
- } else {
2588
- $remotefiles[$n] = array($method);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2589
  }
2590
- if (!empty($entry['size'])) {
2591
- if (empty($remotesizes[$n]) || $remotesizes[$n] < $entry['size']) $remotesizes[$n] = $entry['size'];
 
 
 
 
 
 
 
 
 
2592
  }
2593
  }
2594
- } elseif (is_wp_error($files)) {
2595
- foreach ($files->get_error_codes() as $code) {
2596
- if ('no_settings' == $code || 'no_addon' == $code || 'insufficient_php' == $code || 'no_listing' == $code) continue;
2597
- $messages[] = array(
2598
- 'method' => $method,
2599
- 'desc' => $method_description,
2600
- 'code' => $code,
2601
- 'message' => $files->get_error_message($code),
2602
- 'data' => $files->get_error_data($code),
2603
- );
2604
- }
2605
  }
2606
  }
2607
  remove_action('http_request_args', array($this, 'modify_http_options'));
@@ -2614,14 +2862,14 @@ class UpdraftPlus {
2614
  $accepted_foreign = false;
2615
  $potmessage = false;
2616
 
2617
- if ($only_add_this_file !== false && $entry != $only_add_this_file['file']) continue;
2618
 
2619
  if ('.' == $entry || '..' == $entry) continue;
2620
 
2621
- # TODO: Make compatible with Incremental naming
2622
  if (preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-([\-a-z]+)([0-9]+)?(\.(zip|gz|gz\.crypt))?$/i', $entry, $matches)) {
2623
  // Interpret the time as one from the blog's local timezone, rather than as UTC
2624
- # $matches[1] is YYYY-MM-DD-HHmm, to be interpreted as being the local timezone
2625
  $btime2 = strtotime($matches[1]);
2626
  $btime = (!empty($gmt_offset)) ? $btime2 - $gmt_offset*3600 : $btime2;
2627
  $nonce = $matches[2];
@@ -2630,9 +2878,9 @@ class UpdraftPlus {
2630
  $type .= (!empty($matches[4])) ? $matches[4] : '';
2631
  $index = 0;
2632
  } else {
2633
- $index = (empty($matches[4])) ? '0' : (max((int)$matches[4]-1,0));
2634
  }
2635
- $itext = ($index == 0) ? '' : $index;
2636
  } elseif (false != ($accepted_foreign = apply_filters('updraftplus_accept_foreign', false, $entry)) && false !== ($btime = apply_filters('updraftplus_foreign_gettime', false, $accepted_foreign, $entry))) {
2637
  $nonce = substr(md5($entry), 0, 12);
2638
  $type = (preg_match('/\.sql(\.(bz2|gz))?$/i', $entry) || preg_match('/-database-([-0-9]+)\.zip$/i', $entry) || preg_match('/backup_db_/', $entry)) ? 'db' : 'wpcore';
@@ -2659,11 +2907,11 @@ class UpdraftPlus {
2659
  // The time from the filename does not include seconds. Need to identify the seconds to get the right time
2660
  if (isset($known_nonces[$nonce])) {
2661
  $btime_exact = $known_nonces[$nonce];
2662
- # TODO: If the btime we had was more than 60 seconds earlier, then this must be an increment - we then need to change the $backup_history array accordingly. We can pad the '60 second' test, as there's no option to run an increment more frequently than every 4 hours (though someone could run one manually from the CLI)
2663
  if ($btime > 100 && $btime_exact - $btime > 60 && !empty($backup_history[$btime_exact])) {
2664
- # TODO: This needs testing
2665
- # The code below assumes that $backup_history[$btime] is presently empty
2666
- # Re-key array, indicating the newly-found time to be the start of the backup set
2667
  $backup_history[$btime] = $backup_history[$btime_exact];
2668
  unset($backup_history[$btime_exact]);
2669
  $btime_exact = $btime;
@@ -2690,8 +2938,8 @@ class UpdraftPlus {
2690
  }
2691
  }
2692
 
2693
- # TODO: Code below here has not been reviewed or adjusted for compatibility with incremental backups
2694
- # Make sure we have the right list of services
2695
  $current_services = (!empty($backup_history[$btime]) && !empty($backup_history[$btime]['service'])) ? $backup_history[$btime]['service'] : array();
2696
  if (is_string($current_services)) $current_services = array($current_services);
2697
  if (!is_array($current_services)) $current_services = array();
@@ -2700,19 +2948,19 @@ class UpdraftPlus {
2700
  $backup_history[$btime]['service'] = $remotefiles[$entry];
2701
  $changes = true;
2702
  }
2703
- # Get the right size (our local copy may be too small)
2704
  foreach ($remotefiles[$entry] as $rem) {
2705
  if (!empty($rem['size']) && $rem['size'] > $fs) {
2706
  $fs = $rem['size'];
2707
  $changes = true;
2708
  }
2709
  }
2710
- # Remove from $remotefiles, so that we can later see what was left over
2711
  unset($remotefiles[$entry]);
2712
  } else {
2713
- # Not known remotely
2714
  if (!empty($backup_history[$btime])) {
2715
- if (empty($backup_history[$btime]['service']) || ('none' !== $backup_history[$btime]['service'] && '' !== $backup_history[$btime]['service'] && array('none') !== $backup_history[$btime]['service'])) {
2716
  $backup_history[$btime]['service'] = 'none';
2717
  $changes = true;
2718
  }
@@ -2728,11 +2976,11 @@ class UpdraftPlus {
2728
  if (!empty($accepted_foreign)) $backup_history[$btime]['meta_foreign'] = $accepted_foreign;
2729
  }
2730
 
2731
- # Any found in remote storage that we did not previously know about?
2732
- # Compare $remotefiles with $known_files / $known_nonces, and adjust $backup_history
2733
  if (count($remotefiles) > 0) {
2734
 
2735
- # $backup_history[$btime]['nonce'] = $nonce
2736
  foreach ($remotefiles as $file => $services) {
2737
  if (!preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-([\-a-z]+)([0-9]+)?(\.(zip|gz|gz\.crypt))?$/i', $file, $matches)) continue;
2738
  $nonce = $matches[2];
@@ -2741,15 +2989,15 @@ class UpdraftPlus {
2741
  $index = 0;
2742
  $type .= !empty($matches[4]) ? $matches[4] : '';
2743
  } else {
2744
- $index = (empty($matches[4])) ? '0' : (max((int)$matches[4]-1,0));
2745
  }
2746
- $itext = ($index == 0) ? '' : $index;
2747
  $btime2 = strtotime($matches[1]);
2748
  $btime = (!empty($gmt_offset)) ? $btime2 - $gmt_offset*3600 : $btime2;
2749
 
2750
  if (isset($known_nonces[$nonce])) $btime = $known_nonces[$nonce];
2751
  if ($btime <= 100) continue;
2752
- # Remember that at this point, we already know that the file is not known about locally
2753
  if (isset($backup_history[$btime])) {
2754
  if (!isset($backup_history[$btime]['service']) || ((is_array($backup_history[$btime]['service']) && $backup_history[$btime]['service'] !== $services) || is_string($backup_history[$btime]['service']) && (1 != count($services) || $services[0] !== $backup_history[$btime]['service']))) {
2755
  $changes = true;
@@ -2798,10 +3046,10 @@ class UpdraftPlus {
2798
  if (0 == $this->error_count() || $force_abort) {
2799
  if ($do_cleanup) {
2800
  $this->log("There were no errors in the uploads, so the 'resume' event ($cancel_event) is being unscheduled");
2801
- # This apparently-worthless setting of metadata before deleting it is for the benefit of a WP install seen where wp_clear_scheduled_hook() and delete_transient() apparently did nothing (probably a faulty cache)
2802
  $this->jobdata_set('jobstatus', 'finished');
2803
  wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event, $this->nonce));
2804
- # This should be unnecessary - even if it does resume, all should be detected as finished; but I saw one very strange case where it restarted, and repeated everything; so, this will help
2805
  wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event+1, $this->nonce));
2806
  wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event+2, $this->nonce));
2807
  wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event+3, $this->nonce));
@@ -2811,7 +3059,7 @@ class UpdraftPlus {
2811
  } else {
2812
  $this->log("There were errors in the uploads, so the 'resume' event is remaining scheduled");
2813
  $this->jobdata_set('jobstatus', 'resumingforerrors');
2814
- # If there were no errors before moving to the upload stage, on the first run, then bring the resumption back very close. Since this is only attempted on the first run, it is really only an efficiency thing for a quicker finish if there was an unexpected networking event. We don't want to do it straight away every time, as it may be that the cloud service is down - and might be up in 5 minutes time. This was added after seeing a case where resumption 0 got to run for 10 hours... and the resumption 7 that should have picked up the uploading of 1 archive that failed never occurred.
2815
  if (isset($this->error_count_before_cloud_backup) && 0 === $this->error_count_before_cloud_backup) {
2816
  if (0 == $resumption_no) {
2817
  $this->reschedule(60);
@@ -2837,7 +3085,7 @@ class UpdraftPlus {
2837
  // - It was the tenth resumption; everything failed
2838
 
2839
  $send_an_email = false;
2840
- # Save the jobdata's state for the reporting - because it might get changed (e.g. incremental backup is scheduled)
2841
  $jobdata_as_was = $this->jobdata;
2842
 
2843
  // Make sure that the final status is shown
@@ -2850,12 +3098,12 @@ class UpdraftPlus {
2850
  $remote_sent = (!empty($service) && ((is_array($service) && in_array('remotesend', $service)) || 'remotesend' === $service)) ? true : false;
2851
  if (0 == $this->error_count('warning')) {
2852
  $final_message = __('The backup apparently succeeded and is now complete', 'updraftplus');
2853
- # Ensure it is logged in English. Not hugely important; but helps with a tiny number of really broken setups in which the options cacheing is broken
2854
  if ('The backup apparently succeeded and is now complete' != $final_message) {
2855
  $this->log('The backup apparently succeeded and is now complete');
2856
  }
2857
  } else {
2858
- $final_message = __('The backup apparently succeeded (with warnings) and is now complete','updraftplus');
2859
  if ('The backup apparently succeeded (with warnings) and is now complete' != $final_message) {
2860
  $this->log('The backup apparently succeeded (with warnings) and is now complete');
2861
  }
@@ -2892,7 +3140,7 @@ class UpdraftPlus {
2892
  if ($force_abort) $jobdata_as_was['aborted'] = true;
2893
  if ($send_an_email) $updraftplus_backup->send_results_email($final_message, $jobdata_as_was);
2894
 
2895
- # Make sure this is the final message logged (so it remains on the dashboard)
2896
  $this->log($final_message);
2897
 
2898
  @fclose($this->logfile_handle);
@@ -2903,7 +3151,12 @@ class UpdraftPlus {
2903
 
2904
  }
2905
 
2906
- // This function returns 'true' if mod_rewrite could be detected as unavailable; a 'false' result may mean it just couldn't find out the answer
 
 
 
 
 
2907
  public function mod_rewrite_unavailable($check_if_in_use_first = true) {
2908
  if (function_exists('apache_get_modules')) {
2909
  global $wp_rewrite;
@@ -2918,7 +3171,9 @@ class UpdraftPlus {
2918
  public function error_count($level = 'error') {
2919
  $count = 0;
2920
  foreach ($this->errors as $err) {
2921
- if (('error' == $level && (is_string($err) || is_wp_error($err))) || (is_array($err) && $level == $err['level']) ) { $count++; }
 
 
2922
  }
2923
  return $count;
2924
  }
@@ -2931,11 +3186,11 @@ class UpdraftPlus {
2931
  echo '<li>'.htmlspecialchars($msg).'<li>';
2932
  }
2933
  } elseif (is_array($err) && ('error' == $err['level'] || 'warning' == $err['level'])) {
2934
- echo "<li>".htmlspecialchars($err['message'])."</li>";
2935
  } elseif (is_string($err)) {
2936
- echo "<li>".htmlspecialchars($err)."</li>";
2937
  } else {
2938
- print "<li>".print_r($err,true)."</li>";
2939
  }
2940
  }
2941
  echo '</ul>';
@@ -2953,17 +3208,24 @@ class UpdraftPlus {
2953
  UpdraftPlus_Options::update_updraft_option('updraft_last_backup', $last_backup, false);
2954
  }
2955
 
2956
- # $handle must be either false or a WPDB class (or extension thereof). Other options are not yet fully supported.
 
 
 
 
 
 
 
2957
  public function check_db_connection($handle = false, $logit = false, $reschedule = false) {
2958
 
2959
  $type = false;
2960
  if (false === $handle || is_a($handle, 'wpdb')) {
2961
- $type='wpdb';
2962
  } elseif (is_resource($handle)) {
2963
- # Expected: string(10) "mysql link"
2964
- $type=get_resource_type($handle);
2965
  } elseif (is_object($handle) && is_a($handle, 'mysqli')) {
2966
- $type='mysqli';
2967
  }
2968
 
2969
  if (false === $type) return -1;
@@ -2971,13 +3233,15 @@ class UpdraftPlus {
2971
  $db_connected = -1;
2972
 
2973
  if ('mysql link' == $type || 'mysqli' == $type) {
 
2974
  if ('mysql link' == $type && @mysql_ping($handle)) return true;
2975
  if ('mysqli' == $type && @mysqli_ping($handle)) return true;
2976
 
2977
- for ( $tries = 1; $tries <= 5; $tries++ ) {
2978
- # to do, if ever needed
2979
- // if ( $this->db_connect( false ) ) return true;
2980
- // sleep( 1 );
 
2981
  }
2982
 
2983
  } elseif ('wpdb' == $type) {
@@ -2988,7 +3252,7 @@ class UpdraftPlus {
2988
  if (method_exists($handle, 'check_connection') && (!defined('UPDRAFTPLUS_SUPPRESS_CONNECTION_CHECKS') || !UPDRAFTPLUS_SUPPRESS_CONNECTION_CHECKS)) {
2989
  if (!$handle->check_connection(false)) {
2990
  if ($logit) $this->log("The database went away, and could not be reconnected to");
2991
- # Almost certainly a no-op
2992
  if ($reschedule) $this->reschedule(60);
2993
  $db_connected = false;
2994
  } else {
@@ -3001,7 +3265,13 @@ class UpdraftPlus {
3001
 
3002
  }
3003
 
3004
- // This should be called whenever a file is successfully uploaded
 
 
 
 
 
 
3005
  public function uploaded_file($file, $force = false) {
3006
 
3007
  global $updraftplus_backup;
@@ -3025,11 +3295,11 @@ class UpdraftPlus {
3025
  $upload_status = $this->jobdata_get('uploading_substatus');
3026
  if (is_array($upload_status) && isset($upload_status['i'])) {
3027
  $upload_status['i']++;
3028
- $upload_status['p']=0;
3029
  $this->jobdata_set('uploading_substatus', $upload_status);
3030
  }
3031
 
3032
- # Really, we could do this immediately when we realise the DB has gone away. This is just for the probably-impossible case that a DB write really can still succeed. But, we must abort before calling delete_local(), as the removal of the local file can cause it to be recreated if the DB is out of sync with the fact that it really is already uploaded
3033
  if (false === $db_connected) {
3034
  $this->record_still_alive();
3035
  die;
@@ -3038,11 +3308,19 @@ class UpdraftPlus {
3038
  // Delete local files immediately if the option is set
3039
  // Where we are only backing up locally, only the "prune" function should do deleting
3040
  $service = $this->jobdata_get('service');
3041
- if (!empty($updraftplus_backup->last_service) && ($service !== '' && ((is_array($service) && count($service)>0 && (count($service) > 1 || ($service[0] != '' && $service[0] != 'none'))) || (is_string($service) && $service !== 'none')))) {
3042
  $this->delete_local($file);
3043
  }
3044
  }
3045
 
 
 
 
 
 
 
 
 
3046
  public function is_uploaded($file, $service = '') {
3047
  $hash = $service.(('' == $service) ? '' : '-').md5($file);
3048
  return ($this->jobdata_get("uploaded_$hash") === "yes") ? true : false;
@@ -3053,8 +3331,8 @@ class UpdraftPlus {
3053
  if (UpdraftPlus_Options::get_updraft_option('updraft_delete_local')) {
3054
  $fullpath = $this->backups_dir_location().'/'.$file;
3055
 
3056
- //check to make sure it exists before removing
3057
- if(realpath($fullpath)){
3058
  $deleted = unlink($fullpath);
3059
  $this->log($log.(($deleted) ? 'OK' : 'failed'));
3060
  return $deleted;
@@ -3065,7 +3343,11 @@ class UpdraftPlus {
3065
  return true;
3066
  }
3067
 
3068
- // This function is not needed for backup success, according to the design, but it helps with efficient scheduling
 
 
 
 
3069
  private function reschedule_if_needed() {
3070
  // If nothing is scheduled, then return
3071
  if (empty($this->newresumption_scheduled)) return;
@@ -3075,7 +3357,7 @@ class UpdraftPlus {
3075
  if ($time_away >1 && $time_away <= 45) {
3076
  $this->log('The scheduled resumption is within 45 seconds - will reschedule');
3077
  // Push 45 seconds into the future
3078
- // $this->reschedule(60);
3079
  // Increase interval generally by 45 seconds, on the assumption that our prior estimates were innaccurate (i.e. not just 45 seconds *this* time)
3080
  $this->increase_resume_and_reschedule(45);
3081
  }
@@ -3086,9 +3368,9 @@ class UpdraftPlus {
3086
  $next_resumption = $this->current_resumption + 1;
3087
  wp_clear_scheduled_hook('updraft_backup_resume', array($next_resumption, $this->nonce));
3088
  // Add new event
3089
- # This next line may be too cautious; but until 14-Aug-2014, it was 300.
3090
- # Update 20-Mar-2015 - lowered from 180
3091
- if ($how_far_ahead < 120) $how_far_ahead=120;
3092
  $schedule_for = time() + $how_far_ahead;
3093
  $this->log("Rescheduling resumption $next_resumption: moving to $how_far_ahead seconds from now ($schedule_for)");
3094
  wp_schedule_single_event($schedule_for, 'updraft_backup_resume', array($next_resumption, $this->nonce));
@@ -3097,25 +3379,25 @@ class UpdraftPlus {
3097
 
3098
  private function increase_resume_and_reschedule($howmuch = 120, $force_schedule = false) {
3099
 
3100
- $resume_interval = max(intval($this->jobdata_get('resume_interval')), ($howmuch === 0) ? 120 : 300);
3101
 
3102
  if (empty($this->newresumption_scheduled) && $force_schedule) {
3103
  $this->log("A new resumption will be scheduled to prevent the job ending");
3104
  }
3105
 
3106
  $new_resume = $resume_interval + $howmuch;
3107
- # It may be that we're increasing for the second (or more) time during a run, and that we already know that the new value will be insufficient, and can be increased
3108
  if ($this->opened_log_time > 100 && microtime(true)-$this->opened_log_time > $new_resume) {
3109
  $new_resume = ceil(microtime(true)-$this->opened_log_time)+45;
3110
  $howmuch = $new_resume-$resume_interval;
3111
  }
3112
 
3113
- # This used to be always $new_resume, until 14-Aug-2014. However, people who have very long-running processes can end up with very long times between resumptions as a result.
3114
- # Actually, let's not try this yet. I think it is safe, but think there is a more conservative solution available.
3115
- #$how_far_ahead = min($new_resume, 600);
3116
  $how_far_ahead = $new_resume;
3117
- # If it is very long-running, then that would normally be known soon.
3118
- # If the interval is already 12 minutes or more, then try the next resumption 10 minutes from now (i.e. sooner than it would have been). Thus, we are guaranteed to get at least 24 minutes of processing in the first 34.
3119
  if ($this->current_resumption <= 1 && $new_resume > 720) $how_far_ahead = 600;
3120
 
3121
  if (!empty($this->newresumption_scheduled) || $force_schedule) $this->reschedule($how_far_ahead);
@@ -3124,10 +3406,15 @@ class UpdraftPlus {
3124
  $this->log("To decrease the likelihood of overlaps, increasing resumption interval to: $resume_interval + $howmuch = $new_resume");
3125
  }
3126
 
3127
- // For detecting another run, and aborting if one was found
 
 
 
 
 
3128
  public function check_recent_modification($file) {
3129
  if (file_exists($file)) {
3130
- $time_mod = (int)@filemtime($file);
3131
  $time_now = time();
3132
  if ($time_mod>100 && ($time_now-$time_mod)<30) {
3133
  $this->terminate_due_to_activity($file, $time_now, $time_mod);
@@ -3173,8 +3460,8 @@ class UpdraftPlus {
3173
  }
3174
 
3175
  public function backup_uploads_dirlist($logit = false) {
3176
- # Create an array of directories to be skipped
3177
- # Make the values into the keys
3178
  $exclude = UpdraftPlus_Options::get_updraft_option('updraft_include_uploads_exclude', UPDRAFT_DEFAULT_UPLOADS_EXCLUDE);
3179
  if ($logit) $this->log("Exclusion option setting (uploads): ".$exclude);
3180
  $skip = array_flip(preg_split("/,/", $exclude));
@@ -3184,15 +3471,15 @@ class UpdraftPlus {
3184
  }
3185
 
3186
  public function backup_others_dirlist($logit = false) {
3187
- # Create an array of directories to be skipped
3188
- # Make the values into the keys
3189
  $exclude = UpdraftPlus_Options::get_updraft_option('updraft_include_others_exclude', UPDRAFT_DEFAULT_OTHERS_EXCLUDE);
3190
  if ($logit) $this->log("Exclusion option setting (others): ".$exclude);
3191
  $skip = array_flip(preg_split("/,/", $exclude));
3192
  $file_entities = $this->get_backupable_file_entities(false);
3193
 
3194
- # Keys = directory names to avoid; values = the label for that directory (used only in log files)
3195
- #$avoid_these_dirs = array_flip($file_entities);
3196
  $avoid_these_dirs = array();
3197
  foreach ($file_entities as $type => $dirs) {
3198
  if (is_string($dirs)) {
@@ -3206,14 +3493,20 @@ class UpdraftPlus {
3206
  return $this->compile_folder_list_for_backup(WP_CONTENT_DIR, $avoid_these_dirs, $skip);
3207
  }
3208
 
3209
- // Add backquotes to tables and db-names in SQL queries. Taken from phpMyAdmin.
 
 
 
 
 
3210
  public function backquote($a_name) {
3211
- if (!empty($a_name) && $a_name != '*') {
3212
  if (is_array($a_name)) {
3213
  $result = array();
3214
  reset($a_name);
3215
- while(list($key, $val) = each($a_name))
3216
  $result[$key] = '`'.$val.'`';
 
3217
  return $result;
3218
  } else {
3219
  return '`'.$a_name.'`';
@@ -3227,6 +3520,12 @@ class UpdraftPlus {
3227
  return preg_replace('#/+(,|$)#', '$1', $string);
3228
  }
3229
 
 
 
 
 
 
 
3230
  public function remove_empties($list) {
3231
  if (!is_array($list)) return $list;
3232
  foreach ($list as $ind => $entry) {
@@ -3235,7 +3534,14 @@ class UpdraftPlus {
3235
  return $list;
3236
  }
3237
 
3238
- // avoid_these_dirs and skip_these_dirs ultimately do the same thing; but avoid_these_dirs takes full paths whereas skip_these_dirs takes basenames; and they are logged differently (dirs in avoid are potentially dangerous to include; skip is just a user-level preference). They are allowed to overlap.
 
 
 
 
 
 
 
3239
  public function compile_folder_list_for_backup($backup_from_inside_dir, $avoid_these_dirs, $skip_these_dirs) {
3240
 
3241
  // Entries in $skip_these_dirs are allowed to end in *, which means "and anything else as a suffix". It's not a full shell glob, but it covers what is needed to-date.
@@ -3255,7 +3561,7 @@ class UpdraftPlus {
3255
  while (false !== ($entry = readdir($handle))) {
3256
  // $candidate: full path; $entry = one-level
3257
  $candidate = $backup_from_inside_dir.'/'.$entry;
3258
- if ($entry != "." && $entry != "..") {
3259
  if (isset($avoid_these_dirs[$candidate])) {
3260
  $this->log("finding files: $entry: skipping: this is the ".$avoid_these_dirs[$candidate]." directory");
3261
  } elseif ($candidate == $updraft_dir) {
@@ -3303,11 +3609,22 @@ class UpdraftPlus {
3303
  }
3304
 
3305
  private function save_backup_history($backup_array) {
3306
- if(is_array($backup_array)) {
3307
  $backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
3308
  $backup_history = (is_array($backup_history)) ? $backup_history : array();
3309
  $backup_array['nonce'] = $this->nonce;
3310
  $backup_array['service'] = $this->jobdata_get('service');
 
 
 
 
 
 
 
 
 
 
 
3311
  if ('' != ($label = $this->jobdata_get('label', ''))) $backup_array['label'] = $label;
3312
  $backup_array['created_by_version'] = $this->version;
3313
  $backup_array['is_multisite'] = is_multisite() ? true : false;
@@ -3318,10 +3635,81 @@ class UpdraftPlus {
3318
  UpdraftPlus_Options::update_updraft_option('updraft_backup_history', $backup_history, false);
3319
  } else {
3320
  $this->log('Could not save backup history because we have no backup array. Backup probably failed.');
3321
- $this->log(__('Could not save backup history because we have no backup array. Backup probably failed.','updraftplus'), 'error');
3322
  }
3323
  }
3324
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3325
  public function is_db_encrypted($file) {
3326
  return preg_match('/\.crypt$/i', $file);
3327
  }
@@ -3329,10 +3717,10 @@ class UpdraftPlus {
3329
  public function get_backup_history($timestamp = false) {
3330
  $backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
3331
  // The line below actually *introduces* a race condition
3332
- // global $wpdb;
3333
- // $backup_history = @unserialize($wpdb->get_var($wpdb->prepare("SELECT option_value from $wpdb->options WHERE option_name='updraft_backup_history'")));
3334
  if (is_array($backup_history)) {
3335
- krsort($backup_history); //reverse sort so earliest backup is last on the array. Then we can array_pop.
3336
  } else {
3337
  $backup_history = array();
3338
  }
@@ -3341,36 +3729,54 @@ class UpdraftPlus {
3341
  }
3342
 
3343
  public function terminate_due_to_activity($file, $time_now, $time_mod, $increase_resumption = true) {
3344
- # We check-in, to avoid 'no check in last time!' detectors firing
3345
  $this->record_still_alive();
3346
- $file_size = file_exists($file) ? round(filesize($file)/1024,1). 'KB' : 'n/a';
3347
  $this->log("Terminate: ".basename($file)." exists with activity within the last 30 seconds (time_mod=$time_mod, time_now=$time_now, diff=".(floor($time_now-$time_mod)).", size=$file_size). This likely means that another UpdraftPlus run is at work; so we will exit.");
3348
  $increase_by = ($increase_resumption) ? 120 : 0;
3349
  $this->increase_resume_and_reschedule($increase_by, true);
3350
  if (!defined('UPDRAFTPLUS_ALLOW_RECENT_ACTIVITY') || true != UPDRAFTPLUS_ALLOW_RECENT_ACTIVITY) die;
3351
  }
3352
 
3353
- # Replace last occurence
 
 
 
 
 
 
 
3354
  public function str_lreplace($search, $replace, $subject) {
3355
  $pos = strrpos($subject, $search);
3356
- if($pos !== false) $subject = substr_replace($subject, $replace, $pos, strlen($search));
3357
  return $subject;
3358
  }
3359
 
 
 
 
 
 
 
 
 
 
3360
  public function str_replace_once($needle, $replace, $haystack) {
3361
  $pos = strpos($haystack, $needle);
3362
- return ($pos !== false) ? substr_replace($haystack,$replace,$pos,strlen($needle)) : $haystack;
3363
  }
3364
 
3365
- /*
3366
- If files + db are on different schedules but are scheduled for the same time, then combine them
3367
- $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );
3368
- See wp_schedule_single_event() and wp_schedule_event() in wp-includes/cron.php
3369
- */
 
 
 
3370
  public function schedule_event($event) {
3371
 
3372
  static $scheduled = array();
3373
-
3374
 
3375
  if (is_object($event) && ('updraft_backup' == $event->hook || 'updraft_backup_database' == $event->hook)) {
3376
 
@@ -3384,11 +3790,11 @@ class UpdraftPlus {
3384
  // This next fragment is wrong: there's only a 'second call' when saving all settings; otherwise, the WP scheduler might just be updating one event. So, there's some inefficieny as the option is wiped and set uselessly at least once when saving settings.
3385
  // We only want to take action on the second call (otherwise, our information is out-of-date already)
3386
  // If there is no second call, then that's fine - nothing to do
3387
- //if (count($scheduled) < 2) {
3388
- // return $event;
3389
- //}
3390
 
3391
- $backup_scheduled_for = ('updraft_backup' == $event->hook) ? $event->timestamp : wp_next_scheduled('updraft_backup');
3392
  $db_scheduled_for = ('updraft_backup_database' == $event->hook) ? $event->timestamp : wp_next_scheduled('updraft_backup_database');
3393
 
3394
  $diff = absint($backup_scheduled_for - $db_scheduled_for);
@@ -3405,12 +3811,13 @@ class UpdraftPlus {
3405
  return $event;
3406
 
3407
  }
3408
-
3409
- /*
3410
- This function is both the backup scheduler and a filter callback for saving the option.
3411
- It is called in the register_setting for the updraft_interval, which means when the
3412
- admin settings are saved it is called.
3413
- */
 
3414
  public function schedule_backup($interval) {
3415
  $previous_time = wp_next_scheduled('updraft_backup');
3416
 
@@ -3455,7 +3862,7 @@ class UpdraftPlus {
3455
  /**
3456
  * Acts as a WordPress options filter
3457
  *
3458
- * @param Array $onedrive - An array of OneDrive options
3459
  * @return Array - the returned array can either be the set of updated OneDrive settings or a WordPress error array
3460
  */
3461
  public function onedrive_checkchange($onedrive) {
@@ -3498,8 +3905,9 @@ class UpdraftPlus {
3498
  }
3499
 
3500
  /**
3501
- * Acts as a WordPress options filter
3502
- * @param Array $azure an array of Azure options
 
3503
  * @return Array - the returned array can either be the set of updated Azure settings or a WordPress error array
3504
  */
3505
  public function azure_checkchange($azure) {
@@ -3541,7 +3949,7 @@ class UpdraftPlus {
3541
  /**
3542
  * Acts as a WordPress options filter
3543
  *
3544
- * @param Array $google - An array of Google Drive options
3545
  * @return Array - the returned array can either be the set of updated Google Drive settings or a WordPress error array
3546
  */
3547
  public function googledrive_checkchange($google) {
@@ -3558,7 +3966,7 @@ class UpdraftPlus {
3558
  // The saved options had a problem; so, return the new ones
3559
  return $google;
3560
  }
3561
- //$opts = UpdraftPlus_Options::get_updraft_option('updraft_googledrive');
3562
  if (!is_array($google)) return $opts;
3563
 
3564
  // Remove instances that no longer exist
@@ -3567,16 +3975,19 @@ class UpdraftPlus {
3567
  }
3568
 
3569
  foreach ($google['settings'] as $instance_id => $storage_options) {
3570
- $old_client_id = (empty($opts['settings'][$instance_id]['clientid'])) ? '' : $opts['settings'][$instance_id]['clientid'];
3571
- if (!empty($opts['settings'][$instance_id]['token']) && $old_client_id != $storage_options['clientid']) {
3572
- require_once(UPDRAFTPLUS_DIR.'/methods/googledrive.php');
3573
- add_action('http_request_args', array($this, 'modify_http_options'));
3574
- $googledrive = new UpdraftPlus_BackupModule_googledrive();
3575
- $googledrive->gdrive_auth_revoke(false);
3576
- remove_action('http_request_args', array($this, 'modify_http_options'));
3577
- $opts['settings'][$instance_id]['token'] = '';
3578
- unset($opts['settings'][$instance_id]['ownername']);
 
 
3579
  }
 
3580
  foreach ($storage_options as $key => $value) {
3581
  // Trim spaces - I got support requests from users who didn't spot the spaces they introduced when copy/pasting
3582
  $opts['settings'][$instance_id][$key] = ('clientid' == $key || 'secret' == $key) ? trim($value) : $value;
@@ -3592,7 +4003,7 @@ class UpdraftPlus {
3592
  /**
3593
  * Acts as a WordPress options filter
3594
  *
3595
- * @param Array $google - An array of Google Cloud options
3596
  * @return Array - the returned array can either be the set of updated Google Cloud settings or a WordPress error array
3597
  */
3598
  public function googlecloud_checkchange($google) {
@@ -3622,11 +4033,11 @@ class UpdraftPlus {
3622
  $old_client_id = (empty($opts['settings'][$instance_id]['clientid'])) ? '' : $opts['settings'][$instance_id]['clientid'];
3623
  $old_client_secret = (empty($opts['settings'][$instance_id]['secret'])) ? '' : $opts['settings'][$instance_id]['secret'];
3624
 
3625
- if($old_client_id == $google['settings'][$instance_id]['clientid'] && $old_client_secret == $google['settings'][$instance_id]['secret']){
3626
  $google['settings'][$instance_id]['token'] = $old_token;
3627
  }
3628
  if (!empty($opts['settings'][$instance_id]['token']) && $old_client_id != $google['settings'][$instance_id]['clientid']) {
3629
- require_once(UPDRAFTPLUS_DIR.'/methods/googlecloud.php');
3630
  add_action('http_request_args', array($this, 'modify_http_options'));
3631
  $googlecloud = new UpdraftPlus_BackupModule_googlecloud();
3632
  $googlecloud->gcloud_auth_revoke(false);
@@ -3637,16 +4048,28 @@ class UpdraftPlus {
3637
  foreach ($storage_options as $key => $value) {
3638
  // Trim spaces - I got support requests from users who didn't spot the spaces they introduced when copy/pasting
3639
  $opts['settings'][$instance_id][$key] = ('clientid' == $key || 'secret' == $key) ? trim($value) : $value;
3640
- if ($key == 'bucket_location') $opts['settings'][$instance_id][$key] = trim(strtolower($value));
3641
  }
3642
  }
3643
 
3644
  return $opts;
3645
  }
3646
 
 
 
 
 
 
 
 
3647
  public function ftp_sanitise($ftp) {
3648
- if (is_array($ftp) && !empty($ftp['host']) && preg_match('#ftp(es|s)?://(.*)#i', $ftp['host'], $matches)) {
3649
- $ftp['host'] = untrailingslashit($matches[2]);
 
 
 
 
 
3650
  }
3651
  return $ftp;
3652
  }
@@ -3661,7 +4084,7 @@ class UpdraftPlus {
3661
  /**
3662
  * Acts as a WordPress options filter
3663
  *
3664
- * @param Array $dropbox - An array of Dropbox options
3665
  * @return Array - the returned array can either be the set of updated Dropbox settings or a WordPress error array
3666
  */
3667
  public function dropbox_checkchange($dropbox) {
@@ -3687,7 +4110,7 @@ class UpdraftPlus {
3687
  if (!isset($dropbox['settings'][$instance_id])) unset($opts['settings'][$instance_id]);
3688
  }
3689
 
3690
- // Dropbox has a special case where the settings could be empty so we should check for this before
3691
  if (!empty($dropbox['settings'])) {
3692
 
3693
  foreach ($dropbox['settings'] as $instance_id => $storage_options) {
@@ -3706,12 +4129,12 @@ class UpdraftPlus {
3706
  }
3707
 
3708
  // Now loop over the new options, and replace old options with them
3709
- foreach ($storage_options as $key => $value) {
3710
  if (null === $value) {
3711
  unset($opts['settings'][$instance_id][$key]);
3712
  } else {
3713
  if (!isset($opts['settings'][$instance_id])) $opts['settings'][$instance_id] = array();
3714
- $opts['settings'][$instance_id][$key] = $value;
3715
  }
3716
  }
3717
 
@@ -3726,10 +4149,10 @@ class UpdraftPlus {
3726
 
3727
  public function remove_local_directory($dir, $contents_only = false) {
3728
  // PHP 5.3+ only
3729
- //foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
3730
- // $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
3731
- //}
3732
- //return rmdir($dir);
3733
 
3734
  if ($handle = @opendir($dir)) {
3735
  while (false !== ($entry = readdir($handle))) {
@@ -3747,13 +4170,18 @@ class UpdraftPlus {
3747
  return ($contents_only) ? true : rmdir($dir);
3748
  }
3749
 
3750
- // Returns without any trailing slash
 
 
 
 
 
3751
  public function backups_dir_location($allow_cache = true) {
3752
 
3753
  if ($allow_cache && !empty($this->backup_dir)) return $this->backup_dir;
3754
 
3755
  $updraft_dir = untrailingslashit(UpdraftPlus_Options::get_updraft_option('updraft_dir'));
3756
- # When newly installing, if someone had (e.g.) wp-content/updraft in their database from a previous, deleted pre-1.7.18 install but had removed the updraft directory before re-installing, without this fix they'd end up with wp-content/wp-content/updraft.
3757
  if (preg_match('/^wp-content\/(.*)$/', $updraft_dir, $matches) && ABSPATH.'wp-content' === WP_CONTENT_DIR) {
3758
  UpdraftPlus_Options::update_updraft_option('updraft_dir', $matches[1]);
3759
  $updraft_dir = WP_CONTENT_DIR.'/'.$matches[1];
@@ -3763,21 +4191,21 @@ class UpdraftPlus {
3763
 
3764
  // Do a test for a relative path
3765
  if ('/' != substr($updraft_dir, 0, 1) && "\\" != substr($updraft_dir, 0, 1) && !preg_match('/^[a-zA-Z]:/', $updraft_dir)) {
3766
- # Legacy - file paths stored related to ABSPATH
3767
  if (is_dir(ABSPATH.$updraft_dir) && is_file(ABSPATH.$updraft_dir.'/index.html') && is_file(ABSPATH.$updraft_dir.'/.htaccess') && !is_file(ABSPATH.$updraft_dir.'/index.php') && false !== strpos(file_get_contents(ABSPATH.$updraft_dir.'/.htaccess', false, null, 0, 20), 'deny from all')) {
3768
  $updraft_dir = ABSPATH.$updraft_dir;
3769
  } else {
3770
- # File paths stored relative to WP_CONTENT_DIR
3771
  $updraft_dir = trailingslashit(WP_CONTENT_DIR).$updraft_dir;
3772
  }
3773
  }
3774
 
3775
  // Check for the existence of the dir and prevent enumeration
3776
  // index.php is for a sanity check - make sure that we're not somewhere unexpected
3777
- if((!is_dir($updraft_dir) || !is_file($updraft_dir.'/index.html') || !is_file($updraft_dir.'/.htaccess')) && !is_file($updraft_dir.'/index.php') || !is_file($updraft_dir.'/web.config')) {
3778
  @mkdir($updraft_dir, 0775, true);
3779
- @file_put_contents($updraft_dir.'/index.html',"<html><body><a href=\"https://updraftplus.com\">WordPress backups by UpdraftPlus</a></body></html>");
3780
- if (!is_file($updraft_dir.'/.htaccess')) @file_put_contents($updraft_dir.'/.htaccess','deny from all');
3781
  if (!is_file($updraft_dir.'/web.config')) @file_put_contents($updraft_dir.'/web.config', "<configuration>\n<system.webServer>\n<authorization>\n<deny users=\"*\" />\n</authorization>\n</system.webServer>\n</configuration>\n");
3782
  }
3783
 
@@ -3788,6 +4216,7 @@ class UpdraftPlus {
3788
 
3789
  /**
3790
  * This function creates the correct header when download files
 
3791
  * @param string $fullpath This is the full path to the encrypted file
3792
  * @param string $encryption This is the key (salting) used to decrypt the file
3793
  * @return heder This will download the fila when via the browser
@@ -3801,17 +4230,17 @@ class UpdraftPlus {
3801
  } else {
3802
 
3803
 
3804
- //now decrypt the file and return array
3805
  $decrypted_file = $this->decrypt($fullpath, $encryption, true);
3806
 
3807
- //check to ensure there is a response back
3808
  if (is_array($decrypted_file)) {
3809
  header('Content-type: application/x-gzip');
3810
  header("Content-Disposition: attachment; filename=\"".$decrypted_file['basename']."\";");
3811
  header("Content-Length: ".filesize($decrypted_file['fullpath']));
3812
  readfile($decrypted_file['fullpath']);
3813
 
3814
- //need to remove the file as this is no longer needed on the local server
3815
  unlink($decrypted_file['fullpath']);
3816
  } else {
3817
  header('Content-type: text/plain');
@@ -3845,28 +4274,32 @@ class UpdraftPlus {
3845
 
3846
  // Prevent any debug output
3847
  // Don't enable this line - it causes 500 HTTP errors in some cases/hosts on some large files, for unknown reason
3848
- //@ini_set('display_errors', '0');
3849
 
3850
  $spooled = false;
3851
  if ('.crypt' == substr($fullpath, -6, 6)) {
3852
  if (ob_get_level()) {
3853
- $flush_max = min(5, (int)ob_get_level());
3854
- for ($i=1; $i<=$flush_max; $i++) { @ob_end_clean(); }
 
 
3855
  }
3856
  header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
3857
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
3858
- $this->spool_crypted_file($fullpath, (string)$encryption);
3859
  return;
3860
  }
3861
 
3862
  $content_type = $this->get_mime_type_from_filename($fullpath, false);
3863
 
3864
- require_once(UPDRAFTPLUS_DIR.'/includes/class-partialfileservlet.php');
3865
 
3866
- //Prevent the file being read into memory
3867
  if (ob_get_level()) {
3868
- $flush_max = min(5, (int)ob_get_level());
3869
- for ($i=1; $i<=$flush_max; $i++) { @ob_end_clean(); }
 
 
3870
  }
3871
  if (ob_get_level()) @ob_end_clean(); // Twice - see HS#6673 - someone at least needed it
3872
 
@@ -3891,7 +4324,7 @@ class UpdraftPlus {
3891
  try {
3892
  $range_header = UpdraftPlus_RangeHeader::createFromHeaderString($range_header);
3893
  $servlet = new UpdraftPlus_PartialFileServlet($range_header);
3894
- $servlet->sendFile($fullpath, $content_type);
3895
  } catch (UpdraftPlus_InvalidRangeHeaderException $e) {
3896
  header("HTTP/1.1 400 Bad Request");
3897
  error_log("UpdraftPlus: UpdraftPlus_InvalidRangeHeaderException: ".$e->getMessage());
@@ -3909,14 +4342,14 @@ class UpdraftPlus {
3909
  }
3910
 
3911
  public function retain_range($input) {
3912
- $input = (int)$input;
3913
- return ($input > 0) ? min($input, 9999) : 1;
3914
  }
3915
 
3916
  /**
3917
  * Acts as a WordPress options filter
3918
  *
3919
- * @param Array $webdav - An array of WebDAV options
3920
  * @return Array - the returned array can either be the set of updated WebDAV settings or a WordPress error array
3921
  */
3922
  public function construct_webdav_url($webdav) {
@@ -3957,11 +4390,11 @@ class UpdraftPlus {
3957
  $storage_options['port'] = '';
3958
  }
3959
 
3960
- if ('/' == substr($storage_options['path'], 0, 1)){
3961
  $slash = "";
3962
  }
3963
 
3964
- if (false === strpos($storage_options['host'],"@")) {
3965
  $host = "@";
3966
  }
3967
 
@@ -4018,44 +4451,44 @@ class UpdraftPlus {
4018
  }
4019
 
4020
  public function memory_check_current($memory_limit = false) {
4021
- # Returns in megabytes
4022
- if ($memory_limit == false) $memory_limit = ini_get('memory_limit');
4023
  $memory_limit = rtrim($memory_limit);
4024
  $memory_unit = $memory_limit[strlen($memory_limit)-1];
4025
- if ((int)$memory_unit == 0 && $memory_unit !== '0') {
4026
- $memory_limit = substr($memory_limit,0,strlen($memory_limit)-1);
4027
  } else {
4028
  $memory_unit = '';
4029
  }
4030
- switch($memory_unit) {
4031
  case '':
4032
- $memory_limit = floor($memory_limit/1048576);
4033
- break;
4034
  case 'K':
4035
  case 'k':
4036
- $memory_limit = floor($memory_limit/1024);
4037
- break;
4038
  case 'G':
4039
- $memory_limit = $memory_limit*1024;
4040
- break;
4041
  case 'M':
4042
- //assumed size, no change needed
4043
- break;
4044
  }
4045
  return $memory_limit;
4046
  }
4047
 
4048
  public function memory_check($memory, $check_using = false) {
4049
  $memory_limit = $this->memory_check_current($check_using);
4050
- return ($memory_limit >= $memory)?true:false;
4051
  }
4052
 
4053
  private function url_start($html_allowed, $url, $https = false) {
4054
  $proto = ($https) ? 'https' : 'http';
4055
- if (strpos($url, 'updraftplus.com') !== false){
4056
- return $html_allowed ? "<a href=".apply_filters('updraftplus_com_link',$proto.'://'.$url).">" : "";
4057
- }else{
4058
- return $html_allowed ? "<a href=\"$proto://$url\">" : "";
4059
  }
4060
  }
4061
 
@@ -4066,20 +4499,23 @@ class UpdraftPlus {
4066
 
4067
  private function translation_needed() {
4068
  $wplang = get_locale();
4069
- if (strlen($wplang) < 1 || $wplang == 'en_US' || $wplang == 'en_GB') return false;
4070
  if (defined('WP_LANG_DIR') && is_file(WP_LANG_DIR.'/plugins/updraftplus-'.$wplang.'.mo')) return false;
4071
  if (is_file(UPDRAFTPLUS_DIR.'/languages/updraftplus-'.$wplang.'.mo')) return false;
4072
  return true;
4073
  }
4074
 
4075
  public function get_updraftplus_rssfeed() {
4076
- if (!function_exists('fetch_feed')) require(ABSPATH . WPINC . '/feed.php');
4077
  return fetch_feed('http://feeds.feedburner.com/updraftplus/');
4078
  }
4079
 
4080
  public function analyse_db_file($timestamp, $res, $db_file = false, $header_only = false) {
4081
 
4082
- $mess = array(); $warn = array(); $err = array(); $info = array();
 
 
 
4083
 
4084
  $wp_version = $this->get_wordpress_version();
4085
  global $wpdb;
@@ -4087,7 +4523,7 @@ class UpdraftPlus {
4087
  $updraft_dir = $this->backups_dir_location();
4088
 
4089
  if (false === $db_file) {
4090
- # This attempts to raise the maximum packet size. This can't be done within the session, only globally. Therefore, it has to be done before the session starts; in our case, during the pre-analysis.
4091
  $this->get_max_packet_size();
4092
 
4093
  $backup = $this->get_backup_history($timestamp);
@@ -4117,16 +4553,16 @@ class UpdraftPlus {
4117
  if (is_array($decrypted_file)) {
4118
  $db_file = $decrypted_file['fullpath'];
4119
  } else {
4120
- $err[] = __('Decryption failed. The most likely cause is that you used the wrong key.','updraftplus');
4121
  return array($mess, $warn, $err, $info);
4122
  }
4123
 
4124
 
4125
  }
4126
 
4127
- # Even the empty schema when gzipped comes to 1565 bytes; a blank WP 3.6 install at 5158. But we go low, in case someone wants to share single tables.
4128
  if (filesize($db_file) < 1000) {
4129
- $err[] = sprintf(__('The database is too small to be a valid WordPress database (size: %s Kb).','updraftplus'), round(filesize($db_file)/1024, 1));
4130
  return array($mess, $warn, $err, $info);
4131
  }
4132
 
@@ -4134,13 +4570,13 @@ class UpdraftPlus {
4134
 
4135
  $dbhandle = ($is_plain) ? fopen($db_file, 'r') : $this->gzopen_for_read($db_file, $warn, $err);
4136
  if (!is_resource($dbhandle)) {
4137
- $err[] = __('Failed to open database file.', 'updraftplus');
4138
  return array($mess, $warn, $err, $info);
4139
  }
4140
 
4141
  $info['timestamp'] = $timestamp;
4142
 
4143
- # Analyse the file, print the results.
4144
 
4145
  $line = 0;
4146
  $old_siteurl = '';
@@ -4179,10 +4615,10 @@ class UpdraftPlus {
4179
  $old_siteurl = untrailingslashit($matches[1]);
4180
  $mess[] = __('Backup of:', 'updraftplus').' '.htmlspecialchars($old_siteurl).((!empty($old_wp_version)) ? ' '.sprintf(__('(version: %s)', 'updraftplus'), $old_wp_version) : '');
4181
  // Check for should-be migration
4182
- if ($old_siteurl != untrailingslashit(site_url())) {
4183
  if (!$migration_warning) {
4184
  $migration_warning = true;
4185
- $powarn = apply_filters('updraftplus_dbscan_urlchange', sprintf(__('Warning: %s', 'updraftplus'), '<a href="https://updraftplus.com/shop/migrator/">'.__('This backup set is from a different site - this is not a restoration, but a migration. You need the Migrator add-on in order to make this work.', 'updraftplus').'</a>'), $old_siteurl, $res);
4186
  if (!empty($powarn)) $warn[] = $powarn;
4187
  }
4188
  // Explicitly set it, allowing the consumer to detect when the result was unknown
@@ -4198,9 +4634,9 @@ class UpdraftPlus {
4198
  } elseif ('' == $old_home && preg_match('/^\# Home URL: (http(.*))$/', $buffer, $matches)) {
4199
  $old_home = untrailingslashit($matches[1]);
4200
  // Check for should-be migration
4201
- if (!$migration_warning && $old_home != home_url()) {
4202
  $migration_warning = true;
4203
- $powarn = apply_filters('updraftplus_dbscan_urlchange', sprintf(__('Warning: %s', 'updraftplus'), '<a href="https://updraftplus.com/shop/migrator/">'.__('This backup set is from a different site - this is not a restoration, but a migration. You need the Migrator add-on in order to make this work.', 'updraftplus').'</a>'), $old_home, $res);
4204
  if (!empty($powarn)) $warn[] = $powarn;
4205
  }
4206
  } elseif (!isset($info['created_by_version']) && preg_match('/^\# Created by UpdraftPlus version ([\d\.]+)/', $buffer, $matches)) {
@@ -4209,20 +4645,20 @@ class UpdraftPlus {
4209
  $old_wp_version = $matches[1];
4210
  if (!empty($matches[3])) $old_wp_version .= substr($matches[3], 0, strlen($matches[3])-1);
4211
  if (version_compare($old_wp_version, $wp_version, '>')) {
4212
- //$mess[] = sprintf(__('%s version: %s', 'updraftplus'), 'WordPress', $old_wp_version);
4213
  $warn[] = sprintf(__('You are importing from a newer version of WordPress (%s) into an older one (%s). There are no guarantees that WordPress can handle this.', 'updraftplus'), $old_wp_version, $wp_version);
4214
  }
4215
  if (preg_match('/running on PHP ([0-9]+\.[0-9]+)(\s|\.)/', $matches[4], $nmatches) && preg_match('/^([0-9]+\.[0-9]+)(\s|\.)/', PHP_VERSION, $cmatches)) {
4216
  $old_php_version = $nmatches[1];
4217
  $current_php_version = $cmatches[1];
4218
  if (version_compare($old_php_version, $current_php_version, '>')) {
4219
- //$mess[] = sprintf(__('%s version: %s', 'updraftplus'), 'WordPress', $old_wp_version);
4220
  $warn[] = sprintf(__('The site in this backup was running on a webserver with version %s of %s. ', 'updraftplus'), $old_php_version, 'PHP').' '.sprintf(__('This is significantly newer than the server which you are now restoring onto (version %s).', 'updraftplus'), PHP_VERSION).' '.sprintf(__('You should only proceed if you cannot update the current server and are confident (or willing to risk) that your plugins/themes/etc. are compatible with the older %s version.', 'updraftplus'), 'PHP').' '.sprintf(__('Any support requests to do with %s should be raised with your web hosting company.', 'updraftplus'), 'PHP');
4221
  }
4222
  }
4223
  } elseif ('' == $old_table_prefix && (preg_match('/^\# Table prefix: (\S+)$/', $buffer, $matches) || preg_match('/^-- Table prefix: (\S+)$/i', $buffer, $matches))) {
4224
  $old_table_prefix = $matches[1];
4225
- // echo '<strong>'.__('Old table prefix:', 'updraftplus').'</strong> '.htmlspecialchars($old_table_prefix).'<br>';
4226
  } elseif (empty($info['label']) && preg_match('/^\# Label: (.*)$/', $buffer, $matches)) {
4227
  $info['label'] = $matches[1];
4228
  $mess[] = __('Backup label:', 'updraftplus').' '.htmlspecialchars($info['label']);
@@ -4232,12 +4668,12 @@ class UpdraftPlus {
4232
  // Sanity checks
4233
  if (isset($old_siteinfo['multisite']) && !$old_siteinfo['multisite'] && is_multisite()) {
4234
  // Just need to check that you're crazy
4235
- //if (!defined('UPDRAFTPLUS_EXPERIMENTAL_IMPORTINTOMULTISITE') || !UPDRAFTPLUS_EXPERIMENTAL_IMPORTINTOMULTISITE) {
4236
- //$err[] = sprintf(__('Error: %s', 'updraftplus'), __('You are running on WordPress multisite - but your backup is not of a multisite site.', 'updraftplus'));
4237
- //return array($mess, $warn, $err, $info);
4238
- //} else {
4239
  $warn[] = __('You are running on WordPress multisite - but your backup is not of a multisite site.', 'updraftplus').' '.__('It will be imported as a new site.', 'updraftplus').' <a href="https://updraftplus.com/information-on-importing-a-single-site-wordpress-backup-into-a-wordpress-network-i-e-multisite/">'.__('Please read this link for important information on this process.', 'updraftplus').'</a>';
4240
- //}
4241
  // Got the needed code?
4242
  if (!class_exists('UpdraftPlusAddOn_MultiSite') || !class_exists('UpdraftPlus_Addons_Migrator')) {
4243
  $err[] = sprintf(__('Error: %s', 'updraftplus'), sprintf(__('To import an ordinary WordPress site into a multisite installation requires %s.', 'updraftplus'), 'UpdraftPlus Premium'));
@@ -4253,7 +4689,7 @@ class UpdraftPlus {
4253
  $info['multisite'] = $val ? true : false;
4254
  if ($val) $mess[] = '<strong>'.__('Site information:', 'updraftplus').'</strong> '.'backup is of a WordPress Network';
4255
  }
4256
- $old_siteinfo[$key]=$val;
4257
  }
4258
  } elseif (preg_match('/^\# Skipped tables: (.*)$/', $buffer, $matches)) {
4259
  $skipped_tables = explode(',', $matches[1]);
@@ -4355,7 +4791,7 @@ CREATE TABLE $wpdb->signups (
4355
  if (!function_exists('gzseek')) return $dbhandle;
4356
 
4357
  if (false === ($bytes = gzread($dbhandle, 3))) return false;
4358
- # Double-gzipped?
4359
  if ('H4sI' != base64_encode($bytes)) {
4360
  if (0 === gzseek($dbhandle, 0)) {
4361
  return $dbhandle;
@@ -4364,7 +4800,7 @@ CREATE TABLE $wpdb->signups (
4364
  return gzopen($file, 'r');
4365
  }
4366
  }
4367
- # Yes, it's double-gzipped
4368
 
4369
  $what_to_return = false;
4370
  $mess = __('The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver.', 'updraftplus');
@@ -4393,7 +4829,7 @@ CREATE TABLE $wpdb->signups (
4393
 
4394
  gzclose($dbhandle);
4395
  fclose($fnew);
4396
- # On some systems (all Windows?) you can't rename a gz file whilst it's gzopened
4397
  if (!rename($file.".tmp", $file)) {
4398
  $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus');
4399
  } else {
@@ -4409,35 +4845,127 @@ CREATE TABLE $wpdb->signups (
4409
  return $what_to_return;
4410
  }
4411
 
4412
- # TODO: Remove legacy storage setting keys from here
4413
- // These are used in 4 places (Feb 2016 - of course, you should re-scan the code to check if relying on this): showing current settings on the debug modal, wiping all current settings, getting a settings bundle to restore when migrating, and for relevant keys in POST-ed data when saving settings over AJAX
 
 
 
 
4414
  public function get_settings_keys() {
4415
- // N.B. updraft_backup_history is not included here, as we don't want that wiped
4416
- return array('updraft_autobackup_default', 'updraft_dropbox', 'updraft_googledrive', 'updraftplus_tmp_googledrive_access_token', 'updraftplus_dismissedautobackup', 'dismissed_general_notices_until', 'dismissed_season_notices_until', 'updraftplus_dismissedexpiry', 'updraftplus_dismisseddashnotice', 'updraft_interval', 'updraft_interval_increments', 'updraft_interval_database', 'updraft_retain', 'updraft_retain_db', 'updraft_encryptionphrase', 'updraft_service', 'updraft_googledrive_clientid', 'updraft_googledrive_secret', 'updraft_googledrive_remotepath', 'updraft_ftp', 'updraft_server_address', 'updraft_dir', 'updraft_email', 'updraft_delete_local', 'updraft_debug_mode', 'updraft_include_plugins', 'updraft_include_themes', 'updraft_include_uploads', 'updraft_include_others', 'updraft_include_wpcore', 'updraft_include_wpcore_exclude', 'updraft_include_more', 'updraft_include_blogs', 'updraft_include_mu-plugins',
4417
- 'updraft_include_others_exclude', 'updraft_include_uploads_exclude', 'updraft_lastmessage', 'updraft_googledrive_token', 'updraft_dropboxtk_request_token', 'updraft_dropboxtk_access_token', 'updraft_adminlocking', 'updraft_updraftvault', 'updraft_remotesites', 'updraft_migrator_localkeys', 'updraft_central_localkeys', 'updraft_retain_extrarules', 'updraft_googlecloud', 'updraft_include_more_path', 'updraft_split_every', 'updraft_ssl_nossl', 'updraft_backupdb_nonwp', 'updraft_extradbs', 'updraft_combine_jobs_around',
4418
- 'updraft_last_backup', 'updraft_starttime_files', 'updraft_starttime_db', 'updraft_startday_db', 'updraft_startday_files', 'updraft_sftp', 'updraft_s3', 'updraft_s3generic', 'updraft_dreamhost', 'updraft_s3generic_login', 'updraft_s3generic_pass', 'updraft_s3generic_remote_path', 'updraft_s3generic_endpoint', 'updraft_webdav', 'updraft_openstack', 'updraft_onedrive', 'updraft_azure', 'updraft_cloudfiles', 'updraft_cloudfiles_user', 'updraft_cloudfiles_apikey', 'updraft_cloudfiles_path', 'updraft_cloudfiles_authurl', 'updraft_ssl_useservercerts', 'updraft_ssl_disableverify', 'updraft_s3_login', 'updraft_s3_pass', 'updraft_s3_remote_path', 'updraft_dreamobjects_login', 'updraft_dreamobjects_pass', 'updraft_dreamobjects_remote_path', 'updraft_dreamobjects', 'updraft_report_warningsonly', 'updraft_report_wholebackup', 'updraft_log_syslog', 'updraft_extradatabases');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4419
  }
4420
 
4421
  /**
4422
  * A function that works through the array passed to it and gets a list of all the tables from that database and puts the information in an array ready to be parsed and output to html.
4423
- * @param [array] $dbsinfo an array that contains information about each database, the default 'wp' array is just an empty array, but other entries can be added so that this method can get tables from other databases the array structure for this would be array('wp' => array(), 'TestDB' => array('host' => '', 'user' => '', 'pass' => '', 'name' => '', 'prefix' => ''))
4424
- * note that the extra tables array key must match the database name in the array
4425
- * @return [array] returns an array of databases and their table names
 
4426
  */
4427
  public function get_database_tables($dbsinfo = array('wp' => array())) {
4428
 
4429
  global $wpdb;
4430
 
4431
- if (!class_exists('UpdraftPlus_Database_Utility')) require_once(UPDRAFTPLUS_DIR.'/includes/class-database-utility.php');
4432
 
4433
  $dbhandle = '';
4434
  $db_tables_array = array();
4435
 
4436
  foreach ($dbsinfo as $key => $value) {
4437
  if ('wp' == $key) {
4438
- # The table prefix after being filtered - i.e. what filters what we'll actually back up
4439
  $table_prefix = $this->get_table_prefix(true);
4440
- # The unfiltered table prefix - i.e. the real prefix that things are relative to
4441
  $table_prefix_raw = $this->get_table_prefix(false);
4442
  $dbinfo['host'] = DB_HOST;
4443
  $dbinfo['name'] = DB_NAME;
@@ -4463,7 +4991,7 @@ CREATE TABLE $wpdb->signups (
4463
  $all_tables = array_map(array($this, 'cb_get_name_type'), $all_tables);
4464
  }
4465
 
4466
- # If this is not the WP database, then we do not consider it a fatal error if there are no tables
4467
  if ('wp' == $key && 0 == count($all_tables)) {
4468
  return $this->log_wp_error("No tables found in wp database.");
4469
  die;
@@ -4512,5 +5040,4 @@ CREATE TABLE $wpdb->signups (
4512
  private function cb_get_name($a) {
4513
  return $a['name'];
4514
  }
4515
-
4516
  }
28
  );
29
 
30
  public $errors = array();
31
+
32
  public $nonce;
33
+
34
  public $logfile_name = "";
35
+
36
  public $logfile_handle = false;
37
+
38
  public $backup_time;
39
+
40
  public $job_time_ms;
41
 
42
  public $opened_log_time;
43
+
44
  private $backup_dir;
45
 
46
  private $jobdata;
47
 
48
  public $something_useful_happened = false;
49
+
50
  public $have_addons = false;
51
 
52
  // Used to schedule resumption attempts beyond the tenth, if needed
53
  public $current_resumption;
54
+
55
  public $newresumption_scheduled = false;
56
 
57
  public $cpanel_quota_readable = false;
72
  fclose($fp);
73
  }
74
 
75
+ // Create admin page
76
  add_action('init', array($this, 'handle_url_actions'));
77
  // Run earlier than default - hence earlier than other components
78
  // admin_menu runs earlier, and we need it because options.php wants to use $updraftplus_admin before admin_init happens
79
  add_action(apply_filters('updraft_admin_menu_hook', 'admin_menu'), array($this, 'admin_menu'), 9);
80
+ // Not a mistake: admin-ajax.php calls only admin_init and not admin_menu
81
  add_action('admin_init', array($this, 'admin_menu'), 9);
82
 
83
+ // The two actions which we schedule upon
84
  add_action('updraft_backup', array($this, 'backup_files'));
85
  add_action('updraft_backup_database', array($this, 'backup_database'));
86
 
87
+ // The three actions that can be called from "Backup Now"
88
  add_action('updraft_backupnow_backup', array($this, 'backupnow_files'));
89
  add_action('updraft_backupnow_backup_database', array($this, 'backupnow_database'));
90
  add_action('updraft_backupnow_backup_all', array($this, 'backup_all'));
91
 
92
+ // backup_all as an action is legacy (Oct 2013) - there may be some people who wrote cron scripts to use it
93
  add_action('updraft_backup_all', array($this, 'backup_all'));
94
 
95
+ // This is our runs-after-backup event, whose purpose is to see if it succeeded or failed, and resume/mom-up etc.
96
  add_action('updraft_backup_resume', array($this, 'backup_resume'), 10, 3);
97
 
98
+ // If files + db are on different schedules but are scheduled for the same time, then combine them
99
  add_filter('schedule_event', array($this, 'schedule_event'));
100
 
101
  add_action('plugins_loaded', array($this, 'plugins_loaded'));
102
 
103
+ // Prevent iThemes Security from telling people that they have no backups (and advertising them another product on that basis!)
104
  add_filter('itsec_has_external_backup', '__return_true', 999);
105
  add_filter('itsec_external_backup_link', array($this, 'itsec_external_backup_link'), 999);
106
  add_filter('itsec_scheduled_external_backup', array($this, 'itsec_scheduled_external_backup'), 999);
107
 
108
+ // register_deactivation_hook(__FILE__, array($this, 'deactivation'));
109
  if (!empty($_POST) && !empty($_GET['udm_action']) && 'vault_disconnect' == $_GET['udm_action'] && !empty($_POST['udrpc_message']) && !empty($_POST['reset_hash'])) {
110
  add_action('wp_loaded', array($this, 'wp_loaded_vault_disconnect'), 1);
111
  }
112
 
113
  }
114
 
115
+ public function itsec_scheduled_external_backup($x) {
116
+ return (!wp_next_scheduled('updraft_backup')) ? false : true;
117
+ }
118
+ public function itsec_external_backup_link($x) {
119
+ return UpdraftPlus_Options::admin_page_url().'?page=updraftplus';
120
+ }
121
 
122
  /**
123
  * This method will disconnect UpdraftVault accounts.
124
+ *
125
  * @return Array - returns the saved options if an error is encountered.
126
  */
127
  public function wp_loaded_vault_disconnect() {
143
  $hash = hash('sha256', $site_id.':::'.$storage_options['token']);
144
  if ($hash == $_POST['reset_hash']) {
145
  $this->log('This site has been remotely disconnected from UpdraftPlus Vault');
146
+ include_once(UPDRAFTPLUS_DIR.'/methods/updraftvault.php');
147
  $vault = new UpdraftPlus_BackupModule_updraftvault();
148
  $vault->ajax_vault_disconnect();
149
  // Die, as the vault method has already sent output
152
  $this->log('An invalid request was received to disconnect this site from UpdraftPlus Vault');
153
  }
154
  }
155
+ echo json_encode(array('disconnected' => 0));
156
  }
157
  }
158
  die;
159
  }
160
 
161
+ /**
162
+ * Gets an RPC object, and sets some defaults on it that we always want
163
+ *
164
+ * @param string $indicator_name indicator name
165
+ * @return array
166
+ */
167
  public function get_udrpc($indicator_name = 'migrator.updraftplus.com') {
168
+ if (!class_exists('UpdraftPlus_Remote_Communications')) include_once(apply_filters('updraftplus_class_udrpc_path', UPDRAFTPLUS_DIR.'/includes/class-udrpc.php', $this->version));
169
  $ud_rpc = new UpdraftPlus_Remote_Communications($indicator_name);
170
  $ud_rpc->set_can_generate(true);
171
  return $ud_rpc;
189
  if (false === strpos(get_include_path(), $phpseclib_dir)) set_include_path(get_include_path().PATH_SEPARATOR.$phpseclib_dir);
190
  if (is_string($class_paths)) $class_paths = array($class_paths);
191
  foreach ($class_paths as $cp) {
192
+ include_once($phpseclib_dir.'/'.$cp.'.php');
193
  }
194
  }
195
  }
196
 
197
+ /**
198
+ * Ugly, but necessary to prevent debug output breaking the conversation when the user has debug turned on
199
+ */
200
  private function no_deprecation_warnings_on_php7() {
201
  // PHP_MAJOR_VERSION is defined in PHP 5.2.7+
202
  // We don't test for PHP > 7 because the specific deprecated element will be removed in PHP 8 - and so no warning should come anyway (and we shouldn't suppress other stuff until we know we need to).
227
  *
228
  * N.B. Don't actually call this on any particular method's options
229
  * until the functions which read the options can cope!
230
+ *
231
  * N.B. Until the UI is changed (DOM changed), saving settings will
232
  * revert to the previous format. But that does not break anything.
233
+ *
234
  * Don't call for settings that aren't array-style. You may lose
235
  * the settings if you do.
236
  *
238
  * already updated.
239
  *
240
  * @param String $method - the method identifier
241
+ *
242
  * @returns Array|WP_Error - returns the new options, or a WP_Error if it failed
243
  */
244
  public function update_remote_storage_options_format($method) {
302
  return $new_setting;
303
  }
304
 
305
+ /**
306
+ * Returns the number of bytes free, if it can be detected; otherwise, false
307
+ * Presently, we only detect CPanel. If you know of others, then feel free to contribute!
308
+ */
309
  public function get_hosting_disk_quota_free() {
310
  if (!@is_dir('/usr/local/cpanel') || $this->detect_safe_mode() || !function_exists('popen') || (!@is_executable('/usr/local/bin/perl') && !@is_executable('/usr/local/cpanel/3rdparty/bin/perl')) || (defined('UPDRAFTPLUS_SKIP_CPANEL_QUOTA_CHECK') && UPDRAFTPLUS_SKIP_CPANEL_QUOTA_CHECK)) return false;
311
 
321
  while (false === $found && !feof($handle) && $lines<100) {
322
  $lines++;
323
  $w = fgets($handle);
324
+ // Used, limit, remain
325
+ if (preg_match('/RESULT: (\d+) (\d+) (\d+) /', $w, $matches)) {
326
+ $found = true;
327
+ }
328
  }
329
  $ret = pclose($handle);
330
+ if (false === $found || 0 != $ret) return false;
331
 
332
+ if ((int) $matches[2]<100 || ($matches[1] + $matches[3] != $matches[2])) return false;
333
 
334
  $this->cpanel_quota_readable = true;
335
 
361
  return array($mod_time, $log_file, $nonce);
362
  }
363
 
364
+ /**
365
+ * This function may get called multiple times, so write accordingly
366
+ */
367
  public function admin_menu() {
368
  // We are in the admin area: now load all that code
369
  global $updraftplus_admin;
370
+ if (empty($updraftplus_admin)) include_once(UPDRAFTPLUS_DIR.'/admin.php');
371
 
372
+ if (isset($_GET['wpnonce']) && isset($_GET['page']) && isset($_GET['action']) && 'updraftplus' == $_GET['page'] && 'downloadlatestmodlog' == $_GET['action'] && wp_verify_nonce($_GET['wpnonce'], 'updraftplus_download')) {
373
 
374
  list ($mod_time, $log_file, $nonce) = $this->last_modified_log();
375
 
379
  readfile($log_file);
380
  exit;
381
  } else {
382
+ add_action('all_admin_notices', array($this, 'show_admin_warning_unreadablelog'));
383
  }
384
  } else {
385
+ add_action('all_admin_notices', array($this, 'show_admin_warning_nolog'));
386
  }
387
  }
388
 
400
 
401
  }
402
 
403
+ /**
404
+ * Handle actions passed on to method plugins; e.g. Google OAuth 2.0 - ?action=updraftmethod-googledrive-auth&page=updraftplus
405
+ * Nov 2013: Google's new cloud console, for reasons as yet unknown, only allows you to enter a redirect_uri with a single URL parameter... thus, we put page second, and re-add it if necessary. Apr 2014: Bitcasa already do this, so perhaps it is part of the OAuth2 standard or best practice somewhere.
406
+ * Also handle action=downloadlog
407
+ *
408
+ * @return Void - may not necessarily return at all, depending on the action
409
+ */
410
  public function handle_url_actions() {
411
 
412
  // First, basic security check: must be an admin page, with ability to manage options, with the right parameters
416
  $_GET['page'] = 'updraftplus';
417
  $_REQUEST['page'] = 'updraftplus';
418
  $method = $matches[1];
419
+ include_once(UPDRAFTPLUS_DIR.'/methods/'.$method.'.php');
420
  $call_class = "UpdraftPlus_BackupModule_".$method;
421
  $call_method = "action_".$matches[2];
422
  $backup_obj = new $call_class;
429
  $this->log(sprintf(__("%s error: %s", 'updraftplus'), $method, $e->getMessage().' ('.$e->getCode().')', 'error'));
430
  }
431
  remove_action('http_request_args', array($this, 'modify_http_options'));
432
+ } elseif (isset($_GET['page']) && 'updraftplus' == $_GET['page'] && 'downloadlog' == $_GET['action'] && isset($_GET['updraftplus_backup_nonce']) && preg_match("/^[0-9a-f]{12}$/", $_GET['updraftplus_backup_nonce']) && UpdraftPlus_Options::user_can_manage()) {
433
  // No WordPress nonce is needed here or for the next, since the backup is already nonce-based
434
  $updraft_dir = $this->backups_dir_location();
435
  $log_file = $updraft_dir.'/log.'.$_GET['updraftplus_backup_nonce'].'.txt';
439
  readfile($log_file);
440
  exit;
441
  } else {
442
+ add_action('all_admin_notices', array($this, 'show_admin_warning_unreadablelog'));
443
  }
444
+ } elseif (isset($_GET['page']) && 'updraftplus' == $_GET['page'] && 'downloadfile' == $_GET['action'] && isset($_GET['updraftplus_file']) && preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-db([0-9]+)?+\.(gz\.crypt)$/i', $_GET['updraftplus_file']) && UpdraftPlus_Options::user_can_manage()) {
445
  // Though this (venerable) code uses the action 'downloadfile', in fact, it's not that general: it's just for downloading a decrypted copy of encrypted databases, and nothing else
446
  $updraft_dir = $this->backups_dir_location();
447
  $file = $_GET['updraftplus_file'];
451
  $this->spool_file($spool_file, $dkey);
452
  exit;
453
  } else {
454
+ add_action('all_admin_notices', array($this, 'show_admin_warning_unreadablefile'));
455
  }
456
+ } elseif ('updraftplus_spool_file' == $_GET['action'] && !empty($_GET['what']) && !empty($_GET['backup_timestamp']) && is_numeric($_GET['backup_timestamp']) && UpdraftPlus_Options::user_can_manage()) {
457
  // At some point, it may be worth merging this with the previous section
458
  $updraft_dir = $this->backups_dir_location();
459
 
460
+ $findex = isset($_GET['findex']) ? (int) $_GET['findex'] : 0;
461
  $backup_timestamp = $_GET['backup_timestamp'];
462
  $what = $_GET['what'];
463
 
478
  }
479
  }
480
  if (empty($filename) || !is_readable($updraft_dir.'/'.basename($filename))) {
481
+ echo json_encode(array('result' => __('UpdraftPlus notice:', 'updraftplus').' '.__('The given file was not found, or could not be read.', 'updraftplus')));
482
  exit;
483
  }
484
 
494
  public function get_table_prefix($allow_override = false) {
495
  global $wpdb;
496
  if (is_multisite() && !defined('MULTISITE')) {
497
+ // In this case (which should only be possible on installs upgraded from pre WP 3.0 WPMU), $wpdb->get_blog_prefix() cannot be made to return the right thing. $wpdb->base_prefix is not explicitly marked as public, so we prefer to use get_blog_prefix if we can, for future compatibility.
498
  $prefix = $wpdb->base_prefix;
499
  } else {
500
  $prefix = $wpdb->get_blog_prefix(0);
513
 
514
  public function show_admin_warning_unreadablelog() {
515
  global $updraftplus_admin;
516
+ $updraftplus_admin->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> '.__('The log file could not be read.', 'updraftplus'));
517
  }
518
 
519
  public function show_admin_warning_nolog() {
520
  global $updraftplus_admin;
521
+ $updraftplus_admin->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> '.__('No log files were found.', 'updraftplus'));
522
  }
523
 
524
  public function show_admin_warning_unreadablefile() {
525
  global $updraftplus_admin;
526
+ $updraftplus_admin->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> '.__('The given file was not found, or could not be read.', 'updraftplus'));
527
  }
528
 
529
  public function plugins_loaded() {
532
  load_plugin_textdomain('updraftplus', false, basename(dirname(__FILE__)).'/languages/');
533
 
534
  // The Google Analyticator plugin does something horrible: loads an old version of the Google SDK on init, always - which breaks us
535
+ if ((defined('DOING_CRON') && DOING_CRON) || (defined('DOING_AJAX') && DOING_AJAX && isset($_REQUEST['subaction']) && 'backupnow' == $_REQUEST['subaction']) || (isset($_GET['page']) && 'updraftplus' == $_GET['page'] )) {
536
  remove_action('init', 'ganalyticator_stats_init');
537
  // Appointments+ does the same; but provides a cleaner way to disable it
538
  @define('APP_GCAL_DISABLE', true);
539
  }
540
 
541
  if (file_exists(UPDRAFTPLUS_DIR.'/central/bootstrap.php')) {
542
+ add_filter('updraftplus_remotecontrol_command_classes', array($this, 'updraftplus_remotecontrol_command_classes'));
543
  add_action('updraftcentral_command_class_wanted', array($this, 'updraftcentral_command_class_wanted'));
544
+ include_once(UPDRAFTPLUS_DIR.'/central/bootstrap.php');
545
  }
546
 
547
  }
548
 
549
+ /**
550
+ * Register our class. WP filter updraftplus_remotecontrol_command_classes.
551
+ *
552
+ * @param Array $command_classes sends across the command class
553
+ *
554
+ * @return Array - filtered value
555
+ */
556
  public function updraftplus_remotecontrol_command_classes($command_classes) {
557
  if (is_array($command_classes)) $command_classes['updraftplus'] = 'UpdraftCentral_UpdraftPlus_Commands';
558
  return $command_classes;
559
  }
560
 
561
+ /**
562
+ * Load the class when required
563
+ *
564
+ * @param string $command_php_class Sends across the php class type
565
+ */
566
  public function updraftcentral_command_class_wanted($command_php_class) {
567
  if ('UpdraftCentral_UpdraftPlus_Commands' == $command_php_class) {
568
+ include_once(UPDRAFTPLUS_DIR.'/includes/class-updraftcentral-updraftplus-commands.php');
569
  }
570
  }
571
 
572
+ /**
573
+ * Cleans up temporary files found in the updraft directory (and some in the site root - pclzip)
574
+ * Always cleans up temporary files over 12 hours old.
575
+ * With parameters, also cleans up those.
576
+ * Also cleans out old job data older than 12 hours old (immutable value)
577
+ * include_cachelist also looks to match any files of cached file analysis data
578
+ *
579
+ * @param String $match - if specified, then a prefix to require
580
+ * @param Integer $older_than - in seconds
581
+ * @param Boolean $include_cachelist - include cachelist files in what can be purged
582
+ * @return Void
583
+ */
584
  public function clean_temporary_files($match = '', $older_than = 43200, $include_cachelist = false) {
585
+ // Clean out old job data
586
  if ($older_than > 10000) {
587
  global $wpdb;
588
 
589
  $all_jobs = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE 'updraft_jobdata_%'", ARRAY_A);
590
  foreach ($all_jobs as $job) {
591
  $val = maybe_unserialize($job['option_value']);
592
+ // TODO: Can simplify this after a while (now all jobs use job_time_ms) - 1 Jan 2014
593
  $delete = false;
594
  if (!empty($val['next_increment_start_scheduled_for'])) {
595
  if (time() > $val['next_increment_start_scheduled_for'] + 86400) $delete = true;
604
  }
605
  }
606
  $updraft_dir = $this->backups_dir_location();
607
+ $now_time = time();
608
+ $files_deleted = 0;
609
  if ($handle = opendir($updraft_dir)) {
610
  while (false !== ($entry = readdir($handle))) {
611
  $manifest_match = preg_match("/^udmanifest$match\.json$/i", $entry);
615
  $binzip_match = preg_match("/^zi([A-Za-z0-9]){6}$/", $entry);
616
  $cachelist_match = ($include_cachelist) ? preg_match("/$match-cachelist-.*.tmp$/i", $entry) : false;
617
  $browserlog_match = preg_match('/^log\.[0-9a-f]+-browser\.txt$/', $entry);
618
+ // Temporary files from the database dump process - not needed, as is caught by the catch-all
619
+ // $table_match = preg_match("/${match}-table-(.*)\.table(\.tmp)?\.gz$/i", $entry);
620
+ // The gz goes in with the txt, because we *don't* want to reap the raw .txt files
621
  if ((preg_match("/$match\.(tmp|table|txt\.gz)(\.gz)?$/i", $entry) || $cachelist_match || $ziparchive_match || $binzip_match || $manifest_match || $browserlog_match) && is_file($updraft_dir.'/'.$entry)) {
622
  // We delete if a parameter was specified (and either it is a ZipArchive match or an order to delete of whatever age), or if over 12 hours old
623
  if (($match && ($ziparchive_match || $binzip_match || $cachelist_match || $manifest_match || 0 == $older_than) && $now_time-filemtime($updraft_dir.'/'.$entry) >= $older_than) || $now_time-filemtime($updraft_dir.'/'.$entry)>43200) {
624
+ $skip_dblog = (0 == $files_deleted % 25) ? false : true;
625
+ $this->log("Deleting old temporary file: $entry", 'notice', false, $skip_dblog);
626
  @unlink($updraft_dir.'/'.$entry);
627
+ $files_deleted++;
628
  }
629
  }
630
  }
631
  @closedir($handle);
632
  }
633
+ // Depending on the PHP setup, the current working directory could be ABSPATH or wp-admin - scan both
634
+ // Since 1.9.32, we set them to go into $updraft_dir, so now we must check there too. Checking the old ones doesn't hurt, as other backup plugins might leave their temporary files around can cause issues with huge files.
635
  foreach (array(ABSPATH, ABSPATH.'wp-admin/', $updraft_dir.'/') as $path) {
636
  if ($handle = opendir($path)) {
637
  while (false !== ($entry = readdir($handle))) {
638
+ // With the old pclzip temporary files, there is no need to keep them around after they're not in use - so we don't use $older_than here - just go for 15 minutes
639
  if (preg_match("/^pclzip-[a-z0-9]+.tmp$/", $entry) && $now_time-filemtime($path.$entry) >= 900) {
640
  $this->log("Deleting old PclZip temporary file: $entry");
641
  @unlink($path.$entry);
666
 
667
  /**
668
  * Opens the log file, writes a standardised header, and stores the resulting name and handle in the class variables logfile_name/logfile_handle/opened_log_time (and possibly backup_is_already_complete)
669
+ *
670
  * @param string $nonce - Used in the log file name to distinguish it from other log files. Should be the job nonce.
671
  * @returns void
672
  */
673
  public function logfile_open($nonce) {
674
 
675
  $updraft_dir = $this->backups_dir_location();
676
+ $this->logfile_name = $updraft_dir."/log.$nonce.txt";
677
 
678
  if (file_exists($this->logfile_name)) {
679
  $seek_to = max((filesize($this->logfile_name) - 340), 1);
682
  // Returns 0 on success
683
  if (0 === @fseek($handle, $seek_to)) {
684
  $bytes_back = filesize($this->logfile_name) - $seek_to;
685
+ // Return to the end of the file
686
  $read_recent = fread($handle, $bytes_back);
687
+ // Move to end of file - ought to be redundant
688
  if (false !== strpos($read_recent, ') The backup apparently succeeded') && false !== strpos($read_recent, 'and is now complete')) {
689
  $this->backup_is_already_complete = true;
690
  }
703
 
704
  /**
705
  * Writes a standardised header to the log file, using the specified logging function, which needs to be compatible with (or to be) UpdraftPlus::log()
706
+ *
707
  * @param callable $logging_function
708
  */
709
  public function write_log_header($logging_function) {
724
 
725
  // Attempt to raise limit to avoid false positives
726
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
727
+ $max_execution_time = (int) @ini_get("max_execution_time");
728
 
729
  $logline = "UpdraftPlus WordPress backup plugin (https://updraftplus.com): ".$this->version." WP: ".$wp_version." PHP: ".phpversion()." (".PHP_SAPI.", ".@php_uname().") MySQL: $mysql_version WPLANG: ".get_locale()." Server: ".$_SERVER["SERVER_SOFTWARE"]." safe_mode: $safe_mode max_execution_time: $max_execution_time memory_limit: $memory_limit (used: ${memory_usage}M | ${memory_usage2}M) multisite: ".(is_multisite() ? 'Y' : 'N')." openssl: ".(defined('OPENSSL_VERSION_TEXT') ? OPENSSL_VERSION_TEXT : 'N')." mcrypt: ".(function_exists('mcrypt_encrypt') ? 'Y' : 'N')." LANG: ".getenv('LANG')." ZipArchive::addFile: ";
730
 
761
  }
762
 
763
  $disk_free_space = @disk_free_space($updraft_dir);
764
+ // == rather than === here is deliberate; support experience shows that a result of (int)0 is not reliable. i.e. 0 can be returned when the real result should be false.
765
+ if (false == $disk_free_space) {
766
  call_user_func($logging_function, "Free space on disk containing Updraft's temporary directory: Unknown".$quota_free);
767
  } else {
768
  call_user_func($logging_function, "Free space on disk containing Updraft's temporary directory: ".round($disk_free_space/1048576, 1)." MB".$quota_free);
772
 
773
  }
774
 
775
+ /**
776
+ * Logs the given line, adding (relative) time stamp and newline
777
+ * Note these subtleties of log handling:
778
+ * - Messages at level 'error' are not logged to file - it is assumed that a separate call to log() at another level will take place. This is because at level 'error', messages are translated; whereas the log file is for developers who may not know the translated language. Messages at level 'error' are for the user.
779
+ * - Messages at level 'error' do not persist through the job (they are only saved with save_backup_history(), and never restored from there - so only the final save_backup_history() errors
780
+ * persist); we presume that either a) they will be cleared on the next attempt, or b) they will occur again on the final attempt (at which point they will go to the user). But...
781
+ * - messages at level 'warning' persist. These are conditions that are unlikely to be cleared, not-fatal, but the user should be informed about. The $uniq_id field (which should not be numeric) can then be used for warnings that should only be logged once
782
+ * $skip_dblog = true is suitable when there's a risk of excessive logging, and the information is not important for the user to see in the browser on the settings page
783
+ * The uniq_id field is also used with PHP event detection - it is set then to 'php_event' - which is useful for anything hooking the action to detect
784
+ *
785
+ * @param String $how_many_bytes_needed - how many bytes need to be available
786
+ * @return Boolean - whether the needed number of bytes is available
787
+ */
788
  public function verify_free_memory($how_many_bytes_needed) {
789
  // This returns in MB
790
  $memory_limit = $this->memory_check_current();
796
  return false;
797
  }
798
 
799
+ /**
800
+ * Log
801
+ *
802
+ * @param string $line the log line
803
+ * @param string $level the log level: notice, warning, error. If suffixed with a hypen and a destination, then the default destination is changed too.
804
+ * @param boolean $uniq_id each of these will only be logged once
805
+ * @param boolean $skip_dblog if true, then do not write to the database
806
+ * @return null
807
+ */
808
  public function log($line, $level = 'notice', $uniq_id = false, $skip_dblog = false) {
809
 
810
  $destination = 'default';
820
  } else {
821
  $this->errors[] = array('level' => $level, 'message' => $line);
822
  }
823
+ // Errors are logged separately
824
  if ('error' == $level) return;
825
+ // It's a warning
826
  $warnings = $this->jobdata_get('warnings');
827
  if (!is_array($warnings)) $warnings = array();
828
  if ($uniq_id) {
836
  if (false === ($line = apply_filters('updraftplus_logline', $line, $this->nonce, $level, $uniq_id, $destination))) return;
837
 
838
  if ($this->logfile_handle) {
839
+ // Record log file times relative to the backup start, if possible
840
  $rtime = (!empty($this->job_time_ms)) ? microtime(true)-$this->job_time_ms : microtime(true)-$this->opened_log_time;
841
  fwrite($this->logfile_handle, sprintf("%08.03f", round($rtime, 3))." (".$this->current_resumption.") ".(('notice' != $level) ? '['.ucfirst($level).'] ' : '').$line."\n");
842
  }
843
 
844
  switch ($this->jobdata_get('job_type')) {
845
  case 'download':
846
+ // Download messages are keyed on the job (since they could be running several), and type
847
+ // The values of the POST array were checked before
848
+ $findex = empty($_POST['findex']) ? 0 : $_POST['findex'];
 
 
849
 
850
+ if (!empty($_POST['timestamp']) && !empty($_POST['type'])) $this->jobdata_set('dlmessage_'.$_POST['timestamp'].'_'.$_POST['type'].'_'.$findex, $line);
851
  break;
852
+
853
  case 'restore':
854
+ // if ('debug' != $level) echo $line."\n";
855
  break;
856
+
857
  default:
858
+ if (!$skip_dblog && 'debug' != $level) UpdraftPlus_Options::update_updraft_option('updraft_lastmessage', $line." (".date_i18n('M d H:i:s').")", false);
859
  break;
860
  }
861
 
862
+ if (defined('UPDRAFTPLUS_CONSOLELOG') && UPDRAFTPLUS_CONSOLELOG) echo $line."\n";
863
+ if (defined('UPDRAFTPLUS_BROWSERLOG') && UPDRAFTPLUS_BROWSERLOG) echo htmlentities($line)."<br>\n";
864
  }
865
 
866
  public function log_removewarning($uniq_id) {
867
  $warnings = $this->jobdata_get('warnings');
868
+ if (!is_array($warnings)) $warnings = array();
869
  unset($warnings[$uniq_id]);
870
  $this->jobdata_set('warnings', $warnings);
871
  unset($this->errors[$uniq_id]);
872
  }
873
 
874
+ /**
875
+ * For efficiency, you can also feed false or a string into this function
876
+ *
877
+ * @param Boolean|String|WP_Error $err - the errors
878
+ * @param Boolean $echo - whether to echo() the error(s)
879
+ * @param Boolean $logerror - whether to pass errors to UpdraftPlus::log()
880
+ * @return Boolean - returns false for convenience
881
+ */
882
  public function log_wp_error($err, $echo = false, $logerror = false) {
883
  if (false === $err) return false;
884
  if (is_string($err)) {
902
  }
903
  }
904
  }
905
+ // Returns false so that callers can return with false more efficiently if they wish
906
  return false;
907
  }
908
 
909
  public function get_max_packet_size() {
910
  global $wpdb;
911
+ $mp = (int) $wpdb->get_var("SELECT @@session.max_allowed_packet");
912
+ // Default to 1MB
913
  $mp = (is_numeric($mp) && $mp > 0) ? $mp : 1048576;
914
+ // 32MB
915
  if ($mp < 33554432) {
916
  $save = $wpdb->show_errors(false);
917
  $req = @$wpdb->query("SET GLOBAL max_allowed_packet=33554432");
918
  $wpdb->show_errors($save);
919
+ if (!$req) $this->log("Tried to raise max_allowed_packet from ".round($mp/1048576, 1)." MB to 32 MB, but failed (".$wpdb->last_error.", ".serialize($req).")");
920
+ $mp = (int) $wpdb->get_var("SELECT @@session.max_allowed_packet");
921
+ // Default to 1MB
922
  $mp = (is_numeric($mp) && $mp > 0) ? $mp : 1048576;
923
  }
924
  $this->log("Max packet size: ".round($mp/1048576, 1)." MB");
925
  return $mp;
926
  }
927
 
928
+ /**
929
+ * Q. Why is this abstracted into a separate function? A. To allow poedit and other parsers to pick up the need to translate strings passed to it (and not pick up all of those passed to log()).
930
+ * 1st argument = the line to be logged (obligatory)
931
+ * Further arguments = parameters for sprintf()
932
+ *
933
+ * @return null
934
+ */
935
  public function log_e() {
936
  $args = func_get_args();
937
+ // Get first argument
938
  $pre_line = array_shift($args);
939
+ // Log it whilst still in English
940
  if (is_wp_error($pre_line)) {
941
  $this->log_wp_error($pre_line);
942
  } else {
947
  }
948
  }
949
 
950
+ /**
951
+ * This function is used by cloud methods to provide standardised logging, but more importantly to help us detect that meaningful activity took place during a resumption run, so that we can schedule further resumptions if it is worthwhile
952
+ *
953
+ * @param Number $percent - the amount of the file uploaded
954
+ * @param String $extra - anything extra to include in the log message
955
+ * @param Boolean $file_path - the full path to the file being uploaded
956
+ * @param Boolean $log_it - whether to pass the message to UpdraftPlus::log()
957
+ * @return Void
958
+ */
959
  public function record_uploaded_chunk($percent, $extra = '', $file_path = false, $log_it = true) {
960
 
961
  // Touch the original file, which helps prevent overlapping runs
984
  /**
985
  * Method for helping remote storage methods to upload files in chunks without needing to duplicate all the overhead
986
  *
987
+ * @param object $caller the object to call back to do the actual network API calls; needs to have a chunked_upload() method.
988
+ * @param string $file the full path to the file
989
+ * @param string $cloudpath this is passed back to the callback function; within this function, it is used only for logging
990
+ * @param string $logname the prefix used on log lines. Also passed back to the callback function.
991
+ * @param integer $chunk_size the size, in bytes, of each upload chunk
992
+ * @param integer $uploaded_size how many bytes have already been uploaded. This is passed back to the callback function; within this method, it is only used for logging.
993
+ * @param boolean $singletons when the file, given the chunk size, would only have one chunk, should that be uploaded (true), or instead should 1 be returned (false) ?
994
+ * @return boolean
995
+ */
996
  public function chunked_upload($caller, $file, $cloudpath, $logname, $chunk_size, $uploaded_size, $singletons = false) {
997
 
998
  $fullpath = $this->backups_dir_location().'/'.$file;
1013
 
1014
  if (false == ($fp = @fopen($fullpath, 'rb'))) {
1015
  $this->log("$logname: failed to open file: $fullpath");
1016
+ $this->log("$file: ".sprintf(__('%s Error: Failed to open local file', 'updraftplus'), $logname), 'error');
1017
  return false;
1018
  }
1019
 
1084
  if ($uploaded) {
1085
  $perc = round(100*($upload_end + 1)/max($orig_file_size, 1), 1);
1086
  // Consumers use a return value of (int)1 (rather than (bool)true) to suppress logging
1087
+ $log_it = (1 === $uploaded) ? false : true;
1088
  $this->record_uploaded_chunk($perc, $chunk_index, $fullpath, $log_it);
1089
 
1090
  // $uploaded_bytes = $upload_end + 1;
1091
 
1092
  } else {
1093
  $errors_so_far++;
1094
+ if ($errors_so_far >= 3) {
1095
+ @fclose($fp);
1096
+ return false;
1097
+ }
1098
  }
1099
 
1100
  $chunk_index++;
1119
  }
1120
  if ($ret) {
1121
  $this->log("$logname upload: success");
1122
+ // UpdraftPlus_RemoteStorage_Addons_Base calls this itself
1123
  if (!is_a($caller, 'UpdraftPlus_RemoteStorage_Addons_Base')) $this->uploaded_file($file);
1124
  }
1125
 
1130
 
1131
  /**
1132
  * Provides a convenience function allowing remote storage methods to download a file in chunks, without duplicated overhead.
1133
+ *
1134
+ * @param string $file - The basename of the file being downloaded
1135
+ * @param object $method - This remote storage method object needs to have a chunked_download() method to call back
1136
+ * @param integer $remote_size - The size, in bytes, of the object being downloaded
1137
  * @param boolean $manually_break_up - Whether to break the download into multiple network operations (rather than just issuing a GET with a range beginning at the end of the already-downloaded data, and carrying on until it times out)
1138
+ * @param * $passback - A value to pass back to the callback function
1139
+ * @param integer $chunk_size - Break up the download into chunks of this number of bytes. Should be set if and only if $manually_break_up is true.
1140
  */
1141
  public function chunked_download($file, $method, $remote_size, $manually_break_up = false, $passback = null, $chunk_size = 1048576) {
1142
 
1154
  // N.B. We use ftell(), which precludes us from using open in append-only ('a') mode - see https://php.net/manual/en/function.fopen.php
1155
  if (!($fh = fopen($fullpath, 'c'))) {
1156
  $this->log("Error opening local file: $fullpath");
1157
+ $this->log($file.": ".__("Error", 'updraftplus').": ".__('Error opening local file: Failed to download', 'updraftplus'), 'error');
1158
  return false;
1159
  }
1160
 
1161
+ $last_byte = ($manually_break_up) ? min($remote_size, $start_offset + $chunk_size) : $remote_size;
1162
 
1163
+ // This only affects logging
1164
  $expected_bytes_delivered_so_far = true;
1165
 
1166
  while ($start_offset < $remote_size) {
1198
  // fseek returns - on success
1199
  if (false == ($fh = fopen($fullpath, 'c')) || 0 !== fseek($fh, $ret)) {
1200
  $this->log("Error opening local file: $fullpath");
1201
+ $this->log($file.": ".__("Error", 'updraftplus').": ".__('Error opening local file: Failed to download', 'updraftplus'), 'error');
1202
  return false;
1203
  }
1204
  }
1220
 
1221
  }
1222
 
1223
+ } catch (Exception $e) {
1224
  $this->log('Error ('.get_class($e).') - failed to download the file ('.$e->getCode().', '.$e->getMessage().')');
1225
+ $this->log("$file: ".__('Error - failed to download the file', 'updraftplus').' ('.$e->getCode().', '.$e->getMessage().')', 'error');
1226
  return false;
1227
  }
1228
 
1233
 
1234
  /**
1235
  * This will decrypt an encryped db file
1236
+ *
1237
+ * @param string $fullpath This is the full path to the encrypted file location
1238
+ * @param string $key This is the key (satling) to be used when decrypting
1239
  * @param boolean $to_temporary_file Use if the resulting file is not intended to be kept
1240
  * @return array This bring back an array of full decrypted path
1241
  */
1251
  }
1252
  }
1253
 
1254
+ // open file to read
1255
  if (false === ($file_handle = fopen($fullpath, 'rb'))) return false;
1256
 
1257
  $decrypted_path = dirname($fullpath).'/decrypt_'.basename($fullpath).'.tmp';
1258
+ // open new file from new path
1259
  if (false === ($decrypted_handle = fopen($decrypted_path, 'wb+'))) return false;
1260
 
1261
+ // setup encryption
1262
  $rijndael = new Crypt_Rijndael();
1263
  $rijndael->setKey($key);
1264
  $rijndael->disablePadding();
1268
  $bytes_decrypted = 0;
1269
  $buffer_size = defined('UPDRAFTPLUS_CRYPT_BUFFER_SIZE') ? UPDRAFTPLUS_CRYPT_BUFFER_SIZE : 2097152;
1270
 
1271
+ // loop around the file
1272
  while ($bytes_decrypted < $file_size) {
1273
+ // read buffer sized amount from file
1274
  if (false === ($file_part = fread($file_handle, $buffer_size))) return false;
1275
+ // check to ensure padding is needed before decryption
1276
  $length = strlen($file_part);
1277
+ if (0 != $length % 16) {
1278
  $pad = 16 - ($length % 16);
1279
  $file_part = str_pad($file_part, $length + $pad, chr($pad));
1280
+ // $file_part = str_pad($file_part, $length + $pad, chr(0));
1281
  }
1282
 
1283
  $decrypted_data = $rijndael->decrypt($file_part);
1290
  $last_byte = ord(substr($decrypted_data, -1, 1));
1291
  if ($last_byte < 16) {
1292
  $is_padding = true;
1293
+ for ($j = 1; $j<=$last_byte; $j++) {
1294
  if (substr($decrypted_data, -$j, 1) != chr($last_byte)) $is_padding = false;
1295
  }
1296
  }
1303
  $bytes_decrypted += $buffer_size;
1304
  }
1305
 
1306
+ // close the main file handle
1307
  fclose($decrypted_handle);
1308
+ // close original file
1309
  fclose($file_handle);
1310
 
1311
+ // remove the crypt extension from the end as this causes issues when opening
1312
  $fullpath_new = preg_replace('/\.crypt$/', '', $fullpath, 1);
1313
  // //need to replace original file with tmp file
1314
 
1323
 
1324
  if (false === rename($decrypted_path, $fullpath_new)) return false;
1325
 
1326
+ // need to send back the new decrypted path
1327
  $decrypt_return = array(
1328
  'fullpath' => $fullpath_new,
1329
  'basename' => $fullpath_basename
1333
  }
1334
 
1335
  public function detect_safe_mode() {
1336
+ // @codingStandardsIgnoreLine
1337
  return (@ini_get('safe_mode') && strtolower(@ini_get('safe_mode')) != "off") ? 1 : 0;
1338
  }
1339
 
1345
  return false;
1346
  }
1347
  $existing = $this->jobdata_get('binsqldump', null);
1348
+ // Theoretically, we could have moved machines, due to a migration
1349
  if (null !== $existing && (!is_string($existing) || @is_executable($existing))) return $existing;
1350
 
1351
  $updraft_dir = $this->backups_dir_location();
1386
  $output = '';
1387
  }
1388
  $ret = pclose($handle);
1389
+ if (0 != $ret) {
1390
  if ($logit) {
1391
  $this->log("Binary mysqldump: error (code: $ret)");
1392
  }
1393
  } else {
1394
+ // $dumped = file_get_contents($updraft_dir.'/'.$tmp_file, false, null, 0, 4096);
1395
  if (stripos($output, 'insert into') !== false) {
1396
  if ($logit) $this->log("Working binary mysqldump found: $potsql");
1397
  $result = $potsql;
1411
  return $result;
1412
  }
1413
 
1414
+ /**
1415
+ * We require -@ and -u -r to work - which is the usual Linux binzip
1416
+ *
1417
+ * @param Boolean $logit - whether to record the results with UpdraftPlus::log()
1418
+ * @param Boolean $cacheit - whether to cache the results as job data
1419
+ * @return String|Boolean - the path to a working zip binary, or false
1420
+ */
1421
  public function find_working_bin_zip($logit = true, $cacheit = true) {
1422
  if ($this->detect_safe_mode()) return false;
1423
  // The hosting provider may have explicitly disabled the popen or proc_open functions
1427
  }
1428
 
1429
  $existing = $this->jobdata_get('binzip', null);
1430
+ // Theoretically, we could have moved machines, due to a migration
1431
  if (null !== $existing && (!is_string($existing) || @is_executable($existing))) return $existing;
1432
 
1433
  $updraft_dir = $this->backups_dir_location();
1435
  if (!@is_executable($potzip)) continue;
1436
  if ($logit) $this->log("Testing: $potzip");
1437
 
1438
+ // Test it, see if it is compatible with Info-ZIP
1439
+ // If you have another kind of zip, then feel free to tell me about it
1440
  @mkdir($updraft_dir.'/binziptest/subdir1/subdir2', 0777, true);
1441
 
1442
  if (!file_exists($updraft_dir.'/binziptest/subdir1/subdir2')) return false;
1457
  if ($w && $logit) $this->log("Output: ".trim($w));
1458
  }
1459
  $ret = pclose($handle);
1460
+ if (0 != $ret) {
1461
  if ($logit) $this->log("Binary zip: error (code: $ret)");
1462
  $all_ok = false;
1463
  }
1466
  $all_ok = false;
1467
  }
1468
 
1469
+ // Now test -@
1470
  if (true == $all_ok) {
1471
  file_put_contents($updraft_dir.'/binziptest/subdir1/subdir2/test2.html', '<html><body><a href="https://updraftplus.com">UpdraftPlus is a really great backup and restoration plugin for WordPress.</a></body></html>');
1472
 
1474
  if (defined('UPDRAFTPLUS_BINZIP_OPTS') && UPDRAFTPLUS_BINZIP_OPTS) $exec .= ' '.UPDRAFTPLUS_BINZIP_OPTS;
1475
  $exec .= " -v -@ binziptest/test.zip";
1476
 
1477
+ $all_ok = true;
1478
 
1479
  $descriptorspec = array(
1480
  0 => array('pipe', 'r'),
1503
  fclose($pipes[2]);
1504
 
1505
  $ret = proc_close($handle);
1506
+ if (0 != $ret) {
1507
  if ($logit) $this->log("Binary zip: error (code: $ret)");
1508
  $all_ok = false;
1509
  }
1523
  $found_second = false;
1524
  if ($all_ok && file_exists($updraft_dir.'/binziptest/test.zip')) {
1525
  if (function_exists('gzopen')) {
1526
+ if (!class_exists('PclZip')) include_once(ABSPATH.'/wp-admin/includes/class-pclzip.php');
1527
  $zip = new PclZip($updraft_dir.'/binziptest/test.zip');
1528
  $foundit = 0;
1529
  if (($list = $zip->listContent()) != 0) {
1530
  foreach ($list as $obj) {
1531
+ if ($obj['filename'] && !empty($obj['stored_filename']) && 'binziptest/subdir1/subdir2/test.html' == $obj['stored_filename'] && 131 == $obj['size']) $found_first=true;
1532
+ if ($obj['filename'] && !empty($obj['stored_filename']) && 'binziptest/subdir1/subdir2/test2.html' == $obj['stored_filename'] && 138 == $obj['size']) $found_second=true;
1533
  }
1534
  }
1535
  } else {
1565
  @rmdir($updraft_dir.'/binziptest');
1566
  }
1567
 
1568
+ /**
1569
+ * This function is purely for timing - we just want to know the maximum run-time; not whether we have achieved anything during it
1570
+ *
1571
+ * @return null
1572
+ */
1573
  public function record_still_alive() {
1574
  // Update the record of maximum detected runtime on each run
1575
  $time_passed = $this->jobdata_get('run_times');
1582
  $resume_interval = $this->jobdata_get('resume_interval');
1583
  if ($time_this_run + 30 > $resume_interval) {
1584
  $new_interval = ceil($time_this_run + 30);
1585
+ set_site_transient('updraft_initial_resume_interval', (int) $new_interval, 8*86400);
1586
+ $this->log("The time we have been running (".round($time_this_run, 1).") is approaching the resumption interval ($resume_interval) - increasing resumption interval to $new_interval");
1587
  $this->jobdata_set('resume_interval', $new_interval);
1588
  }
1589
 
1636
  'nonce' => $matches[3],
1637
  'type' => $matches[4],
1638
  'index' => (empty($matches[5]) ? 0 : $matches[5]-1),
1639
+ 'extension' => $matches[6]
1640
+ );
1641
  } else {
1642
  return false;
1643
  }
1645
 
1646
  /**
1647
  * Indicate which checksums to take for backup files. Abstracted for extensibilty and future changes.
1648
+ *
1649
  * @returns array - a list of hashing algorithms, as understood by PHP's hash() function
1650
  */
1651
  public function which_checksums() {
1652
  return apply_filters('updraftplus_which_checksums', array('sha1', 'sha256'));
1653
  }
1654
 
1655
+ /**
1656
+ * Pretty printing of the raw backup information
1657
+ *
1658
+ * @param String $description
1659
+ * @param Array $history
1660
+ * @param String $entity
1661
+ * @param Array $checksums
1662
+ * @param Array $jobdata
1663
+ * @param Boolean $smaller
1664
+ * @return String
1665
+ */
1666
+ public function printfile($description, $history, $entity, $checksums, $jobdata, $smaller = false) {
1667
 
1668
  if (empty($history[$entity])) return;
1669
 
1670
  if ($smaller) {
1671
+ $pfiles = "<strong>".$description." (".sprintf(__('files: %s', 'updraftplus'), count($history[$entity])).")</strong><br>\n";
1672
  } else {
1673
+ $pfiles = "<h3>".$description." (".sprintf(__('files: %s', 'updraftplus'), count($history[$entity])).")</h3>\n\n";
1674
  }
1675
 
1676
  $pfiles .= '<ul>';
1711
  }
1712
  }
1713
 
1714
+ // if ($meta) $meta = " ($meta)";
1715
  if ($meta) $meta = "<br><em>$meta</em>";
1716
  $pfiles .= '<li>'.$op.$meta."\n</li>\n";
1717
  }
1722
 
1723
  }
1724
 
1725
+ /**
1726
+ * This important function returns a list of file entities that can potentially be backed up (subject to users settings), and optionally further meta-data about them
1727
+ *
1728
+ * @param boolean $include_others
1729
+ * @param boolean $full_info
1730
+ * @return array
1731
+ */
1732
  public function get_backupable_file_entities($include_others = true, $full_info = false) {
1733
 
1734
  $wp_upload_dir = $this->wp_upload_dir();
1735
 
1736
  if ($full_info) {
1737
  $arr = array(
1738
+ 'plugins' => array('path' => untrailingslashit(WP_PLUGIN_DIR), 'description' => __('Plugins', 'updraftplus')),
1739
+ 'themes' => array('path' => WP_CONTENT_DIR.'/themes', 'description' => __('Themes', 'updraftplus')),
1740
+ 'uploads' => array('path' => untrailingslashit($wp_upload_dir['basedir']), 'description' => __('Uploads', 'updraftplus'))
1741
  );
1742
  } else {
1743
  $arr = array(
1765
 
1766
  }
1767
 
1768
+ /**
1769
+ * This is just a long-winded way of forcing WP to get the value afresh from the db, instead of using the auto-loaded/cached value (which can be out of date, especially since backups are, by their nature, long-running)
1770
+ *
1771
+ * @param String $v - ignored
1772
+ * @return Mixed - the database option
1773
+ */
1774
  public function filter_updraft_backup_history($v) {
1775
  global $wpdb;
1776
+ $row = $wpdb->get_row($wpdb->prepare("SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", 'updraft_backup_history'));
1777
+ if (is_object($row)) return maybe_unserialize($row->option_value);
1778
  return false;
1779
  }
1780
 
1781
  public function php_error_to_logline($errno, $errstr, $errfile, $errline) {
1782
  switch ($errno) {
1783
+ case 1:
1784
+ $e_type = 'E_ERROR';
1785
+ break;
1786
+ case 2:
1787
+ $e_type = 'E_WARNING';
1788
+ break;
1789
+ case 4:
1790
+ $e_type = 'E_PARSE';
1791
+ break;
1792
+ case 8:
1793
+ $e_type = 'E_NOTICE';
1794
+ break;
1795
+ case 16:
1796
+ $e_type = 'E_CORE_ERROR';
1797
+ break;
1798
+ case 32:
1799
+ $e_type = 'E_CORE_WARNING';
1800
+ break;
1801
+ case 64:
1802
+ $e_type = 'E_COMPILE_ERROR';
1803
+ break;
1804
+ case 128:
1805
+ $e_type = 'E_COMPILE_WARNING';
1806
+ break;
1807
+ case 256:
1808
+ $e_type = 'E_USER_ERROR';
1809
+ break;
1810
+ case 512:
1811
+ $e_type = 'E_USER_WARNING';
1812
+ break;
1813
+ case 1024:
1814
+ $e_type = 'E_USER_NOTICE';
1815
+ break;
1816
+ case 2048:
1817
+ $e_type = 'E_STRICT';
1818
+ break;
1819
+ case 4096:
1820
+ $e_type = 'E_RECOVERABLE_ERROR';
1821
+ break;
1822
+ case 8192:
1823
+ $e_type = 'E_DEPRECATED';
1824
+ break;
1825
+ case 16384:
1826
+ $e_type = 'E_USER_DEPRECATED';
1827
+ break;
1828
+ case 30719:
1829
+ $e_type = 'E_ALL';
1830
+ break;
1831
+ default:
1832
+ $e_type = "E_UNKNOWN ($errno)";
1833
+ break;
1834
  }
1835
 
1836
  if (!is_string($errstr)) $errstr = serialize($errstr);
1879
  $this->backup_time = $this->jobdata_get('backup_time');
1880
  $this->job_time_ms = $this->jobdata_get('job_time_ms');
1881
 
1882
+ // Get the warnings before opening the log file, as opening the log file may generate new ones (which then leads to $this->errors having duplicate entries when they are copied over below)
1883
  $warnings = $this->jobdata_get('warnings');
1884
 
1885
  $this->logfile_open($bnonce);
1892
  }
1893
 
1894
  $runs_started = $this->jobdata_get('runs_started');
1895
+ if (!is_array($runs_started)) $runs_started =array();
1896
  $time_passed = $this->jobdata_get('run_times');
1897
  if (!is_array($time_passed)) $time_passed = array();
1898
 
1979
 
1980
  if ($resumption_no > 0 && isset($runs_started[$prev_resumption])) {
1981
  $our_expected_start = $runs_started[$prev_resumption] + $resume_interval;
1982
+ // If the previous run increased the resumption time, then it is timed from the end of the previous run, not the start
1983
  if (isset($time_passed[$prev_resumption]) && $time_passed[$prev_resumption]>0) $our_expected_start += $time_passed[$prev_resumption];
1984
  $our_expected_start = apply_filters('updraftplus_expected_start', $our_expected_start, $job_type);
1985
+ // More than 12 minutes late?
1986
  if ($time_now > $our_expected_start + 720) {
1987
+ $this->log('Long time past since expected resumption time: approx expected='.round($our_expected_start, 1).", now=".round($time_now, 1).", diff=".round($time_now-$our_expected_start, 1));
1988
  $this->log(__('Your website is visited infrequently and UpdraftPlus is not getting the resources it hoped for; please read this page:', 'updraftplus').' https://updraftplus.com/faqs/why-am-i-getting-warnings-about-my-site-not-having-enough-visitors/', 'warning', 'infrequentvisits');
1989
  }
1990
  }
1999
  // $time_passed is set earlier
2000
  list($max_time, $timings_string, $run_times_known) = $this->max_time_passed($time_passed, $resumption_no - 1, $first_run);
2001
 
2002
+ // Do this on resumption 8, or the first time that we have 6 data points
2003
  if (($first_run + 8 == $resumption_no && $run_times_known >= 6) || (6 == $run_times_known && !empty($time_passed[$prev_resumption]))) {
2004
  $this->log("Time passed on previous resumptions: $timings_string (known: $run_times_known, max: $max_time)");
2005
  // Remember that 30 seconds is used as the 'perhaps something is still running' detection threshold, and that 45 seconds is used as the 'the next resumption is approaching - reschedule!' interval
2060
 
2061
  global $updraftplus_backup;
2062
  // Bring in all the backup routines
2063
+ include_once(UPDRAFTPLUS_DIR.'/backup.php');
2064
  $updraftplus_backup = new UpdraftPlus_Backup($backup_files, apply_filters('updraftplus_files_altered_since', -1, $job_type));
2065
 
2066
  $undone_files = array();
2067
+
2068
  if ('no' == $backup_files) {
2069
  $this->log("This backup run is not intended for files - skipping");
2070
  $our_files = array();
2071
  } else {
2072
+ try {
2073
+ // This should be always called; if there were no files in this run, it returns us an empty array
2074
+ $backup_array = $updraftplus_backup->resumable_backup_of_files($resumption_no);
2075
+ // This save, if there was something, is then immediately picked up again
2076
+ if (is_array($backup_array)) {
2077
+ $this->log('Saving backup status to database (elements: '.count($backup_array).")");
2078
+ $this->save_backup_history($backup_array);
2079
+ }
2080
+
2081
+ // Switch of variable name is purely vestigial
2082
+ $our_files = $backup_array;
2083
+ if (!is_array($our_files)) $our_files = array();
2084
+ } catch (Exception $e) {
2085
+ $log_message = 'Exception ('.get_class($e).') occurred during files backup: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
2086
+ $this->log($log_message);
2087
+ error_log($log_message);
2088
+ $this->log(sprintf(__('A PHP exception (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage()), 'error');
2089
+ die();
2090
+ // @codingStandardsIgnoreLine
2091
+ } catch (Error $e) {
2092
+ $log_message = 'PHP Fatal error ('.get_class($e).') has occurred. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
2093
+ $this->log($log_message);
2094
+ error_log($log_message);
2095
+ $this->log(sprintf(__('A PHP fatal error (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage()), 'error');
2096
+ die();
2097
  }
2098
 
 
 
 
 
2099
  }
2100
 
2101
  $backup_databases = $this->jobdata_get('backup_database');
2143
  continue;
2144
  }
2145
 
2146
+ // Catch fatal errors through try/catch blocks around the database backup
2147
+ try {
2148
+ $db_backup = $updraftplus_backup->backup_db($backup_database, $whichdb, $dbinfo);
2149
+ } catch (Exception $e) {
2150
+ $log_message = 'Exception ('.get_class($e).') occurred during files backup: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
2151
+ $this->log($log_message);
2152
+ error_log($log_message);
2153
+ $this->log(sprintf(__('A PHP exception (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage()), 'error');
2154
+ die();
2155
+ // @codingStandardsIgnoreLine
2156
+ } catch (Error $e) {
2157
+ $log_message = 'PHP Fatal error ('.get_class($e).') has occurred. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
2158
+ $this->log($log_message);
2159
+ error_log($log_message);
2160
+ $this->log(sprintf(__('A PHP fatal error (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage()), 'error');
2161
+ die();
2162
+ }
2163
 
2164
+ if (is_array($our_files) && is_string($db_backup)) $our_files[$tindex] = $db_backup;
2165
 
2166
  if ('encrypted' != $backup_database) {
2167
  $backup_databases[$whichdb] = array('status' => 'finished', 'dbinfo' => $dbinfo);
2277
  }
2278
 
2279
  $this->log("Requesting upload of the files that have not yet been successfully uploaded (".count($undone_files).")");
2280
+ // Catch fatal errors through try/catch blocks around the upload to remote storage
2281
+ try {
2282
+ $updraftplus_backup->cloud_backup($undone_files);
2283
+ } catch (Exception $e) {
2284
+ $log_message = 'Exception ('.get_class($e).') occurred during files backup: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
2285
+ $this->log($log_message);
2286
+ error_log($log_message);
2287
+ $this->log(sprintf(__('A PHP exception (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage()), 'error');
2288
+ die();
2289
+ // @codingStandardsIgnoreLine
2290
+ } catch (Error $e) {
2291
+ $log_message = 'PHP Fatal error ('.get_class($e).') has occurred. Error Message: '.$e->getMessage().' (Code: '.$e->getCode().', line '.$e->getLine().' in '.$e->getFile().')';
2292
+ $this->log($log_message);
2293
+ error_log($log_message);
2294
+ $this->log(sprintf(__('A PHP fatal error (%s) has occurred: %s', 'updraftplus'), get_class($e), $e->getMessage()), 'error');
2295
+ die();
2296
+ }
2297
 
 
 
2298
  $this->log("Resume backup ($bnonce, $resumption_no): finish run");
2299
  if (is_array($our_files)) $this->save_last_backup($our_files);
2300
  $this->backup_finish($next_resumption, true, true, $resumption_no);
2322
  for ($i=$first_run; $i<=$upto; $i++) {
2323
  $timings_string .= "$i:";
2324
  if (isset($time_passed[$i])) {
2325
+ $timings_string .= round($time_passed[$i], 1).' ';
2326
  $run_times_known++;
2327
  if ($time_passed[$i] > $max_time) $max_time = round($time_passed[$i]);
2328
  } else {
2329
+ $timings_string .= '? ';
2330
  }
2331
  }
2332
  return array($max_time, $timings_string, $run_times_known);
2341
  if (!empty($this->nonce)) update_site_option("updraft_jobdata_".$this->nonce, $this->jobdata);
2342
  }
2343
 
2344
+ /**
2345
+ * This works with any amount of settings, but we provide also a jobdata_set for efficiency as normally there's only one setting
2346
+ *
2347
+ * @return null
2348
+ */
2349
  public function jobdata_set_multi() {
2350
  if (!is_array($this->jobdata)) $this->jobdata = array();
2351
 
2431
  }
2432
 
2433
  public function backup_files() {
2434
+ // Note that the "false" for database gets over-ridden automatically if they turn out to have the same schedules
2435
  $this->boot_backup(true, false);
2436
  }
2437
 
2438
  public function backup_database() {
2439
+ // Note that nothing will happen if the file backup had the same schedule
2440
  $this->boot_backup(false, true);
2441
  }
2442
 
2455
  $this->boot_backup(0, 1, false, false, ($skip_cloud) ? 'none' : false, $options);
2456
  }
2457
 
2458
+ /**
2459
+ * This procedure initiates a backup run
2460
+ * $backup_files/$backup_database: true/false = yes/no (over-write allowed); 1/0 = yes/no (force)
2461
+ *
2462
+ * @param Boolean $backup_files
2463
+ * @param Boolean $backup_database
2464
+ * @param Boolean|Array $restrict_files_to_override
2465
+ * @param Boolean $one_shot
2466
+ * @param Boolean|Array|String $service
2467
+ * @param Array $options
2468
+ * @return Boolean|Void - not currently well specified (though false indicates definite failure)
2469
+ */
2470
  public function boot_backup($backup_files, $backup_database, $restrict_files_to_override = false, $one_shot = false, $service = false, $options = array()) {
2471
 
2472
  @ignore_user_abort(true);
2482
 
2483
  if (!is_file($this->logfile_name)) {
2484
  $this->log('Failed to open log file ('.$this->logfile_name.') - you need to check your UpdraftPlus settings (your chosen directory for creating files in is not writable, or you ran out of disk space). Backup aborted.');
2485
+ $this->log(__('Could not create files in the backup directory. Backup aborted - check your UpdraftPlus settings.', 'updraftplus'), 'error');
2486
  return false;
2487
  }
2488
 
2494
 
2495
  // The is_bool() check here is confirming that we're allowed to adjust the parameters
2496
  if (false === $one_shot && is_bool($backup_database)) {
2497
+ // If the files and database schedules are the same, and if this the file one, then we rope in database too.
2498
+ // On the other hand, if the schedules were the same and this was the database run, then there is nothing to do.
2499
 
2500
  $files_schedule = UpdraftPlus_Options::get_updraft_option('updraft_interval');
2501
  $db_schedule = UpdraftPlus_Options::get_updraft_option('updraft_interval_database');
2505
  if ('manual' != $files_schedule) {
2506
  if ($files_schedule == $db_schedule || UpdraftPlus_Options::get_updraft_option('updraft_interval_database', 'xyz') == 'xyz') {
2507
  $sched_log_extra = 'Combining jobs from identical schedules. ';
2508
+ $backup_database = (true == $backup_files) ? true : false;
2509
  } elseif ($files_schedule && $db_schedule && $files_schedule != $db_schedule) {
2510
 
2511
  // This stored value is the earliest of the two apparently-close jobs
2558
  if (!is_array($service)) $service = array('none');
2559
 
2560
  if (!empty($options['extradata']) && preg_match('#services=remotesend/(\d+)#', $options['extradata'])) {
2561
+ if (array('none') === $service) $service = array();
2562
  $service[] = 'remotesend';
2563
  }
2564
 
2608
  }
2609
  update_option("updraft_last_scheduled_$semaphore", time());
2610
 
2611
+ include_once(UPDRAFTPLUS_DIR.'/includes/class-semaphore.php');
2612
  $this->semaphore = UpdraftPlus_Semaphore::factory();
2613
  $this->semaphore->lock_name = $semaphore;
2614
 
2629
  if (defined('UPDRAFTPLUS_INITIAL_RESUME_INTERVAL') && is_numeric(UPDRAFTPLUS_INITIAL_RESUME_INTERVAL)) {
2630
  $resume_interval = UPDRAFTPLUS_INITIAL_RESUME_INTERVAL;
2631
  } else {
2632
+ $resume_interval = (int) min(max(300, get_site_transient('updraft_initial_resume_interval')), 600);
2633
  }
2634
+ // We delete it because we only want to know about behaviour found during the very last backup run (so, if you move servers then old data is not retained)
2635
  delete_site_transient('updraft_initial_resume_interval');
2636
 
2637
  $job_file_entities = array();
2652
  $split_every = max(intval(UpdraftPlus_Options::get_updraft_option('updraft_split_every', 400)), UPDRAFTPLUS_SPLIT_MIN);
2653
 
2654
  $initial_jobdata = array(
2655
+ 'resume_interval',
2656
+ $resume_interval,
2657
+ 'job_type',
2658
+ 'backup',
2659
+ 'jobstatus',
2660
+ 'begun',
2661
+ 'backup_time',
2662
+ $this->backup_time,
2663
+ 'job_time_ms',
2664
+ $this->job_time_ms,
2665
+ 'service',
2666
+ $service,
2667
+ 'split_every',
2668
+ $split_every,
2669
+ 'maxzipbatch',
2670
+ 26214400, // 25MB
2671
+ 'job_file_entities',
2672
+ $job_file_entities,
2673
+ 'option_cache',
2674
+ $option_cache,
2675
+ 'uploaded_lastreset',
2676
+ 9,
2677
+ 'one_shot',
2678
+ $one_shot,
2679
+ 'followsups_allowed',
2680
+ $followups_allowed,
2681
  );
2682
 
2683
  if ($one_shot) update_site_option('updraft_oneshotnonce', $this->nonce);
2716
 
2717
  }
2718
 
2719
+ /**
2720
+ * This function examines inside the updraft directory to see if any new archives have been uploaded. If so, it adds them to the backup set. (Non-present items are also removed, only if the service is 'none').
2721
+ *
2722
+ * @param Boolean $remotescan scan not only local, but also remote storage
2723
+ * @param Array|String $only_add_this_file if set to an array (with keys 'name' and (optionally) 'label'), then a file will only be taken notice of if the filename matches the 'name' key (and the label will be associated with the backup set)
2724
+ * @return Array - an array of messages which the caller may wish to display to the user
2725
+ */
2726
  public function rebuild_backup_history($remotescan = false, $only_add_this_file = false) {
2727
 
2728
+ // TODO: Make compatible with incremental naming scheme
2729
 
2730
  $messages = array();
2731
  $gmt_offset = get_option('gmt_offset');
2744
  if (!is_dir($updraft_dir)) return;
2745
 
2746
  $accept = apply_filters('updraftplus_accept_archivename', array());
2747
+
2748
  if (!is_array($accept)) $accept = array();
2749
+ // First, process the database backup history to get a record of what is already known there. This means populating the arrays $known_files and $known_nonces .
2750
  foreach ($backup_history as $btime => $bdata) {
2751
  $found_file = false;
2752
  foreach ($bdata as $key => $values) {
2753
  if ('db' != $key && !isset($backupable_entities[$key])) continue;
2754
  // Record which set this file is found in
2755
+ if (!is_array($values)) $values = array($values);
2756
  foreach ($values as $val) {
2757
  if (!is_string($val)) continue;
2758
  if (preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+)?+(\.(zip|gz|gz\.crypt))?$/i', $val, $matches)) {
2759
  $nonce = $matches[2];
2760
+ if (isset($bdata['service']) && ('none' === $bdata['service'] || (is_array($bdata['service']) && (array('none') === $bdata['service'] || (1 == count($bdata['service']) && isset($bdata['service'][0]) && empty($bdata['service'][0]))))) && !is_file($updraft_dir.'/'.$val)) {
2761
+ // File without remote storage is no longer present
2762
  } else {
2763
  $found_file = true;
2764
  $known_files[$val] = $nonce;
2771
  }
2772
  if (!empty($accepted) && (false != ($btime = apply_filters('updraftplus_foreign_gettime', false, $accepted, $val))) && $btime > 0) {
2773
  $found_file = true;
2774
+ // Generate a nonce; this needs to be deterministic and based on the filename only
2775
  $nonce = substr(md5($val), 0, 12);
2776
  $known_files[$val] = $nonce;
2777
  $known_nonces[$nonce] = (empty($known_nonces[$nonce]) || $known_nonces[$nonce]<100) ? $btime : min($btime, $known_nonces[$nonce]);
2780
  }
2781
  }
2782
  if (!$found_file) {
2783
+ // File recorded as being without remote storage is no longer present. It may in fact exist in remote storage, and this will be picked up later (when we scan the remote storage).
2784
  unset($backup_history[$btime]);
2785
  $changes = true;
2786
  }
2788
 
2789
  $remotefiles = array();
2790
  $remotesizes = array();
2791
+ // Scan remote storage and get back lists of files and their sizes
2792
+ // TODO: Make compatible with incremental naming
2793
  if ($remotescan) {
2794
  add_action('http_request_args', array($this, 'modify_http_options'));
2795
+ $storage_objects_and_ids = $this->get_storage_objects_and_ids(array_keys($this->backup_methods));
2796
+
2797
+ foreach ($storage_objects_and_ids as $method => $method_information) {
2798
+
2799
+ $object = $method_information['object'];
2800
+
2801
+ if (!method_exists($object, 'listfiles')) continue;
2802
+
2803
+ if (!$object->supports_feature('multi_options')) {
2804
+ error_log("Multi options not supported by: ".$method);
2805
  continue;
2806
  }
2807
+
2808
+ foreach ($method_information['instance_settings'] as $instance_id => $options) {
2809
+
2810
+ $object->set_options($options, false, $instance_id);
2811
+ $files = $object->listfiles('backup_');
2812
+
2813
+ if (is_array($files)) {
2814
+
2815
+ foreach ($files as $entry) {
2816
+ $n = $entry['name'];
2817
+ if (!preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-([\-a-z]+)([0-9]+)?(\.(zip|gz|gz\.crypt))?$/i', $n, $matches)) continue;
2818
+
2819
+ $nonce = $matches[2];
2820
+ $btime2 = strtotime($matches[1]);
2821
+ $btime = (!empty($gmt_offset)) ? $btime2 - $gmt_offset*3600 : $btime2;
2822
+
2823
+ if (isset($known_nonces[$nonce])) $btime = $known_nonces[$nonce];
2824
+ if ($btime <= 100) continue;
2825
+
2826
+ if (!isset($backup_history[$btime]['service_instance_ids'][$method][$instance_id])) {
2827
+ $backup_history[$btime]['service_instance_ids'][$method][] = $instance_id;
2828
+ $changes = true;
2829
+ }
2830
+
2831
+ if (isset($remotefiles[$n])) {
2832
+ $remotefiles[$n][] = $method;
2833
+ } else {
2834
+ $remotefiles[$n] = array($method);
2835
+ }
2836
+ if (!empty($entry['size'])) {
2837
+ if (empty($remotesizes[$n]) || $remotesizes[$n] < $entry['size']) $remotesizes[$n] = $entry['size'];
2838
+ }
2839
  }
2840
+ } elseif (is_wp_error($files)) {
2841
+ foreach ($files->get_error_codes() as $code) {
2842
+ if ('no_settings' == $code || 'no_addon' == $code || 'insufficient_php' == $code || 'no_listing' == $code) continue;
2843
+ $messages[] = array(
2844
+ 'method' => $method,
2845
+ 'desc' => $method_description,
2846
+ 'code' => $code,
2847
+ 'message' => $files->get_error_message($code),
2848
+ 'data' => $files->get_error_data($code),
2849
+ 'service_instance_id' => $instance_id,
2850
+ );
2851
  }
2852
  }
 
 
 
 
 
 
 
 
 
 
 
2853
  }
2854
  }
2855
  remove_action('http_request_args', array($this, 'modify_http_options'));
2862
  $accepted_foreign = false;
2863
  $potmessage = false;
2864
 
2865
+ if (false !== $only_add_this_file && $entry != $only_add_this_file['file']) continue;
2866
 
2867
  if ('.' == $entry || '..' == $entry) continue;
2868
 
2869
+ // TODO: Make compatible with Incremental naming
2870
  if (preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-([\-a-z]+)([0-9]+)?(\.(zip|gz|gz\.crypt))?$/i', $entry, $matches)) {
2871
  // Interpret the time as one from the blog's local timezone, rather than as UTC
2872
+ // $matches[1] is YYYY-MM-DD-HHmm, to be interpreted as being the local timezone
2873
  $btime2 = strtotime($matches[1]);
2874
  $btime = (!empty($gmt_offset)) ? $btime2 - $gmt_offset*3600 : $btime2;
2875
  $nonce = $matches[2];
2878
  $type .= (!empty($matches[4])) ? $matches[4] : '';
2879
  $index = 0;
2880
  } else {
2881
+ $index = (empty($matches[4])) ? '0' : (max((int) $matches[4]-1, 0));
2882
  }
2883
+ $itext = (0 == $index) ? '' : $index;
2884
  } elseif (false != ($accepted_foreign = apply_filters('updraftplus_accept_foreign', false, $entry)) && false !== ($btime = apply_filters('updraftplus_foreign_gettime', false, $accepted_foreign, $entry))) {
2885
  $nonce = substr(md5($entry), 0, 12);
2886
  $type = (preg_match('/\.sql(\.(bz2|gz))?$/i', $entry) || preg_match('/-database-([-0-9]+)\.zip$/i', $entry) || preg_match('/backup_db_/', $entry)) ? 'db' : 'wpcore';
2907
  // The time from the filename does not include seconds. Need to identify the seconds to get the right time
2908
  if (isset($known_nonces[$nonce])) {
2909
  $btime_exact = $known_nonces[$nonce];
2910
+ // TODO: If the btime we had was more than 60 seconds earlier, then this must be an increment - we then need to change the $backup_history array accordingly. We can pad the '60 second' test, as there's no option to run an increment more frequently than every 4 hours (though someone could run one manually from the CLI)
2911
  if ($btime > 100 && $btime_exact - $btime > 60 && !empty($backup_history[$btime_exact])) {
2912
+ // TODO: This needs testing
2913
+ // The code below assumes that $backup_history[$btime] is presently empty
2914
+ // Re-key array, indicating the newly-found time to be the start of the backup set
2915
  $backup_history[$btime] = $backup_history[$btime_exact];
2916
  unset($backup_history[$btime_exact]);
2917
  $btime_exact = $btime;
2938
  }
2939
  }
2940
 
2941
+ // TODO: Code below here has not been reviewed or adjusted for compatibility with incremental backups
2942
+ // Make sure we have the right list of services
2943
  $current_services = (!empty($backup_history[$btime]) && !empty($backup_history[$btime]['service'])) ? $backup_history[$btime]['service'] : array();
2944
  if (is_string($current_services)) $current_services = array($current_services);
2945
  if (!is_array($current_services)) $current_services = array();
2948
  $backup_history[$btime]['service'] = $remotefiles[$entry];
2949
  $changes = true;
2950
  }
2951
+ // Get the right size (our local copy may be too small)
2952
  foreach ($remotefiles[$entry] as $rem) {
2953
  if (!empty($rem['size']) && $rem['size'] > $fs) {
2954
  $fs = $rem['size'];
2955
  $changes = true;
2956
  }
2957
  }
2958
+ // Remove from $remotefiles, so that we can later see what was left over
2959
  unset($remotefiles[$entry]);
2960
  } else {
2961
+ // Not known remotely
2962
  if (!empty($backup_history[$btime])) {
2963
+ if (empty($backup_history[$btime]['service']) || ('none' !== $backup_history[$btime]['service'] && '' !== $backup_history[$btime]['service'] && array('none') !== $backup_history[$btime]['service'])) {
2964
  $backup_history[$btime]['service'] = 'none';
2965
  $changes = true;
2966
  }
2976
  if (!empty($accepted_foreign)) $backup_history[$btime]['meta_foreign'] = $accepted_foreign;
2977
  }
2978
 
2979
+ // Any found in remote storage that we did not previously know about?
2980
+ // Compare $remotefiles with $known_files / $known_nonces, and adjust $backup_history
2981
  if (count($remotefiles) > 0) {
2982
 
2983
+ // $backup_history[$btime]['nonce'] = $nonce
2984
  foreach ($remotefiles as $file => $services) {
2985
  if (!preg_match('/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-([\-a-z]+)([0-9]+)?(\.(zip|gz|gz\.crypt))?$/i', $file, $matches)) continue;
2986
  $nonce = $matches[2];
2989
  $index = 0;
2990
  $type .= !empty($matches[4]) ? $matches[4] : '';
2991
  } else {
2992
+ $index = (empty($matches[4])) ? '0' : (max((int) $matches[4]-1, 0));
2993
  }
2994
+ $itext = (0 == $index) ? '' : $index;
2995
  $btime2 = strtotime($matches[1]);
2996
  $btime = (!empty($gmt_offset)) ? $btime2 - $gmt_offset*3600 : $btime2;
2997
 
2998
  if (isset($known_nonces[$nonce])) $btime = $known_nonces[$nonce];
2999
  if ($btime <= 100) continue;
3000
+ // Remember that at this point, we already know that the file is not known about locally
3001
  if (isset($backup_history[$btime])) {
3002
  if (!isset($backup_history[$btime]['service']) || ((is_array($backup_history[$btime]['service']) && $backup_history[$btime]['service'] !== $services) || is_string($backup_history[$btime]['service']) && (1 != count($services) || $services[0] !== $backup_history[$btime]['service']))) {
3003
  $changes = true;
3046
  if (0 == $this->error_count() || $force_abort) {
3047
  if ($do_cleanup) {
3048
  $this->log("There were no errors in the uploads, so the 'resume' event ($cancel_event) is being unscheduled");
3049
+ // This apparently-worthless setting of metadata before deleting it is for the benefit of a WP install seen where wp_clear_scheduled_hook() and delete_transient() apparently did nothing (probably a faulty cache)
3050
  $this->jobdata_set('jobstatus', 'finished');
3051
  wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event, $this->nonce));
3052
+ // This should be unnecessary - even if it does resume, all should be detected as finished; but I saw one very strange case where it restarted, and repeated everything; so, this will help
3053
  wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event+1, $this->nonce));
3054
  wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event+2, $this->nonce));
3055
  wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event+3, $this->nonce));
3059
  } else {
3060
  $this->log("There were errors in the uploads, so the 'resume' event is remaining scheduled");
3061
  $this->jobdata_set('jobstatus', 'resumingforerrors');
3062
+ // If there were no errors before moving to the upload stage, on the first run, then bring the resumption back very close. Since this is only attempted on the first run, it is really only an efficiency thing for a quicker finish if there was an unexpected networking event. We don't want to do it straight away every time, as it may be that the cloud service is down - and might be up in 5 minutes time. This was added after seeing a case where resumption 0 got to run for 10 hours... and the resumption 7 that should have picked up the uploading of 1 archive that failed never occurred.
3063
  if (isset($this->error_count_before_cloud_backup) && 0 === $this->error_count_before_cloud_backup) {
3064
  if (0 == $resumption_no) {
3065
  $this->reschedule(60);
3085
  // - It was the tenth resumption; everything failed
3086
 
3087
  $send_an_email = false;
3088
+ // Save the jobdata's state for the reporting - because it might get changed (e.g. incremental backup is scheduled)
3089
  $jobdata_as_was = $this->jobdata;
3090
 
3091
  // Make sure that the final status is shown
3098
  $remote_sent = (!empty($service) && ((is_array($service) && in_array('remotesend', $service)) || 'remotesend' === $service)) ? true : false;
3099
  if (0 == $this->error_count('warning')) {
3100
  $final_message = __('The backup apparently succeeded and is now complete', 'updraftplus');
3101
+ // Ensure it is logged in English. Not hugely important; but helps with a tiny number of really broken setups in which the options cacheing is broken
3102
  if ('The backup apparently succeeded and is now complete' != $final_message) {
3103
  $this->log('The backup apparently succeeded and is now complete');
3104
  }
3105
  } else {
3106
+ $final_message = __('The backup apparently succeeded (with warnings) and is now complete', 'updraftplus');
3107
  if ('The backup apparently succeeded (with warnings) and is now complete' != $final_message) {
3108
  $this->log('The backup apparently succeeded (with warnings) and is now complete');
3109
  }
3140
  if ($force_abort) $jobdata_as_was['aborted'] = true;
3141
  if ($send_an_email) $updraftplus_backup->send_results_email($final_message, $jobdata_as_was);
3142
 
3143
+ // Make sure this is the final message logged (so it remains on the dashboard)
3144
  $this->log($final_message);
3145
 
3146
  @fclose($this->logfile_handle);
3151
 
3152
  }
3153
 
3154
+ /**
3155
+ * This function returns 'true' if mod_rewrite could be detected as unavailable; a 'false' result may mean it just couldn't find out the answer
3156
+ *
3157
+ * @param boolean $check_if_in_use_first
3158
+ * @return boolean
3159
+ */
3160
  public function mod_rewrite_unavailable($check_if_in_use_first = true) {
3161
  if (function_exists('apache_get_modules')) {
3162
  global $wp_rewrite;
3171
  public function error_count($level = 'error') {
3172
  $count = 0;
3173
  foreach ($this->errors as $err) {
3174
+ if (('error' == $level && (is_string($err) || is_wp_error($err))) || (is_array($err) && $level == $err['level'])) {
3175
+ $count++;
3176
+ }
3177
  }
3178
  return $count;
3179
  }
3186
  echo '<li>'.htmlspecialchars($msg).'<li>';
3187
  }
3188
  } elseif (is_array($err) && ('error' == $err['level'] || 'warning' == $err['level'])) {
3189
+ echo "<li>".htmlspecialchars($err['message'])."</li>";
3190
  } elseif (is_string($err)) {
3191
+ echo "<li>".htmlspecialchars($err)."</li>";
3192
  } else {
3193
+ print "<li>".print_r($err, true)."</li>";
3194
  }
3195
  }
3196
  echo '</ul>';
3208
  UpdraftPlus_Options::update_updraft_option('updraft_last_backup', $last_backup, false);
3209
  }
3210
 
3211
+ /**
3212
+ * $handle must be either false or a WPDB class (or extension thereof). Other options are not yet fully supported.
3213
+ *
3214
+ * @param Resource|Boolean|Object $handle
3215
+ * @param Boolean $logit - whether to log information about the check
3216
+ * @param Boolean $reschedule - whether to schedule a resumption if checking fails
3217
+ * @return Boolean|Integer - whether the check succeeded, or -1 for an unknown result
3218
+ */
3219
  public function check_db_connection($handle = false, $logit = false, $reschedule = false) {
3220
 
3221
  $type = false;
3222
  if (false === $handle || is_a($handle, 'wpdb')) {
3223
+ $type = 'wpdb';
3224
  } elseif (is_resource($handle)) {
3225
+ // Expected: string(10) "mysql link"
3226
+ $type = get_resource_type($handle);
3227
  } elseif (is_object($handle) && is_a($handle, 'mysqli')) {
3228
+ $type = 'mysqli';
3229
  }
3230
 
3231
  if (false === $type) return -1;
3233
  $db_connected = -1;
3234
 
3235
  if ('mysql link' == $type || 'mysqli' == $type) {
3236
+ // @codingStandardsIgnoreLine
3237
  if ('mysql link' == $type && @mysql_ping($handle)) return true;
3238
  if ('mysqli' == $type && @mysqli_ping($handle)) return true;
3239
 
3240
+ // @codingStandardsIgnoreLine
3241
+ for ($tries = 1; $tries <= 5; $tries++) {
3242
+ // to do, if ever needed
3243
+ // if ($this->db_connect(false )) return true;
3244
+ // sleep(1);
3245
  }
3246
 
3247
  } elseif ('wpdb' == $type) {
3252
  if (method_exists($handle, 'check_connection') && (!defined('UPDRAFTPLUS_SUPPRESS_CONNECTION_CHECKS') || !UPDRAFTPLUS_SUPPRESS_CONNECTION_CHECKS)) {
3253
  if (!$handle->check_connection(false)) {
3254
  if ($logit) $this->log("The database went away, and could not be reconnected to");
3255
+ // Almost certainly a no-op
3256
  if ($reschedule) $this->reschedule(60);
3257
  $db_connected = false;
3258
  } else {
3265
 
3266
  }
3267
 
3268
+ /**
3269
+ * This should be called whenever a file is successfully uploaded
3270
+ *
3271
+ * @param String $file - full filepath
3272
+ * @param boolean $force - mark as successfully uploaded even if not on the last server
3273
+ * @return Void
3274
+ */
3275
  public function uploaded_file($file, $force = false) {
3276
 
3277
  global $updraftplus_backup;
3295
  $upload_status = $this->jobdata_get('uploading_substatus');
3296
  if (is_array($upload_status) && isset($upload_status['i'])) {
3297
  $upload_status['i']++;
3298
+ $upload_status['p'] =0;
3299
  $this->jobdata_set('uploading_substatus', $upload_status);
3300
  }
3301
 
3302
+ // Really, we could do this immediately when we realise the DB has gone away. This is just for the probably-impossible case that a DB write really can still succeed. But, we must abort before calling delete_local(), as the removal of the local file can cause it to be recreated if the DB is out of sync with the fact that it really is already uploaded
3303
  if (false === $db_connected) {
3304
  $this->record_still_alive();
3305
  die;
3308
  // Delete local files immediately if the option is set
3309
  // Where we are only backing up locally, only the "prune" function should do deleting
3310
  $service = $this->jobdata_get('service');
3311
+ if (!empty($updraftplus_backup->last_service) && ('' !== $service && ((is_array($service) && count($service)>0 && (count($service) > 1 || ('' !== $service[0] && 'none' !== $service[0]))) || (is_string($service) && 'none' !== $service)))) {
3312
  $this->delete_local($file);
3313
  }
3314
  }
3315
 
3316
+ /**
3317
+ * Return whether a particular file has been uploaded to a particular remote service
3318
+ *
3319
+ * @param String $file - the filename (basename)
3320
+ * @param String $service - the service identifier; or none, to indicate all services
3321
+ *
3322
+ * @return Boolean - the result
3323
+ */
3324
  public function is_uploaded($file, $service = '') {
3325
  $hash = $service.(('' == $service) ? '' : '-').md5($file);
3326
  return ($this->jobdata_get("uploaded_$hash") === "yes") ? true : false;
3331
  if (UpdraftPlus_Options::get_updraft_option('updraft_delete_local')) {
3332
  $fullpath = $this->backups_dir_location().'/'.$file;
3333
 
3334
+ // check to make sure it exists before removing
3335
+ if (realpath($fullpath)) {
3336
  $deleted = unlink($fullpath);
3337
  $this->log($log.(($deleted) ? 'OK' : 'failed'));
3338
  return $deleted;
3343
  return true;
3344
  }
3345
 
3346
+ /**
3347
+ * This function is not needed for backup success, according to the design, but it helps with efficient scheduling
3348
+ *
3349
+ * @return null
3350
+ */
3351
  private function reschedule_if_needed() {
3352
  // If nothing is scheduled, then return
3353
  if (empty($this->newresumption_scheduled)) return;
3357
  if ($time_away >1 && $time_away <= 45) {
3358
  $this->log('The scheduled resumption is within 45 seconds - will reschedule');
3359
  // Push 45 seconds into the future
3360
+ // $this->reschedule(60);
3361
  // Increase interval generally by 45 seconds, on the assumption that our prior estimates were innaccurate (i.e. not just 45 seconds *this* time)
3362
  $this->increase_resume_and_reschedule(45);
3363
  }
3368
  $next_resumption = $this->current_resumption + 1;
3369
  wp_clear_scheduled_hook('updraft_backup_resume', array($next_resumption, $this->nonce));
3370
  // Add new event
3371
+ // This next line may be too cautious; but until 14-Aug-2014, it was 300.
3372
+ // Update 20-Mar-2015 - lowered from 180
3373
+ if ($how_far_ahead < 120) $how_far_ahead = 120;
3374
  $schedule_for = time() + $how_far_ahead;
3375
  $this->log("Rescheduling resumption $next_resumption: moving to $how_far_ahead seconds from now ($schedule_for)");
3376
  wp_schedule_single_event($schedule_for, 'updraft_backup_resume', array($next_resumption, $this->nonce));
3379
 
3380
  private function increase_resume_and_reschedule($howmuch = 120, $force_schedule = false) {
3381
 
3382
+ $resume_interval = max(intval($this->jobdata_get('resume_interval')), (0 === $howmuch) ? 120 : 300);
3383
 
3384
  if (empty($this->newresumption_scheduled) && $force_schedule) {
3385
  $this->log("A new resumption will be scheduled to prevent the job ending");
3386
  }
3387
 
3388
  $new_resume = $resume_interval + $howmuch;
3389
+ // It may be that we're increasing for the second (or more) time during a run, and that we already know that the new value will be insufficient, and can be increased
3390
  if ($this->opened_log_time > 100 && microtime(true)-$this->opened_log_time > $new_resume) {
3391
  $new_resume = ceil(microtime(true)-$this->opened_log_time)+45;
3392
  $howmuch = $new_resume-$resume_interval;
3393
  }
3394
 
3395
+ // This used to be always $new_resume, until 14-Aug-2014. However, people who have very long-running processes can end up with very long times between resumptions as a result.
3396
+ // Actually, let's not try this yet. I think it is safe, but think there is a more conservative solution available.
3397
+ // $how_far_ahead = min($new_resume, 600);
3398
  $how_far_ahead = $new_resume;
3399
+ // If it is very long-running, then that would normally be known soon.
3400
+ // If the interval is already 12 minutes or more, then try the next resumption 10 minutes from now (i.e. sooner than it would have been). Thus, we are guaranteed to get at least 24 minutes of processing in the first 34.
3401
  if ($this->current_resumption <= 1 && $new_resume > 720) $how_far_ahead = 600;
3402
 
3403
  if (!empty($this->newresumption_scheduled) || $force_schedule) $this->reschedule($how_far_ahead);
3406
  $this->log("To decrease the likelihood of overlaps, increasing resumption interval to: $resume_interval + $howmuch = $new_resume");
3407
  }
3408
 
3409
+ /**
3410
+ * For detecting another run, and aborting if one was found
3411
+ *
3412
+ * @param String $file - full file path
3413
+ * @return Void
3414
+ */
3415
  public function check_recent_modification($file) {
3416
  if (file_exists($file)) {
3417
+ $time_mod = (int) @filemtime($file);
3418
  $time_now = time();
3419
  if ($time_mod>100 && ($time_now-$time_mod)<30) {
3420
  $this->terminate_due_to_activity($file, $time_now, $time_mod);
3460
  }
3461
 
3462
  public function backup_uploads_dirlist($logit = false) {
3463
+ // Create an array of directories to be skipped
3464
+ // Make the values into the keys
3465
  $exclude = UpdraftPlus_Options::get_updraft_option('updraft_include_uploads_exclude', UPDRAFT_DEFAULT_UPLOADS_EXCLUDE);
3466
  if ($logit) $this->log("Exclusion option setting (uploads): ".$exclude);
3467
  $skip = array_flip(preg_split("/,/", $exclude));
3471
  }
3472
 
3473
  public function backup_others_dirlist($logit = false) {
3474
+ // Create an array of directories to be skipped
3475
+ // Make the values into the keys
3476
  $exclude = UpdraftPlus_Options::get_updraft_option('updraft_include_others_exclude', UPDRAFT_DEFAULT_OTHERS_EXCLUDE);
3477
  if ($logit) $this->log("Exclusion option setting (others): ".$exclude);
3478
  $skip = array_flip(preg_split("/,/", $exclude));
3479
  $file_entities = $this->get_backupable_file_entities(false);
3480
 
3481
+ // Keys = directory names to avoid; values = the label for that directory (used only in log files)
3482
+ // $avoid_these_dirs = array_flip($file_entities);
3483
  $avoid_these_dirs = array();
3484
  foreach ($file_entities as $type => $dirs) {
3485
  if (is_string($dirs)) {
3493
  return $this->compile_folder_list_for_backup(WP_CONTENT_DIR, $avoid_these_dirs, $skip);
3494
  }
3495
 
3496
+ /**
3497
+ * Add backquotes to tables and db-names in SQL queries. Taken from phpMyAdmin.
3498
+ *
3499
+ * @param string $a_name - the table name
3500
+ * @return string - the quoted table name
3501
+ */
3502
  public function backquote($a_name) {
3503
+ if (!empty($a_name) && '*' != $a_name) {
3504
  if (is_array($a_name)) {
3505
  $result = array();
3506
  reset($a_name);
3507
+ while (list($key, $val) = each($a_name)) {
3508
  $result[$key] = '`'.$val.'`';
3509
+ }
3510
  return $result;
3511
  } else {
3512
  return '`'.$a_name.'`';
3520
  return preg_replace('#/+(,|$)#', '$1', $string);
3521
  }
3522
 
3523
+ /**
3524
+ * Remove empty (according to empty()) members of an array
3525
+ *
3526
+ * @param Array $list - input array
3527
+ * @return Array - pruned array
3528
+ */
3529
  public function remove_empties($list) {
3530
  if (!is_array($list)) return $list;
3531
  foreach ($list as $ind => $entry) {
3534
  return $list;
3535
  }
3536
 
3537
+ /**
3538
+ * avoid_these_dirs and skip_these_dirs ultimately do the same thing; but avoid_these_dirs takes full paths whereas skip_these_dirs takes basenames; and they are logged differently (dirs in avoid are potentially dangerous to include; skip is just a user-level preference). They are allowed to overlap.
3539
+ *
3540
+ * @param string $backup_from_inside_dir
3541
+ * @param string $avoid_these_dirs
3542
+ * @param string $skip_these_dirs
3543
+ * @return array
3544
+ */
3545
  public function compile_folder_list_for_backup($backup_from_inside_dir, $avoid_these_dirs, $skip_these_dirs) {
3546
 
3547
  // Entries in $skip_these_dirs are allowed to end in *, which means "and anything else as a suffix". It's not a full shell glob, but it covers what is needed to-date.
3561
  while (false !== ($entry = readdir($handle))) {
3562
  // $candidate: full path; $entry = one-level
3563
  $candidate = $backup_from_inside_dir.'/'.$entry;
3564
+ if ("." != $entry && ".." != $entry) {
3565
  if (isset($avoid_these_dirs[$candidate])) {
3566
  $this->log("finding files: $entry: skipping: this is the ".$avoid_these_dirs[$candidate]." directory");
3567
  } elseif ($candidate == $updraft_dir) {
3609
  }
3610
 
3611
  private function save_backup_history($backup_array) {
3612
+ if (is_array($backup_array)) {
3613
  $backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
3614
  $backup_history = (is_array($backup_history)) ? $backup_history : array();
3615
  $backup_array['nonce'] = $this->nonce;
3616
  $backup_array['service'] = $this->jobdata_get('service');
3617
+
3618
+ $backup_array['service_instance_ids'] = array();
3619
+
3620
+ // N.B. Though the saved 'service' option can have various forms (especially if upgrading from (very) old versions), in the jobdata, it is always an array.
3621
+ $storage_objects_and_ids = $this->get_storage_objects_and_ids($backup_array['service']);
3622
+
3623
+ // N.B. On PHP 5.5+, we'd use array_column()
3624
+ foreach ($storage_objects_and_ids as $method => $method_information) {
3625
+ $backup_array['service_instance_ids'][$method] = array_keys($method_information['instance_settings']);
3626
+ }
3627
+
3628
  if ('' != ($label = $this->jobdata_get('label', ''))) $backup_array['label'] = $label;
3629
  $backup_array['created_by_version'] = $this->version;
3630
  $backup_array['is_multisite'] = is_multisite() ? true : false;
3635
  UpdraftPlus_Options::update_updraft_option('updraft_backup_history', $backup_history, false);
3636
  } else {
3637
  $this->log('Could not save backup history because we have no backup array. Backup probably failed.');
3638
+ $this->log(__('Could not save backup history because we have no backup array. Backup probably failed.', 'updraftplus'), 'error');
3639
  }
3640
  }
3641
 
3642
+ /**
3643
+ * This method will return an array of remote storage objects and instance settings of the currently connected remote storage services.
3644
+ *
3645
+ * @param Array $services - an list of service identifiers (e.g. ['dropbox', 's3'])
3646
+ *
3647
+ * @return Array - returns an array, with a key equal to each member of the $services list passed in. The corresponding value is then an array with keys 'object', 'instance_settings'. The value for 'object' is an UpdraftPlus_BackupModule instance. The value for 'instance_settings' is an array keyed by associated instance IDs, with the values being the associated settings for the instance ID.
3648
+ */
3649
+ public function get_storage_objects_and_ids($services) {
3650
+
3651
+ $storage_objects_and_ids = array();
3652
+
3653
+ foreach ($services as $method) {
3654
+
3655
+ if ('none' === $method) continue;
3656
+
3657
+ $call_method = 'UpdraftPlus_BackupModule_'.$method;
3658
+
3659
+ if (!class_exists($call_method)) include_once UPDRAFTPLUS_DIR.'/methods/'.$method.'.php';
3660
+
3661
+ if (class_exists($call_method)) {
3662
+
3663
+ $remote_storage = new $call_method;
3664
+
3665
+ if (!empty($method_objects[$method])) $storage_objects_and_ids[$method] = array();
3666
+
3667
+ $storage_objects_and_ids[$method]['object'] = $remote_storage;
3668
+
3669
+ if ($remote_storage->supports_feature('multi_options')) {
3670
+
3671
+ $settings = UpdraftPlus_Options::get_updraft_option('updraft_'.$method);
3672
+
3673
+ if (!is_array($settings)) $settings = array();
3674
+
3675
+ if (!isset($settings['version'])) $settings = $this->update_remote_storage_options_format($method);
3676
+
3677
+ if (is_wp_error($settings)) {
3678
+ error_log("UpdraftPlus: failed to convert storage options format: $method");
3679
+ $settings = array('settings' => array());
3680
+ }
3681
+
3682
+ if (empty($settings['settings'])) {
3683
+ // See: https://wordpress.org/support/topic/cannot-setup-connectionauthenticate-with-dropbox/
3684
+ error_log("UpdraftPlus: Warning: settings for $method are empty. A dummy field is usually needed so that something is saved.");
3685
+
3686
+ // Try to recover by getting a default set of options for display
3687
+ if (is_callable(array($remote_storage, 'get_default_options'))) {
3688
+ $uuid = 's-'.md5(rand().uniqid().microtime(true));
3689
+ $settings['settings'] = array($uuid => $remote_storage->get_default_options());
3690
+ }
3691
+
3692
+ }
3693
+
3694
+ if (!empty($settings['settings'])) {
3695
+
3696
+ if (!isset($storage_objects_and_ids[$method]['instance_settings'])) $storage_objects_and_ids[$method]['instance_settings'] = array();
3697
+
3698
+ foreach ($settings['settings'] as $instance_id => $storage_options) {
3699
+ $storage_objects_and_ids[$method]['instance_settings'][$instance_id] = $storage_options;
3700
+ }
3701
+ }
3702
+ }
3703
+
3704
+ } else {
3705
+ error_log("UpdraftPlus: no such storage class: $call_method");
3706
+ }
3707
+ }
3708
+
3709
+ return $storage_objects_and_ids;
3710
+
3711
+ }
3712
+
3713
  public function is_db_encrypted($file) {
3714
  return preg_match('/\.crypt$/i', $file);
3715
  }
3717
  public function get_backup_history($timestamp = false) {
3718
  $backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
3719
  // The line below actually *introduces* a race condition
3720
+ // global $wpdb;
3721
+ // $backup_history = @unserialize($wpdb->get_var($wpdb->prepare("SELECT option_value from $wpdb->options WHERE option_name='updraft_backup_history'")));
3722
  if (is_array($backup_history)) {
3723
+ krsort($backup_history); // reverse sort so earliest backup is last on the array. Then we can array_pop.
3724
  } else {
3725
  $backup_history = array();
3726
  }
3729
  }
3730
 
3731
  public function terminate_due_to_activity($file, $time_now, $time_mod, $increase_resumption = true) {
3732
+ // We check-in, to avoid 'no check in last time!' detectors firing
3733
  $this->record_still_alive();
3734
+ $file_size = file_exists($file) ? round(filesize($file)/1024, 1). 'KB' : 'n/a';
3735
  $this->log("Terminate: ".basename($file)." exists with activity within the last 30 seconds (time_mod=$time_mod, time_now=$time_now, diff=".(floor($time_now-$time_mod)).", size=$file_size). This likely means that another UpdraftPlus run is at work; so we will exit.");
3736
  $increase_by = ($increase_resumption) ? 120 : 0;
3737
  $this->increase_resume_and_reschedule($increase_by, true);
3738
  if (!defined('UPDRAFTPLUS_ALLOW_RECENT_ACTIVITY') || true != UPDRAFTPLUS_ALLOW_RECENT_ACTIVITY) die;
3739
  }
3740
 
3741
+ /**
3742
+ * Replace last occurence
3743
+ *
3744
+ * @param string $search
3745
+ * @param string $replace
3746
+ * @param string $subject
3747
+ * @return string
3748
+ */
3749
  public function str_lreplace($search, $replace, $subject) {
3750
  $pos = strrpos($subject, $search);
3751
+ if (false !== $pos) $subject = substr_replace($subject, $replace, $pos, strlen($search));
3752
  return $subject;
3753
  }
3754
 
3755
+ /**
3756
+ * Replace the first, and only the first, instance within a string
3757
+ *
3758
+ * @param String $needle - the search term
3759
+ * @param String $replace - the replacement term
3760
+ * @param String $haystack - the string to replace within
3761
+ *
3762
+ * @return String - the filtered string
3763
+ */
3764
  public function str_replace_once($needle, $replace, $haystack) {
3765
  $pos = strpos($haystack, $needle);
3766
+ return (false !== $pos) ? substr_replace($haystack, $replace, $pos, strlen($needle)) : $haystack;
3767
  }
3768
 
3769
+ /**
3770
+ * If files + db are on different schedules but are scheduled for the same time,
3771
+ * then combine them $event = (object) array('hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval']);
3772
+ * See wp_schedule_single_event() and wp_schedule_event() in wp-includes/cron.php
3773
+ *
3774
+ * @param Object|Boolean $event - the event being scheduled
3775
+ * @return Object|Boolean - the filtered value
3776
+ */
3777
  public function schedule_event($event) {
3778
 
3779
  static $scheduled = array();
 
3780
 
3781
  if (is_object($event) && ('updraft_backup' == $event->hook || 'updraft_backup_database' == $event->hook)) {
3782
 
3790
  // This next fragment is wrong: there's only a 'second call' when saving all settings; otherwise, the WP scheduler might just be updating one event. So, there's some inefficieny as the option is wiped and set uselessly at least once when saving settings.
3791
  // We only want to take action on the second call (otherwise, our information is out-of-date already)
3792
  // If there is no second call, then that's fine - nothing to do
3793
+ // if (count($scheduled) < 2) {
3794
+ // return $event;
3795
+ // }
3796
 
3797
+ $backup_scheduled_for = ('updraft_backup' == $event->hook) ? $event->timestamp : wp_next_scheduled('updraft_backup');
3798
  $db_scheduled_for = ('updraft_backup_database' == $event->hook) ? $event->timestamp : wp_next_scheduled('updraft_backup_database');
3799
 
3800
  $diff = absint($backup_scheduled_for - $db_scheduled_for);
3811
  return $event;
3812
 
3813
  }
3814
+
3815
+ /**
3816
+ * This function is both the backup scheduler and a filter callback for saving the option. It is called in the register_setting for the updraft_interval, which means when the admin settings are saved it is called.
3817
+ *
3818
+ * @param String $interval
3819
+ * @return String - filtered value
3820
+ */
3821
  public function schedule_backup($interval) {
3822
  $previous_time = wp_next_scheduled('updraft_backup');
3823
 
3862
  /**
3863
  * Acts as a WordPress options filter
3864
  *
3865
+ * @param Array $onedrive - An array of OneDrive options
3866
  * @return Array - the returned array can either be the set of updated OneDrive settings or a WordPress error array
3867
  */
3868
  public function onedrive_checkchange($onedrive) {
3905
  }
3906
 
3907
  /**
3908
+ * Acts as a WordPress options filter
3909
+ *
3910
+ * @param Array $azure an array of Azure options
3911
  * @return Array - the returned array can either be the set of updated Azure settings or a WordPress error array
3912
  */
3913
  public function azure_checkchange($azure) {
3949
  /**
3950
  * Acts as a WordPress options filter
3951
  *
3952
+ * @param Array $google - An array of Google Drive options
3953
  * @return Array - the returned array can either be the set of updated Google Drive settings or a WordPress error array
3954
  */
3955
  public function googledrive_checkchange($google) {
3966
  // The saved options had a problem; so, return the new ones
3967
  return $google;
3968
  }
3969
+ // $opts = UpdraftPlus_Options::get_updraft_option('updraft_googledrive');
3970
  if (!is_array($google)) return $opts;
3971
 
3972
  // Remove instances that no longer exist
3975
  }
3976
 
3977
  foreach ($google['settings'] as $instance_id => $storage_options) {
3978
+ if (empty($opts['settings'][$instance_id]['user_id'])) {
3979
+ $old_client_id = (empty($opts['settings'][$instance_id]['clientid'])) ? '' : $opts['settings'][$instance_id]['clientid'];
3980
+ if (!empty($opts['settings'][$instance_id]['token']) && $old_client_id != $storage_options['clientid']) {
3981
+ include_once(UPDRAFTPLUS_DIR.'/methods/googledrive.php');
3982
+ add_action('http_request_args', array($this, 'modify_http_options'));
3983
+ $googledrive = new UpdraftPlus_BackupModule_googledrive();
3984
+ $googledrive->gdrive_auth_revoke(false);
3985
+ remove_action('http_request_args', array($this, 'modify_http_options'));
3986
+ $opts['settings'][$instance_id]['token'] = '';
3987
+ unset($opts['settings'][$instance_id]['ownername']);
3988
+ }
3989
  }
3990
+
3991
  foreach ($storage_options as $key => $value) {
3992
  // Trim spaces - I got support requests from users who didn't spot the spaces they introduced when copy/pasting
3993
  $opts['settings'][$instance_id][$key] = ('clientid' == $key || 'secret' == $key) ? trim($value) : $value;
4003
  /**
4004
  * Acts as a WordPress options filter
4005
  *
4006
+ * @param Array $google - An array of Google Cloud options
4007
  * @return Array - the returned array can either be the set of updated Google Cloud settings or a WordPress error array
4008
  */
4009
  public function googlecloud_checkchange($google) {
4033
  $old_client_id = (empty($opts['settings'][$instance_id]['clientid'])) ? '' : $opts['settings'][$instance_id]['clientid'];
4034
  $old_client_secret = (empty($opts['settings'][$instance_id]['secret'])) ? '' : $opts['settings'][$instance_id]['secret'];
4035
 
4036
+ if ($old_client_id == $google['settings'][$instance_id]['clientid'] && $old_client_secret == $google['settings'][$instance_id]['secret']) {
4037
  $google['settings'][$instance_id]['token'] = $old_token;
4038
  }
4039
  if (!empty($opts['settings'][$instance_id]['token']) && $old_client_id != $google['settings'][$instance_id]['clientid']) {
4040
+ include_once(UPDRAFTPLUS_DIR.'/methods/googlecloud.php');
4041
  add_action('http_request_args', array($this, 'modify_http_options'));
4042
  $googlecloud = new UpdraftPlus_BackupModule_googlecloud();
4043
  $googlecloud->gcloud_auth_revoke(false);
4048
  foreach ($storage_options as $key => $value) {
4049
  // Trim spaces - I got support requests from users who didn't spot the spaces they introduced when copy/pasting
4050
  $opts['settings'][$instance_id][$key] = ('clientid' == $key || 'secret' == $key) ? trim($value) : $value;
4051
+ if ('bucket_location' == $key) $opts['settings'][$instance_id][$key] = trim(strtolower($value));
4052
  }
4053
  }
4054
 
4055
  return $opts;
4056
  }
4057
 
4058
+ /**
4059
+ * WordPress options filter, sanitising the FTP options saved from the options page
4060
+ *
4061
+ * @param Array $ftp - the options, prior to sanitisation
4062
+ *
4063
+ * @return Array - the sanitised options for saving
4064
+ */
4065
  public function ftp_sanitise($ftp) {
4066
+ if (is_array($ftp)) {
4067
+ if (!empty($ftp['host']) && preg_match('#ftp(es|s)?://(.*)#i', $ftp['host'], $matches)) {
4068
+ $ftp['host'] = untrailingslashit($matches[2]);
4069
+ }
4070
+ if (isset($ftp['pass'])) {
4071
+ $ftp['pass'] = trim($ftp['pass'], "\n\r\0\x0B");
4072
+ }
4073
  }
4074
  return $ftp;
4075
  }
4084
  /**
4085
  * Acts as a WordPress options filter
4086
  *
4087
+ * @param Array $dropbox - An array of Dropbox options
4088
  * @return Array - the returned array can either be the set of updated Dropbox settings or a WordPress error array
4089
  */
4090
  public function dropbox_checkchange($dropbox) {
4110
  if (!isset($dropbox['settings'][$instance_id])) unset($opts['settings'][$instance_id]);
4111
  }
4112
 
4113
+ // Dropbox has a special case where the settings could be empty so we should check for this before
4114
  if (!empty($dropbox['settings'])) {
4115
 
4116
  foreach ($dropbox['settings'] as $instance_id => $storage_options) {
4129
  }
4130
 
4131
  // Now loop over the new options, and replace old options with them
4132
+ foreach ($storage_options as $key => $value) {
4133
  if (null === $value) {
4134
  unset($opts['settings'][$instance_id][$key]);
4135
  } else {
4136
  if (!isset($opts['settings'][$instance_id])) $opts['settings'][$instance_id] = array();
4137
+ $opts['settings'][$instance_id][$key] = $value;
4138
  }
4139
  }
4140
 
4149
 
4150
  public function remove_local_directory($dir, $contents_only = false) {
4151
  // PHP 5.3+ only
4152
+ // foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
4153
+ // $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
4154
+ // }
4155
+ // return rmdir($dir);
4156
 
4157
  if ($handle = @opendir($dir)) {
4158
  while (false !== ($entry = readdir($handle))) {
4170
  return ($contents_only) ? true : rmdir($dir);
4171
  }
4172
 
4173
+ /**
4174
+ * Get the location of UD's internal directory
4175
+ *
4176
+ * @param Boolean $allow_cache
4177
+ * @return String - the directory path. Returns without any trailing slash.
4178
+ */
4179
  public function backups_dir_location($allow_cache = true) {
4180
 
4181
  if ($allow_cache && !empty($this->backup_dir)) return $this->backup_dir;
4182
 
4183
  $updraft_dir = untrailingslashit(UpdraftPlus_Options::get_updraft_option('updraft_dir'));
4184
+ // When newly installing, if someone had (e.g.) wp-content/updraft in their database from a previous, deleted pre-1.7.18 install but had removed the updraft directory before re-installing, without this fix they'd end up with wp-content/wp-content/updraft.
4185
  if (preg_match('/^wp-content\/(.*)$/', $updraft_dir, $matches) && ABSPATH.'wp-content' === WP_CONTENT_DIR) {
4186
  UpdraftPlus_Options::update_updraft_option('updraft_dir', $matches[1]);
4187
  $updraft_dir = WP_CONTENT_DIR.'/'.$matches[1];
4191
 
4192
  // Do a test for a relative path
4193
  if ('/' != substr($updraft_dir, 0, 1) && "\\" != substr($updraft_dir, 0, 1) && !preg_match('/^[a-zA-Z]:/', $updraft_dir)) {
4194
+ // Legacy - file paths stored related to ABSPATH
4195
  if (is_dir(ABSPATH.$updraft_dir) && is_file(ABSPATH.$updraft_dir.'/index.html') && is_file(ABSPATH.$updraft_dir.'/.htaccess') && !is_file(ABSPATH.$updraft_dir.'/index.php') && false !== strpos(file_get_contents(ABSPATH.$updraft_dir.'/.htaccess', false, null, 0, 20), 'deny from all')) {
4196
  $updraft_dir = ABSPATH.$updraft_dir;
4197
  } else {
4198
+ // File paths stored relative to WP_CONTENT_DIR
4199
  $updraft_dir = trailingslashit(WP_CONTENT_DIR).$updraft_dir;
4200
  }
4201
  }
4202
 
4203
  // Check for the existence of the dir and prevent enumeration
4204
  // index.php is for a sanity check - make sure that we're not somewhere unexpected
4205
+ if ((!is_dir($updraft_dir) || !is_file($updraft_dir.'/index.html') || !is_file($updraft_dir.'/.htaccess')) && !is_file($updraft_dir.'/index.php') || !is_file($updraft_dir.'/web.config')) {
4206
  @mkdir($updraft_dir, 0775, true);
4207
+ @file_put_contents($updraft_dir.'/index.html', "<html><body><a href=\"https://updraftplus.com\">WordPress backups by UpdraftPlus</a></body></html>");
4208
+ if (!is_file($updraft_dir.'/.htaccess')) @file_put_contents($updraft_dir.'/.htaccess', 'deny from all');
4209
  if (!is_file($updraft_dir.'/web.config')) @file_put_contents($updraft_dir.'/web.config', "<configuration>\n<system.webServer>\n<authorization>\n<deny users=\"*\" />\n</authorization>\n</system.webServer>\n</configuration>\n");
4210
  }
4211
 
4216
 
4217
  /**
4218
  * This function creates the correct header when download files
4219
+ *
4220
  * @param string $fullpath This is the full path to the encrypted file
4221
  * @param string $encryption This is the key (salting) used to decrypt the file
4222
  * @return heder This will download the fila when via the browser
4230
  } else {
4231
 
4232
 
4233
+ // now decrypt the file and return array
4234
  $decrypted_file = $this->decrypt($fullpath, $encryption, true);
4235
 
4236
+ // check to ensure there is a response back
4237
  if (is_array($decrypted_file)) {
4238
  header('Content-type: application/x-gzip');
4239
  header("Content-Disposition: attachment; filename=\"".$decrypted_file['basename']."\";");
4240
  header("Content-Length: ".filesize($decrypted_file['fullpath']));
4241
  readfile($decrypted_file['fullpath']);
4242
 
4243
+ // need to remove the file as this is no longer needed on the local server
4244
  unlink($decrypted_file['fullpath']);
4245
  } else {
4246
  header('Content-type: text/plain');
4274
 
4275
  // Prevent any debug output
4276
  // Don't enable this line - it causes 500 HTTP errors in some cases/hosts on some large files, for unknown reason
4277
+ // @ini_set('display_errors', '0');
4278
 
4279
  $spooled = false;
4280
  if ('.crypt' == substr($fullpath, -6, 6)) {
4281
  if (ob_get_level()) {
4282
+ $flush_max = min(5, (int) ob_get_level());
4283
+ for ($i=1; $i<=$flush_max; $i++) {
4284
+ @ob_end_clean();
4285
+ }
4286
  }
4287
  header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
4288
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
4289
+ $this->spool_crypted_file($fullpath, (string) $encryption);
4290
  return;
4291
  }
4292
 
4293
  $content_type = $this->get_mime_type_from_filename($fullpath, false);
4294
 
4295
+ include_once(UPDRAFTPLUS_DIR.'/includes/class-partialfileservlet.php');
4296
 
4297
+ // Prevent the file being read into memory
4298
  if (ob_get_level()) {
4299
+ $flush_max = min(5, (int) ob_get_level());
4300
+ for ($i=1; $i<=$flush_max; $i++) {
4301
+ @ob_end_clean();
4302
+ }
4303
  }
4304
  if (ob_get_level()) @ob_end_clean(); // Twice - see HS#6673 - someone at least needed it
4305
 
4324
  try {
4325
  $range_header = UpdraftPlus_RangeHeader::createFromHeaderString($range_header);
4326
  $servlet = new UpdraftPlus_PartialFileServlet($range_header);
4327
+ $servlet->send_file($fullpath, $content_type);
4328
  } catch (UpdraftPlus_InvalidRangeHeaderException $e) {
4329
  header("HTTP/1.1 400 Bad Request");
4330
  error_log("UpdraftPlus: UpdraftPlus_InvalidRangeHeaderException: ".$e->getMessage());
4342
  }
4343
 
4344
  public function retain_range($input) {
4345
+ $input = (int) $input;
4346
+ return ($input > 0) ? min($input, 9999) : 1;
4347
  }
4348
 
4349
  /**
4350
  * Acts as a WordPress options filter
4351
  *
4352
+ * @param Array $webdav - An array of WebDAV options
4353
  * @return Array - the returned array can either be the set of updated WebDAV settings or a WordPress error array
4354
  */
4355
  public function construct_webdav_url($webdav) {
4390
  $storage_options['port'] = '';
4391
  }
4392
 
4393
+ if ('/' == substr($storage_options['path'], 0, 1)) {
4394
  $slash = "";
4395
  }
4396
 
4397
+ if (false === strpos($storage_options['host'], "@")) {
4398
  $host = "@";
4399
  }
4400
 
4451
  }
4452
 
4453
  public function memory_check_current($memory_limit = false) {
4454
+ // Returns in megabytes
4455
+ if (false == $memory_limit) $memory_limit = ini_get('memory_limit');
4456
  $memory_limit = rtrim($memory_limit);
4457
  $memory_unit = $memory_limit[strlen($memory_limit)-1];
4458
+ if (0 == (int) $memory_unit && '0' !== $memory_unit) {
4459
+ $memory_limit = substr($memory_limit, 0, strlen($memory_limit)-1);
4460
  } else {
4461
  $memory_unit = '';
4462
  }
4463
+ switch ($memory_unit) {
4464
  case '':
4465
+ $memory_limit = floor($memory_limit/1048576);
4466
+ break;
4467
  case 'K':
4468
  case 'k':
4469
+ $memory_limit = floor($memory_limit/1024);
4470
+ break;
4471
  case 'G':
4472
+ $memory_limit = $memory_limit*1024;
4473
+ break;
4474
  case 'M':
4475
+ // assumed size, no change needed
4476
+ break;
4477
  }
4478
  return $memory_limit;
4479
  }
4480
 
4481
  public function memory_check($memory, $check_using = false) {
4482
  $memory_limit = $this->memory_check_current($check_using);
4483
+ return ($memory_limit >= $memory) ? true : false;
4484
  }
4485
 
4486
  private function url_start($html_allowed, $url, $https = false) {
4487
  $proto = ($https) ? 'https' : 'http';
4488
+ if (strpos($url, 'updraftplus.com') !== false) {
4489
+ return $html_allowed ? "<a href=".apply_filters('updraftplus_com_link', $proto.'://'.$url).">" : "";
4490
+ } else {
4491
+ return $html_allowed ? "<a href=\"$proto://$url\">" : "";
4492
  }
4493
  }
4494
 
4499
 
4500
  private function translation_needed() {
4501
  $wplang = get_locale();
4502
+ if (strlen($wplang) < 1 || 'en_US' == $wplang || 'en_GB' == $wplang) return false;
4503
  if (defined('WP_LANG_DIR') && is_file(WP_LANG_DIR.'/plugins/updraftplus-'.$wplang.'.mo')) return false;
4504
  if (is_file(UPDRAFTPLUS_DIR.'/languages/updraftplus-'.$wplang.'.mo')) return false;
4505
  return true;
4506
  }
4507
 
4508
  public function get_updraftplus_rssfeed() {
4509
+ if (!function_exists('fetch_feed')) include(ABSPATH.WPINC.'/feed.php');
4510
  return fetch_feed('http://feeds.feedburner.com/updraftplus/');
4511
  }
4512
 
4513
  public function analyse_db_file($timestamp, $res, $db_file = false, $header_only = false) {
4514
 
4515
+ $mess = array();
4516
+ $warn = array();
4517
+ $err = array();
4518
+ $info = array();
4519
 
4520
  $wp_version = $this->get_wordpress_version();
4521
  global $wpdb;
4523
  $updraft_dir = $this->backups_dir_location();
4524
 
4525
  if (false === $db_file) {
4526
+ // This attempts to raise the maximum packet size. This can't be done within the session, only globally. Therefore, it has to be done before the session starts; in our case, during the pre-analysis.
4527
  $this->get_max_packet_size();
4528
 
4529
  $backup = $this->get_backup_history($timestamp);
4553
  if (is_array($decrypted_file)) {
4554
  $db_file = $decrypted_file['fullpath'];
4555
  } else {
4556
+ $err[] = __('Decryption failed. The most likely cause is that you used the wrong key.', 'updraftplus');
4557
  return array($mess, $warn, $err, $info);
4558
  }
4559
 
4560
 
4561
  }
4562
 
4563
+ // Even the empty schema when gzipped comes to 1565 bytes; a blank WP 3.6 install at 5158. But we go low, in case someone wants to share single tables.
4564
  if (filesize($db_file) < 1000) {
4565
+ $err[] = sprintf(__('The database is too small to be a valid WordPress database (size: %s Kb).', 'updraftplus'), round(filesize($db_file)/1024, 1));
4566
  return array($mess, $warn, $err, $info);
4567
  }
4568
 
4570
 
4571
  $dbhandle = ($is_plain) ? fopen($db_file, 'r') : $this->gzopen_for_read($db_file, $warn, $err);
4572
  if (!is_resource($dbhandle)) {
4573
+ $err[] = __('Failed to open database file.', 'updraftplus');
4574
  return array($mess, $warn, $err, $info);
4575
  }
4576
 
4577
  $info['timestamp'] = $timestamp;
4578
 
4579
+ // Analyse the file, print the results.
4580
 
4581
  $line = 0;
4582
  $old_siteurl = '';
4615
  $old_siteurl = untrailingslashit($matches[1]);
4616
  $mess[] = __('Backup of:', 'updraftplus').' '.htmlspecialchars($old_siteurl).((!empty($old_wp_version)) ? ' '.sprintf(__('(version: %s)', 'updraftplus'), $old_wp_version) : '');
4617
  // Check for should-be migration
4618
+ if (untrailingslashit(site_url()) != $old_siteurl) {
4619
  if (!$migration_warning) {
4620
  $migration_warning = true;
4621
+ $powarn = apply_filters('updraftplus_dbscan_urlchange', '<a href="https://updraftplus.com/shop/migrator/">'.__('This backup set is from a different site - this is not a restoration, but a migration. You need the Migrator add-on in order to make this work.', 'updraftplus').'</a>', $old_siteurl, $res);
4622
  if (!empty($powarn)) $warn[] = $powarn;
4623
  }
4624
  // Explicitly set it, allowing the consumer to detect when the result was unknown
4634
  } elseif ('' == $old_home && preg_match('/^\# Home URL: (http(.*))$/', $buffer, $matches)) {
4635
  $old_home = untrailingslashit($matches[1]);
4636
  // Check for should-be migration
4637
+ if (!$migration_warning && home_url() != $old_home) {
4638
  $migration_warning = true;
4639
+ $powarn = apply_filters('updraftplus_dbscan_urlchange', '<a href="https://updraftplus.com/shop/migrator/">'.__('This backup set is from a different site - this is not a restoration, but a migration. You need the Migrator add-on in order to make this work.', 'updraftplus').'</a>', $old_home, $res);
4640
  if (!empty($powarn)) $warn[] = $powarn;
4641
  }
4642
  } elseif (!isset($info['created_by_version']) && preg_match('/^\# Created by UpdraftPlus version ([\d\.]+)/', $buffer, $matches)) {
4645
  $old_wp_version = $matches[1];
4646
  if (!empty($matches[3])) $old_wp_version .= substr($matches[3], 0, strlen($matches[3])-1);
4647
  if (version_compare($old_wp_version, $wp_version, '>')) {
4648
+ // $mess[] = sprintf(__('%s version: %s', 'updraftplus'), 'WordPress', $old_wp_version);
4649
  $warn[] = sprintf(__('You are importing from a newer version of WordPress (%s) into an older one (%s). There are no guarantees that WordPress can handle this.', 'updraftplus'), $old_wp_version, $wp_version);
4650
  }
4651
  if (preg_match('/running on PHP ([0-9]+\.[0-9]+)(\s|\.)/', $matches[4], $nmatches) && preg_match('/^([0-9]+\.[0-9]+)(\s|\.)/', PHP_VERSION, $cmatches)) {
4652
  $old_php_version = $nmatches[1];
4653
  $current_php_version = $cmatches[1];
4654
  if (version_compare($old_php_version, $current_php_version, '>')) {
4655
+ // $mess[] = sprintf(__('%s version: %s', 'updraftplus'), 'WordPress', $old_wp_version);
4656
  $warn[] = sprintf(__('The site in this backup was running on a webserver with version %s of %s. ', 'updraftplus'), $old_php_version, 'PHP').' '.sprintf(__('This is significantly newer than the server which you are now restoring onto (version %s).', 'updraftplus'), PHP_VERSION).' '.sprintf(__('You should only proceed if you cannot update the current server and are confident (or willing to risk) that your plugins/themes/etc. are compatible with the older %s version.', 'updraftplus'), 'PHP').' '.sprintf(__('Any support requests to do with %s should be raised with your web hosting company.', 'updraftplus'), 'PHP');
4657
  }
4658
  }
4659
  } elseif ('' == $old_table_prefix && (preg_match('/^\# Table prefix: (\S+)$/', $buffer, $matches) || preg_match('/^-- Table prefix: (\S+)$/i', $buffer, $matches))) {
4660
  $old_table_prefix = $matches[1];
4661
+ // echo '<strong>'.__('Old table prefix:', 'updraftplus').'</strong> '.htmlspecialchars($old_table_prefix).'<br>';
4662
  } elseif (empty($info['label']) && preg_match('/^\# Label: (.*)$/', $buffer, $matches)) {
4663
  $info['label'] = $matches[1];
4664
  $mess[] = __('Backup label:', 'updraftplus').' '.htmlspecialchars($info['label']);
4668
  // Sanity checks
4669
  if (isset($old_siteinfo['multisite']) && !$old_siteinfo['multisite'] && is_multisite()) {
4670
  // Just need to check that you're crazy
4671
+ // if (!defined('UPDRAFTPLUS_EXPERIMENTAL_IMPORTINTOMULTISITE') || !UPDRAFTPLUS_EXPERIMENTAL_IMPORTINTOMULTISITE) {
4672
+ // $err[] = sprintf(__('Error: %s', 'updraftplus'), __('You are running on WordPress multisite - but your backup is not of a multisite site.', 'updraftplus'));
4673
+ // return array($mess, $warn, $err, $info);
4674
+ // } else {
4675
  $warn[] = __('You are running on WordPress multisite - but your backup is not of a multisite site.', 'updraftplus').' '.__('It will be imported as a new site.', 'updraftplus').' <a href="https://updraftplus.com/information-on-importing-a-single-site-wordpress-backup-into-a-wordpress-network-i-e-multisite/">'.__('Please read this link for important information on this process.', 'updraftplus').'</a>';
4676
+ // }
4677
  // Got the needed code?
4678
  if (!class_exists('UpdraftPlusAddOn_MultiSite') || !class_exists('UpdraftPlus_Addons_Migrator')) {
4679
  $err[] = sprintf(__('Error: %s', 'updraftplus'), sprintf(__('To import an ordinary WordPress site into a multisite installation requires %s.', 'updraftplus'), 'UpdraftPlus Premium'));
4689
  $info['multisite'] = $val ? true : false;
4690
  if ($val) $mess[] = '<strong>'.__('Site information:', 'updraftplus').'</strong> '.'backup is of a WordPress Network';
4691
  }
4692
+ $old_siteinfo[$key] = $val;
4693
  }
4694
  } elseif (preg_match('/^\# Skipped tables: (.*)$/', $buffer, $matches)) {
4695
  $skipped_tables = explode(',', $matches[1]);
4791
  if (!function_exists('gzseek')) return $dbhandle;
4792
 
4793
  if (false === ($bytes = gzread($dbhandle, 3))) return false;
4794
+ // Double-gzipped?
4795
  if ('H4sI' != base64_encode($bytes)) {
4796
  if (0 === gzseek($dbhandle, 0)) {
4797
  return $dbhandle;
4800
  return gzopen($file, 'r');
4801
  }
4802
  }
4803
+ // Yes, it's double-gzipped
4804
 
4805
  $what_to_return = false;
4806
  $mess = __('The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver.', 'updraftplus');
4829
 
4830
  gzclose($dbhandle);
4831
  fclose($fnew);
4832
+ // On some systems (all Windows?) you can't rename a gz file whilst it's gzopened
4833
  if (!rename($file.".tmp", $file)) {
4834
  $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus');
4835
  } else {
4845
  return $what_to_return;
4846
  }
4847
 
4848
+ /**
4849
+ * TODO: Remove legacy storage setting keys from here
4850
+ * These are used in 4 places (Feb 2016 - of course, you should re-scan the code to check if relying on this): showing current settings on the debug modal, wiping all current settings, getting a settings bundle to restore when migrating, and for relevant keys in POST-ed data when saving settings over AJAX
4851
+ *
4852
+ * @return Array - the list of keys
4853
+ */
4854
  public function get_settings_keys() {
4855
+ // N.B. updraft_backup_history is not included here, as we don't want that wiped
4856
+ return array(
4857
+ 'updraft_autobackup_default',
4858
+ 'updraft_dropbox',
4859
+ 'updraft_googledrive',
4860
+ 'updraftplus_tmp_googledrive_access_token',
4861
+ 'updraftplus_dismissedautobackup',
4862
+ 'dismissed_general_notices_until',
4863
+ 'dismissed_season_notices_until',
4864
+ 'updraftplus_dismissedexpiry',
4865
+ 'updraftplus_dismisseddashnotice',
4866
+ 'updraft_interval',
4867
+ 'updraft_interval_increments',
4868
+ 'updraft_interval_database',
4869
+ 'updraft_retain',
4870
+ 'updraft_retain_db',
4871
+ 'updraft_encryptionphrase',
4872
+ 'updraft_service',
4873
+ 'updraft_googledrive_clientid',
4874
+ 'updraft_googledrive_secret',
4875
+ 'updraft_googledrive_remotepath',
4876
+ 'updraft_ftp',
4877
+ 'updraft_server_address',
4878
+ 'updraft_dir',
4879
+ 'updraft_email',
4880
+ 'updraft_delete_local',
4881
+ 'updraft_debug_mode',
4882
+ 'updraft_include_plugins',
4883
+ 'updraft_include_themes',
4884
+ 'updraft_include_uploads',
4885
+ 'updraft_include_others',
4886
+ 'updraft_include_wpcore',
4887
+ 'updraft_include_wpcore_exclude',
4888
+ 'updraft_include_more',
4889
+ 'updraft_include_blogs',
4890
+ 'updraft_include_mu-plugins',
4891
+ 'updraft_include_others_exclude',
4892
+ 'updraft_include_uploads_exclude',
4893
+ 'updraft_lastmessage',
4894
+ 'updraft_googledrive_token',
4895
+ 'updraft_dropboxtk_request_token',
4896
+ 'updraft_dropboxtk_access_token',
4897
+ 'updraft_adminlocking',
4898
+ 'updraft_updraftvault',
4899
+ 'updraft_remotesites',
4900
+ 'updraft_migrator_localkeys',
4901
+ 'updraft_central_localkeys',
4902
+ 'updraft_retain_extrarules',
4903
+ 'updraft_googlecloud',
4904
+ 'updraft_include_more_path',
4905
+ 'updraft_split_every',
4906
+ 'updraft_ssl_nossl',
4907
+ 'updraft_backupdb_nonwp',
4908
+ 'updraft_extradbs',
4909
+ 'updraft_combine_jobs_around',
4910
+ 'updraft_last_backup',
4911
+ 'updraft_starttime_files',
4912
+ 'updraft_starttime_db',
4913
+ 'updraft_startday_db',
4914
+ 'updraft_startday_files',
4915
+ 'updraft_sftp',
4916
+ 'updraft_s3',
4917
+ 'updraft_s3generic',
4918
+ 'updraft_dreamhost',
4919
+ 'updraft_s3generic_login',
4920
+ 'updraft_s3generic_pass',
4921
+ 'updraft_s3generic_remote_path',
4922
+ 'updraft_s3generic_endpoint',
4923
+ 'updraft_webdav',
4924
+ 'updraft_openstack',
4925
+ 'updraft_onedrive',
4926
+ 'updraft_azure',
4927
+ 'updraft_cloudfiles',
4928
+ 'updraft_cloudfiles_user',
4929
+ 'updraft_cloudfiles_apikey',
4930
+ 'updraft_cloudfiles_path',
4931
+ 'updraft_cloudfiles_authurl',
4932
+ 'updraft_ssl_useservercerts',
4933
+ 'updraft_ssl_disableverify',
4934
+ 'updraft_s3_login',
4935
+ 'updraft_s3_pass',
4936
+ 'updraft_s3_remote_path',
4937
+ 'updraft_dreamobjects_login',
4938
+ 'updraft_dreamobjects_pass',
4939
+ 'updraft_dreamobjects_remote_path',
4940
+ 'updraft_dreamobjects',
4941
+ 'updraft_report_warningsonly',
4942
+ 'updraft_report_wholebackup',
4943
+ 'updraft_log_syslog',
4944
+ 'updraft_extradatabases',
4945
+ );
4946
  }
4947
 
4948
  /**
4949
  * A function that works through the array passed to it and gets a list of all the tables from that database and puts the information in an array ready to be parsed and output to html.
4950
+ *
4951
+ * @param Array $dbsinfo an array that contains information about each database, the default 'wp' array is just an empty array, but other entries can be added so that this method can get tables from other databases the array structure for this would be array('wp' => array(), 'TestDB' => array('host' => '', 'user' => '', 'pass' => '', 'name' => '', 'prefix' => ''))
4952
+ * note that the extra tables array key must match the database name in the array note that the extra tables array key must match the database name in the array
4953
+ * @return Array - databases and their table names
4954
  */
4955
  public function get_database_tables($dbsinfo = array('wp' => array())) {
4956
 
4957
  global $wpdb;
4958
 
4959
+ if (!class_exists('UpdraftPlus_Database_Utility')) include_once(UPDRAFTPLUS_DIR.'/includes/class-database-utility.php');
4960
 
4961
  $dbhandle = '';
4962
  $db_tables_array = array();
4963
 
4964
  foreach ($dbsinfo as $key => $value) {
4965
  if ('wp' == $key) {
4966
+ // The table prefix after being filtered - i.e. what filters what we'll actually back up
4967
  $table_prefix = $this->get_table_prefix(true);
4968
+ // The unfiltered table prefix - i.e. the real prefix that things are relative to
4969
  $table_prefix_raw = $this->get_table_prefix(false);
4970
  $dbinfo['host'] = DB_HOST;
4971
  $dbinfo['name'] = DB_NAME;
4991
  $all_tables = array_map(array($this, 'cb_get_name_type'), $all_tables);
4992
  }
4993
 
4994
+ // If this is not the WP database, then we do not consider it a fatal error if there are no tables
4995
  if ('wp' == $key && 0 == count($all_tables)) {
4996
  return $this->log_wp_error("No tables found in wp database.");
4997
  die;
5040
  private function cb_get_name($a) {
5041
  return $a['name'];
5042
  }
 
5043
  }
class-zip.php CHANGED
@@ -1,23 +1,34 @@
1
  <?php
2
 
3
- if (!defined ('ABSPATH')) die('No direct access allowed');
4
 
5
- if (class_exists('ZipArchive')):
6
- # We just add a last_error variable for comaptibility with our UpdraftPlus_PclZip object
 
 
7
  class UpdraftPlus_ZipArchive extends ZipArchive {
8
- public $last_error = 'Unknown: ZipArchive does not return error messages';
 
9
  }
10
  endif;
11
 
12
- # A ZipArchive compatibility layer, with behaviour sufficient for our usage of ZipArchive
 
 
13
  class UpdraftPlus_PclZip {
14
 
15
  protected $pclzip;
 
16
  protected $path;
 
17
  protected $addfiles;
 
18
  protected $adddirs;
 
19
  private $statindex;
 
20
  private $include_mtime = false;
 
21
  public $last_error;
22
 
23
  public function __construct() {
@@ -28,13 +39,17 @@ class UpdraftPlus_PclZip {
28
  if (!defined('PCLZIP_TEMPORARY_DIR')) define('PCLZIP_TEMPORARY_DIR', trailingslashit($updraftplus->backups_dir_location()));
29
  }
30
 
31
- # Used to include mtime in statindex (by default, not done - to save memory; probably a bit paranoid)
 
 
 
 
32
  public function ud_include_mtime() {
33
  $this->include_mtime = true;
34
  }
35
 
36
  public function __get($name) {
37
- if ($name == 'numFiles' || $name == 'numAll') {
38
 
39
  if (empty($this->pclzip)) return false;
40
 
@@ -47,7 +62,7 @@ class UpdraftPlus_PclZip {
47
  return (0 === $statindex) ? false : 0;
48
  }
49
 
50
- if ($name == 'numFiles') {
51
 
52
  $result = array();
53
  foreach ($statindex as $i => $file) {
@@ -57,10 +72,10 @@ class UpdraftPlus_PclZip {
57
  unset($statindex[$i]);
58
  }
59
 
60
- $this->statindex=$result;
61
 
62
  } else {
63
- $this->statindex=$statindex;
64
  }
65
 
66
  return count($this->statindex);
@@ -79,13 +94,13 @@ class UpdraftPlus_PclZip {
79
 
80
  public function open($path, $flags = 0) {
81
 
82
- if(!class_exists('PclZip')) include_once(ABSPATH.'/wp-admin/includes/class-pclzip.php');
83
- if(!class_exists('PclZip')) {
84
  $this->last_error = "No PclZip class was found";
85
  return false;
86
  }
87
 
88
- # Route around PHP bug (exact version with the problem not known)
89
  $ziparchive_create_match = (version_compare(PHP_VERSION, '5.2.12', '>') && defined('ZIPARCHIVE::CREATE')) ? ZIPARCHIVE::CREATE : 1;
90
 
91
  if ($flags == $ziparchive_create_match && file_exists($path)) @unlink($path);
@@ -97,7 +112,7 @@ class UpdraftPlus_PclZip {
97
  return false;
98
  }
99
 
100
- # Make the empty directory we need to implement addEmptyDir()
101
  global $updraftplus;
102
  $updraft_dir = $updraftplus->backups_dir_location();
103
  if (!is_dir($updraft_dir.'/emptydir') && !mkdir($updraft_dir.'/emptydir')) {
@@ -111,7 +126,11 @@ class UpdraftPlus_PclZip {
111
 
112
  }
113
 
114
- # Do the actual write-out - it is assumed that close() is where this is done. Needs to return true/false
 
 
 
 
115
  public function close() {
116
  if (empty($this->pclzip)) {
117
  $this->last_error = 'Zip file was not opened';
@@ -123,7 +142,7 @@ class UpdraftPlus_PclZip {
123
 
124
  $activity = false;
125
 
126
- # Add the empty directories
127
  foreach ($this->adddirs as $dir) {
128
  if (false == $this->pclzip->add($updraft_dir.'/emptydir', PCLZIP_OPT_REMOVE_PATH, $updraft_dir.'/emptydir', PCLZIP_OPT_ADD_PATH, $dir)) {
129
  $this->last_error = $this->pclzip->errorInfo(true);
@@ -156,15 +175,24 @@ class UpdraftPlus_PclZip {
156
  return true;
157
  }
158
 
159
- # Note: basename($add_as) is irrelevant; that is, it is actually basename($file) that will be used. But these are always identical in our usage.
 
 
 
 
 
160
  public function addFile($file, $add_as) {
161
- # Add the files. PclZip appears to do the whole (copy zip to temporary file, add file, move file) cycle for each file - so batch them as much as possible. We have to batch by dirname(). On a test with 1000 files of 25KB each in the same directory, this reduced the time needed on that directory from 120s to 15s (or 5s with primed caches).
162
  $rdirname = dirname($file);
163
  $adirname = dirname($add_as);
164
  $this->addfiles[$rdirname][$adirname][] = $file;
165
  }
166
 
167
- # PclZip doesn't have a direct way to do this
 
 
 
 
168
  public function addEmptyDir($dir) {
169
  $this->adddirs[] = $dir;
170
  }
@@ -172,7 +200,6 @@ class UpdraftPlus_PclZip {
172
  public function extract($path_to_extract, $path) {
173
  return $this->pclzip->extract(PCLZIP_OPT_PATH, $path_to_extract, PCLZIP_OPT_BY_NAME, $path);
174
  }
175
-
176
  }
177
 
178
  class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
@@ -192,7 +219,7 @@ class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
192
  public function addFile($file, $add_as) {
193
 
194
  global $updraftplus;
195
- # Get the directory that $add_as is relative to
196
  $base = $updraftplus->str_lreplace($add_as, '', $file);
197
 
198
  if ($file == $base) {
@@ -200,14 +227,18 @@ class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
200
  $updraftplus->log("File skipped due to unexpected name mismatch (locale: ".setlocale(LC_CTYPE, "0")."): file=$file add_as=$add_as", 'notice', false, true);
201
  } else {
202
  $rdirname = untrailingslashit($base);
203
- # Note: $file equals $rdirname/$add_as
204
  $this->addfiles[$rdirname][] = $add_as;
205
  }
206
 
207
  }
208
 
209
- # The standard zip binary cannot list; so we use PclZip for that
210
- # Do the actual write-out - it is assumed that close() is where this is done. Needs to return true/false
 
 
 
 
211
  public function close() {
212
 
213
  if (empty($this->pclzip)) {
@@ -220,7 +251,7 @@ class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
220
 
221
  $activity = false;
222
 
223
- # BinZip does not like zero-sized zip files
224
  if (file_exists($this->path) && 0 == filesize($this->path)) @unlink($this->path);
225
 
226
  $descriptorspec = array(
@@ -240,7 +271,7 @@ class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
240
 
241
  $added_dirs_yet = false;
242
 
243
- # If there are no files to add, but there are empty directories, then we need to make sure the directories actually get added
244
  if (0 == count($this->addfiles) && 0 < count($this->adddirs)) {
245
  $dir = realpath($updraftplus_backup->make_zipfile_source);
246
  $this->addfiles[$dir] = '././.';
@@ -257,11 +288,11 @@ class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
257
  }
258
 
259
  if (!$added_dirs_yet) {
260
- # Add the directories - (in fact, with binzip, non-empty directories automatically have their entries added; but it doesn't hurt to add them explicitly)
261
  foreach ($this->adddirs as $dir) {
262
  fwrite($pipes[0], $dir."/\n");
263
  }
264
- $added_dirs_yet=true;
265
  }
266
 
267
  $read = array($pipes[1], $pipes[2]);
@@ -298,9 +329,9 @@ class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
298
  $something_useful_happened = true;
299
  }
300
  clearstatcache();
301
- # Log when 20% bigger or at least every 50MB
302
  if ($new_size > $last_size*1.2 || $new_size > $last_size + 52428800) {
303
- $updraftplus->log(basename($this->path).sprintf(": size is now: %.2f MB", round($new_size/1048576,1)));
304
  $last_size = $new_size;
305
  }
306
  }
@@ -323,7 +354,7 @@ class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
323
 
324
  $ret = proc_close($process);
325
 
326
- if ($ret != 0 && $ret != 12) {
327
  if ($ret < 128) {
328
  $updraftplus->log("Binary zip: error (code: $ret - look it up in the Diagnostics section of the zip manual at http://www.info-zip.org/mans/zip.html for interpretation... and also check that your hosting account quota is not full)");
329
  } else {
@@ -338,5 +369,4 @@ class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
338
 
339
  return true;
340
  }
341
-
342
  }
1
  <?php
2
 
3
+ if (!defined('ABSPATH')) die('No direct access allowed');
4
 
5
+ if (class_exists('ZipArchive')) :
6
+ /**
7
+ * We just add a last_error variable for comaptibility with our UpdraftPlus_PclZip object
8
+ */
9
  class UpdraftPlus_ZipArchive extends ZipArchive {
10
+
11
+ public $last_error = 'Unknown: ZipArchive does not return error messages';
12
  }
13
  endif;
14
 
15
+ /**
16
+ * A ZipArchive compatibility layer, with behaviour sufficient for our usage of ZipArchive
17
+ */
18
  class UpdraftPlus_PclZip {
19
 
20
  protected $pclzip;
21
+
22
  protected $path;
23
+
24
  protected $addfiles;
25
+
26
  protected $adddirs;
27
+
28
  private $statindex;
29
+
30
  private $include_mtime = false;
31
+
32
  public $last_error;
33
 
34
  public function __construct() {
39
  if (!defined('PCLZIP_TEMPORARY_DIR')) define('PCLZIP_TEMPORARY_DIR', trailingslashit($updraftplus->backups_dir_location()));
40
  }
41
 
42
+ /**
43
+ * Used to include mtime in statindex (by default, not done - to save memory; probably a bit paranoid)
44
+ *
45
+ * @return null
46
+ */
47
  public function ud_include_mtime() {
48
  $this->include_mtime = true;
49
  }
50
 
51
  public function __get($name) {
52
+ if ('numFiles' == $name || 'numAll' == $name) {
53
 
54
  if (empty($this->pclzip)) return false;
55
 
62
  return (0 === $statindex) ? false : 0;
63
  }
64
 
65
+ if ('numFiles' == $name) {
66
 
67
  $result = array();
68
  foreach ($statindex as $i => $file) {
72
  unset($statindex[$i]);
73
  }
74
 
75
+ $this->statindex = $result;
76
 
77
  } else {
78
+ $this->statindex = $statindex;
79
  }
80
 
81
  return count($this->statindex);
94
 
95
  public function open($path, $flags = 0) {
96
 
97
+ if (!class_exists('PclZip')) include_once(ABSPATH.'/wp-admin/includes/class-pclzip.php');
98
+ if (!class_exists('PclZip')) {
99
  $this->last_error = "No PclZip class was found";
100
  return false;
101
  }
102
 
103
+ // Route around PHP bug (exact version with the problem not known)
104
  $ziparchive_create_match = (version_compare(PHP_VERSION, '5.2.12', '>') && defined('ZIPARCHIVE::CREATE')) ? ZIPARCHIVE::CREATE : 1;
105
 
106
  if ($flags == $ziparchive_create_match && file_exists($path)) @unlink($path);
112
  return false;
113
  }
114
 
115
+ // Make the empty directory we need to implement add_empty_dir()
116
  global $updraftplus;
117
  $updraft_dir = $updraftplus->backups_dir_location();
118
  if (!is_dir($updraft_dir.'/emptydir') && !mkdir($updraft_dir.'/emptydir')) {
126
 
127
  }
128
 
129
+ /**
130
+ * Do the actual write-out - it is assumed that close() is where this is done. Needs to return true/false
131
+ *
132
+ * @return boolean
133
+ */
134
  public function close() {
135
  if (empty($this->pclzip)) {
136
  $this->last_error = 'Zip file was not opened';
142
 
143
  $activity = false;
144
 
145
+ // Add the empty directories
146
  foreach ($this->adddirs as $dir) {
147
  if (false == $this->pclzip->add($updraft_dir.'/emptydir', PCLZIP_OPT_REMOVE_PATH, $updraft_dir.'/emptydir', PCLZIP_OPT_ADD_PATH, $dir)) {
148
  $this->last_error = $this->pclzip->errorInfo(true);
175
  return true;
176
  }
177
 
178
+ /**
179
+ * Note: basename($add_as) is irrelevant; that is, it is actually basename($file) that will be used. But these are always identical in our usage.
180
+ *
181
+ * @param string $file Specific file to add
182
+ * @param string $add_as This is the name of the file that it is added as but it is usually the same as $file
183
+ */
184
  public function addFile($file, $add_as) {
185
+ // Add the files. PclZip appears to do the whole (copy zip to temporary file, add file, move file) cycle for each file - so batch them as much as possible. We have to batch by dirname(). On a test with 1000 files of 25KB each in the same directory, this reduced the time needed on that directory from 120s to 15s (or 5s with primed caches).
186
  $rdirname = dirname($file);
187
  $adirname = dirname($add_as);
188
  $this->addfiles[$rdirname][$adirname][] = $file;
189
  }
190
 
191
+ /**
192
+ * PclZip doesn't have a direct way to do this
193
+ *
194
+ * @param string $dir Specific Directory to empty
195
+ */
196
  public function addEmptyDir($dir) {
197
  $this->adddirs[] = $dir;
198
  }
200
  public function extract($path_to_extract, $path) {
201
  return $this->pclzip->extract(PCLZIP_OPT_PATH, $path_to_extract, PCLZIP_OPT_BY_NAME, $path);
202
  }
 
203
  }
204
 
205
  class UpdraftPlus_BinZip extends UpdraftPlus_PclZip {
219
  public function addFile($file, $add_as) {
220
 
221
  global $updraftplus;
222
+ // Get the directory that $add_as is relative to
223
  $base = $updraftplus->str_lreplace($add_as, '', $file);
224
 
225
  if ($file == $base) {
227
  $updraftplus->log("File skipped due to unexpected name mismatch (locale: ".setlocale(LC_CTYPE, "0")."): file=$file add_as=$add_as", 'notice', false, true);
228
  } else {
229
  $rdirname = untrailingslashit($base);
230
+ // Note: $file equals $rdirname/$add_as
231
  $this->addfiles[$rdirname][] = $add_as;
232
  }
233
 
234
  }
235
 
236
+ /**
237
+ * The standard zip binary cannot list; so we use PclZip for that
238
+ * Do the actual write-out - it is assumed that close() is where this is done. Needs to return true/false
239
+ *
240
+ * @return boolean - success or failure state
241
+ */
242
  public function close() {
243
 
244
  if (empty($this->pclzip)) {
251
 
252
  $activity = false;
253
 
254
+ // BinZip does not like zero-sized zip files
255
  if (file_exists($this->path) && 0 == filesize($this->path)) @unlink($this->path);
256
 
257
  $descriptorspec = array(
271
 
272
  $added_dirs_yet = false;
273
 
274
+ // If there are no files to add, but there are empty directories, then we need to make sure the directories actually get added
275
  if (0 == count($this->addfiles) && 0 < count($this->adddirs)) {
276
  $dir = realpath($updraftplus_backup->make_zipfile_source);
277
  $this->addfiles[$dir] = '././.';
288
  }
289
 
290
  if (!$added_dirs_yet) {
291
+ // Add the directories - (in fact, with binzip, non-empty directories automatically have their entries added; but it doesn't hurt to add them explicitly)
292
  foreach ($this->adddirs as $dir) {
293
  fwrite($pipes[0], $dir."/\n");
294
  }
295
+ $added_dirs_yet = true;
296
  }
297
 
298
  $read = array($pipes[1], $pipes[2]);
329
  $something_useful_happened = true;
330
  }
331
  clearstatcache();
332
+ // Log when 20% bigger or at least every 50MB
333
  if ($new_size > $last_size*1.2 || $new_size > $last_size + 52428800) {
334
+ $updraftplus->log(basename($this->path).sprintf(": size is now: %.2f MB", round($new_size/1048576, 1)));
335
  $last_size = $new_size;
336
  }
337
  }
354
 
355
  $ret = proc_close($process);
356
 
357
+ if (0 != $ret && 12 != $ret) {
358
  if ($ret < 128) {
359
  $updraftplus->log("Binary zip: error (code: $ret - look it up in the Diagnostics section of the zip manual at http://www.info-zip.org/mans/zip.html for interpretation... and also check that your hosting account quota is not full)");
360
  } else {
369
 
370
  return true;
371
  }
 
372
  }
css/admin.css CHANGED
@@ -1,1729 +1,1731 @@
1
- /* General things used by many things */
2
-
3
- /* Widths and sizing */
4
- .max-width-600 {
5
- max-width: 600px;
6
- }
7
-
8
- .width-900 {
9
- width: 900px;
10
- }
11
-
12
- .width-80 {
13
- width: 80%;
14
- }
15
-
16
- /* End widths and sizing */
17
-
18
- /* Font styling */
19
- .no-decoration {
20
- text-decoration: none;
21
- }
22
-
23
- .bold {
24
- font-weight: bold;
25
- }
26
-
27
- /* End font styling */
28
- /* Alignment */
29
- .center-align-td {
30
- text-align: center;
31
- }
32
-
33
- /* End of Alignment */
34
- /* Padding */
35
- .remove-padding {
36
- padding: 0 !important;
37
- }
38
-
39
- /* End of padding */
40
-
41
- .updraft-text-center {
42
- text-align: center;
43
- }
44
-
45
- .autobackup {
46
- padding: 6px;
47
- margin: 8px 0px;
48
- }
49
-
50
- ul .disc {
51
- list-style: disc inside;
52
- }
53
-
54
- .dashicons-log-fix {
55
- display: inherit;
56
- }
57
-
58
- /* Input boxes */
59
-
60
- input {
61
- border-radius: 4px;
62
- line-height: 1.42;
63
- border: 1px solid #CCC;
64
- height: 27px;
65
- padding: 2px 6px;
66
- color: #555;
67
- }
68
-
69
- input[type="text"] {
70
- font-size: 14px;
71
- }
72
-
73
- input[type="number"] {
74
- height: 31px;
75
- }
76
-
77
- select {
78
- border-radius: 4px;
79
- }
80
-
81
- /* End input boxes */
82
-
83
- /* Main Buttons */
84
- .main-dashboard-buttons {
85
- border-width: 4px;
86
- border-radius: 12px;
87
- letter-spacing: 0px;
88
- font-size: 17px;
89
- font-weight: bold;
90
- padding-left: 0.7em;
91
- padding-right: 2em;
92
- padding: 0.3em 1em;
93
- line-height: 1.7em;
94
- background: transparent;
95
- position: relative;
96
- border: 2px solid;
97
- transition: all 0.2s;
98
- vertical-align: baseline;
99
- box-sizing: border-box;
100
- text-align: center;
101
- line-height: 1.3em;
102
- margin-left: .3em;
103
- text-transform: none;
104
- line-height: 1;
105
- text-decoration: none;
106
- }
107
-
108
- .button-restore {
109
- border-color: rgb(98, 158, 192);
110
- color: rgb(98, 158, 192);
111
- }
112
-
113
- .dashboard-main-sizing {
114
- border-width: 4px;
115
- width: 190px;
116
- line-height: 1.7em;
117
- }
118
-
119
- .button-restore:hover, .button-migrate:hover, .button-backup:hover,
120
- .button-view-log:hover, .button-mass-selectors:hover,
121
- .button-delete:hover, .button-entity-backup:hover, .udp-button-primary:hover {
122
- border-color: #DF6926;
123
- color: #DF6926;
124
- }
125
-
126
- .button-migrate {
127
- color: rgb(238, 169, 32);
128
- border-color: rgb(238, 169, 32);
129
- }
130
-
131
- .button-backup {
132
- border-color: #84CA1B;
133
- color: #84CA1B;
134
- }
135
-
136
- .existing-backups-buttons {
137
- font-size: 11px;
138
- line-height: 1.4em;
139
- border-width: 3px;
140
- }
141
-
142
- .existing-backups-restore-buttons {
143
- font-size: 11px;
144
- line-height: 1.4em;
145
- border-width: 3px;
146
- }
147
-
148
- .button-delete {
149
- color: #E23900;
150
- border-color: #E23900;
151
- font-size: 14px;
152
- line-height: 1.4em;
153
- border-width: 2px;
154
- margin-right: 10px;
155
- }
156
-
157
- .button-view-log, .button-mass-selectors {
158
- color: darkgrey;
159
- border-color: darkgrey;
160
- font-size: 14px;
161
- line-height: 1.4em;
162
- border-width: 2px;
163
- margin-top: -1px;
164
- }
165
-
166
- .button-view-log {
167
- width: 120px;
168
- }
169
-
170
- .button-existing-restore {
171
- font-size: 14px;
172
- line-height: 1.4em;
173
- border-width: 2px;
174
- width: 110px;
175
- }
176
-
177
- .main-restore {
178
- margin-right: 3%;
179
- margin-left: 3%;
180
- }
181
-
182
- .button-entity-backup {
183
- color: #555;
184
- border-color: #555;
185
- font-size: 11px;
186
- line-height: 1.4em;
187
- border-width: 2px;
188
- margin-right: 5px;
189
- }
190
-
191
- .button-select-all {
192
- width: 122px;
193
- }
194
-
195
- .button-deselect {
196
- width: 92px;
197
- }
198
-
199
- #ud_massactions > .display-flex > .mass-selectors-margins {
200
- margin-right: -4px;
201
- }
202
-
203
- .udp-button-primary {
204
- border-width: 4px;
205
- color: #0073AA;
206
- border-color: #0073AA;
207
- font-size: 14px;
208
- height: 40px;
209
- }
210
-
211
- #ud_massactions .button-delete {
212
- margin-right: 0px;
213
- }
214
-
215
- .stored_local {
216
- border-radius: 5px;
217
- background-color: #007FE7;
218
- padding: 3px 5px 5px 5px;
219
- color: #FFF;
220
- font-size: 75%;
221
- }
222
-
223
- .form-table td.updraft_existingbackup_date {
224
- padding-bottom: 5px;
225
- }
226
-
227
- .stored_icon {
228
- height: 1.3em;
229
- position: relative;
230
- top: 0.2em;
231
- }
232
-
233
- .backup_date_label .clear-right {
234
- clear: right;
235
- }
236
-
237
- /* End Main Buttons */
238
-
239
- /* End of common elements */
240
-
241
- .udp-logo-70 {
242
- width: 70px;
243
- height: 70px;
244
- float: left;
245
- padding-right: 25px;
246
- }
247
-
248
- h3 .thank-you {
249
- margin-top: 0px;
250
- }
251
-
252
- .ws_advert {
253
- max-width: 800px;
254
- font-size: 140%;
255
- line-height: 140%;
256
- padding: 14px;
257
- clear: left;
258
- }
259
-
260
- .dismiss-dash-notice {
261
- float: right;
262
- position: relative;
263
- top: -20px;
264
- }
265
-
266
- #updraft_report_cell .updraft_reportbox {
267
- padding: 8px;
268
- margin: 8px 0;
269
- border: 1px dotted;
270
- clear: left;
271
- float: left;
272
- }
273
-
274
- #updraft_report_cell button.updraft_reportbox_delete {
275
- font-size: 50%;
276
- float: right;
277
- padding: 0 3px;
278
- position: relative;
279
- top: -4px;
280
- left: 4px;
281
- }
282
-
283
- #updraft-navtab-settings-content .updraft-test-button {
284
- font-size: 18px !important;
285
- }
286
-
287
- #updraft_report_cell .updraft_report_checkbox {
288
- margin-top: 4px;
289
- }
290
-
291
- #updraft_report_cell .updraft_report_email {
292
- width: 300px;
293
- }
294
-
295
- #updraft_report_cell .updraft_report_another_p {
296
- clear: left;
297
- }
298
-
299
- /* Taken straight from admin.php */
300
-
301
- #updraft-navtab-settings-content table.form-table p {
302
- max-width: 700px;
303
- }
304
-
305
- #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected {
306
- background-color: #CCC;
307
- }
308
-
309
- .updraft_settings_sectionheading {
310
- display: none;
311
- }
312
-
313
- .updraft-backupentitybutton-disabled {
314
- background-color: transparent;
315
- border: none;
316
- color: #0074A2;
317
- text-decoration: underline;
318
- cursor: pointer;
319
- clear: none;
320
- float: left;
321
- }
322
-
323
- .updraft-backupentitybutton {
324
- margin-left: 8px;
325
- }
326
-
327
- .updraft-bigbutton {
328
- padding: 2px 0px !important;
329
- margin-right: 14px !important;
330
- font-size: 22px !important;
331
- min-height: 32px;
332
- min-width: 180px;
333
- }
334
-
335
- .updraft_debugrow th {
336
- float: right;
337
- text-align: right;
338
- font-weight: bold;
339
- padding-right: 8px;
340
- min-width: 140px;
341
- }
342
-
343
- .updraft_debugrow td {
344
- min-width: 300px;
345
- vertical-align: bottom;
346
- }
347
-
348
- #updraft_webdav_host_error {
349
- color: red;
350
- }
351
-
352
- /* jstree styles */
353
-
354
- /* these styles hide the dots from the parent but keep the arrows */
355
- #updraft_zip_files_jstree .jstree-container-ul > .jstree-node,
356
- #updraft_more_files_jstree .jstree-container-ul > .jstree-node {
357
- background: transparent;
358
- }
359
-
360
- #updraft_zip_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl,
361
- #updraft_more_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl {
362
- background-position: -36px -4px;
363
- }
364
-
365
- #updraft_zip_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl,
366
- #updraft_more_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl {
367
- background-position: -4px -4px;
368
- }
369
-
370
- #updraft_zip_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl,
371
- #updraft_more_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl {
372
- background: transparent;
373
- }
374
-
375
- /* zip browser jstree styles */
376
- #updraft_zip_files_container {
377
- position: relative;
378
- height: 450px;
379
- overflow: none;
380
- }
381
-
382
- #updraft_zip_info_container {
383
- position: relative;
384
- height: auto;
385
- width: 100%;
386
- border: 1px dotted;
387
- margin-bottom: 5px;
388
- }
389
-
390
- #updraft_zip_info_container p {
391
- margin: 1px;
392
- padding-left: 10px;
393
- font-size: 14px;
394
- }
395
-
396
- #updraft_zip_download_item {
397
- display: none;
398
- color: #0073AA;
399
- padding-left: 10px;
400
- }
401
-
402
- #updraft_zip_download_notice {
403
- padding-left: 10px;
404
- }
405
-
406
- #updraft_zip_files_jstree_container {
407
- position: relative;
408
- border: 1px dotted;
409
- height: 80%;
410
- width: 100%;
411
- overflow: auto;
412
- }
413
-
414
- /* More files jstree styles */
415
- #updraft_more_files_container {
416
- position: relative;
417
- display: none;
418
- height: 300px;
419
- width: 100%;
420
- border: 1px dotted;
421
- margin-bottom: 5px;
422
- }
423
-
424
- #updraft_jstree_buttons {
425
- position: absolute;
426
- top: 0;
427
- right: 0;
428
- }
429
-
430
- #updraft_jstree_container {
431
- height: 100%;
432
- width: 100%;
433
- overflow: auto;
434
- }
435
-
436
- #updraft_more_files_container button {
437
- height: 22px;
438
- line-height: 20px;
439
- }
440
-
441
- #updraft_jstree_confirm, #updraft_jstree_cancel {
442
- display: none;
443
- }
444
-
445
- .updraftplus-morefiles-row-delete {
446
- cursor: pointer;
447
- color: red;
448
- font-size: 23px !important;
449
- }
450
-
451
- .updraftplus-morefiles-row-edit {
452
- cursor: pointer;
453
- font-size: 24px !important;
454
- }
455
-
456
- #updraft-wrap .form-table th {
457
- width: 230px;
458
- }
459
-
460
- .updraftplus-remove {
461
- background-color: #C00000;
462
- border: 1px solid #C00000;
463
- height: 22px;
464
- padding: 4px 3px 0 3px;
465
- margin-right: 6px;
466
- }
467
-
468
- .updraft-viewlogdiv form {
469
- margin: 0;
470
- padding: 0;
471
- }
472
-
473
- .updraft-viewlogdiv {
474
- background-color: #FFF;
475
- color: #000;
476
- border: 1px solid #000;
477
- height: 26px;
478
- padding: 0px;
479
- margin: 0 4px 0 0;
480
- border-radius: 3px;
481
- float: left;
482
- }
483
-
484
- .updraft-viewlogdiv input, .updraft-viewlogdiv a {
485
- border: none;
486
- background-color: transparent;
487
- color: #000;
488
- margin: 0px;
489
- padding: 3px 4px;
490
- font-size: 16px;
491
- line-height: 26px;
492
- }
493
-
494
- .updraft-viewlogdiv:hover {
495
- background-color: #000;
496
- color: #FFF;
497
- border: 1px solid #FFF;
498
- cursor: pointer;
499
- }
500
-
501
- .updraft-viewlogdiv input:hover, .updraft-viewlogdiv a:hover {
502
- color: #FFF;
503
- cursor: pointer;
504
- }
505
-
506
- .updraftplus-remove a {
507
- color: white;
508
- padding: 4px 4px 0px 4px;
509
- }
510
-
511
- .updraftplus-remove:hover {
512
- background-color: white;
513
- border: 1px solid #C00000;
514
- }
515
-
516
- .updraftplus-remove a:hover {
517
- color: #C00000;
518
- }
519
-
520
- .drag-drop #drag-drop-area2 {
521
- border: 4px dashed #DDD;
522
- height: 200px;
523
- }
524
-
525
- #drag-drop-area2 .drag-drop-inside {
526
- margin: 36px auto 0;
527
- width: 350px;
528
- }
529
-
530
- #filelist, #filelist2 {
531
- width: 100%;
532
- }
533
-
534
- #filelist .file, #filelist2 .file, .ud_downloadstatus .file, #ud_downloadstatus2 .file {
535
- padding: 5px;
536
- background: #ECECEC;
537
- border: solid 1px #CCC;
538
- margin: 4px 0;
539
- }
540
-
541
- ul.updraft_premium_description_list {
542
- list-style: disc inside;
543
- }
544
-
545
- ul.updraft_premium_description_list li {
546
- display: inline;
547
- }
548
-
549
- ul.updraft_premium_description_list li::after {
550
- content: " | ";
551
- }
552
-
553
- ul.updraft_premium_description_list li.last::after {
554
- content: "";
555
- }
556
-
557
- .updraft_feature_cell {
558
- background-color: #F7D9C9 !important;
559
- padding: 5px 10px;
560
- }
561
-
562
- .updraft_feat_table, .updraft_feat_th, .updraft_feat_table td {
563
- border: 1px solid black;
564
- border-collapse: collapse;
565
- font-size: 120%;
566
- background-color: white;
567
- text-align: center;
568
- }
569
-
570
- .updraft_feat_table p {
571
- padding: 0px 10px;
572
- margin: 5px 0px;
573
- font-size: 16px;
574
- }
575
-
576
- .updraft_feat_table h4 {
577
- margin: 5px 0px;
578
- }
579
-
580
- .updraft_feat_table .dashicons {
581
- width: 25px;
582
- height: 25px;
583
- font-size: 25px;
584
- line-height: 1;
585
- }
586
-
587
- .updraft_feat_table .dashicons-yes, .updraft_feat_table .updraft-yes {
588
- color: green;
589
- }
590
-
591
- .updraft_feat_table .dashicons-no-alt, .updraft_feat_table .updraft-no {
592
- color: red;
593
- }
594
-
595
- .updraft_tick_cell {
596
- text-align: center;
597
- }
598
-
599
- .updraft_tick_cell img {
600
- margin: 4px 0;
601
- height: 24px;
602
- }
603
-
604
- #filelist .fileprogress, #filelist2 .fileprogress, .ud_downloadstatus .dlfileprogress, #ud_downloadstatus2 .dlfileprogress {
605
- width: 0%;
606
- background: #F6A828;
607
- height: 5px;
608
- }
609
-
610
- .ud_downloadstatus .raw, #ud_downloadstatus2 .raw {
611
- margin-top: 8px;
612
- clear: left;
613
- }
614
-
615
- .ud_downloadstatus .file, #ud_downloadstatus2 .file {
616
- margin-top: 8px;
617
- }
618
-
619
- tr.updraftplusmethod h3 {
620
- margin: 0px;
621
- }
622
-
623
- #updraft_retain_db_rules .updraft_retain_rules_delete, #updraft_retain_files_rules .updraft_retain_rules_delete {
624
- cursor: pointer;
625
- color: red;
626
- font-size: 120%;
627
- font-weight: bold;
628
- border: 0px;
629
- border-radius: 3px;
630
- padding: 2px;
631
- margin: 0 6px;
632
- }
633
-
634
- #updraft_retain_db_rules .updraft_retain_rules_delete:hover, #updraft_retain_files_rules .updraft_retain_rules_delete:hover {
635
- cursor: pointer;
636
- color: white;
637
- background: red;
638
- }
639
-
640
- #updraft_backup_started {
641
- max-width: 800px;
642
- font-size: 140%;
643
- line-height: 140%;
644
- padding: 14px;
645
- clear: left;
646
- }
647
-
648
- .udp-premium-image {
649
- display: none;
650
- }
651
-
652
- @media screen and (min-width: 720px) {
653
-
654
- .udp-premium-image {
655
- display: block;
656
- float: left;
657
- padding-right: 5px;
658
- }
659
-
660
- }
661
-
662
- /* End stuff already in admin.php */
663
- #plupload-upload-ui2 {
664
- width: 80%;
665
- }
666
-
667
- .backup-restored {
668
- padding: 8px;
669
- }
670
-
671
- .backup-restored span {
672
- font-size: 120%;
673
- }
674
-
675
- .memory-limit {
676
- padding: 8px;
677
- }
678
-
679
- .updraft_list_errors {
680
- padding: 8px;
681
- }
682
-
683
- /*.nav-tab {
684
- border-radius: 20px 20px 0 0;
685
- border-color: grey;
686
- border-width: 2px;
687
- margin-top: 34px;
688
- }
689
-
690
- .nav-tab:hover {
691
- border-bottom: 0;
692
- }
693
-
694
- .nav-tab-active, .nav-tab-active:active {
695
- color: #df6926;
696
- border-color: #D3D3D3;
697
- border-width: 1px;
698
- border-bottom: 0;
699
- }
700
-
701
- .nav-tab-active:focus {
702
- color: #df6926;
703
- }*/
704
-
705
- .nav-tab-wrapper {
706
- margin: 14px 0px;
707
- }
708
-
709
- #updraft-poplog-content {
710
- white-space: pre-wrap;
711
- }
712
-
713
- .next-backup {
714
- border: 0px;
715
- padding: 0px;
716
- margin: 0 10px 0 0;
717
- }
718
-
719
- .not-scheduled {
720
- vertical-align: top !important;
721
- margin: 0px !important;
722
- padding: 0px !important;
723
- }
724
-
725
- .next-backup .updraft_scheduled {
726
- /* width: 124px;*/
727
- margin: 0px;
728
- padding: 2px 4px 2px 0px;
729
- }
730
-
731
- #next-backup-table-inner td {
732
- vertical-align: top;
733
- }
734
-
735
- .next-backup .updraft_all-files {
736
- color: blue;
737
- margin: 0px;
738
- padding: 2px 0px 0px 0px;
739
- }
740
-
741
- .multisite-advert-width {
742
- width: 800px;
743
- }
744
-
745
- .updraft_settings_sectionheading {
746
- margin-top: 6px;
747
- }
748
-
749
- .premium-upgrade-prompt {
750
- font-size: 115%;
751
- }
752
-
753
- .updraft_feat_table {
754
- margin-top: 30px;
755
- }
756
-
757
- .show_admin_restore_in_progress_notice {
758
- padding: 8px;
759
- }
760
-
761
- .show_admin_restore_in_progress_notice .unfinished-restoration {
762
- font-size: 120%;
763
- }
764
-
765
- #backupnow_includefiles_moreoptions, #backupnow_database_moreoptions {
766
- margin: 4px 16px 6px 16px;
767
- border: 1px dotted;
768
- padding: 6px 10px;
769
- }
770
-
771
- #backupnow_database_moreoptions {
772
- max-height: 250px;
773
- overflow: auto;
774
- }
775
-
776
- .form-table #updraft_activejobsrow .minimum-height {
777
- min-height: 100px;
778
- }
779
-
780
- #updraft_lastlogmessagerow .last-message {
781
- padding-top: 20px;
782
- display: block;
783
- }
784
-
785
- .updraft_simplepie {
786
- vertical-align: top;
787
- }
788
-
789
- .download-backups {
790
- margin-top: 8px;
791
- }
792
-
793
- .download-backups .updraft_download_button {
794
- margin-right: 6px;
795
- margin-top: 4px;
796
- }
797
-
798
- .download-backups .choose-components-button {
799
- font-size: 16px;
800
- }
801
-
802
- .download-backups .ud-whitespace-warning {
803
- background-color: pink;
804
- padding: 8px;
805
- margin: 4px;
806
- border: 1px dotted;
807
- }
808
-
809
- .download-backups .ul {
810
- list-style: none inside;
811
- max-width: 800px;
812
- margin-top: 6px;
813
- margin-bottom: 12px;
814
- }
815
-
816
- #updraft-plupload-modal {
817
- width: 75%;
818
- margin: 16px;
819
- margin-left: 100px;
820
- }
821
-
822
- .download-backups .upload {
823
- max-width: 610px;
824
- }
825
-
826
- .download-backups #plupload-upload-ui {
827
- width: 70%;
828
- }
829
-
830
- .ud_downloadstatus {
831
- padding: 10px;
832
- background: #F1F1F1;
833
- }
834
-
835
- #ud_massactions {
836
- padding: 14px;
837
- position: fixed;
838
- right: 25%;
839
- top: 25%;
840
- border: 2px solid;
841
- border-radius: 4px;
842
- background: rgb(241, 241, 241);
843
- float: right;
844
- }
845
-
846
- #ud_massactions .updraftplus-remove {
847
- clear: left;
848
- font-size: 16px;
849
- text-align: center;
850
- border-radius: 4px;
851
- margin-top: 4px;
852
- }
853
-
854
- #ud_massactions .updraftplus-remove a {
855
- text-decoration: none;
856
- }
857
-
858
- #ud_massactions .updraft-viewlogdiv {
859
- font-size: 16px;
860
- text-align: center;
861
- border-radius: 4px;
862
- margin-top: 4px;
863
- }
864
-
865
- #ud_massactions .updraft-viewlogdiv a {
866
- text-decoration: none;
867
- position: relative;
868
- top: 3px;
869
- }
870
-
871
- #ud_massactions .updraft-viewlogdiv a {
872
- text-decoration: none;
873
- position: relative;
874
- top: 3px;
875
- }
876
-
877
- #updraft-navtab-backups-content .updraft_existing_backups {
878
- margin-bottom: 12px;
879
- }
880
-
881
- #updraft-message-modal-innards {
882
- padding: 4px;
883
- }
884
-
885
- #updraft-authenticate-modal {
886
- text-align: center;
887
- font-size: 16px !important;
888
- }
889
-
890
- #updraft-authenticate-modal p {
891
- font-size: 16px;
892
- }
893
-
894
- #updraft_delete_form p {
895
- margin-top: 3px;
896
- padding-top: 0;
897
- }
898
-
899
- #updraft_restore_form .cannot-restore {
900
- margin: 8px 0;
901
- }
902
-
903
- #updraft_restorer_dboptions {
904
- padding: 12px;
905
- margin: 8px 0 4px 0;
906
- border: dashed 1px;
907
- }
908
-
909
- #updraft_restorer_dboptions h4 {
910
- margin: 0px 0px 6px 0px;
911
- padding: 0px;
912
- }
913
-
914
- .updraft_debugrow th {
915
- vertical-align: top;
916
- padding-top: 6px;
917
- }
918
-
919
- .expertmode p {
920
- font-size: 125%;
921
- }
922
-
923
- .expertmode .call-wp-action {
924
- width: 300px;
925
- height: 22px;
926
- }
927
-
928
- .updraftplus-lock-advert {
929
- clear: left;
930
- max-width: 600px;
931
- }
932
-
933
- .uncompressed-data {
934
- clear: left;
935
- max-width: 600px;
936
- }
937
-
938
- .delete-old-directories {
939
- padding: 8px;
940
- padding-bottom: 12px;
941
- }
942
-
943
- .active-jobs {
944
- min-width: 480px;
945
- min-height: 48px;
946
- text-align: center;
947
- margin-top: 4px;
948
- padding: 8px;
949
- border: 1px solid;
950
- float: left;
951
- clear: left;
952
- }
953
-
954
- .job-id {
955
- min-width: 480px;
956
- margin-top: 4px;
957
- padding: 8px;
958
- border: 1px solid;
959
- clear: left;
960
- float: left;
961
- }
962
-
963
- .next-resumption {
964
- font-weight: bold;
965
- }
966
-
967
- .updraft_percentage {
968
- z-index: -1;
969
- position: absolute;
970
- left: 0px;
971
- top: 0px;
972
- text-align: center;
973
- background-color: #F6A828;
974
- }
975
-
976
- .curstage {
977
- border-radius: 4px;
978
- margin-top: 8px;
979
- padding-top: 4px;
980
- border: 1px solid #AAA;
981
- width: 100%;
982
- height: 22px;
983
- position: relative;
984
- text-align: center;
985
- font-style: italic;
986
- }
987
-
988
- .retain-files {
989
- width: 48px;
990
- }
991
-
992
- .backup-interval-description tr td div {
993
- max-width: 670px;
994
- }
995
-
996
- #updraft-manualdecrypt-modal {
997
- width: 85%;
998
- margin: 6px;
999
- margin-left: 100px;
1000
- }
1001
-
1002
- .directory-permissions {
1003
- font-size: 110%;
1004
- font-weight: bold;
1005
- }
1006
-
1007
- .double-warning {
1008
- border: 1px solid;
1009
- padding: 6px;
1010
- }
1011
-
1012
- .raw-backup-info {
1013
- font-style: italic;
1014
- font-weight: bold;
1015
- font-size: 120%;
1016
- }
1017
-
1018
- .updraft_existingbackup_date {
1019
- width: 22%;
1020
- max-width: 140px;
1021
- }
1022
-
1023
- .existing-backups-table {
1024
- margin-top: 20px;
1025
- margin-left: 20px;
1026
- width: 80%;
1027
- }
1028
-
1029
- .tr-bottom-4 {
1030
- margin-bottom: 4px;
1031
- }
1032
-
1033
- .form-table .backup-date {
1034
- width: 172px;
1035
- padding: 0;
1036
- padding-left: 15px;
1037
- }
1038
-
1039
- .form-table .backup-data {
1040
- width: 426px;
1041
- padding: 0;
1042
- padding-left: 15px;
1043
- }
1044
-
1045
- .form-table .updraft_backup_actions {
1046
- width: 272px;
1047
- padding: 0 0 10px 15px;
1048
- }
1049
-
1050
- .existing-date {
1051
- -webkit-box-sizing: border-box;
1052
- -moz-box-sizing: border-box;
1053
- box-sizing: border-box;
1054
- max-width: 140px;
1055
- width: 25%;
1056
- }
1057
-
1058
- .line-break-tr {
1059
- height: 2px;
1060
- padding: 1px;
1061
- margin: 0px;
1062
- }
1063
-
1064
- .line-break-td {
1065
- margin: 0;
1066
- padding: 0;
1067
- }
1068
-
1069
- .td-line-color {
1070
- height: 2px;
1071
- background-color: #888;
1072
- }
1073
-
1074
- .raw-backup {
1075
- max-width: 140px;
1076
- }
1077
-
1078
- .existing-backups-actions {
1079
- padding: 1px;
1080
- margin: 0px;
1081
- }
1082
-
1083
- .existing-backups-border {
1084
- height: 2px;
1085
- padding: 1px;
1086
- margin: 0px;
1087
- }
1088
-
1089
- .existing-backups-border > td {
1090
- margin: 0;
1091
- padding: 0;
1092
- }
1093
-
1094
- .existing-backups-border > div {
1095
- height: 2px;
1096
- background-color: #AAA;
1097
- }
1098
-
1099
- .updraft_existing_backup_date {
1100
- max-width: 140px;
1101
- }
1102
-
1103
- .restore-button {
1104
- margin-right: 6px;
1105
- float: left;
1106
- clear: none;
1107
- }
1108
-
1109
- .updraftplus-remove {
1110
- font-size: 16px;
1111
- text-align: center;
1112
- border-radius: 4px;
1113
- }
1114
-
1115
- .before-restore-button {
1116
- padding: 1px;
1117
- margin: 0px;
1118
- }
1119
-
1120
- .table-separator-tr {
1121
- height: 2px;
1122
- padding: 1px;
1123
- margin: 0px;
1124
- }
1125
-
1126
- .table-separator-td {
1127
- margin: 0px;
1128
- padding: 0px;
1129
- }
1130
-
1131
- .end-of-table-div {
1132
- height: 2px;
1133
- background-color: #AAA;
1134
- }
1135
-
1136
- .last-backup-job {
1137
- padding-top: 3% !important;
1138
- }
1139
-
1140
- .line-height-03 {
1141
- line-height: 0.3 !important;
1142
- }
1143
-
1144
- .line-height-13 {
1145
- line-height: 1.3 !important;
1146
- }
1147
-
1148
- .line-height-23 {
1149
- line-height: 2.3 !important;
1150
- }
1151
-
1152
- #updraft_diskspaceused {
1153
- color: #DF6926;
1154
- }
1155
-
1156
- .updraft_premium_description_list {
1157
- text-align: left;
1158
- }
1159
-
1160
- #updraft_delete_old_dirs_pagediv {
1161
- padding-bottom: 10px;
1162
- }
1163
-
1164
- /*#updraft_lastlogmessagerow > td, #updraft_last_backup > td {
1165
- padding: 0;
1166
- }*/
1167
-
1168
- .job-id {
1169
- margin: 0 auto;
1170
- width: 20%;
1171
- }
1172
-
1173
- .updraft_all-files {
1174
- color: #DF6926;
1175
- }
1176
-
1177
- /* Time + scheduling add-on*/
1178
- .fix-time {
1179
- width: 70px;
1180
- }
1181
-
1182
- .retain-files {
1183
- width: 70px;
1184
- }
1185
-
1186
- .number-input {
1187
- min-width: 50px;
1188
- max-width: 70px;
1189
- }
1190
-
1191
- .additional-rule-width {
1192
- min-width: 60px;
1193
- max-width: 70px;
1194
- }
1195
-
1196
- /* Add-ons */
1197
- /* Want to fix the WordPress icons so that they fit inline with the text, and don't push everything out of place. */
1198
-
1199
- .dashicons {
1200
- line-height: inherit;
1201
- font-size: inherit;
1202
- }
1203
-
1204
- .addon-logo-150 {
1205
- margin-left: 30px;
1206
- margin-top: 33px;
1207
- height: 125px;
1208
- width: 150px;
1209
- }
1210
-
1211
- .margin-bottom-50 {
1212
- margin-bottom: 50px;
1213
- }
1214
-
1215
- .premium-container {
1216
- width: 80%;
1217
- }
1218
-
1219
- /* Main Header */
1220
-
1221
- .main-header {
1222
- background-color: #DF6926;
1223
- height: 200px;
1224
- width: 100%;
1225
- }
1226
-
1227
- .button-add-to-cart {
1228
- color: white;
1229
- border-color: white;
1230
- float: none;
1231
- margin-right: 17px;
1232
- }
1233
-
1234
- .button-add-to-cart:hover, .button-add-to-cart:focus, .button-add-to-cart:active {
1235
- border-color: #A0A5AA;
1236
- color: #A0A5AA;
1237
- }
1238
-
1239
- .addon-title {
1240
- margin-top: 25px;
1241
- }
1242
-
1243
- .addon-text {
1244
- margin-top: 75px;
1245
- }
1246
-
1247
- .image-main-div {
1248
- width: 25%;
1249
- float: left;
1250
- }
1251
-
1252
- .text-main-div {
1253
- width: 60%;
1254
- float: left;
1255
- text-align: center;
1256
- color: white;
1257
- margin-top: 16px;
1258
- }
1259
-
1260
- .text-main-div-title {
1261
- font-weight: bold !important;
1262
- color: white;
1263
- text-align: center;
1264
- }
1265
-
1266
- .text-main-div-paragraph {
1267
- color: white;
1268
- }
1269
-
1270
- /* End main header */
1271
-
1272
- /* Vault icons */
1273
-
1274
- .updraftplus-vault-cta {
1275
- width: 100%;
1276
- text-align: center;
1277
- margin-bottom: 50px;
1278
- }
1279
-
1280
- .updraftplus-vault-cta h1 {
1281
- font-weight: bold;
1282
- }
1283
-
1284
- .updraftvault-buy {
1285
- width: 225px;
1286
- height: 225px;
1287
- border: 2px solid #777;
1288
- display: inline-table;
1289
- margin: 0 auto;
1290
- margin-right: 50px;
1291
- position: relative;
1292
- }
1293
-
1294
- .updraftplus-vault-cta > .vault-options > .center-vault {
1295
- width: 275px;
1296
- height: 275px;
1297
- }
1298
-
1299
- .updraftplus-vault-cta > .vault-options > .center-vault > a {
1300
- right: 21%;
1301
- font-size: 16px;
1302
- border-width: 4px !important;
1303
- }
1304
-
1305
- .updraftplus-vault-cta > .vault-options > .center-vault > p {
1306
- font-size: 16px;
1307
- }
1308
-
1309
- .updraftvault-buy .button-purchase {
1310
- right: 24%;
1311
- margin-left: 0;
1312
- line-height: 1.7em;
1313
- }
1314
-
1315
- .updraftvault-buy hr {
1316
- height: 2px;
1317
- background-color: #777;
1318
- margin-top: 18px;
1319
- }
1320
-
1321
- .right {
1322
- margin-right: 0px;
1323
- }
1324
-
1325
- .updraftvault-buy .addon-logo-100 {
1326
- height: 100px;
1327
- width: 125px;
1328
- margin-top: 7px;
1329
- }
1330
-
1331
- .updraftvault-buy .addon-logo-large {
1332
- margin-top: 7px;
1333
- }
1334
-
1335
- .updraftvault-buy .button-buy-vault {
1336
- font-size: 12px;
1337
- color: #DF6926;
1338
- border-color: #DF6926;
1339
- border-width: 2px !important;
1340
- position: absolute;
1341
- right: 29%;
1342
- bottom: 2%;
1343
- }
1344
-
1345
- .premium-addon-div .button-purchase {
1346
- line-height: 1.7em;
1347
- }
1348
-
1349
- .updraftvault-buy .button-buy-vault:hover {
1350
- border-color: darkgrey;
1351
- color: darkgrey;
1352
- }
1353
-
1354
- /* End Vault icons */
1355
-
1356
- /* Premium addons */
1357
-
1358
- .premium-addons {
1359
- margin-top: 80px;
1360
- width: 100%;
1361
- margin: 0 auto;
1362
- display: table;
1363
- }
1364
-
1365
- .addon-list {
1366
- /* margin-left: 32px; */
1367
- display: table;
1368
- text-align: center;
1369
- }
1370
-
1371
- .premium-addons h1 {
1372
- text-align: center;
1373
- font-weight: bold;
1374
- }
1375
-
1376
- .premium-addons p {
1377
- text-align: center;
1378
- }
1379
-
1380
- .premium-addons .premium-addon-div {
1381
- width: 200px;
1382
- height: 250px;
1383
- border: 2px solid #777;
1384
- display: inline-table;
1385
- margin: 0 auto;
1386
- margin-right: 25px;
1387
- margin-top: 25px;
1388
- text-align: center;
1389
- position: relative;
1390
- }
1391
-
1392
- .premium-addons .premium-addon-div p {
1393
- margin-left: 2px;
1394
- margin-right: 2px;
1395
- }
1396
-
1397
- .premium-addons .premium-addon-div img {
1398
- width: auto;
1399
- height: 50px;
1400
- margin-top: 7px;
1401
- }
1402
-
1403
- .premium-addons .premium-addon-div .hr-alignment {
1404
- margin-top: 44px;
1405
- }
1406
-
1407
- .premium-addons .premium-addon-div .dropbox-logo {
1408
- height: 39px;
1409
- width: 150px;
1410
- }
1411
-
1412
- .premium-addons .premium-addon-div .azure-logo, .premium-addons .premium-addon-div .onedrive-logo {
1413
- width: 75%;
1414
- height: 24px;
1415
- }
1416
-
1417
- .button-purchase {
1418
- font-size: 12px;
1419
- color: #DF6926;
1420
- border-color: #DF6926;
1421
- border-width: 2px !important;
1422
- position: absolute;
1423
- right: 25%;
1424
- bottom: 2%;
1425
- }
1426
-
1427
- .button-purchase:hover {
1428
- color: darkgrey;
1429
- border-color: darkgrey;
1430
- }
1431
-
1432
- .premium-addons .premium-addon-div hr {
1433
- height: 2px;
1434
- background-color: #777;
1435
- margin-top: 18px;
1436
- }
1437
-
1438
- .premium-addon-div p {
1439
- font-style: italic;
1440
- }
1441
-
1442
- .addon-list > .premium-addon-div > .onedrive-fix,
1443
- .addon-list > .premium-addon-div > .azure-logo {
1444
- margin-top: 33px;
1445
- }
1446
-
1447
- .addon-list > .premium-addon-div > .dropbox-fix {
1448
- margin-top: 18px;
1449
- }
1450
-
1451
- /* End premium addons */
1452
-
1453
-
1454
- /* Forgotton something (that is the name of the div rather than a mental note!) */
1455
-
1456
- .premium-forgotton-something {
1457
- margin-top: 5%;
1458
- }
1459
-
1460
- .premium-forgotton-something h1 {
1461
- text-align: center;
1462
- font-weight: bold;
1463
- }
1464
-
1465
- .premium-forgotton-something p {
1466
- text-align: center;
1467
- font-weight: normal;
1468
- }
1469
-
1470
- .premium-forgotton-something .button-faq {
1471
- color: #DF6926;
1472
- border-color: #DF6926;
1473
- margin: 0 auto;
1474
- display: table;
1475
- }
1476
-
1477
- .premium-forgotton-something .button-faq:hover {
1478
- color: #777;
1479
- border-color: #777;
1480
- }
1481
-
1482
- /* End of forgotton something */
1483
-
1484
- .updraftplusmethod.updraftvault #vaultlogo {
1485
- padding-left: 40px;
1486
- }
1487
-
1488
- .updraftplusmethod.updraftvault .vault_primary_option {
1489
- float: left;
1490
- width: 50%;
1491
- text-align: center;
1492
- padding-bottom: 20px;
1493
- }
1494
-
1495
- .updraftplusmethod.updraftvault .vault_primary_option div {
1496
- clear: right;
1497
- padding-top: 20px;
1498
- }
1499
-
1500
- .updraftplusmethod.updraftvault .clear-left {
1501
- clear: left;
1502
- }
1503
-
1504
- .updraftplusmethod.updraftvault .padding-top-20px {
1505
- padding-top: 20px;
1506
- }
1507
-
1508
- .updraftplusmethod.updraftvault .padding-top-14px {
1509
- padding-top: 14px;
1510
- }
1511
-
1512
- .updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary, .updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary {
1513
- font-size: 18px !important;
1514
- padding-bottom: 20px;
1515
- }
1516
-
1517
- .updraftplusmethod.updraftvault #updraftvault_showoptions, .updraftplusmethod.updraftvault #updraftvault_connect {
1518
- margin-top: 8px;
1519
- }
1520
-
1521
- .updraftplusmethod.updraftvault #updraftvault_settings_connect input {
1522
- margin-right: 10px;
1523
- }
1524
-
1525
- .updraftplusmethod.updraftvault #updraftvault_email {
1526
- width: 280px;
1527
- }
1528
-
1529
- .updraftplusmethod.updraftvault #updraftvault_pass {
1530
- width: 200px;
1531
- }
1532
-
1533
- .updraftplusmethod.updraftvault #vault-is-connected {
1534
- margin: 0;
1535
- padding: 0;
1536
- }
1537
-
1538
- .updraftplusmethod.updraftvault #updraftvault_settings_default p {
1539
- clear: left;
1540
- }
1541
-
1542
- .updraftplusmethod.updraftvault .vault-purchase-option {
1543
- float: left;
1544
- width: 33%;
1545
- text-align: center;
1546
- padding-top: 20px;
1547
- }
1548
-
1549
- .updraftplusmethod.updraftvault .vault-purchase-option-size {
1550
- font-size: 200%;
1551
- font-weight: bold;
1552
- }
1553
-
1554
- .updraftplusmethod.updraftvault .vault-purchase-option-link {
1555
- clear: both;
1556
- font-size: 150%;
1557
- }
1558
-
1559
- .updraftplusmethod.updraftvault .vault-purchase-option-or {
1560
- clear: both;
1561
- font-size: 115%;
1562
- font-style: italic;
1563
- }
1564
-
1565
- /* Automation Backup Advert by B */
1566
- .autobackup-image {
1567
- /* display: inline-block; */
1568
- /* min-width: 10%;
1569
- max-width:25%;*/
1570
- /* float: left;*/
1571
- clear: left;
1572
- float: left;
1573
- width: 110px;
1574
- height: 110px;
1575
- }
1576
-
1577
- .autobackup-description {
1578
- width: 100%;
1579
- }
1580
-
1581
- .advert-description {
1582
- float: left;
1583
- clear: right;
1584
- padding: 4px 10px 8px 10px;
1585
- width: 70%;
1586
- clear: right;
1587
- vertical-align: top;
1588
- }
1589
-
1590
- .advert-btn {
1591
- display: inline-block;
1592
- min-width: 10%;
1593
- vertical-align: top;
1594
- margin-bottom: 8px;
1595
- }
1596
-
1597
- .advert-btn:first-of-type {
1598
- margin-top: 25px;
1599
- }
1600
-
1601
- .advert-btn a {
1602
- display: block;
1603
- cursor: pointer;
1604
- }
1605
-
1606
- a.btn-get-started {
1607
- background: #FFF;
1608
- border: 2px solid #DF6926;
1609
- border-radius: 4px;
1610
- color: #DF6926;
1611
- display: inline-block;
1612
- margin-left: 10px !important;
1613
- margin-bottom: 7px !important;
1614
- font-size: 18px !important;
1615
- line-height: 20px;
1616
- min-height: 28px;
1617
- padding: 11px 10px 5px 10px;
1618
- text-transform: uppercase;
1619
- text-decoration: none;
1620
- }
1621
-
1622
- .circle-dblarrow {
1623
- border: 1px solid #DF6926;
1624
- border-radius: 100%;
1625
- display: inline-block;
1626
- font-size: 17px;
1627
- line-height: 17px;
1628
- margin-left: 5px;
1629
- width: 20px;
1630
- height: 20px;
1631
- text-align: center;
1632
- }
1633
-
1634
- @media screen and (max-width: 782px) {
1635
- /* .advert-description {
1636
- min-width: 75%;
1637
- margin-bottom: 5px;
1638
- }
1639
-
1640
- .advert-btn {
1641
- margin-top: 15px;
1642
- margin-left:86px;
1643
- min-width: 100%;
1644
- }*/
1645
- }
1646
-
1647
- /* End Automation Backup Advert by B */
1648
- /* New Responsive Pretty Advanced Settings */
1649
- .expertmode .advanced_settings_container {
1650
- height: auto;
1651
- overflow: hidden;
1652
- }
1653
-
1654
- .expertmode .advanced_settings_container .advanced_settings_menu {
1655
- float: none;
1656
- border-bottom: 1px solid rgb(204, 204, 204);
1657
- }
1658
-
1659
- .expertmode .advanced_settings_container .advanced_settings_content {
1660
- padding-top: 5px;
1661
- float: none;
1662
- width: auto;
1663
- overflow: auto;
1664
- }
1665
-
1666
- .expertmode .advanced_settings_container .advanced_settings_content h3 {
1667
- margin-top: 5px !important;
1668
- }
1669
-
1670
- .expertmode .advanced_settings_container .advanced_settings_content .advanced_tools {
1671
- display: none;
1672
- }
1673
-
1674
- .expertmode .advanced_settings_container .advanced_settings_content .site_info {
1675
- display: block;
1676
- }
1677
-
1678
- .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {
1679
- display: inline-block;
1680
- cursor: pointer;
1681
- padding: 5px;
1682
- color: #000;
1683
- }
1684
-
1685
- .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text {
1686
- font-size: 16px;
1687
- }
1688
-
1689
- .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover {
1690
- background-color: #EAEAEA;
1691
- }
1692
-
1693
- .expertmode .advanced_settings_container .advanced_settings_menu .active {
1694
- background-color: #3498DB;
1695
- color: #FFF;
1696
- }
1697
-
1698
- .expertmode .advanced_settings_container .advanced_settings_menu .active:hover {
1699
- background-color: #72C5FD;
1700
- color: #FFF;
1701
- }
1702
-
1703
- .expertmode .advanced_settings_container .advanced_settings_content input#import_settings {
1704
- height: auto !important;
1705
- }
1706
-
1707
- div#updraft-wrap a {
1708
- cursor: pointer !important;
1709
- }
1710
-
1711
- @media screen and (min-width: 670px) {
1712
-
1713
- .expertmode .advanced_settings_container .advanced_settings_menu {
1714
- float: left;
1715
- width: 215px;
1716
- border-right: 1px solid rgb(204, 204, 204);
1717
- border-bottom: none;
1718
- }
1719
-
1720
- .expertmode .advanced_settings_container .advanced_settings_content {
1721
- padding-left: 10px;
1722
- padding-top: 0px;
1723
- }
1724
-
1725
- .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {
1726
- display: block;
1727
- }
1728
-
1729
- }
 
 
1
+ /* Widths and sizing */
2
+ .max-width-600 {
3
+ max-width: 600px;
4
+ }
5
+
6
+ .width-900 {
7
+ width: 900px;
8
+ }
9
+
10
+ .width-80 {
11
+ width: 80%;
12
+ }
13
+
14
+ /* End widths and sizing */
15
+
16
+ /* Font styling */
17
+ .no-decoration {
18
+ text-decoration: none;
19
+ }
20
+
21
+ .bold {
22
+ font-weight: bold;
23
+ }
24
+
25
+ /* End font styling */
26
+ /* Alignment */
27
+ .center-align-td {
28
+ text-align: center;
29
+ }
30
+
31
+ /* End of Alignment */
32
+ /* Padding */
33
+ .remove-padding {
34
+ padding: 0 !important;
35
+ }
36
+
37
+ /* End of padding */
38
+
39
+ .updraft-text-center {
40
+ text-align: center;
41
+ }
42
+
43
+ .autobackup {
44
+ padding: 6px;
45
+ margin: 8px 0px;
46
+ }
47
+
48
+ ul .disc {
49
+ list-style: disc inside;
50
+ }
51
+
52
+ .dashicons-log-fix {
53
+ display: inherit;
54
+ }
55
+
56
+ /* Input boxes */
57
+
58
+ input {
59
+ border-radius: 4px;
60
+ line-height: 1.42;
61
+ border: 1px solid #CCC;
62
+ height: 27px;
63
+ padding: 2px 6px;
64
+ color: #555;
65
+ }
66
+
67
+ input[type="text"] {
68
+ font-size: 14px;
69
+ }
70
+
71
+ input[type="number"] {
72
+ height: 31px;
73
+ }
74
+
75
+ select {
76
+ border-radius: 4px;
77
+ }
78
+
79
+ /* End input boxes */
80
+
81
+ /* Main Buttons */
82
+ .main-dashboard-buttons {
83
+ border-width: 4px;
84
+ border-radius: 12px;
85
+ letter-spacing: 0px;
86
+ font-size: 17px;
87
+ font-weight: bold;
88
+ padding-left: 0.7em;
89
+ padding-right: 2em;
90
+ padding: 0.3em 1em;
91
+ line-height: 1.7em;
92
+ background: transparent;
93
+ position: relative;
94
+ border: 2px solid;
95
+ transition: all 0.2s;
96
+ vertical-align: baseline;
97
+ box-sizing: border-box;
98
+ text-align: center;
99
+ line-height: 1.3em;
100
+ margin-left: .3em;
101
+ text-transform: none;
102
+ line-height: 1;
103
+ text-decoration: none;
104
+ }
105
+
106
+ .button-restore {
107
+ border-color: rgb(98, 158, 192);
108
+ color: rgb(98, 158, 192);
109
+ }
110
+
111
+ .dashboard-main-sizing {
112
+ border-width: 4px;
113
+ width: 190px;
114
+ line-height: 1.7em;
115
+ }
116
+
117
+ .button-restore:hover, .button-migrate:hover, .button-backup:hover,
118
+ .button-view-log:hover, .button-mass-selectors:hover,
119
+ .button-delete:hover, .button-entity-backup:hover, .udp-button-primary:hover {
120
+ border-color: #DF6926;
121
+ color: #DF6926;
122
+ }
123
+
124
+ .button-migrate {
125
+ color: rgb(238, 169, 32);
126
+ border-color: rgb(238, 169, 32);
127
+ }
128
+
129
+ .button-backup {
130
+ border-color: #84CA1B;
131
+ color: #84CA1B;
132
+ }
133
+
134
+ .existing-backups-buttons {
135
+ font-size: 11px;
136
+ line-height: 1.4em;
137
+ border-width: 3px;
138
+ }
139
+
140
+ .existing-backups-restore-buttons {
141
+ font-size: 11px;
142
+ line-height: 1.4em;
143
+ border-width: 3px;
144
+ }
145
+
146
+ .button-delete {
147
+ color: #E23900;
148
+ border-color: #E23900;
149
+ font-size: 14px;
150
+ line-height: 1.4em;
151
+ border-width: 2px;
152
+ margin-right: 10px;
153
+ }
154
+
155
+ .button-view-log, .button-mass-selectors {
156
+ color: darkgrey;
157
+ border-color: darkgrey;
158
+ font-size: 14px;
159
+ line-height: 1.4em;
160
+ border-width: 2px;
161
+ margin-top: -1px;
162
+ }
163
+
164
+ .button-view-log {
165
+ width: 120px;
166
+ }
167
+
168
+ .button-existing-restore {
169
+ font-size: 14px;
170
+ line-height: 1.4em;
171
+ border-width: 2px;
172
+ width: 110px;
173
+ }
174
+
175
+ .main-restore {
176
+ margin-right: 3%;
177
+ margin-left: 3%;
178
+ }
179
+
180
+ .button-entity-backup {
181
+ color: #555;
182
+ border-color: #555;
183
+ font-size: 11px;
184
+ line-height: 1.4em;
185
+ border-width: 2px;
186
+ margin-right: 5px;
187
+ }
188
+
189
+ .button-select-all {
190
+ width: 122px;
191
+ }
192
+
193
+ .button-deselect {
194
+ width: 92px;
195
+ }
196
+
197
+ #ud_massactions > .display-flex > .mass-selectors-margins {
198
+ margin-right: -4px;
199
+ }
200
+
201
+ .udp-button-primary {
202
+ border-width: 4px;
203
+ color: #0073AA;
204
+ border-color: #0073AA;
205
+ font-size: 14px;
206
+ height: 40px;
207
+ }
208
+
209
+ #ud_massactions .button-delete {
210
+ margin-right: 0px;
211
+ }
212
+
213
+ .stored_local {
214
+ border-radius: 5px;
215
+ background-color: #007FE7;
216
+ padding: 3px 5px 5px 5px;
217
+ color: #FFF;
218
+ font-size: 75%;
219
+ }
220
+
221
+ .form-table td.updraft_existingbackup_date {
222
+ padding-bottom: 5px;
223
+ }
224
+
225
+ span#updraft_lastlogcontainer {
226
+ word-break: break-all;
227
+ }
228
+
229
+ .stored_icon {
230
+ height: 1.3em;
231
+ position: relative;
232
+ top: 0.2em;
233
+ }
234
+
235
+ .backup_date_label .clear-right {
236
+ clear: right;
237
+ }
238
+
239
+ /* End Main Buttons */
240
+
241
+ /* End of common elements */
242
+
243
+ .udp-logo-70 {
244
+ width: 70px;
245
+ height: 70px;
246
+ float: left;
247
+ padding-right: 25px;
248
+ }
249
+
250
+ h3 .thank-you {
251
+ margin-top: 0px;
252
+ }
253
+
254
+ .ws_advert {
255
+ max-width: 800px;
256
+ font-size: 140%;
257
+ line-height: 140%;
258
+ padding: 14px;
259
+ clear: left;
260
+ }
261
+
262
+ .dismiss-dash-notice {
263
+ float: right;
264
+ position: relative;
265
+ top: -20px;
266
+ }
267
+
268
+ #updraft_report_cell .updraft_reportbox {
269
+ padding: 8px;
270
+ margin: 8px 0;
271
+ border: 1px dotted;
272
+ clear: left;
273
+ float: left;
274
+ }
275
+
276
+ #updraft_report_cell button.updraft_reportbox_delete {
277
+ font-size: 50%;
278
+ float: right;
279
+ padding: 0 3px;
280
+ position: relative;
281
+ top: -4px;
282
+ left: 4px;
283
+ }
284
+
285
+ #updraft-navtab-settings-content .updraft-test-button {
286
+ font-size: 18px !important;
287
+ }
288
+
289
+ #updraft_report_cell .updraft_report_checkbox {
290
+ margin-top: 4px;
291
+ }
292
+
293
+ #updraft_report_cell .updraft_report_email {
294
+ width: 300px;
295
+ }
296
+
297
+ #updraft_report_cell .updraft_report_another_p {
298
+ clear: left;
299
+ }
300
+
301
+ /* Taken straight from admin.php */
302
+
303
+ #updraft-navtab-settings-content table.form-table p {
304
+ max-width: 700px;
305
+ }
306
+
307
+ #updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected {
308
+ background-color: #CCC;
309
+ }
310
+
311
+ .updraft_settings_sectionheading {
312
+ display: none;
313
+ }
314
+
315
+ .updraft-backupentitybutton-disabled {
316
+ background-color: transparent;
317
+ border: none;
318
+ color: #0074A2;
319
+ text-decoration: underline;
320
+ cursor: pointer;
321
+ clear: none;
322
+ float: left;
323
+ }
324
+
325
+ .updraft-backupentitybutton {
326
+ margin-left: 8px;
327
+ }
328
+
329
+ .updraft-bigbutton {
330
+ padding: 2px 0px !important;
331
+ margin-right: 14px !important;
332
+ font-size: 22px !important;
333
+ min-height: 32px;
334
+ min-width: 180px;
335
+ }
336
+
337
+ .updraft_debugrow th {
338
+ float: right;
339
+ text-align: right;
340
+ font-weight: bold;
341
+ padding-right: 8px;
342
+ min-width: 140px;
343
+ }
344
+
345
+ .updraft_debugrow td {
346
+ min-width: 300px;
347
+ vertical-align: bottom;
348
+ }
349
+
350
+ #updraft_webdav_host_error {
351
+ color: red;
352
+ }
353
+
354
+ /* jstree styles */
355
+
356
+ /* these styles hide the dots from the parent but keep the arrows */
357
+ #updraft_zip_files_jstree .jstree-container-ul > .jstree-node,
358
+ #updraft_more_files_jstree .jstree-container-ul > .jstree-node {
359
+ background: transparent;
360
+ }
361
+
362
+ #updraft_zip_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl,
363
+ #updraft_more_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl {
364
+ background-position: -36px -4px;
365
+ }
366
+
367
+ #updraft_zip_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl,
368
+ #updraft_more_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl {
369
+ background-position: -4px -4px;
370
+ }
371
+
372
+ #updraft_zip_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl,
373
+ #updraft_more_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl {
374
+ background: transparent;
375
+ }
376
+
377
+ /* zip browser jstree styles */
378
+ #updraft_zip_files_container {
379
+ position: relative;
380
+ height: 450px;
381
+ overflow: none;
382
+ }
383
+
384
+ #updraft_zip_info_container {
385
+ position: relative;
386
+ height: auto;
387
+ width: 100%;
388
+ border: 1px dotted;
389
+ margin-bottom: 5px;
390
+ }
391
+
392
+ #updraft_zip_info_container p {
393
+ margin: 1px;
394
+ padding-left: 10px;
395
+ font-size: 14px;
396
+ }
397
+
398
+ #updraft_zip_download_item {
399
+ display: none;
400
+ color: #0073AA;
401
+ padding-left: 10px;
402
+ }
403
+
404
+ #updraft_zip_download_notice {
405
+ padding-left: 10px;
406
+ }
407
+
408
+ #updraft_zip_files_jstree_container {
409
+ position: relative;
410
+ border: 1px dotted;
411
+ height: 80%;
412
+ width: 100%;
413
+ overflow: auto;
414
+ }
415
+
416
+ /* More files jstree styles */
417
+ #updraft_more_files_container {
418
+ position: relative;
419
+ display: none;
420
+ height: 300px;
421
+ width: 100%;
422
+ border: 1px dotted;
423
+ margin-bottom: 5px;
424
+ }
425
+
426
+ #updraft_jstree_buttons {
427
+ position: absolute;
428
+ top: 0;
429
+ right: 0;
430
+ }
431
+
432
+ #updraft_jstree_container {
433
+ height: 100%;
434
+ width: 100%;
435
+ overflow: auto;
436
+ }
437
+
438
+ #updraft_more_files_container button {
439
+ height: 22px;
440
+ line-height: 20px;
441
+ }
442
+
443
+ #updraft_jstree_confirm, #updraft_jstree_cancel {
444
+ display: none;
445
+ }
446
+
447
+ .updraftplus-morefiles-row-delete {
448
+ cursor: pointer;
449
+ color: red;
450
+ font-size: 23px !important;
451
+ }
452
+
453
+ .updraftplus-morefiles-row-edit {
454
+ cursor: pointer;
455
+ font-size: 24px !important;
456
+ }
457
+
458
+ #updraft-wrap .form-table th {
459
+ width: 230px;
460
+ }
461
+
462
+ .updraftplus-remove {
463
+ background-color: #C00000;
464
+ border: 1px solid #C00000;
465
+ height: 22px;
466
+ padding: 4px 3px 0 3px;
467
+ margin-right: 6px;
468
+ }
469
+
470
+ .updraft-viewlogdiv form {
471
+ margin: 0;
472
+ padding: 0;
473
+ }
474
+
475
+ .updraft-viewlogdiv {
476
+ background-color: #FFF;
477
+ color: #000;
478
+ border: 1px solid #000;
479
+ height: 26px;
480
+ padding: 0px;
481
+ margin: 0 4px 0 0;
482
+ border-radius: 3px;
483
+ float: left;
484
+ }
485
+
486
+ .updraft-viewlogdiv input, .updraft-viewlogdiv a {
487
+ border: none;
488
+ background-color: transparent;
489
+ color: #000;
490
+ margin: 0px;
491
+ padding: 3px 4px;
492
+ font-size: 16px;
493
+ line-height: 26px;
494
+ }
495
+
496
+ .updraft-viewlogdiv:hover {
497
+ background-color: #000;
498
+ color: #FFF;
499
+ border: 1px solid #FFF;
500
+ cursor: pointer;
501
+ }
502
+
503
+ .updraft-viewlogdiv input:hover, .updraft-viewlogdiv a:hover {
504
+ color: #FFF;
505
+ cursor: pointer;
506
+ }
507
+
508
+ .updraftplus-remove a {
509
+ color: white;
510
+ padding: 4px 4px 0px 4px;
511
+ }
512
+
513
+ .updraftplus-remove:hover {
514
+ background-color: white;
515
+ border: 1px solid #C00000;
516
+ }
517
+
518
+ .updraftplus-remove a:hover {
519
+ color: #C00000;
520
+ }
521
+
522
+ .drag-drop #drag-drop-area2 {
523
+ border: 4px dashed #DDD;
524
+ height: 200px;
525
+ }
526
+
527
+ #drag-drop-area2 .drag-drop-inside {
528
+ margin: 36px auto 0;
529
+ width: 350px;
530
+ }
531
+
532
+ #filelist, #filelist2 {
533
+ width: 100%;
534
+ }
535
+
536
+ #filelist .file, #filelist2 .file, .ud_downloadstatus .file, #ud_downloadstatus2 .file {
537
+ padding: 5px;
538
+ background: #ECECEC;
539
+ border: solid 1px #CCC;
540
+ margin: 4px 0;
541
+ }
542
+
543
+ ul.updraft_premium_description_list {
544
+ list-style: disc inside;
545
+ }
546
+
547
+ ul.updraft_premium_description_list li {
548
+ display: inline;
549
+ }
550
+
551
+ ul.updraft_premium_description_list li::after {
552
+ content: " | ";
553
+ }
554
+
555
+ ul.updraft_premium_description_list li.last::after {
556
+ content: "";
557
+ }
558
+
559
+ .updraft_feature_cell {
560
+ background-color: #F7D9C9 !important;
561
+ padding: 5px 10px;
562
+ }
563
+
564
+ .updraft_feat_table, .updraft_feat_th, .updraft_feat_table td {
565
+ border: 1px solid black;
566
+ border-collapse: collapse;
567
+ font-size: 120%;
568
+ background-color: white;
569
+ text-align: center;
570
+ }
571
+
572
+ .updraft_feat_table p {
573
+ padding: 0px 10px;
574
+ margin: 5px 0px;
575
+ font-size: 16px;
576
+ }
577
+
578
+ .updraft_feat_table h4 {
579
+ margin: 5px 0px;
580
+ }
581
+
582
+ .updraft_feat_table .dashicons {
583
+ width: 25px;
584
+ height: 25px;
585
+ font-size: 25px;
586
+ line-height: 1;
587
+ }
588
+
589
+ .updraft_feat_table .dashicons-yes, .updraft_feat_table .updraft-yes {
590
+ color: green;
591
+ }
592
+
593
+ .updraft_feat_table .dashicons-no-alt, .updraft_feat_table .updraft-no {
594
+ color: red;
595
+ }
596
+
597
+ .updraft_tick_cell {
598
+ text-align: center;
599
+ }
600
+
601
+ .updraft_tick_cell img {
602
+ margin: 4px 0;
603
+ height: 24px;
604
+ }
605
+
606
+ #filelist .fileprogress, #filelist2 .fileprogress, .ud_downloadstatus .dlfileprogress, #ud_downloadstatus2 .dlfileprogress {
607
+ width: 0%;
608
+ background: #F6A828;
609
+ height: 5px;
610
+ }
611
+
612
+ .ud_downloadstatus .raw, #ud_downloadstatus2 .raw {
613
+ margin-top: 8px;
614
+ clear: left;
615
+ }
616
+
617
+ .ud_downloadstatus .file, #ud_downloadstatus2 .file {
618
+ margin-top: 8px;
619
+ }
620
+
621
+ tr.updraftplusmethod h3 {
622
+ margin: 0px;
623
+ }
624
+
625
+ #updraft_retain_db_rules .updraft_retain_rules_delete, #updraft_retain_files_rules .updraft_retain_rules_delete {
626
+ cursor: pointer;
627
+ color: red;
628
+ font-size: 120%;
629
+ font-weight: bold;
630
+ border: 0px;
631
+ border-radius: 3px;
632
+ padding: 2px;
633
+ margin: 0 6px;
634
+ }
635
+
636
+ #updraft_retain_db_rules .updraft_retain_rules_delete:hover, #updraft_retain_files_rules .updraft_retain_rules_delete:hover {
637
+ cursor: pointer;
638
+ color: white;
639
+ background: red;
640
+ }
641
+
642
+ #updraft_backup_started {
643
+ max-width: 800px;
644
+ font-size: 140%;
645
+ line-height: 140%;
646
+ padding: 14px;
647
+ clear: left;
648
+ }
649
+
650
+ .udp-premium-image {
651
+ display: none;
652
+ }
653
+
654
+ @media screen and (min-width: 720px) {
655
+
656
+ .udp-premium-image {
657
+ display: block;
658
+ float: left;
659
+ padding-right: 5px;
660
+ }
661
+
662
+ }
663
+
664
+ /* End stuff already in admin.php */
665
+ #plupload-upload-ui2 {
666
+ width: 80%;
667
+ }
668
+
669
+ .backup-restored {
670
+ padding: 8px;
671
+ }
672
+
673
+ .backup-restored span {
674
+ font-size: 120%;
675
+ }
676
+
677
+ .memory-limit {
678
+ padding: 8px;
679
+ }
680
+
681
+ .updraft_list_errors {
682
+ padding: 8px;
683
+ }
684
+
685
+ /*.nav-tab {
686
+ border-radius: 20px 20px 0 0;
687
+ border-color: grey;
688
+ border-width: 2px;
689
+ margin-top: 34px;
690
+ }
691
+
692
+ .nav-tab:hover {
693
+ border-bottom: 0;
694
+ }
695
+
696
+ .nav-tab-active, .nav-tab-active:active {
697
+ color: #df6926;
698
+ border-color: #D3D3D3;
699
+ border-width: 1px;
700
+ border-bottom: 0;
701
+ }
702
+
703
+ .nav-tab-active:focus {
704
+ color: #df6926;
705
+ }*/
706
+
707
+ .nav-tab-wrapper {
708
+ margin: 14px 0px;
709
+ }
710
+
711
+ #updraft-poplog-content {
712
+ white-space: pre-wrap;
713
+ }
714
+
715
+ .next-backup {
716
+ border: 0px;
717
+ padding: 0px;
718
+ margin: 0 10px 0 0;
719
+ }
720
+
721
+ .not-scheduled {
722
+ vertical-align: top !important;
723
+ margin: 0px !important;
724
+ padding: 0px !important;
725
+ }
726
+
727
+ .next-backup .updraft_scheduled {
728
+ /* width: 124px;*/
729
+ margin: 0px;
730
+ padding: 2px 4px 2px 0px;
731
+ }
732
+
733
+ #next-backup-table-inner td {
734
+ vertical-align: top;
735
+ }
736
+
737
+ .next-backup .updraft_all-files {
738
+ color: blue;
739
+ margin: 0px;
740
+ padding: 2px 0px 0px 0px;
741
+ }
742
+
743
+ .multisite-advert-width {
744
+ width: 800px;
745
+ }
746
+
747
+ .updraft_settings_sectionheading {
748
+ margin-top: 6px;
749
+ }
750
+
751
+ .premium-upgrade-prompt {
752
+ font-size: 115%;
753
+ }
754
+
755
+ .updraft_feat_table {
756
+ margin-top: 30px;
757
+ }
758
+
759
+ .show_admin_restore_in_progress_notice {
760
+ padding: 8px;
761
+ }
762
+
763
+ .show_admin_restore_in_progress_notice .unfinished-restoration {
764
+ font-size: 120%;
765
+ }
766
+
767
+ #backupnow_includefiles_moreoptions, #backupnow_database_moreoptions {
768
+ margin: 4px 16px 6px 16px;
769
+ border: 1px dotted;
770
+ padding: 6px 10px;
771
+ }
772
+
773
+ #backupnow_database_moreoptions {
774
+ max-height: 250px;
775
+ overflow: auto;
776
+ }
777
+
778
+ .form-table #updraft_activejobsrow .minimum-height {
779
+ min-height: 100px;
780
+ }
781
+
782
+ #updraft_lastlogmessagerow .last-message {
783
+ padding-top: 20px;
784
+ display: block;
785
+ }
786
+
787
+ .updraft_simplepie {
788
+ vertical-align: top;
789
+ }
790
+
791
+ .download-backups {
792
+ margin-top: 8px;
793
+ }
794
+
795
+ .download-backups .updraft_download_button {
796
+ margin-right: 6px;
797
+ margin-top: 4px;
798
+ }
799
+
800
+ .download-backups .choose-components-button {
801
+ font-size: 16px;
802
+ }
803
+
804
+ .download-backups .ud-whitespace-warning {
805
+ background-color: pink;
806
+ padding: 8px;
807
+ margin: 4px;
808
+ border: 1px dotted;
809
+ }
810
+
811
+ .download-backups .ul {
812
+ list-style: none inside;
813
+ max-width: 800px;
814
+ margin-top: 6px;
815
+ margin-bottom: 12px;
816
+ }
817
+
818
+ #updraft-plupload-modal {
819
+ width: 75%;
820
+ margin: 16px;
821
+ margin-left: 100px;
822
+ }
823
+
824
+ .download-backups .upload {
825
+ max-width: 610px;
826
+ }
827
+
828
+ .download-backups #plupload-upload-ui {
829
+ width: 70%;
830
+ }
831
+
832
+ .ud_downloadstatus {
833
+ padding: 10px;
834
+ background: #F1F1F1;
835
+ }
836
+
837
+ #ud_massactions {
838
+ padding: 14px;
839
+ position: fixed;
840
+ right: 25%;
841
+ top: 25%;
842
+ border: 2px solid;
843
+ border-radius: 4px;
844
+ background: rgb(241, 241, 241);
845
+ float: right;
846
+ }
847
+
848
+ #ud_massactions .updraftplus-remove {
849
+ clear: left;
850
+ font-size: 16px;
851
+ text-align: center;
852
+ border-radius: 4px;
853
+ margin-top: 4px;
854
+ }
855
+
856
+ #ud_massactions .updraftplus-remove a {
857
+ text-decoration: none;
858
+ }
859
+
860
+ #ud_massactions .updraft-viewlogdiv {
861
+ font-size: 16px;
862
+ text-align: center;
863
+ border-radius: 4px;
864
+ margin-top: 4px;
865
+ }
866
+
867
+ #ud_massactions .updraft-viewlogdiv a {
868
+ text-decoration: none;
869
+ position: relative;
870
+ top: 3px;
871
+ }
872
+
873
+ #ud_massactions .updraft-viewlogdiv a {
874
+ text-decoration: none;
875
+ position: relative;
876
+ top: 3px;
877
+ }
878
+
879
+ #updraft-navtab-backups-content .updraft_existing_backups {
880
+ margin-bottom: 12px;
881
+ }
882
+
883
+ #updraft-message-modal-innards {
884
+ padding: 4px;
885
+ }
886
+
887
+ #updraft-authenticate-modal {
888
+ text-align: center;
889
+ font-size: 16px !important;
890
+ }
891
+
892
+ #updraft-authenticate-modal p {
893
+ font-size: 16px;
894
+ }
895
+
896
+ #updraft_delete_form p {
897
+ margin-top: 3px;
898
+ padding-top: 0;
899
+ }
900
+
901
+ #updraft_restore_form .cannot-restore {
902
+ margin: 8px 0;
903
+ }
904
+
905
+ #updraft_restorer_dboptions {
906
+ padding: 12px;
907
+ margin: 8px 0 4px 0;
908
+ border: dashed 1px;
909
+ }
910
+
911
+ #updraft_restorer_dboptions h4 {
912
+ margin: 0px 0px 6px 0px;
913
+ padding: 0px;
914
+ }
915
+
916
+ .updraft_debugrow th {
917
+ vertical-align: top;
918
+ padding-top: 6px;
919
+ }
920
+
921
+ .expertmode p {
922
+ font-size: 125%;
923
+ }
924
+
925
+ .expertmode .call-wp-action {
926
+ width: 300px;
927
+ height: 22px;
928
+ }
929
+
930
+ .updraftplus-lock-advert {
931
+ clear: left;
932
+ max-width: 600px;
933
+ }
934
+
935
+ .uncompressed-data {
936
+ clear: left;
937
+ max-width: 600px;
938
+ }
939
+
940
+ .delete-old-directories {
941
+ padding: 8px;
942
+ padding-bottom: 12px;
943
+ }
944
+
945
+ .active-jobs {
946
+ min-width: 480px;
947
+ min-height: 48px;
948
+ text-align: center;
949
+ margin-top: 4px;
950
+ padding: 8px;
951
+ border: 1px solid;
952
+ float: left;
953
+ clear: left;
954
+ }
955
+
956
+ .job-id {
957
+ min-width: 480px;
958
+ margin-top: 4px;
959
+ padding: 8px;
960
+ border: 1px solid;
961
+ clear: left;
962
+ float: left;
963
+ }
964
+
965
+ .next-resumption {
966
+ font-weight: bold;
967
+ }
968
+
969
+ .updraft_percentage {
970
+ z-index: -1;
971
+ position: absolute;
972
+ left: 0px;
973
+ top: 0px;
974
+ text-align: center;
975
+ background-color: #F6A828;
976
+ }
977
+
978
+ .curstage {
979
+ border-radius: 4px;
980
+ margin-top: 8px;
981
+ padding-top: 4px;
982
+ border: 1px solid #AAA;
983
+ width: 100%;
984
+ height: 22px;
985
+ position: relative;
986
+ text-align: center;
987
+ font-style: italic;
988
+ }
989
+
990
+ .retain-files {
991
+ width: 48px;
992
+ }
993
+
994
+ .backup-interval-description tr td div {
995
+ max-width: 670px;
996
+ }
997
+
998
+ #updraft-manualdecrypt-modal {
999
+ width: 85%;
1000
+ margin: 6px;
1001
+ margin-left: 100px;
1002
+ }
1003
+
1004
+ .directory-permissions {
1005
+ font-size: 110%;
1006
+ font-weight: bold;
1007
+ }
1008
+
1009
+ .double-warning {
1010
+ border: 1px solid;
1011
+ padding: 6px;
1012
+ }
1013
+
1014
+ .raw-backup-info {
1015
+ font-style: italic;
1016
+ font-weight: bold;
1017
+ font-size: 120%;
1018
+ }
1019
+
1020
+ .updraft_existingbackup_date {
1021
+ width: 22%;
1022
+ max-width: 140px;
1023
+ }
1024
+
1025
+ .existing-backups-table {
1026
+ margin-top: 20px;
1027
+ margin-left: 20px;
1028
+ width: 80%;
1029
+ }
1030
+
1031
+ .tr-bottom-4 {
1032
+ margin-bottom: 4px;
1033
+ }
1034
+
1035
+ .form-table .backup-date {
1036
+ width: 172px;
1037
+ padding: 0;
1038
+ padding-left: 15px;
1039
+ }
1040
+
1041
+ .form-table .backup-data {
1042
+ width: 426px;
1043
+ padding: 0;
1044
+ padding-left: 15px;
1045
+ }
1046
+
1047
+ .form-table .updraft_backup_actions {
1048
+ width: 272px;
1049
+ padding: 0 0 10px 15px;
1050
+ }
1051
+
1052
+ .existing-date {
1053
+ -webkit-box-sizing: border-box;
1054
+ -moz-box-sizing: border-box;
1055
+ box-sizing: border-box;
1056
+ max-width: 140px;
1057
+ width: 25%;
1058
+ }
1059
+
1060
+ .line-break-tr {
1061
+ height: 2px;
1062
+ padding: 1px;
1063
+ margin: 0px;
1064
+ }
1065
+
1066
+ .line-break-td {
1067
+ margin: 0;
1068
+ padding: 0;
1069
+ }
1070
+
1071
+ .td-line-color {
1072
+ height: 2px;
1073
+ background-color: #888;
1074
+ }
1075
+
1076
+ .raw-backup {
1077
+ max-width: 140px;
1078
+ }
1079
+
1080
+ .existing-backups-actions {
1081
+ padding: 1px;
1082
+ margin: 0px;
1083
+ }
1084
+
1085
+ .existing-backups-border {
1086
+ height: 2px;
1087
+ padding: 1px;
1088
+ margin: 0px;
1089
+ }
1090
+
1091
+ .existing-backups-border > td {
1092
+ margin: 0;
1093
+ padding: 0;
1094
+ }
1095
+
1096
+ .existing-backups-border > div {
1097
+ height: 2px;
1098
+ background-color: #AAA;
1099
+ }
1100
+
1101
+ .updraft_existing_backup_date {
1102
+ max-width: 140px;
1103
+ }
1104
+
1105
+ .restore-button {
1106
+ margin-right: 6px;
1107
+ float: left;
1108
+ clear: none;
1109
+ }
1110
+
1111
+ .updraftplus-remove {
1112
+ font-size: 16px;
1113
+ text-align: center;
1114
+ border-radius: 4px;
1115
+ }
1116
+
1117
+ .before-restore-button {
1118
+ padding: 1px;
1119
+ margin: 0px;
1120
+ }
1121
+
1122
+ .table-separator-tr {
1123
+ height: 2px;
1124
+ padding: 1px;
1125
+ margin: 0px;
1126
+ }
1127
+
1128
+ .table-separator-td {
1129
+ margin: 0px;
1130
+ padding: 0px;
1131
+ }
1132
+
1133
+ .end-of-table-div {
1134
+ height: 2px;
1135
+ background-color: #AAA;
1136
+ }
1137
+
1138
+ .last-backup-job {
1139
+ padding-top: 3% !important;
1140
+ }
1141
+
1142
+ .line-height-03 {
1143
+ line-height: 0.3 !important;
1144
+ }
1145
+
1146
+ .line-height-13 {
1147
+ line-height: 1.3 !important;
1148
+ }
1149
+
1150
+ .line-height-23 {
1151
+ line-height: 2.3 !important;
1152
+ }
1153
+
1154
+ #updraft_diskspaceused {
1155
+ color: #DF6926;
1156
+ }
1157
+
1158
+ .updraft_premium_description_list {
1159
+ text-align: left;
1160
+ }
1161
+
1162
+ #updraft_delete_old_dirs_pagediv {
1163
+ padding-bottom: 10px;
1164
+ }
1165
+
1166
+ /*#updraft_lastlogmessagerow > td, #updraft_last_backup > td {
1167
+ padding: 0;
1168
+ }*/
1169
+
1170
+ .job-id {
1171
+ margin: 0 auto;
1172
+ width: 20%;
1173
+ }
1174
+
1175
+ .updraft_all-files {
1176
+ color: #DF6926;
1177
+ }
1178
+
1179
+ /* Time + scheduling add-on*/
1180
+ .fix-time {
1181
+ width: 70px;
1182
+ }
1183
+
1184
+ .retain-files {
1185
+ width: 70px;
1186
+ }
1187
+
1188
+ .number-input {
1189
+ min-width: 50px;
1190
+ max-width: 70px;
1191
+ }
1192
+
1193
+ .additional-rule-width {
1194
+ min-width: 60px;
1195
+ max-width: 70px;
1196
+ }
1197
+
1198
+ /* Add-ons */
1199
+ /* Want to fix the WordPress icons so that they fit inline with the text, and don't push everything out of place. */
1200
+
1201
+ .dashicons {
1202
+ line-height: inherit;
1203
+ font-size: inherit;
1204
+ }
1205
+
1206
+ .addon-logo-150 {
1207
+ margin-left: 30px;
1208
+ margin-top: 33px;
1209
+ height: 125px;
1210
+ width: 150px;
1211
+ }
1212
+
1213
+ .margin-bottom-50 {
1214
+ margin-bottom: 50px;
1215
+ }
1216
+
1217
+ .premium-container {
1218
+ width: 80%;
1219
+ }
1220
+
1221
+ /* Main Header */
1222
+
1223
+ .main-header {
1224
+ background-color: #DF6926;
1225
+ height: 200px;
1226
+ width: 100%;
1227
+ }
1228
+
1229
+ .button-add-to-cart {
1230
+ color: white;
1231
+ border-color: white;
1232
+ float: none;
1233
+ margin-right: 17px;
1234
+ }
1235
+
1236
+ .button-add-to-cart:hover, .button-add-to-cart:focus, .button-add-to-cart:active {
1237
+ border-color: #A0A5AA;
1238
+ color: #A0A5AA;
1239
+ }
1240
+
1241
+ .addon-title {
1242
+ margin-top: 25px;
1243
+ }
1244
+
1245
+ .addon-text {
1246
+ margin-top: 75px;
1247
+ }
1248
+
1249
+ .image-main-div {
1250
+ width: 25%;
1251
+ float: left;
1252
+ }
1253
+
1254
+ .text-main-div {
1255
+ width: 60%;
1256
+ float: left;
1257
+ text-align: center;
1258
+ color: white;
1259
+ margin-top: 16px;
1260
+ }
1261
+
1262
+ .text-main-div-title {
1263
+ font-weight: bold !important;
1264
+ color: white;
1265
+ text-align: center;
1266
+ }
1267
+
1268
+ .text-main-div-paragraph {
1269
+ color: white;
1270
+ }
1271
+
1272
+ /* End main header */
1273
+
1274
+ /* Vault icons */
1275
+
1276
+ .updraftplus-vault-cta {
1277
+ width: 100%;
1278
+ text-align: center;
1279
+ margin-bottom: 50px;
1280
+ }
1281
+
1282
+ .updraftplus-vault-cta h1 {
1283
+ font-weight: bold;
1284
+ }
1285
+
1286
+ .updraftvault-buy {
1287
+ width: 225px;
1288
+ height: 225px;
1289
+ border: 2px solid #777;
1290
+ display: inline-table;
1291
+ margin: 0 auto;
1292
+ margin-right: 50px;
1293
+ position: relative;
1294
+ }
1295
+
1296
+ .updraftplus-vault-cta > .vault-options > .center-vault {
1297
+ width: 275px;
1298
+ height: 275px;
1299
+ }
1300
+
1301
+ .updraftplus-vault-cta > .vault-options > .center-vault > a {
1302
+ right: 21%;
1303
+ font-size: 16px;
1304
+ border-width: 4px !important;
1305
+ }
1306
+
1307
+ .updraftplus-vault-cta > .vault-options > .center-vault > p {
1308
+ font-size: 16px;
1309
+ }
1310
+
1311
+ .updraftvault-buy .button-purchase {
1312
+ right: 24%;
1313
+ margin-left: 0;
1314
+ line-height: 1.7em;
1315
+ }
1316
+
1317
+ .updraftvault-buy hr {
1318
+ height: 2px;
1319
+ background-color: #777;
1320
+ margin-top: 18px;
1321
+ }
1322
+
1323
+ .right {
1324
+ margin-right: 0px;
1325
+ }
1326
+
1327
+ .updraftvault-buy .addon-logo-100 {
1328
+ height: 100px;
1329
+ width: 125px;
1330
+ margin-top: 7px;
1331
+ }
1332
+
1333
+ .updraftvault-buy .addon-logo-large {
1334
+ margin-top: 7px;
1335
+ }
1336
+
1337
+ .updraftvault-buy .button-buy-vault {
1338
+ font-size: 12px;
1339
+ color: #DF6926;
1340
+ border-color: #DF6926;
1341
+ border-width: 2px !important;
1342
+ position: absolute;
1343
+ right: 29%;
1344
+ bottom: 2%;
1345
+ }
1346
+
1347
+ .premium-addon-div .button-purchase {
1348
+ line-height: 1.7em;
1349
+ }
1350
+
1351
+ .updraftvault-buy .button-buy-vault:hover {
1352
+ border-color: darkgrey;
1353
+ color: darkgrey;
1354
+ }
1355
+
1356
+ /* End Vault icons */
1357
+
1358
+ /* Premium addons */
1359
+
1360
+ .premium-addons {
1361
+ margin-top: 80px;
1362
+ width: 100%;
1363
+ margin: 0 auto;
1364
+ display: table;
1365
+ }
1366
+
1367
+ .addon-list {
1368
+ /* margin-left: 32px; */
1369
+ display: table;
1370
+ text-align: center;
1371
+ }
1372
+
1373
+ .premium-addons h1 {
1374
+ text-align: center;
1375
+ font-weight: bold;
1376
+ }
1377
+
1378
+ .premium-addons p {
1379
+ text-align: center;
1380
+ }
1381
+
1382
+ .premium-addons .premium-addon-div {
1383
+ width: 200px;
1384
+ height: 250px;
1385
+ border: 2px solid #777;
1386
+ display: inline-table;
1387
+ margin: 0 auto;
1388
+ margin-right: 25px;
1389
+ margin-top: 25px;
1390
+ text-align: center;
1391
+ position: relative;
1392
+ }
1393
+
1394
+ .premium-addons .premium-addon-div p {
1395
+ margin-left: 2px;
1396
+ margin-right: 2px;
1397
+ }
1398
+
1399
+ .premium-addons .premium-addon-div img {
1400
+ width: auto;
1401
+ height: 50px;
1402
+ margin-top: 7px;
1403
+ }
1404
+
1405
+ .premium-addons .premium-addon-div .hr-alignment {
1406
+ margin-top: 44px;
1407
+ }
1408
+
1409
+ .premium-addons .premium-addon-div .dropbox-logo {
1410
+ height: 39px;
1411
+ width: 150px;
1412
+ }
1413
+
1414
+ .premium-addons .premium-addon-div .azure-logo, .premium-addons .premium-addon-div .onedrive-logo {
1415
+ width: 75%;
1416
+ height: 24px;
1417
+ }
1418
+
1419
+ .button-purchase {
1420
+ font-size: 12px;
1421
+ color: #DF6926;
1422
+ border-color: #DF6926;
1423
+ border-width: 2px !important;
1424
+ position: absolute;
1425
+ right: 25%;
1426
+ bottom: 2%;
1427
+ }
1428
+
1429
+ .button-purchase:hover {
1430
+ color: darkgrey;
1431
+ border-color: darkgrey;
1432
+ }
1433
+
1434
+ .premium-addons .premium-addon-div hr {
1435
+ height: 2px;
1436
+ background-color: #777;
1437
+ margin-top: 18px;
1438
+ }
1439
+
1440
+ .premium-addon-div p {
1441
+ font-style: italic;
1442
+ }
1443
+
1444
+ .addon-list > .premium-addon-div > .onedrive-fix,
1445
+ .addon-list > .premium-addon-div > .azure-logo {
1446
+ margin-top: 33px;
1447
+ }
1448
+
1449
+ .addon-list > .premium-addon-div > .dropbox-fix {
1450
+ margin-top: 18px;
1451
+ }
1452
+
1453
+ /* End premium addons */
1454
+
1455
+
1456
+ /* Forgotton something (that is the name of the div rather than a mental note!) */
1457
+
1458
+ .premium-forgotton-something {
1459
+ margin-top: 5%;
1460
+ }
1461
+
1462
+ .premium-forgotton-something h1 {
1463
+ text-align: center;
1464
+ font-weight: bold;
1465
+ }
1466
+
1467
+ .premium-forgotton-something p {
1468
+ text-align: center;
1469
+ font-weight: normal;
1470
+ }
1471
+
1472
+ .premium-forgotton-something .button-faq {
1473
+ color: #DF6926;
1474
+ border-color: #DF6926;
1475
+ margin: 0 auto;
1476
+ display: table;
1477
+ }
1478
+
1479
+ .premium-forgotton-something .button-faq:hover {
1480
+ color: #777;
1481
+ border-color: #777;
1482
+ }
1483
+
1484
+ /* End of forgotton something */
1485
+
1486
+ .updraftplusmethod.updraftvault #vaultlogo {
1487
+ padding-left: 40px;
1488
+ }
1489
+
1490
+ .updraftplusmethod.updraftvault .vault_primary_option {
1491
+ float: left;
1492
+ width: 50%;
1493
+ text-align: center;
1494
+ padding-bottom: 20px;
1495
+ }
1496
+
1497
+ .updraftplusmethod.updraftvault .vault_primary_option div {
1498
+ clear: right;
1499
+ padding-top: 20px;
1500
+ }
1501
+
1502
+ .updraftplusmethod.updraftvault .clear-left {
1503
+ clear: left;
1504
+ }
1505
+
1506
+ .updraftplusmethod.updraftvault .padding-top-20px {
1507
+ padding-top: 20px;
1508
+ }
1509
+
1510
+ .updraftplusmethod.updraftvault .padding-top-14px {
1511
+ padding-top: 14px;
1512
+ }
1513
+
1514
+ .updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary, .updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary {
1515
+ font-size: 18px !important;
1516
+ padding-bottom: 20px;
1517
+ }
1518
+
1519
+ .updraftplusmethod.updraftvault #updraftvault_showoptions, .updraftplusmethod.updraftvault #updraftvault_connect {
1520
+ margin-top: 8px;
1521
+ }
1522
+
1523
+ .updraftplusmethod.updraftvault #updraftvault_settings_connect input {
1524
+ margin-right: 10px;
1525
+ }
1526
+
1527
+ .updraftplusmethod.updraftvault #updraftvault_email {
1528
+ width: 280px;
1529
+ }
1530
+
1531
+ .updraftplusmethod.updraftvault #updraftvault_pass {
1532
+ width: 200px;
1533
+ }
1534
+
1535
+ .updraftplusmethod.updraftvault #vault-is-connected {
1536
+ margin: 0;
1537
+ padding: 0;
1538
+ }
1539
+
1540
+ .updraftplusmethod.updraftvault #updraftvault_settings_default p {
1541
+ clear: left;
1542
+ }
1543
+
1544
+ .updraftplusmethod.updraftvault .vault-purchase-option {
1545
+ float: left;
1546
+ width: 33%;
1547
+ text-align: center;
1548
+ padding-top: 20px;
1549
+ }
1550
+
1551
+ .updraftplusmethod.updraftvault .vault-purchase-option-size {
1552
+ font-size: 200%;
1553
+ font-weight: bold;
1554
+ }
1555
+
1556
+ .updraftplusmethod.updraftvault .vault-purchase-option-link {
1557
+ clear: both;
1558
+ font-size: 150%;
1559
+ }
1560
+
1561
+ .updraftplusmethod.updraftvault .vault-purchase-option-or {
1562
+ clear: both;
1563
+ font-size: 115%;
1564
+ font-style: italic;
1565
+ }
1566
+
1567
+ /* Automation Backup Advert by B */
1568
+ .autobackup-image {
1569
+ /* display: inline-block; */
1570
+ /* min-width: 10%;
1571
+ max-width:25%;*/
1572
+ /* float: left;*/
1573
+ clear: left;
1574
+ float: left;
1575
+ width: 110px;
1576
+ height: 110px;
1577
+ }
1578
+
1579
+ .autobackup-description {
1580
+ width: 100%;
1581
+ }
1582
+
1583
+ .advert-description {
1584
+ float: left;
1585
+ clear: right;
1586
+ padding: 4px 10px 8px 10px;
1587
+ width: 70%;
1588
+ clear: right;
1589
+ vertical-align: top;
1590
+ }
1591
+
1592
+ .advert-btn {
1593
+ display: inline-block;
1594
+ min-width: 10%;
1595
+ vertical-align: top;
1596
+ margin-bottom: 8px;
1597
+ }
1598
+
1599
+ .advert-btn:first-of-type {
1600
+ margin-top: 25px;
1601
+ }
1602
+
1603
+ .advert-btn a {
1604
+ display: block;
1605
+ cursor: pointer;
1606
+ }
1607
+
1608
+ a.btn-get-started {
1609
+ background: #FFF;
1610
+ border: 2px solid #DF6926;
1611
+ border-radius: 4px;
1612
+ color: #DF6926;
1613
+ display: inline-block;
1614
+ margin-left: 10px !important;
1615
+ margin-bottom: 7px !important;
1616
+ font-size: 18px !important;
1617
+ line-height: 20px;
1618
+ min-height: 28px;
1619
+ padding: 11px 10px 5px 10px;
1620
+ text-transform: uppercase;
1621
+ text-decoration: none;
1622
+ }
1623
+
1624
+ .circle-dblarrow {
1625
+ border: 1px solid #DF6926;
1626
+ border-radius: 100%;
1627
+ display: inline-block;
1628
+ font-size: 17px;
1629
+ line-height: 17px;
1630
+ margin-left: 5px;
1631
+ width: 20px;
1632
+ height: 20px;
1633
+ text-align: center;
1634
+ }
1635
+
1636
+ @media screen and (max-width: 782px) {
1637
+ /* .advert-description {
1638
+ min-width: 75%;
1639
+ margin-bottom: 5px;
1640
+ }
1641
+
1642
+ .advert-btn {
1643
+ margin-top: 15px;
1644
+ margin-left:86px;
1645
+ min-width: 100%;
1646
+ }*/
1647
+ }
1648
+
1649
+ /* End Automation Backup Advert by B */
1650
+ /* New Responsive Pretty Advanced Settings */
1651
+ .expertmode .advanced_settings_container {
1652
+ height: auto;
1653
+ overflow: hidden;
1654
+ }
1655
+
1656
+ .expertmode .advanced_settings_container .advanced_settings_menu {
1657
+ float: none;
1658
+ border-bottom: 1px solid rgb(204, 204, 204);
1659
+ }
1660
+
1661
+ .expertmode .advanced_settings_container .advanced_settings_content {
1662
+ padding-top: 5px;
1663
+ float: none;
1664
+ width: auto;
1665
+ overflow: auto;
1666
+ }
1667
+
1668
+ .expertmode .advanced_settings_container .advanced_settings_content h3 {
1669
+ margin-top: 5px !important;
1670
+ }
1671
+
1672
+ .expertmode .advanced_settings_container .advanced_settings_content .advanced_tools {
1673
+ display: none;
1674
+ }
1675
+
1676
+ .expertmode .advanced_settings_container .advanced_settings_content .site_info {
1677
+ display: block;
1678
+ }
1679
+
1680
+ .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {
1681
+ display: inline-block;
1682
+ cursor: pointer;
1683
+ padding: 5px;
1684
+ color: #000;
1685
+ }
1686
+
1687
+ .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text {
1688
+ font-size: 16px;
1689
+ }
1690
+
1691
+ .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover {
1692
+ background-color: #EAEAEA;
1693
+ }
1694
+
1695
+ .expertmode .advanced_settings_container .advanced_settings_menu .active {
1696
+ background-color: #3498DB;
1697
+ color: #FFF;
1698
+ }
1699
+
1700
+ .expertmode .advanced_settings_container .advanced_settings_menu .active:hover {
1701
+ background-color: #72C5FD;
1702
+ color: #FFF;
1703
+ }
1704
+
1705
+ .expertmode .advanced_settings_container .advanced_settings_content input#import_settings {
1706
+ height: auto !important;
1707
+ }
1708
+
1709
+ div#updraft-wrap a {
1710
+ cursor: pointer !important;
1711
+ }
1712
+
1713
+ @media screen and (min-width: 670px) {
1714
+
1715
+ .expertmode .advanced_settings_container .advanced_settings_menu {
1716
+ float: left;
1717
+ width: 215px;
1718
+ border-right: 1px solid rgb(204, 204, 204);
1719
+ border-bottom: none;
1720
+ }
1721
+
1722
+ .expertmode .advanced_settings_container .advanced_settings_content {
1723
+ padding-left: 10px;
1724
+ padding-top: 0px;
1725
+ }
1726
+
1727
+ .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {
1728
+ display: block;
1729
+ }
1730
+
1731
+ }
css/admin.min.css CHANGED
@@ -1,2 +1,2 @@
1
- .max-width-600{max-width:600px}.width-900{width:900px}.width-80{width:80%}.no-decoration{text-decoration:none}.bold{font-weight:bold}.center-align-td{text-align:center}.remove-padding{padding:0 !important}.updraft-text-center{text-align:center}.autobackup{padding:6px;margin:8px 0}ul .disc{list-style:disc inside}.dashicons-log-fix{display:inherit}input{border-radius:4px;line-height:1.42;border:1px solid #CCC;height:27px;padding:2px 6px;color:#555}input[type="text"]{font-size:14px}input[type="number"]{height:31px}select{border-radius:4px}.main-dashboard-buttons{border-width:4px;border-radius:12px;letter-spacing:0;font-size:17px;font-weight:bold;padding-left:.7em;padding-right:2em;padding:.3em 1em;line-height:1.7em;background:transparent;position:relative;border:2px solid;transition:all .2s;vertical-align:baseline;box-sizing:border-box;text-align:center;line-height:1.3em;margin-left:.3em;text-transform:none;line-height:1;text-decoration:none}.button-restore{border-color:#629ec0;color:#629ec0}.dashboard-main-sizing{border-width:4px;width:190px;line-height:1.7em}.button-restore:hover,.button-migrate:hover,.button-backup:hover,.button-view-log:hover,.button-mass-selectors:hover,.button-delete:hover,.button-entity-backup:hover,.udp-button-primary:hover{border-color:#df6926;color:#df6926}.button-migrate{color:#eea920;border-color:#eea920}.button-backup{border-color:#84ca1b;color:#84ca1b}.existing-backups-buttons{font-size:11px;line-height:1.4em;border-width:3px}.existing-backups-restore-buttons{font-size:11px;line-height:1.4em;border-width:3px}.button-delete{color:#e23900;border-color:#e23900;font-size:14px;line-height:1.4em;border-width:2px;margin-right:10px}.button-view-log,.button-mass-selectors{color:darkgrey;border-color:darkgrey;font-size:14px;line-height:1.4em;border-width:2px;margin-top:-1px}.button-view-log{width:120px}.button-existing-restore{font-size:14px;line-height:1.4em;border-width:2px;width:110px}.main-restore{margin-right:3%;margin-left:3%}.button-entity-backup{color:#555;border-color:#555;font-size:11px;line-height:1.4em;border-width:2px;margin-right:5px}.button-select-all{width:122px}.button-deselect{width:92px}#ud_massactions>.display-flex>.mass-selectors-margins{margin-right:-4px}.udp-button-primary{border-width:4px;color:#0073aa;border-color:#0073aa;font-size:14px;height:40px}#ud_massactions .button-delete{margin-right:0}.stored_local{border-radius:5px;background-color:#007fe7;padding:3px 5px 5px 5px;color:#FFF;font-size:75%}.form-table td.updraft_existingbackup_date{padding-bottom:5px}.stored_icon{height:1.3em;position:relative;top:.2em}.backup_date_label .clear-right{clear:right}.udp-logo-70{width:70px;height:70px;float:left;padding-right:25px}h3 .thank-you{margin-top:0}.ws_advert{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.dismiss-dash-notice{float:right;position:relative;top:-20px}#updraft_report_cell .updraft_reportbox{padding:8px;margin:8px 0;border:1px dotted;clear:left;float:left}#updraft_report_cell button.updraft_reportbox_delete{font-size:50%;float:right;padding:0 3px;position:relative;top:-4px;left:4px}#updraft-navtab-settings-content .updraft-test-button{font-size:18px !important}#updraft_report_cell .updraft_report_checkbox{margin-top:4px}#updraft_report_cell .updraft_report_email{width:300px}#updraft_report_cell .updraft_report_another_p{clear:left}#updraft-navtab-settings-content table.form-table p{max-width:700px}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected{background-color:#CCC}.updraft_settings_sectionheading{display:none}.updraft-backupentitybutton-disabled{background-color:transparent;border:0;color:#0074a2;text-decoration:underline;cursor:pointer;clear:none;float:left}.updraft-backupentitybutton{margin-left:8px}.updraft-bigbutton{padding:2px 0 !important;margin-right:14px !important;font-size:22px !important;min-height:32px;min-width:180px}.updraft_debugrow th{float:right;text-align:right;font-weight:bold;padding-right:8px;min-width:140px}.updraft_debugrow td{min-width:300px;vertical-align:bottom}#updraft_webdav_host_error{color:red}#updraft_zip_files_jstree .jstree-container-ul>.jstree-node,#updraft_more_files_jstree .jstree-container-ul>.jstree-node{background:transparent}#updraft_zip_files_jstree .jstree-container-ul>.jstree-open>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-open>.jstree-ocl{background-position:-36px -4px}#updraft_zip_files_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl{background-position:-4px -4px}#updraft_zip_files_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl{background:transparent}#updraft_zip_files_container{position:relative;height:450px;overflow:none}#updraft_zip_info_container{position:relative;height:auto;width:100%;border:1px dotted;margin-bottom:5px}#updraft_zip_info_container p{margin:1px;padding-left:10px;font-size:14px}#updraft_zip_download_item{display:none;color:#0073aa;padding-left:10px}#updraft_zip_download_notice{padding-left:10px}#updraft_zip_files_jstree_container{position:relative;border:1px dotted;height:80%;width:100%;overflow:auto}#updraft_more_files_container{position:relative;display:none;height:300px;width:100%;border:1px dotted;margin-bottom:5px}#updraft_jstree_buttons{position:absolute;top:0;right:0}#updraft_jstree_container{height:100%;width:100%;overflow:auto}#updraft_more_files_container button{height:22px;line-height:20px}#updraft_jstree_confirm,#updraft_jstree_cancel{display:none}.updraftplus-morefiles-row-delete{cursor:pointer;color:red;font-size:23px !important}.updraftplus-morefiles-row-edit{cursor:pointer;font-size:24px !important}#updraft-wrap .form-table th{width:230px}.updraftplus-remove{background-color:#c00000;border:1px solid #c00000;height:22px;padding:4px 3px 0 3px;margin-right:6px}.updraft-viewlogdiv form{margin:0;padding:0}.updraft-viewlogdiv{background-color:#FFF;color:#000;border:1px solid #000;height:26px;padding:0;margin:0 4px 0 0;border-radius:3px;float:left}.updraft-viewlogdiv input,.updraft-viewlogdiv a{border:0;background-color:transparent;color:#000;margin:0;padding:3px 4px;font-size:16px;line-height:26px}.updraft-viewlogdiv:hover{background-color:#000;color:#FFF;border:1px solid #FFF;cursor:pointer}.updraft-viewlogdiv input:hover,.updraft-viewlogdiv a:hover{color:#FFF;cursor:pointer}.updraftplus-remove a{color:white;padding:4px 4px 0 4px}.updraftplus-remove:hover{background-color:white;border:1px solid #c00000}.updraftplus-remove a:hover{color:#c00000}.drag-drop #drag-drop-area2{border:4px dashed #DDD;height:200px}#drag-drop-area2 .drag-drop-inside{margin:36px auto 0;width:350px}#filelist,#filelist2{width:100%}#filelist .file,#filelist2 .file,.ud_downloadstatus .file,#ud_downloadstatus2 .file{padding:5px;background:#ececec;border:solid 1px #CCC;margin:4px 0}ul.updraft_premium_description_list{list-style:disc inside}ul.updraft_premium_description_list li{display:inline}ul.updraft_premium_description_list li::after{content:" | "}ul.updraft_premium_description_list li.last::after{content:""}.updraft_feature_cell{background-color:#f7d9c9 !important;padding:5px 10px}.updraft_feat_table,.updraft_feat_th,.updraft_feat_table td{border:1px solid black;border-collapse:collapse;font-size:120%;background-color:white;text-align:center}.updraft_feat_table p{padding:0 10px;margin:5px 0;font-size:16px}.updraft_feat_table h4{margin:5px 0}.updraft_feat_table .dashicons{width:25px;height:25px;font-size:25px;line-height:1}.updraft_feat_table .dashicons-yes,.updraft_feat_table .updraft-yes{color:green}.updraft_feat_table .dashicons-no-alt,.updraft_feat_table .updraft-no{color:red}.updraft_tick_cell{text-align:center}.updraft_tick_cell img{margin:4px 0;height:24px}#filelist .fileprogress,#filelist2 .fileprogress,.ud_downloadstatus .dlfileprogress,#ud_downloadstatus2 .dlfileprogress{width:0;background:#f6a828;height:5px}.ud_downloadstatus .raw,#ud_downloadstatus2 .raw{margin-top:8px;clear:left}.ud_downloadstatus .file,#ud_downloadstatus2 .file{margin-top:8px}tr.updraftplusmethod h3{margin:0}#updraft_retain_db_rules .updraft_retain_rules_delete,#updraft_retain_files_rules .updraft_retain_rules_delete{cursor:pointer;color:red;font-size:120%;font-weight:bold;border:0;border-radius:3px;padding:2px;margin:0 6px}#updraft_retain_db_rules .updraft_retain_rules_delete:hover,#updraft_retain_files_rules .updraft_retain_rules_delete:hover{cursor:pointer;color:white;background:red}#updraft_backup_started{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.udp-premium-image{display:none}@media screen and (min-width:720px){.udp-premium-image{display:block;float:left;padding-right:5px}}#plupload-upload-ui2{width:80%}.backup-restored{padding:8px}.backup-restored span{font-size:120%}.memory-limit{padding:8px}.updraft_list_errors{padding:8px}.nav-tab-wrapper{margin:14px 0}#updraft-poplog-content{white-space:pre-wrap}.next-backup{border:0;padding:0;margin:0 10px 0 0}.not-scheduled{vertical-align:top !important;margin:0 !important;padding:0 !important}.next-backup .updraft_scheduled{margin:0;padding:2px 4px 2px 0}#next-backup-table-inner td{vertical-align:top}.next-backup .updraft_all-files{color:blue;margin:0;padding:2px 0 0 0}.multisite-advert-width{width:800px}.updraft_settings_sectionheading{margin-top:6px}.premium-upgrade-prompt{font-size:115%}.updraft_feat_table{margin-top:30px}.show_admin_restore_in_progress_notice{padding:8px}.show_admin_restore_in_progress_notice .unfinished-restoration{font-size:120%}#backupnow_includefiles_moreoptions,#backupnow_database_moreoptions{margin:4px 16px 6px 16px;border:1px dotted;padding:6px 10px}#backupnow_database_moreoptions{max-height:250px;overflow:auto}.form-table #updraft_activejobsrow .minimum-height{min-height:100px}#updraft_lastlogmessagerow .last-message{padding-top:20px;display:block}.updraft_simplepie{vertical-align:top}.download-backups{margin-top:8px}.download-backups .updraft_download_button{margin-right:6px;margin-top:4px}.download-backups .choose-components-button{font-size:16px}.download-backups .ud-whitespace-warning{background-color:pink;padding:8px;margin:4px;border:1px dotted}.download-backups .ul{list-style:none inside;max-width:800px;margin-top:6px;margin-bottom:12px}#updraft-plupload-modal{width:75%;margin:16px;margin-left:100px}.download-backups .upload{max-width:610px}.download-backups #plupload-upload-ui{width:70%}.ud_downloadstatus{padding:10px;background:#f1f1f1}#ud_massactions{padding:14px;position:fixed;right:25%;top:25%;border:2px solid;border-radius:4px;background:#f1f1f1;float:right}#ud_massactions .updraftplus-remove{clear:left;font-size:16px;text-align:center;border-radius:4px;margin-top:4px}#ud_massactions .updraftplus-remove a{text-decoration:none}#ud_massactions .updraft-viewlogdiv{font-size:16px;text-align:center;border-radius:4px;margin-top:4px}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative;top:3px}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative;top:3px}#updraft-navtab-backups-content .updraft_existing_backups{margin-bottom:12px}#updraft-message-modal-innards{padding:4px}#updraft-authenticate-modal{text-align:center;font-size:16px !important}#updraft-authenticate-modal p{font-size:16px}#updraft_delete_form p{margin-top:3px;padding-top:0}#updraft_restore_form .cannot-restore{margin:8px 0}#updraft_restorer_dboptions{padding:12px;margin:8px 0 4px 0;border:dashed 1px}#updraft_restorer_dboptions h4{margin:0 0 6px 0;padding:0}.updraft_debugrow th{vertical-align:top;padding-top:6px}.expertmode p{font-size:125%}.expertmode .call-wp-action{width:300px;height:22px}.updraftplus-lock-advert{clear:left;max-width:600px}.uncompressed-data{clear:left;max-width:600px}.delete-old-directories{padding:8px;padding-bottom:12px}.active-jobs{min-width:480px;min-height:48px;text-align:center;margin-top:4px;padding:8px;border:1px solid;float:left;clear:left}.job-id{min-width:480px;margin-top:4px;padding:8px;border:1px solid;clear:left;float:left}.next-resumption{font-weight:bold}.updraft_percentage{z-index:-1;position:absolute;left:0;top:0;text-align:center;background-color:#f6a828}.curstage{border-radius:4px;margin-top:8px;padding-top:4px;border:1px solid #AAA;width:100%;height:22px;position:relative;text-align:center;font-style:italic}.retain-files{width:48px}.backup-interval-description tr td div{max-width:670px}#updraft-manualdecrypt-modal{width:85%;margin:6px;margin-left:100px}.directory-permissions{font-size:110%;font-weight:bold}.double-warning{border:1px solid;padding:6px}.raw-backup-info{font-style:italic;font-weight:bold;font-size:120%}.updraft_existingbackup_date{width:22%;max-width:140px}.existing-backups-table{margin-top:20px;margin-left:20px;width:80%}.tr-bottom-4{margin-bottom:4px}.form-table .backup-date{width:172px;padding:0;padding-left:15px}.form-table .backup-data{width:426px;padding:0;padding-left:15px}.form-table .updraft_backup_actions{width:272px;padding:0 0 10px 15px}.existing-date{box-sizing:border-box;max-width:140px;width:25%}.line-break-tr{height:2px;padding:1px;margin:0}.line-break-td{margin:0;padding:0}.td-line-color{height:2px;background-color:#888}.raw-backup{max-width:140px}.existing-backups-actions{padding:1px;margin:0}.existing-backups-border{height:2px;padding:1px;margin:0}.existing-backups-border>td{margin:0;padding:0}.existing-backups-border>div{height:2px;background-color:#AAA}.updraft_existing_backup_date{max-width:140px}.restore-button{margin-right:6px;float:left;clear:none}.updraftplus-remove{font-size:16px;text-align:center;border-radius:4px}.before-restore-button{padding:1px;margin:0}.table-separator-tr{height:2px;padding:1px;margin:0}.table-separator-td{margin:0;padding:0}.end-of-table-div{height:2px;background-color:#AAA}.last-backup-job{padding-top:3% !important}.line-height-03{line-height:.3 !important}.line-height-13{line-height:1.3 !important}.line-height-23{line-height:2.3 !important}#updraft_diskspaceused{color:#df6926}.updraft_premium_description_list{text-align:left}#updraft_delete_old_dirs_pagediv{padding-bottom:10px}.job-id{margin:0 auto;width:20%}.updraft_all-files{color:#df6926}.fix-time{width:70px}.retain-files{width:70px}.number-input{min-width:50px;max-width:70px}.additional-rule-width{min-width:60px;max-width:70px}.dashicons{line-height:inherit;font-size:inherit}.addon-logo-150{margin-left:30px;margin-top:33px;height:125px;width:150px}.margin-bottom-50{margin-bottom:50px}.premium-container{width:80%}.main-header{background-color:#df6926;height:200px;width:100%}.button-add-to-cart{color:white;border-color:white;float:none;margin-right:17px}.button-add-to-cart:hover,.button-add-to-cart:focus,.button-add-to-cart:active{border-color:#a0a5aa;color:#a0a5aa}.addon-title{margin-top:25px}.addon-text{margin-top:75px}.image-main-div{width:25%;float:left}.text-main-div{width:60%;float:left;text-align:center;color:white;margin-top:16px}.text-main-div-title{font-weight:bold !important;color:white;text-align:center}.text-main-div-paragraph{color:white}.updraftplus-vault-cta{width:100%;text-align:center;margin-bottom:50px}.updraftplus-vault-cta h1{font-weight:bold}.updraftvault-buy{width:225px;height:225px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:50px;position:relative}.updraftplus-vault-cta>.vault-options>.center-vault{width:275px;height:275px}.updraftplus-vault-cta>.vault-options>.center-vault>a{right:21%;font-size:16px;border-width:4px !important}.updraftplus-vault-cta>.vault-options>.center-vault>p{font-size:16px}.updraftvault-buy .button-purchase{right:24%;margin-left:0;line-height:1.7em}.updraftvault-buy hr{height:2px;background-color:#777;margin-top:18px}.right{margin-right:0}.updraftvault-buy .addon-logo-100{height:100px;width:125px;margin-top:7px}.updraftvault-buy .addon-logo-large{margin-top:7px}.updraftvault-buy .button-buy-vault{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:29%;bottom:2%}.premium-addon-div .button-purchase{line-height:1.7em}.updraftvault-buy .button-buy-vault:hover{border-color:darkgrey;color:darkgrey}.premium-addons{margin-top:80px;width:100%;margin:0 auto;display:table}.addon-list{display:table;text-align:center}.premium-addons h1{text-align:center;font-weight:bold}.premium-addons p{text-align:center}.premium-addons .premium-addon-div{width:200px;height:250px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:25px;margin-top:25px;text-align:center;position:relative}.premium-addons .premium-addon-div p{margin-left:2px;margin-right:2px}.premium-addons .premium-addon-div img{width:auto;height:50px;margin-top:7px}.premium-addons .premium-addon-div .hr-alignment{margin-top:44px}.premium-addons .premium-addon-div .dropbox-logo{height:39px;width:150px}.premium-addons .premium-addon-div .azure-logo,.premium-addons .premium-addon-div .onedrive-logo{width:75%;height:24px}.button-purchase{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:25%;bottom:2%}.button-purchase:hover{color:darkgrey;border-color:darkgrey}.premium-addons .premium-addon-div hr{height:2px;background-color:#777;margin-top:18px}.premium-addon-div p{font-style:italic}.addon-list>.premium-addon-div>.onedrive-fix,.addon-list>.premium-addon-div>.azure-logo{margin-top:33px}.addon-list>.premium-addon-div>.dropbox-fix{margin-top:18px}.premium-forgotton-something{margin-top:5%}.premium-forgotton-something h1{text-align:center;font-weight:bold}.premium-forgotton-something p{text-align:center;font-weight:normal}.premium-forgotton-something .button-faq{color:#df6926;border-color:#df6926;margin:0 auto;display:table}.premium-forgotton-something .button-faq:hover{color:#777;border-color:#777}.updraftplusmethod.updraftvault #vaultlogo{padding-left:40px}.updraftplusmethod.updraftvault .vault_primary_option{float:left;width:50%;text-align:center;padding-bottom:20px}.updraftplusmethod.updraftvault .vault_primary_option div{clear:right;padding-top:20px}.updraftplusmethod.updraftvault .clear-left{clear:left}.updraftplusmethod.updraftvault .padding-top-20px{padding-top:20px}.updraftplusmethod.updraftvault .padding-top-14px{padding-top:14px}.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary,.updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary{font-size:18px !important;padding-bottom:20px}.updraftplusmethod.updraftvault #updraftvault_showoptions,.updraftplusmethod.updraftvault #updraftvault_connect{margin-top:8px}.updraftplusmethod.updraftvault #updraftvault_settings_connect input{margin-right:10px}.updraftplusmethod.updraftvault #updraftvault_email{width:280px}.updraftplusmethod.updraftvault #updraftvault_pass{width:200px}.updraftplusmethod.updraftvault #vault-is-connected{margin:0;padding:0}.updraftplusmethod.updraftvault #updraftvault_settings_default p{clear:left}.updraftplusmethod.updraftvault .vault-purchase-option{float:left;width:33%;text-align:center;padding-top:20px}.updraftplusmethod.updraftvault .vault-purchase-option-size{font-size:200%;font-weight:bold}.updraftplusmethod.updraftvault .vault-purchase-option-link{clear:both;font-size:150%}.updraftplusmethod.updraftvault .vault-purchase-option-or{clear:both;font-size:115%;font-style:italic}.autobackup-image{clear:left;float:left;width:110px;height:110px}.autobackup-description{width:100%}.advert-description{float:left;clear:right;padding:4px 10px 8px 10px;width:70%;clear:right;vertical-align:top}.advert-btn{display:inline-block;min-width:10%;vertical-align:top;margin-bottom:8px}.advert-btn:first-of-type{margin-top:25px}.advert-btn a{display:block;cursor:pointer}a.btn-get-started{background:#FFF;border:2px solid #df6926;border-radius:4px;color:#df6926;display:inline-block;margin-left:10px !important;margin-bottom:7px !important;font-size:18px !important;line-height:20px;min-height:28px;padding:11px 10px 5px 10px;text-transform:uppercase;text-decoration:none}.circle-dblarrow{border:1px solid #df6926;border-radius:100%;display:inline-block;font-size:17px;line-height:17px;margin-left:5px;width:20px;height:20px;text-align:center}.expertmode .advanced_settings_container{height:auto;overflow:hidden}.expertmode .advanced_settings_container .advanced_settings_menu{float:none;border-bottom:1px solid #ccc}.expertmode .advanced_settings_container .advanced_settings_content{padding-top:5px;float:none;width:auto;overflow:auto}.expertmode .advanced_settings_container .advanced_settings_content h3{margin-top:5px !important}.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools{display:none}.expertmode .advanced_settings_container .advanced_settings_content .site_info{display:block}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:inline-block;cursor:pointer;padding:5px;color:#000}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text{font-size:16px}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover{background-color:#eaeaea}.expertmode .advanced_settings_container .advanced_settings_menu .active{background-color:#3498db;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_menu .active:hover{background-color:#72c5fd;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_content input#import_settings{height:auto !important}div#updraft-wrap a{cursor:pointer !important}@media screen and (min-width:670px){.expertmode .advanced_settings_container .advanced_settings_menu{float:left;width:215px;border-right:1px solid #ccc;border-bottom:0}.expertmode .advanced_settings_container .advanced_settings_content{padding-left:10px;padding-top:0}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:block}}
2
  /*# sourceMappingURL=admin.min.css.map */
1
+ .max-width-600{max-width:600px}.width-900{width:900px}.width-80{width:80%}.no-decoration{text-decoration:none}.bold{font-weight:bold}.center-align-td{text-align:center}.remove-padding{padding:0 !important}.updraft-text-center{text-align:center}.autobackup{padding:6px;margin:8px 0}ul .disc{list-style:disc inside}.dashicons-log-fix{display:inherit}input{border-radius:4px;line-height:1.42;border:1px solid #CCC;height:27px;padding:2px 6px;color:#555}input[type="text"]{font-size:14px}input[type="number"]{height:31px}select{border-radius:4px}.main-dashboard-buttons{border-width:4px;border-radius:12px;letter-spacing:0;font-size:17px;font-weight:bold;padding-left:.7em;padding-right:2em;padding:.3em 1em;line-height:1.7em;background:transparent;position:relative;border:2px solid;transition:all .2s;vertical-align:baseline;box-sizing:border-box;text-align:center;line-height:1.3em;margin-left:.3em;text-transform:none;line-height:1;text-decoration:none}.button-restore{border-color:#629ec0;color:#629ec0}.dashboard-main-sizing{border-width:4px;width:190px;line-height:1.7em}.button-restore:hover,.button-migrate:hover,.button-backup:hover,.button-view-log:hover,.button-mass-selectors:hover,.button-delete:hover,.button-entity-backup:hover,.udp-button-primary:hover{border-color:#df6926;color:#df6926}.button-migrate{color:#eea920;border-color:#eea920}.button-backup{border-color:#84ca1b;color:#84ca1b}.existing-backups-buttons{font-size:11px;line-height:1.4em;border-width:3px}.existing-backups-restore-buttons{font-size:11px;line-height:1.4em;border-width:3px}.button-delete{color:#e23900;border-color:#e23900;font-size:14px;line-height:1.4em;border-width:2px;margin-right:10px}.button-view-log,.button-mass-selectors{color:darkgrey;border-color:darkgrey;font-size:14px;line-height:1.4em;border-width:2px;margin-top:-1px}.button-view-log{width:120px}.button-existing-restore{font-size:14px;line-height:1.4em;border-width:2px;width:110px}.main-restore{margin-right:3%;margin-left:3%}.button-entity-backup{color:#555;border-color:#555;font-size:11px;line-height:1.4em;border-width:2px;margin-right:5px}.button-select-all{width:122px}.button-deselect{width:92px}#ud_massactions>.display-flex>.mass-selectors-margins{margin-right:-4px}.udp-button-primary{border-width:4px;color:#0073aa;border-color:#0073aa;font-size:14px;height:40px}#ud_massactions .button-delete{margin-right:0}.stored_local{border-radius:5px;background-color:#007fe7;padding:3px 5px 5px 5px;color:#FFF;font-size:75%}.form-table td.updraft_existingbackup_date{padding-bottom:5px}span#updraft_lastlogcontainer{word-break:break-all}.stored_icon{height:1.3em;position:relative;top:.2em}.backup_date_label .clear-right{clear:right}.udp-logo-70{width:70px;height:70px;float:left;padding-right:25px}h3 .thank-you{margin-top:0}.ws_advert{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.dismiss-dash-notice{float:right;position:relative;top:-20px}#updraft_report_cell .updraft_reportbox{padding:8px;margin:8px 0;border:1px dotted;clear:left;float:left}#updraft_report_cell button.updraft_reportbox_delete{font-size:50%;float:right;padding:0 3px;position:relative;top:-4px;left:4px}#updraft-navtab-settings-content .updraft-test-button{font-size:18px !important}#updraft_report_cell .updraft_report_checkbox{margin-top:4px}#updraft_report_cell .updraft_report_email{width:300px}#updraft_report_cell .updraft_report_another_p{clear:left}#updraft-navtab-settings-content table.form-table p{max-width:700px}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected{background-color:#CCC}.updraft_settings_sectionheading{display:none}.updraft-backupentitybutton-disabled{background-color:transparent;border:0;color:#0074a2;text-decoration:underline;cursor:pointer;clear:none;float:left}.updraft-backupentitybutton{margin-left:8px}.updraft-bigbutton{padding:2px 0 !important;margin-right:14px !important;font-size:22px !important;min-height:32px;min-width:180px}.updraft_debugrow th{float:right;text-align:right;font-weight:bold;padding-right:8px;min-width:140px}.updraft_debugrow td{min-width:300px;vertical-align:bottom}#updraft_webdav_host_error{color:red}#updraft_zip_files_jstree .jstree-container-ul>.jstree-node,#updraft_more_files_jstree .jstree-container-ul>.jstree-node{background:transparent}#updraft_zip_files_jstree .jstree-container-ul>.jstree-open>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-open>.jstree-ocl{background-position:-36px -4px}#updraft_zip_files_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl{background-position:-4px -4px}#updraft_zip_files_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl{background:transparent}#updraft_zip_files_container{position:relative;height:450px;overflow:none}#updraft_zip_info_container{position:relative;height:auto;width:100%;border:1px dotted;margin-bottom:5px}#updraft_zip_info_container p{margin:1px;padding-left:10px;font-size:14px}#updraft_zip_download_item{display:none;color:#0073aa;padding-left:10px}#updraft_zip_download_notice{padding-left:10px}#updraft_zip_files_jstree_container{position:relative;border:1px dotted;height:80%;width:100%;overflow:auto}#updraft_more_files_container{position:relative;display:none;height:300px;width:100%;border:1px dotted;margin-bottom:5px}#updraft_jstree_buttons{position:absolute;top:0;right:0}#updraft_jstree_container{height:100%;width:100%;overflow:auto}#updraft_more_files_container button{height:22px;line-height:20px}#updraft_jstree_confirm,#updraft_jstree_cancel{display:none}.updraftplus-morefiles-row-delete{cursor:pointer;color:red;font-size:23px !important}.updraftplus-morefiles-row-edit{cursor:pointer;font-size:24px !important}#updraft-wrap .form-table th{width:230px}.updraftplus-remove{background-color:#c00000;border:1px solid #c00000;height:22px;padding:4px 3px 0 3px;margin-right:6px}.updraft-viewlogdiv form{margin:0;padding:0}.updraft-viewlogdiv{background-color:#FFF;color:#000;border:1px solid #000;height:26px;padding:0;margin:0 4px 0 0;border-radius:3px;float:left}.updraft-viewlogdiv input,.updraft-viewlogdiv a{border:0;background-color:transparent;color:#000;margin:0;padding:3px 4px;font-size:16px;line-height:26px}.updraft-viewlogdiv:hover{background-color:#000;color:#FFF;border:1px solid #FFF;cursor:pointer}.updraft-viewlogdiv input:hover,.updraft-viewlogdiv a:hover{color:#FFF;cursor:pointer}.updraftplus-remove a{color:white;padding:4px 4px 0 4px}.updraftplus-remove:hover{background-color:white;border:1px solid #c00000}.updraftplus-remove a:hover{color:#c00000}.drag-drop #drag-drop-area2{border:4px dashed #DDD;height:200px}#drag-drop-area2 .drag-drop-inside{margin:36px auto 0;width:350px}#filelist,#filelist2{width:100%}#filelist .file,#filelist2 .file,.ud_downloadstatus .file,#ud_downloadstatus2 .file{padding:5px;background:#ececec;border:solid 1px #CCC;margin:4px 0}ul.updraft_premium_description_list{list-style:disc inside}ul.updraft_premium_description_list li{display:inline}ul.updraft_premium_description_list li::after{content:" | "}ul.updraft_premium_description_list li.last::after{content:""}.updraft_feature_cell{background-color:#f7d9c9 !important;padding:5px 10px}.updraft_feat_table,.updraft_feat_th,.updraft_feat_table td{border:1px solid black;border-collapse:collapse;font-size:120%;background-color:white;text-align:center}.updraft_feat_table p{padding:0 10px;margin:5px 0;font-size:16px}.updraft_feat_table h4{margin:5px 0}.updraft_feat_table .dashicons{width:25px;height:25px;font-size:25px;line-height:1}.updraft_feat_table .dashicons-yes,.updraft_feat_table .updraft-yes{color:green}.updraft_feat_table .dashicons-no-alt,.updraft_feat_table .updraft-no{color:red}.updraft_tick_cell{text-align:center}.updraft_tick_cell img{margin:4px 0;height:24px}#filelist .fileprogress,#filelist2 .fileprogress,.ud_downloadstatus .dlfileprogress,#ud_downloadstatus2 .dlfileprogress{width:0;background:#f6a828;height:5px}.ud_downloadstatus .raw,#ud_downloadstatus2 .raw{margin-top:8px;clear:left}.ud_downloadstatus .file,#ud_downloadstatus2 .file{margin-top:8px}tr.updraftplusmethod h3{margin:0}#updraft_retain_db_rules .updraft_retain_rules_delete,#updraft_retain_files_rules .updraft_retain_rules_delete{cursor:pointer;color:red;font-size:120%;font-weight:bold;border:0;border-radius:3px;padding:2px;margin:0 6px}#updraft_retain_db_rules .updraft_retain_rules_delete:hover,#updraft_retain_files_rules .updraft_retain_rules_delete:hover{cursor:pointer;color:white;background:red}#updraft_backup_started{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.udp-premium-image{display:none}@media screen and (min-width:720px){.udp-premium-image{display:block;float:left;padding-right:5px}}#plupload-upload-ui2{width:80%}.backup-restored{padding:8px}.backup-restored span{font-size:120%}.memory-limit{padding:8px}.updraft_list_errors{padding:8px}.nav-tab-wrapper{margin:14px 0}#updraft-poplog-content{white-space:pre-wrap}.next-backup{border:0;padding:0;margin:0 10px 0 0}.not-scheduled{vertical-align:top !important;margin:0 !important;padding:0 !important}.next-backup .updraft_scheduled{margin:0;padding:2px 4px 2px 0}#next-backup-table-inner td{vertical-align:top}.next-backup .updraft_all-files{color:blue;margin:0;padding:2px 0 0 0}.multisite-advert-width{width:800px}.updraft_settings_sectionheading{margin-top:6px}.premium-upgrade-prompt{font-size:115%}.updraft_feat_table{margin-top:30px}.show_admin_restore_in_progress_notice{padding:8px}.show_admin_restore_in_progress_notice .unfinished-restoration{font-size:120%}#backupnow_includefiles_moreoptions,#backupnow_database_moreoptions{margin:4px 16px 6px 16px;border:1px dotted;padding:6px 10px}#backupnow_database_moreoptions{max-height:250px;overflow:auto}.form-table #updraft_activejobsrow .minimum-height{min-height:100px}#updraft_lastlogmessagerow .last-message{padding-top:20px;display:block}.updraft_simplepie{vertical-align:top}.download-backups{margin-top:8px}.download-backups .updraft_download_button{margin-right:6px;margin-top:4px}.download-backups .choose-components-button{font-size:16px}.download-backups .ud-whitespace-warning{background-color:pink;padding:8px;margin:4px;border:1px dotted}.download-backups .ul{list-style:none inside;max-width:800px;margin-top:6px;margin-bottom:12px}#updraft-plupload-modal{width:75%;margin:16px;margin-left:100px}.download-backups .upload{max-width:610px}.download-backups #plupload-upload-ui{width:70%}.ud_downloadstatus{padding:10px;background:#f1f1f1}#ud_massactions{padding:14px;position:fixed;right:25%;top:25%;border:2px solid;border-radius:4px;background:#f1f1f1;float:right}#ud_massactions .updraftplus-remove{clear:left;font-size:16px;text-align:center;border-radius:4px;margin-top:4px}#ud_massactions .updraftplus-remove a{text-decoration:none}#ud_massactions .updraft-viewlogdiv{font-size:16px;text-align:center;border-radius:4px;margin-top:4px}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative;top:3px}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative;top:3px}#updraft-navtab-backups-content .updraft_existing_backups{margin-bottom:12px}#updraft-message-modal-innards{padding:4px}#updraft-authenticate-modal{text-align:center;font-size:16px !important}#updraft-authenticate-modal p{font-size:16px}#updraft_delete_form p{margin-top:3px;padding-top:0}#updraft_restore_form .cannot-restore{margin:8px 0}#updraft_restorer_dboptions{padding:12px;margin:8px 0 4px 0;border:dashed 1px}#updraft_restorer_dboptions h4{margin:0 0 6px 0;padding:0}.updraft_debugrow th{vertical-align:top;padding-top:6px}.expertmode p{font-size:125%}.expertmode .call-wp-action{width:300px;height:22px}.updraftplus-lock-advert{clear:left;max-width:600px}.uncompressed-data{clear:left;max-width:600px}.delete-old-directories{padding:8px;padding-bottom:12px}.active-jobs{min-width:480px;min-height:48px;text-align:center;margin-top:4px;padding:8px;border:1px solid;float:left;clear:left}.job-id{min-width:480px;margin-top:4px;padding:8px;border:1px solid;clear:left;float:left}.next-resumption{font-weight:bold}.updraft_percentage{z-index:-1;position:absolute;left:0;top:0;text-align:center;background-color:#f6a828}.curstage{border-radius:4px;margin-top:8px;padding-top:4px;border:1px solid #AAA;width:100%;height:22px;position:relative;text-align:center;font-style:italic}.retain-files{width:48px}.backup-interval-description tr td div{max-width:670px}#updraft-manualdecrypt-modal{width:85%;margin:6px;margin-left:100px}.directory-permissions{font-size:110%;font-weight:bold}.double-warning{border:1px solid;padding:6px}.raw-backup-info{font-style:italic;font-weight:bold;font-size:120%}.updraft_existingbackup_date{width:22%;max-width:140px}.existing-backups-table{margin-top:20px;margin-left:20px;width:80%}.tr-bottom-4{margin-bottom:4px}.form-table .backup-date{width:172px;padding:0;padding-left:15px}.form-table .backup-data{width:426px;padding:0;padding-left:15px}.form-table .updraft_backup_actions{width:272px;padding:0 0 10px 15px}.existing-date{box-sizing:border-box;max-width:140px;width:25%}.line-break-tr{height:2px;padding:1px;margin:0}.line-break-td{margin:0;padding:0}.td-line-color{height:2px;background-color:#888}.raw-backup{max-width:140px}.existing-backups-actions{padding:1px;margin:0}.existing-backups-border{height:2px;padding:1px;margin:0}.existing-backups-border>td{margin:0;padding:0}.existing-backups-border>div{height:2px;background-color:#AAA}.updraft_existing_backup_date{max-width:140px}.restore-button{margin-right:6px;float:left;clear:none}.updraftplus-remove{font-size:16px;text-align:center;border-radius:4px}.before-restore-button{padding:1px;margin:0}.table-separator-tr{height:2px;padding:1px;margin:0}.table-separator-td{margin:0;padding:0}.end-of-table-div{height:2px;background-color:#AAA}.last-backup-job{padding-top:3% !important}.line-height-03{line-height:.3 !important}.line-height-13{line-height:1.3 !important}.line-height-23{line-height:2.3 !important}#updraft_diskspaceused{color:#df6926}.updraft_premium_description_list{text-align:left}#updraft_delete_old_dirs_pagediv{padding-bottom:10px}.job-id{margin:0 auto;width:20%}.updraft_all-files{color:#df6926}.fix-time{width:70px}.retain-files{width:70px}.number-input{min-width:50px;max-width:70px}.additional-rule-width{min-width:60px;max-width:70px}.dashicons{line-height:inherit;font-size:inherit}.addon-logo-150{margin-left:30px;margin-top:33px;height:125px;width:150px}.margin-bottom-50{margin-bottom:50px}.premium-container{width:80%}.main-header{background-color:#df6926;height:200px;width:100%}.button-add-to-cart{color:white;border-color:white;float:none;margin-right:17px}.button-add-to-cart:hover,.button-add-to-cart:focus,.button-add-to-cart:active{border-color:#a0a5aa;color:#a0a5aa}.addon-title{margin-top:25px}.addon-text{margin-top:75px}.image-main-div{width:25%;float:left}.text-main-div{width:60%;float:left;text-align:center;color:white;margin-top:16px}.text-main-div-title{font-weight:bold !important;color:white;text-align:center}.text-main-div-paragraph{color:white}.updraftplus-vault-cta{width:100%;text-align:center;margin-bottom:50px}.updraftplus-vault-cta h1{font-weight:bold}.updraftvault-buy{width:225px;height:225px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:50px;position:relative}.updraftplus-vault-cta>.vault-options>.center-vault{width:275px;height:275px}.updraftplus-vault-cta>.vault-options>.center-vault>a{right:21%;font-size:16px;border-width:4px !important}.updraftplus-vault-cta>.vault-options>.center-vault>p{font-size:16px}.updraftvault-buy .button-purchase{right:24%;margin-left:0;line-height:1.7em}.updraftvault-buy hr{height:2px;background-color:#777;margin-top:18px}.right{margin-right:0}.updraftvault-buy .addon-logo-100{height:100px;width:125px;margin-top:7px}.updraftvault-buy .addon-logo-large{margin-top:7px}.updraftvault-buy .button-buy-vault{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:29%;bottom:2%}.premium-addon-div .button-purchase{line-height:1.7em}.updraftvault-buy .button-buy-vault:hover{border-color:darkgrey;color:darkgrey}.premium-addons{margin-top:80px;width:100%;margin:0 auto;display:table}.addon-list{display:table;text-align:center}.premium-addons h1{text-align:center;font-weight:bold}.premium-addons p{text-align:center}.premium-addons .premium-addon-div{width:200px;height:250px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:25px;margin-top:25px;text-align:center;position:relative}.premium-addons .premium-addon-div p{margin-left:2px;margin-right:2px}.premium-addons .premium-addon-div img{width:auto;height:50px;margin-top:7px}.premium-addons .premium-addon-div .hr-alignment{margin-top:44px}.premium-addons .premium-addon-div .dropbox-logo{height:39px;width:150px}.premium-addons .premium-addon-div .azure-logo,.premium-addons .premium-addon-div .onedrive-logo{width:75%;height:24px}.button-purchase{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:25%;bottom:2%}.button-purchase:hover{color:darkgrey;border-color:darkgrey}.premium-addons .premium-addon-div hr{height:2px;background-color:#777;margin-top:18px}.premium-addon-div p{font-style:italic}.addon-list>.premium-addon-div>.onedrive-fix,.addon-list>.premium-addon-div>.azure-logo{margin-top:33px}.addon-list>.premium-addon-div>.dropbox-fix{margin-top:18px}.premium-forgotton-something{margin-top:5%}.premium-forgotton-something h1{text-align:center;font-weight:bold}.premium-forgotton-something p{text-align:center;font-weight:normal}.premium-forgotton-something .button-faq{color:#df6926;border-color:#df6926;margin:0 auto;display:table}.premium-forgotton-something .button-faq:hover{color:#777;border-color:#777}.updraftplusmethod.updraftvault #vaultlogo{padding-left:40px}.updraftplusmethod.updraftvault .vault_primary_option{float:left;width:50%;text-align:center;padding-bottom:20px}.updraftplusmethod.updraftvault .vault_primary_option div{clear:right;padding-top:20px}.updraftplusmethod.updraftvault .clear-left{clear:left}.updraftplusmethod.updraftvault .padding-top-20px{padding-top:20px}.updraftplusmethod.updraftvault .padding-top-14px{padding-top:14px}.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary,.updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary{font-size:18px !important;padding-bottom:20px}.updraftplusmethod.updraftvault #updraftvault_showoptions,.updraftplusmethod.updraftvault #updraftvault_connect{margin-top:8px}.updraftplusmethod.updraftvault #updraftvault_settings_connect input{margin-right:10px}.updraftplusmethod.updraftvault #updraftvault_email{width:280px}.updraftplusmethod.updraftvault #updraftvault_pass{width:200px}.updraftplusmethod.updraftvault #vault-is-connected{margin:0;padding:0}.updraftplusmethod.updraftvault #updraftvault_settings_default p{clear:left}.updraftplusmethod.updraftvault .vault-purchase-option{float:left;width:33%;text-align:center;padding-top:20px}.updraftplusmethod.updraftvault .vault-purchase-option-size{font-size:200%;font-weight:bold}.updraftplusmethod.updraftvault .vault-purchase-option-link{clear:both;font-size:150%}.updraftplusmethod.updraftvault .vault-purchase-option-or{clear:both;font-size:115%;font-style:italic}.autobackup-image{clear:left;float:left;width:110px;height:110px}.autobackup-description{width:100%}.advert-description{float:left;clear:right;padding:4px 10px 8px 10px;width:70%;clear:right;vertical-align:top}.advert-btn{display:inline-block;min-width:10%;vertical-align:top;margin-bottom:8px}.advert-btn:first-of-type{margin-top:25px}.advert-btn a{display:block;cursor:pointer}a.btn-get-started{background:#FFF;border:2px solid #df6926;border-radius:4px;color:#df6926;display:inline-block;margin-left:10px !important;margin-bottom:7px !important;font-size:18px !important;line-height:20px;min-height:28px;padding:11px 10px 5px 10px;text-transform:uppercase;text-decoration:none}.circle-dblarrow{border:1px solid #df6926;border-radius:100%;display:inline-block;font-size:17px;line-height:17px;margin-left:5px;width:20px;height:20px;text-align:center}.expertmode .advanced_settings_container{height:auto;overflow:hidden}.expertmode .advanced_settings_container .advanced_settings_menu{float:none;border-bottom:1px solid #ccc}.expertmode .advanced_settings_container .advanced_settings_content{padding-top:5px;float:none;width:auto;overflow:auto}.expertmode .advanced_settings_container .advanced_settings_content h3{margin-top:5px !important}.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools{display:none}.expertmode .advanced_settings_container .advanced_settings_content .site_info{display:block}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:inline-block;cursor:pointer;padding:5px;color:#000}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text{font-size:16px}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover{background-color:#eaeaea}.expertmode .advanced_settings_container .advanced_settings_menu .active{background-color:#3498db;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_menu .active:hover{background-color:#72c5fd;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_content input#import_settings{height:auto !important}div#updraft-wrap a{cursor:pointer !important}@media screen and (min-width:670px){.expertmode .advanced_settings_container .advanced_settings_menu{float:left;width:215px;border-right:1px solid #ccc;border-bottom:0}.expertmode .advanced_settings_container .advanced_settings_content{padding-left:10px;padding-top:0}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:block}}
2
  /*# sourceMappingURL=admin.min.css.map */
css/admin.min.css.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["css/admin.css"],"names":[],"mappings":"AAAA,wCAAwC;;AAExC,uBAAuB;AACvB;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED,2BAA2B;;AAE3B,kBAAkB;AAClB;CACC,sBAAsB;CACtB;;AAED;CACC,kBAAkB;CAClB;;AAED,sBAAsB;AACtB,eAAe;AACf;CACC,mBAAmB;CACnB;;AAED,sBAAsB;AACtB,aAAa;AACb;CACC,sBAAsB;CACtB;;AAED,oBAAoB;;AAEpB;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,iBAAiB;CACjB;;AAED,iBAAiB;;AAEjB;CACC,mBAAmB;CACnB,kBAAkB;CAClB,uBAAuB;CACvB,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB;;AAED,qBAAqB;;AAErB,kBAAkB;AAClB;CACC,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,kBAAkB;CAClB,oBAAoB;CACpB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,wBAAwB;CACxB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,yBAAyB;CACzB,uBAAuB;CACvB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,sBAAsB;CACtB;;AAED;CACC,gCAAgC;CAChC,yBAAyB;CACzB;;AAED;CACC,kBAAkB;CAClB,aAAa;CACb,mBAAmB;CACnB;;AAED;;;CAGC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,yBAAyB;CACzB,gCAAgC;CAChC;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,eAAe;CACf,sBAAsB;CACtB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,mBAAmB;CACnB;;AAED;CACC,gBAAgB;CAChB,uBAAuB;CACvB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,aAAa;CACb;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,kBAAkB;CAClB;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf,sBAAsB;CACtB,gBAAgB;CAChB,aAAa;CACb;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB,0BAA0B;CAC1B,yBAAyB;CACzB,YAAY;CACZ,eAAe;CACf;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,cAAc;CACd,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED,sBAAsB;;AAEtB,4BAA4B;;AAE5B;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,oBAAoB;CACpB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,cAAc;CACd,YAAY;CACZ;;AAED;CACC,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,aAAa;CACb,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,eAAe;CACf,aAAa;CACb,eAAe;CACf,mBAAmB;CACnB,UAAU;CACV,UAAU;CACV;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED,mCAAmC;;AAEnC;CACC,iBAAiB;CACjB;;AAED;CACC,uBAAuB;CACvB;;AAED;CACC,cAAc;CACd;;AAED;CACC,8BAA8B;CAC9B,aAAa;CACb,eAAe;CACf,2BAA2B;CAC3B,gBAAgB;CAChB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,4BAA4B;CAC5B,8BAA8B;CAC9B,2BAA2B;CAC3B,iBAAiB;CACjB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB,uBAAuB;CACvB;;AAED;CACC,WAAW;CACX;;AAED,mBAAmB;;AAEnB,oEAAoE;AACpE;;CAEC,wBAAwB;CACxB;;AAED;;CAEC,gCAAgC;CAChC;;AAED;;CAEC,+BAA+B;CAC/B;;AAED;;CAEC,wBAAwB;CACxB;;AAED,+BAA+B;AAC/B;CACC,mBAAmB;CACnB,cAAc;CACd,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,aAAa;CACb,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,cAAc;CACd,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf;;AAED,8BAA8B;AAC9B;CACC,mBAAmB;CACnB,cAAc;CACd,cAAc;CACd,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,OAAO;CACP,SAAS;CACT;;AAED;CACC,aAAa;CACb,YAAY;CACZ,eAAe;CACf;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB;;AAED;CACC,cAAc;CACd;;AAED;CACC,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB,2BAA2B;CAC3B;;AAED;CACC,aAAa;CACb;;AAED;CACC,0BAA0B;CAC1B,0BAA0B;CAC1B,aAAa;CACb,uBAAuB;CACvB,kBAAkB;CAClB;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,uBAAuB;CACvB,YAAY;CACZ,uBAAuB;CACvB,aAAa;CACb,aAAa;CACb,kBAAkB;CAClB,mBAAmB;CACnB,YAAY;CACZ;;AAED;CACC,aAAa;CACb,8BAA8B;CAC9B,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,uBAAuB;CACvB,YAAY;CACZ,uBAAuB;CACvB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,yBAAyB;CACzB;;AAED;CACC,wBAAwB;CACxB,0BAA0B;CAC1B;;AAED;CACC,eAAe;CACf;;AAED;CACC,wBAAwB;CACxB,cAAc;CACd;;AAED;CACC,oBAAoB;CACpB,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;CACC,aAAa;CACb,oBAAoB;CACpB,uBAAuB;CACvB,cAAc;CACd;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf;;AAED;CACC,YAAY;CACZ;;AAED;CACC,qCAAqC;CACrC,kBAAkB;CAClB;;AAED;CACC,wBAAwB;CACxB,0BAA0B;CAC1B,gBAAgB;CAChB,wBAAwB;CACxB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,gBAAgB;CAChB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,cAAc;CACd,aAAa;CACb;;AAED;CACC,UAAU;CACV,oBAAoB;CACpB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,WAAW;CACX,gBAAgB;CAChB,kBAAkB;CAClB,YAAY;CACZ,mBAAmB;CACnB,aAAa;CACb,cAAc;CACd;;AAED;CACC,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,cAAc;CACd,YAAY;CACZ;;AAED;CACC,cAAc;CACd;;AAED;;CAEC;EACC,eAAe;EACf,YAAY;EACZ,mBAAmB;EACnB;;CAED;;AAED,oCAAoC;AACpC;CACC,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;;AAEH;CACC,iBAAiB;CACjB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,+BAA+B;CAC/B,uBAAuB;CACvB,wBAAwB;CACxB;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,yBAAyB;CACzB;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,YAAY;CACZ,YAAY;CACZ,yBAAyB;CACzB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,0BAA0B;CAC1B,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,kBAAkB;CAClB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,wBAAwB;CACxB,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX;;AAED;CACC,cAAc;CACd,oBAAoB;CACpB;;AAED;CACC,cAAc;CACd,gBAAgB;CAChB,WAAW;CACX,SAAS;CACT,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,aAAa;CACb;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf;;AAED;CACC,cAAc;CACd;;AAED;CACC,cAAc;CACd,oBAAoB;CACpB,mBAAmB;CACnB;;AAED;CACC,wBAAwB;CACxB,aAAa;CACb;;AAED;CACC,oBAAoB;CACpB,iBAAiB;CACjB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,qBAAqB;CACrB;;AAED;CACC,iBAAiB;CACjB,iBAAiB;CACjB,mBAAmB;CACnB,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,UAAU;CACV,SAAS;CACT,mBAAmB;CACnB,0BAA0B;CAC1B;;AAED;CACC,mBAAmB;CACnB,gBAAgB;CAChB,iBAAiB;CACjB,uBAAuB;CACvB,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB;;AAED;CACC,WAAW;CACX,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB,kBAAkB;CAClB,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,uBAAuB;CACvB;;AAED;CAGC,uBAAuB;CACvB,iBAAiB;CACjB,WAAW;CACX;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,qBAAqB;CACrB;;AAED;;GAEG;;AAEH;CACC,eAAe;CACf,WAAW;CACX;;AAED;CACC,eAAe;CACf;;AAED,6BAA6B;AAC7B;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,gBAAgB;CAChB;;AAED,aAAa;AACb,oHAAoH;;AAEpH;CACC,qBAAqB;CACrB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX;;AAED,iBAAiB;;AAEjB;CACC,0BAA0B;CAC1B,cAAc;CACd,YAAY;CACZ;;AAED;CACC,aAAa;CACb,oBAAoB;CACpB,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX,YAAY;CACZ;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB,aAAa;CACb,iBAAiB;CACjB;;AAED;CACC,6BAA6B;CAC7B,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb;;AAED,qBAAqB;;AAErB,iBAAiB;;AAEjB;CACC,YAAY;CACZ,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,aAAa;CACb,cAAc;CACd,uBAAuB;CACvB,sBAAsB;CACtB,eAAe;CACf,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,cAAc;CACd;;AAED;CACC,WAAW;CACX,gBAAgB;CAChB,6BAA6B;CAC7B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,WAAW;CACX,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB,iBAAiB;CACjB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,uBAAuB;CACvB,gBAAgB;CAChB;;AAED,qBAAqB;;AAErB,oBAAoB;;AAEpB;CACC,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,eAAe;CACf;;AAED;CACC,wBAAwB;CACxB,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,cAAc;CACd,uBAAuB;CACvB,sBAAsB;CACtB,eAAe;CACf,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,WAAW;CACX,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX;;AAED;CACC,gBAAgB;CAChB,uBAAuB;CACvB;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB,iBAAiB;CACjB;;AAED;CACC,mBAAmB;CACnB;;AAED;;CAEC,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB;;AAED,wBAAwB;;;AAGxB,mFAAmF;;AAEnF;CACC,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,eAAe;CACf,sBAAsB;CACtB,eAAe;CACf,eAAe;CACf;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB;;AAED,gCAAgC;;AAEhC;CACC,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,qBAAqB;CACrB;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,2BAA2B;CAC3B,qBAAqB;CACrB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB;;AAED,mCAAmC;AACnC;AACA,6BAA6B;AAC7B;iBACiB;AACjB,iBAAiB;CAChB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,cAAc;CACd;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,2BAA2B;CAC3B,WAAW;CACX,aAAa;CACb,oBAAoB;CACpB;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf,oBAAoB;CACpB,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,eAAe;CACf,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,0BAA0B;CAC1B,mBAAmB;CACnB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,kBAAkB;CAClB,iBAAiB;CACjB,4BAA4B;CAC5B,0BAA0B;CAC1B,sBAAsB;CACtB;;AAED;CACC,0BAA0B;CAC1B,oBAAoB;CACpB,sBAAsB;CACtB,gBAAgB;CAChB,kBAAkB;CAClB,iBAAiB;CACjB,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB;;AAED;AACA;;;;;;;;;IASI;CACH;;AAED,uCAAuC;AACvC,6CAA6C;AAC7C;CACC,aAAa;CACb,iBAAiB;CACjB;;AAED;CACC,YAAY;CACZ,4CAA4C;CAC5C;;AAED;CACC,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,cAAc;CACd;;AAED;CACC,eAAe;CACf;;AAED;CACC,sBAAsB;CACtB,gBAAgB;CAChB,aAAa;CACb,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,0BAA0B;CAC1B;;AAED;CACC,0BAA0B;CAC1B,YAAY;CACZ;;AAED;CACC,0BAA0B;CAC1B,YAAY;CACZ;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,2BAA2B;CAC3B;;AAED;;CAEC;EACC,YAAY;EACZ,aAAa;EACb,2CAA2C;EAC3C,oBAAoB;EACpB;;CAED;EACC,mBAAmB;EACnB,iBAAiB;EACjB;;CAED;EACC,eAAe;EACf;;CAED","file":"admin.min.css","sourcesContent":["/* General things used by many things */\n\n/* Widths and sizing */\n.max-width-600 {\n\tmax-width: 600px;\n}\n\n.width-900 {\n\twidth: 900px;\n}\n\n.width-80 {\n\twidth: 80%;\n}\n\n/* End widths and sizing */\n\n/* Font styling */\n.no-decoration {\n\ttext-decoration: none;\n}\n\n.bold {\n\tfont-weight: bold;\n}\n\n/* End font styling */\n/* Alignment */\n.center-align-td {\n\ttext-align: center;\n}\n\n/* End of Alignment */\n/* Padding */\n.remove-padding {\n\tpadding: 0 !important;\n}\n\n/* End of padding */\n\n.updraft-text-center {\n\ttext-align: center;\n}\n\n.autobackup {\n\tpadding: 6px;\n\tmargin: 8px 0px;\n}\n\nul .disc {\n\tlist-style: disc inside;\n}\n\n.dashicons-log-fix {\n\tdisplay: inherit;\n}\n\n/* Input boxes */\n\ninput {\n\tborder-radius: 4px;\n\tline-height: 1.42;\n\tborder: 1px solid #CCC;\n\theight: 27px;\n\tpadding: 2px 6px;\n\tcolor: #555;\n}\n\ninput[type=\"text\"] {\n\tfont-size: 14px;\n}\n\ninput[type=\"number\"] {\n\theight: 31px;\n}\n\nselect {\n\tborder-radius: 4px;\n}\n\n/* End input boxes */\n\n/* Main Buttons */\n.main-dashboard-buttons {\n\tborder-width: 4px;\n\tborder-radius: 12px;\n\tletter-spacing: 0px;\n\tfont-size: 17px;\n\tfont-weight: bold;\n\tpadding-left: 0.7em;\n\tpadding-right: 2em;\n\tpadding: 0.3em 1em;\n\tline-height: 1.7em;\n\tbackground: transparent;\n\tposition: relative;\n\tborder: 2px solid;\n\ttransition: all 0.2s;\n\tvertical-align: baseline;\n\tbox-sizing: border-box;\n\ttext-align: center;\n\tline-height: 1.3em;\n\tmargin-left: .3em;\n\ttext-transform: none;\n\tline-height: 1;\n\ttext-decoration: none;\n}\n\n.button-restore {\n\tborder-color: rgb(98, 158, 192);\n\tcolor: rgb(98, 158, 192);\n}\n\n.dashboard-main-sizing {\n\tborder-width: 4px;\n\twidth: 190px;\n\tline-height: 1.7em;\n}\n\n.button-restore:hover, .button-migrate:hover, .button-backup:hover,\n.button-view-log:hover, .button-mass-selectors:hover,\n.button-delete:hover, .button-entity-backup:hover, .udp-button-primary:hover {\n\tborder-color: #DF6926;\n\tcolor: #DF6926;\n}\n\n.button-migrate {\n\tcolor: rgb(238, 169, 32);\n\tborder-color: rgb(238, 169, 32);\n}\n\n.button-backup {\n\tborder-color: #84CA1B;\n\tcolor: #84CA1B;\n}\n\n.existing-backups-buttons {\n\tfont-size: 11px;\n\tline-height: 1.4em;\n\tborder-width: 3px;\n}\n\n.existing-backups-restore-buttons {\n\tfont-size: 11px;\n\tline-height: 1.4em;\n\tborder-width: 3px;\n}\n\n.button-delete {\n\tcolor: #E23900;\n\tborder-color: #E23900;\n\tfont-size: 14px;\n\tline-height: 1.4em;\n\tborder-width: 2px;\n\tmargin-right: 10px;\n}\n\n.button-view-log, .button-mass-selectors {\n\tcolor: darkgrey;\n\tborder-color: darkgrey;\n\tfont-size: 14px;\n\tline-height: 1.4em;\n\tborder-width: 2px;\n\tmargin-top: -1px;\n}\n\n.button-view-log {\n\twidth: 120px;\n}\n\n.button-existing-restore {\n\tfont-size: 14px;\n\tline-height: 1.4em;\n\tborder-width: 2px;\n\twidth: 110px;\n}\n\n.main-restore {\n\tmargin-right: 3%;\n\tmargin-left: 3%;\n}\n\n.button-entity-backup {\n\tcolor: #555;\n\tborder-color: #555;\n\tfont-size: 11px;\n\tline-height: 1.4em;\n\tborder-width: 2px;\n\tmargin-right: 5px;\n}\n\n.button-select-all {\n\twidth: 122px;\n}\n\n.button-deselect {\n\twidth: 92px;\n}\n\n#ud_massactions > .display-flex > .mass-selectors-margins {\n\tmargin-right: -4px;\n}\n\n.udp-button-primary {\n\tborder-width: 4px;\n\tcolor: #0073AA;\n\tborder-color: #0073AA;\n\tfont-size: 14px;\n\theight: 40px;\n}\n\n#ud_massactions .button-delete {\n\tmargin-right: 0px;\n}\n\n.stored_local {\n\tborder-radius: 5px;\n\tbackground-color: #007FE7;\n\tpadding: 3px 5px 5px 5px;\n\tcolor: #FFF;\n\tfont-size: 75%;\n}\n\n.form-table td.updraft_existingbackup_date {\n\tpadding-bottom: 5px;\n}\n\n.stored_icon {\n\theight: 1.3em;\n\tposition: relative;\n\ttop: 0.2em;\n}\n\n.backup_date_label .clear-right {\n\tclear: right;\n}\n\n/* End Main Buttons */\n\n/* End of common elements */\n\n.udp-logo-70 {\n\twidth: 70px;\n\theight: 70px;\n\tfloat: left;\n\tpadding-right: 25px;\n}\n\nh3 .thank-you {\n\tmargin-top: 0px;\n}\n\n.ws_advert {\n\tmax-width: 800px;\n\tfont-size: 140%;\n\tline-height: 140%;\n\tpadding: 14px;\n\tclear: left;\n}\n\n.dismiss-dash-notice {\n\tfloat: right;\n\tposition: relative;\n\ttop: -20px;\n}\n\n#updraft_report_cell .updraft_reportbox {\n\tpadding: 8px;\n\tmargin: 8px 0;\n\tborder: 1px dotted;\n\tclear: left;\n\tfloat: left;\n}\n\n#updraft_report_cell button.updraft_reportbox_delete {\n\tfont-size: 50%;\n\tfloat: right;\n\tpadding: 0 3px;\n\tposition: relative;\n\ttop: -4px;\n\tleft: 4px;\n}\n\n#updraft-navtab-settings-content .updraft-test-button {\n\tfont-size: 18px !important;\n}\n\n#updraft_report_cell .updraft_report_checkbox {\n\tmargin-top: 4px;\n}\n\n#updraft_report_cell .updraft_report_email {\n\twidth: 300px;\n}\n\n#updraft_report_cell .updraft_report_another_p {\n\tclear: left;\n}\n\n/* Taken straight from admin.php */\n\n#updraft-navtab-settings-content table.form-table p {\n\tmax-width: 700px;\n}\n\n#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected {\n\tbackground-color: #CCC;\n}\n\n.updraft_settings_sectionheading {\n\tdisplay: none;\n}\n\n.updraft-backupentitybutton-disabled {\n\tbackground-color: transparent;\n\tborder: none;\n\tcolor: #0074A2;\n\ttext-decoration: underline;\n\tcursor: pointer;\n\tclear: none;\n\tfloat: left;\n}\n\n.updraft-backupentitybutton {\n\tmargin-left: 8px;\n}\n\n.updraft-bigbutton {\n\tpadding: 2px 0px !important;\n\tmargin-right: 14px !important;\n\tfont-size: 22px !important;\n\tmin-height: 32px;\n\tmin-width: 180px;\n}\n\n.updraft_debugrow th {\n\tfloat: right;\n\ttext-align: right;\n\tfont-weight: bold;\n\tpadding-right: 8px;\n\tmin-width: 140px;\n}\n\n.updraft_debugrow td {\n\tmin-width: 300px;\n\tvertical-align: bottom;\n}\n\n#updraft_webdav_host_error {\n\tcolor: red;\n}\n\n/* jstree styles */\n\n/* these styles hide the dots from the parent but keep the arrows */\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-node,\n#updraft_more_files_jstree .jstree-container-ul > .jstree-node {\n\tbackground: transparent;\n}\n\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl,\n#updraft_more_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl {\n\tbackground-position: -36px -4px;\n}\n\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl,\n#updraft_more_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl {\n\tbackground-position: -4px -4px;\n}\n\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl,\n#updraft_more_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl {\n\tbackground: transparent;\n}\n\n/* zip browser jstree styles */\n#updraft_zip_files_container {\n\tposition: relative;\n\theight: 450px;\n\toverflow: none;\n}\n\n#updraft_zip_info_container {\n\tposition: relative;\n\theight: auto;\n\twidth: 100%;\n\tborder: 1px dotted;\n\tmargin-bottom: 5px;\n}\n\n#updraft_zip_info_container p {\n\tmargin: 1px;\n\tpadding-left: 10px;\n\tfont-size: 14px;\n}\n\n#updraft_zip_download_item {\n\tdisplay: none;\n\tcolor: #0073AA;\n\tpadding-left: 10px;\n}\n\n#updraft_zip_download_notice {\n\tpadding-left: 10px;\n}\n\n#updraft_zip_files_jstree_container {\n\tposition: relative;\n\tborder: 1px dotted;\n\theight: 80%;\n\twidth: 100%;\n\toverflow: auto;\n}\n\n/* More files jstree styles */\n#updraft_more_files_container {\n\tposition: relative;\n\tdisplay: none;\n\theight: 300px;\n\twidth: 100%;\n\tborder: 1px dotted;\n\tmargin-bottom: 5px;\n}\n\n#updraft_jstree_buttons {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n}\n\n#updraft_jstree_container {\n\theight: 100%;\n\twidth: 100%;\n\toverflow: auto;\n}\n\n#updraft_more_files_container button {\n\theight: 22px;\n\tline-height: 20px;\n}\n\n#updraft_jstree_confirm, #updraft_jstree_cancel {\n\tdisplay: none;\n}\n\n.updraftplus-morefiles-row-delete {\n\tcursor: pointer;\n\tcolor: red;\n\tfont-size: 23px !important;\n}\n\n.updraftplus-morefiles-row-edit {\n\tcursor: pointer;\n\tfont-size: 24px !important;\n}\n\n#updraft-wrap .form-table th {\n\twidth: 230px;\n}\n\n.updraftplus-remove {\n\tbackground-color: #C00000;\n\tborder: 1px solid #C00000;\n\theight: 22px;\n\tpadding: 4px 3px 0 3px;\n\tmargin-right: 6px;\n}\n\n.updraft-viewlogdiv form {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.updraft-viewlogdiv {\n\tbackground-color: #FFF;\n\tcolor: #000;\n\tborder: 1px solid #000;\n\theight: 26px;\n\tpadding: 0px;\n\tmargin: 0 4px 0 0;\n\tborder-radius: 3px;\n\tfloat: left;\n}\n\n.updraft-viewlogdiv input, .updraft-viewlogdiv a {\n\tborder: none;\n\tbackground-color: transparent;\n\tcolor: #000;\n\tmargin: 0px;\n\tpadding: 3px 4px;\n\tfont-size: 16px;\n\tline-height: 26px;\n}\n\n.updraft-viewlogdiv:hover {\n\tbackground-color: #000;\n\tcolor: #FFF;\n\tborder: 1px solid #FFF;\n\tcursor: pointer;\n}\n\n.updraft-viewlogdiv input:hover, .updraft-viewlogdiv a:hover {\n\tcolor: #FFF;\n\tcursor: pointer;\n}\n\n.updraftplus-remove a {\n\tcolor: white;\n\tpadding: 4px 4px 0px 4px;\n}\n\n.updraftplus-remove:hover {\n\tbackground-color: white;\n\tborder: 1px solid #C00000;\n}\n\n.updraftplus-remove a:hover {\n\tcolor: #C00000;\n}\n\n.drag-drop #drag-drop-area2 {\n\tborder: 4px dashed #DDD;\n\theight: 200px;\n}\n\n#drag-drop-area2 .drag-drop-inside {\n\tmargin: 36px auto 0;\n\twidth: 350px;\n}\n\n#filelist, #filelist2 {\n\twidth: 100%;\n}\n\n#filelist .file, #filelist2 .file, .ud_downloadstatus .file, #ud_downloadstatus2 .file {\n\tpadding: 5px;\n\tbackground: #ECECEC;\n\tborder: solid 1px #CCC;\n\tmargin: 4px 0;\n}\n\nul.updraft_premium_description_list {\n\tlist-style: disc inside;\n}\n\nul.updraft_premium_description_list li {\n\tdisplay: inline;\n}\n\nul.updraft_premium_description_list li::after {\n\tcontent: \" | \";\n}\n\nul.updraft_premium_description_list li.last::after {\n\tcontent: \"\";\n}\n\n.updraft_feature_cell {\n\tbackground-color: #F7D9C9 !important;\n\tpadding: 5px 10px;\n}\n\n.updraft_feat_table, .updraft_feat_th, .updraft_feat_table td {\n\tborder: 1px solid black;\n\tborder-collapse: collapse;\n\tfont-size: 120%;\n\tbackground-color: white;\n\ttext-align: center;\n}\n\n.updraft_feat_table p {\n\tpadding: 0px 10px;\n\tmargin: 5px 0px;\n\tfont-size: 16px;\n}\n\n.updraft_feat_table h4 {\n\tmargin: 5px 0px;\n}\n\n.updraft_feat_table .dashicons {\n\twidth: 25px;\n\theight: 25px;\n\tfont-size: 25px;\n\tline-height: 1;\n}\n\n.updraft_feat_table .dashicons-yes, .updraft_feat_table .updraft-yes {\n\tcolor: green;\n}\n\n.updraft_feat_table .dashicons-no-alt, .updraft_feat_table .updraft-no {\n\tcolor: red;\n}\n\n.updraft_tick_cell {\n\ttext-align: center;\n}\n\n.updraft_tick_cell img {\n\tmargin: 4px 0;\n\theight: 24px;\n}\n\n#filelist .fileprogress, #filelist2 .fileprogress, .ud_downloadstatus .dlfileprogress, #ud_downloadstatus2 .dlfileprogress {\n\twidth: 0%;\n\tbackground: #F6A828;\n\theight: 5px;\n}\n\n.ud_downloadstatus .raw, #ud_downloadstatus2 .raw {\n\tmargin-top: 8px;\n\tclear: left;\n}\n\n.ud_downloadstatus .file, #ud_downloadstatus2 .file {\n\tmargin-top: 8px;\n}\n\ntr.updraftplusmethod h3 {\n\tmargin: 0px;\n}\n\n#updraft_retain_db_rules .updraft_retain_rules_delete, #updraft_retain_files_rules .updraft_retain_rules_delete {\n\tcursor: pointer;\n\tcolor: red;\n\tfont-size: 120%;\n\tfont-weight: bold;\n\tborder: 0px;\n\tborder-radius: 3px;\n\tpadding: 2px;\n\tmargin: 0 6px;\n}\n\n#updraft_retain_db_rules .updraft_retain_rules_delete:hover, #updraft_retain_files_rules .updraft_retain_rules_delete:hover {\n\tcursor: pointer;\n\tcolor: white;\n\tbackground: red;\n}\n\n#updraft_backup_started {\n\tmax-width: 800px;\n\tfont-size: 140%;\n\tline-height: 140%;\n\tpadding: 14px;\n\tclear: left;\n}\n\n.udp-premium-image {\n\tdisplay: none;\n}\n\n@media screen and (min-width: 720px) {\n\n\t.udp-premium-image {\n\t\tdisplay: block;\n\t\tfloat: left;\n\t\tpadding-right: 5px;\n\t}\n\n}\n\n/* End stuff already in admin.php */\n#plupload-upload-ui2 {\n\twidth: 80%;\n}\n\n.backup-restored {\n\tpadding: 8px;\n}\n\n.backup-restored span {\n\tfont-size: 120%;\n}\n\n.memory-limit {\n\tpadding: 8px;\n}\n\n.updraft_list_errors {\n\tpadding: 8px;\n}\n\n/*.nav-tab {\n\tborder-radius: 20px 20px 0 0;\n\tborder-color: grey;\n\tborder-width: 2px;\n\tmargin-top: 34px;\n}\n\n.nav-tab:hover {\n\tborder-bottom: 0;\n}\n\n.nav-tab-active, .nav-tab-active:active {\n\tcolor: #df6926;\n\tborder-color: #D3D3D3;\n\tborder-width: 1px;\n\tborder-bottom: 0;\n}\n\n.nav-tab-active:focus {\n\tcolor: #df6926;\n}*/\n\n.nav-tab-wrapper {\n\tmargin: 14px 0px;\n}\n\n#updraft-poplog-content {\n\twhite-space: pre-wrap;\n}\n\n.next-backup {\n\tborder: 0px;\n\tpadding: 0px;\n\tmargin: 0 10px 0 0;\n}\n\n.not-scheduled {\n\tvertical-align: top !important;\n\tmargin: 0px !important;\n\tpadding: 0px !important;\n}\n\n.next-backup .updraft_scheduled {\n\t/* width: 124px;*/\n\tmargin: 0px;\n\tpadding: 2px 4px 2px 0px;\n}\n\n#next-backup-table-inner td {\n\tvertical-align: top;\n}\n\n.next-backup .updraft_all-files {\n\tcolor: blue;\n\tmargin: 0px;\n\tpadding: 2px 0px 0px 0px;\n}\n\n.multisite-advert-width {\n\twidth: 800px;\n}\n\n.updraft_settings_sectionheading {\n\tmargin-top: 6px;\n}\n\n.premium-upgrade-prompt {\n\tfont-size: 115%;\n}\n\n.updraft_feat_table {\n\tmargin-top: 30px;\n}\n\n.show_admin_restore_in_progress_notice {\n\tpadding: 8px;\n}\n\n.show_admin_restore_in_progress_notice .unfinished-restoration {\n\tfont-size: 120%;\n}\n\n#backupnow_includefiles_moreoptions, #backupnow_database_moreoptions {\n\tmargin: 4px 16px 6px 16px;\n\tborder: 1px dotted;\n\tpadding: 6px 10px;\n}\n\n#backupnow_database_moreoptions {\n\tmax-height: 250px;\n\toverflow: auto;\n}\n\n.form-table #updraft_activejobsrow .minimum-height {\n\tmin-height: 100px;\n}\n\n#updraft_lastlogmessagerow .last-message {\n\tpadding-top: 20px;\n\tdisplay: block;\n}\n\n.updraft_simplepie {\n\tvertical-align: top;\n}\n\n.download-backups {\n\tmargin-top: 8px;\n}\n\n.download-backups .updraft_download_button {\n\tmargin-right: 6px;\n\tmargin-top: 4px;\n}\n\n.download-backups .choose-components-button {\n\tfont-size: 16px;\n}\n\n.download-backups .ud-whitespace-warning {\n\tbackground-color: pink;\n\tpadding: 8px;\n\tmargin: 4px;\n\tborder: 1px dotted;\n}\n\n.download-backups .ul {\n\tlist-style: none inside;\n\tmax-width: 800px;\n\tmargin-top: 6px;\n\tmargin-bottom: 12px;\n}\n\n#updraft-plupload-modal {\n\twidth: 75%;\n\tmargin: 16px;\n\tmargin-left: 100px;\n}\n\n.download-backups .upload {\n\tmax-width: 610px;\n}\n\n.download-backups #plupload-upload-ui {\n\twidth: 70%;\n}\n\n.ud_downloadstatus {\n\tpadding: 10px;\n\tbackground: #F1F1F1;\n}\n\n#ud_massactions {\n\tpadding: 14px;\n\tposition: fixed;\n\tright: 25%;\n\ttop: 25%;\n\tborder: 2px solid;\n\tborder-radius: 4px;\n\tbackground: rgb(241, 241, 241);\n\tfloat: right;\n}\n\n#ud_massactions .updraftplus-remove {\n\tclear: left;\n\tfont-size: 16px;\n\ttext-align: center;\n\tborder-radius: 4px;\n\tmargin-top: 4px;\n}\n\n#ud_massactions .updraftplus-remove a {\n\ttext-decoration: none;\n}\n\n#ud_massactions .updraft-viewlogdiv {\n\tfont-size: 16px;\n\ttext-align: center;\n\tborder-radius: 4px;\n\tmargin-top: 4px;\n}\n\n#ud_massactions .updraft-viewlogdiv a {\n\ttext-decoration: none;\n\tposition: relative;\n\ttop: 3px;\n}\n\n#ud_massactions .updraft-viewlogdiv a {\n\ttext-decoration: none;\n\tposition: relative;\n\ttop: 3px;\n}\n\n#updraft-navtab-backups-content .updraft_existing_backups {\n\tmargin-bottom: 12px;\n}\n\n#updraft-message-modal-innards {\n\tpadding: 4px;\n}\n\n#updraft-authenticate-modal {\n\ttext-align: center;\n\tfont-size: 16px !important;\n}\n\n#updraft-authenticate-modal p {\n\tfont-size: 16px;\n}\n\n#updraft_delete_form p {\n\tmargin-top: 3px;\n\tpadding-top: 0;\n}\n\n#updraft_restore_form .cannot-restore {\n\tmargin: 8px 0;\n}\n\n#updraft_restorer_dboptions {\n\tpadding: 12px;\n\tmargin: 8px 0 4px 0;\n\tborder: dashed 1px;\n}\n\n#updraft_restorer_dboptions h4 {\n\tmargin: 0px 0px 6px 0px;\n\tpadding: 0px;\n}\n\n.updraft_debugrow th {\n\tvertical-align: top;\n\tpadding-top: 6px;\n}\n\n.expertmode p {\n\tfont-size: 125%;\n}\n\n.expertmode .call-wp-action {\n\twidth: 300px;\n\theight: 22px;\n}\n\n.updraftplus-lock-advert {\n\tclear: left;\n\tmax-width: 600px;\n}\n\n.uncompressed-data {\n\tclear: left;\n\tmax-width: 600px;\n}\n\n.delete-old-directories {\n\tpadding: 8px;\n\tpadding-bottom: 12px;\n}\n\n.active-jobs {\n\tmin-width: 480px;\n\tmin-height: 48px;\n\ttext-align: center;\n\tmargin-top: 4px;\n\tpadding: 8px;\n\tborder: 1px solid;\n\tfloat: left;\n\tclear: left;\n}\n\n.job-id {\n\tmin-width: 480px;\n\tmargin-top: 4px;\n\tpadding: 8px;\n\tborder: 1px solid;\n\tclear: left;\n\tfloat: left;\n}\n\n.next-resumption {\n\tfont-weight: bold;\n}\n\n.updraft_percentage {\n\tz-index: -1;\n\tposition: absolute;\n\tleft: 0px;\n\ttop: 0px;\n\ttext-align: center;\n\tbackground-color: #F6A828;\n}\n\n.curstage {\n\tborder-radius: 4px;\n\tmargin-top: 8px;\n\tpadding-top: 4px;\n\tborder: 1px solid #AAA;\n\twidth: 100%;\n\theight: 22px;\n\tposition: relative;\n\ttext-align: center;\n\tfont-style: italic;\n}\n\n.retain-files {\n\twidth: 48px;\n}\n\n.backup-interval-description tr td div {\n\tmax-width: 670px;\n}\n\n#updraft-manualdecrypt-modal {\n\twidth: 85%;\n\tmargin: 6px;\n\tmargin-left: 100px;\n}\n\n.directory-permissions {\n\tfont-size: 110%;\n\tfont-weight: bold;\n}\n\n.double-warning {\n\tborder: 1px solid;\n\tpadding: 6px;\n}\n\n.raw-backup-info {\n\tfont-style: italic;\n\tfont-weight: bold;\n\tfont-size: 120%;\n}\n\n.updraft_existingbackup_date {\n\twidth: 22%;\n\tmax-width: 140px;\n}\n\n.existing-backups-table {\n\tmargin-top: 20px;\n\tmargin-left: 20px;\n\twidth: 80%;\n}\n\n.tr-bottom-4 {\n\tmargin-bottom: 4px;\n}\n\n.form-table .backup-date {\n\twidth: 172px;\n\tpadding: 0;\n\tpadding-left: 15px;\n}\n\n.form-table .backup-data {\n\twidth: 426px;\n\tpadding: 0;\n\tpadding-left: 15px;\n}\n\n.form-table .updraft_backup_actions {\n\twidth: 272px;\n\tpadding: 0 0 10px 15px;\n}\n\n.existing-date {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmax-width: 140px;\n\twidth: 25%;\n}\n\n.line-break-tr {\n\theight: 2px;\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.line-break-td {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.td-line-color {\n\theight: 2px;\n\tbackground-color: #888;\n}\n\n.raw-backup {\n\tmax-width: 140px;\n}\n\n.existing-backups-actions {\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.existing-backups-border {\n\theight: 2px;\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.existing-backups-border > td {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.existing-backups-border > div {\n\theight: 2px;\n\tbackground-color: #AAA;\n}\n\n.updraft_existing_backup_date {\n\tmax-width: 140px;\n}\n\n.restore-button {\n\tmargin-right: 6px;\n\tfloat: left;\n\tclear: none;\n}\n\n.updraftplus-remove {\n\tfont-size: 16px;\n\ttext-align: center;\n\tborder-radius: 4px;\n}\n\n.before-restore-button {\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.table-separator-tr {\n\theight: 2px;\n\tpadding: 1px;\n\tmargin: 0px;\n}\n\n.table-separator-td {\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\n.end-of-table-div {\n\theight: 2px;\n\tbackground-color: #AAA;\n}\n\n.last-backup-job {\n\tpadding-top: 3% !important;\n}\n\n.line-height-03 {\n\tline-height: 0.3 !important;\n}\n\n.line-height-13 {\n\tline-height: 1.3 !important;\n}\n\n.line-height-23 {\n\tline-height: 2.3 !important;\n}\n\n#updraft_diskspaceused {\n\tcolor: #DF6926;\n}\n\n.updraft_premium_description_list {\n\ttext-align: left;\n}\n\n#updraft_delete_old_dirs_pagediv {\n\tpadding-bottom: 10px;\n}\n\n/*#updraft_lastlogmessagerow > td, #updraft_last_backup > td {\n\tpadding: 0;\n}*/\n\n.job-id {\n\tmargin: 0 auto;\n\twidth: 20%;\n}\n\n.updraft_all-files {\n\tcolor: #DF6926;\n}\n\n/* Time + scheduling add-on*/\n.fix-time {\n\twidth: 70px;\n}\n\n.retain-files {\n\twidth: 70px;\n}\n\n.number-input {\n\tmin-width: 50px;\n\tmax-width: 70px;\n}\n\n.additional-rule-width {\n\tmin-width: 60px;\n\tmax-width: 70px;\n}\n\n/* Add-ons */\n/* Want to fix the WordPress icons so that they fit inline with the text, and don't push everything out of place. */\n\n.dashicons {\n\tline-height: inherit;\n\tfont-size: inherit;\n}\n\n.addon-logo-150 {\n\tmargin-left: 30px;\n\tmargin-top: 33px;\n\theight: 125px;\n\twidth: 150px;\n}\n\n.margin-bottom-50 {\n\tmargin-bottom: 50px;\n}\n\n.premium-container {\n\twidth: 80%;\n}\n\n/* Main Header */\n\n.main-header {\n\tbackground-color: #DF6926;\n\theight: 200px;\n\twidth: 100%;\n}\n\n.button-add-to-cart {\n\tcolor: white;\n\tborder-color: white;\n\tfloat: none;\n\tmargin-right: 17px;\n}\n\n.button-add-to-cart:hover, .button-add-to-cart:focus, .button-add-to-cart:active {\n\tborder-color: #A0A5AA;\n\tcolor: #A0A5AA;\n}\n\n.addon-title {\n\tmargin-top: 25px;\n}\n\n.addon-text {\n\tmargin-top: 75px;\n}\n\n.image-main-div {\n\twidth: 25%;\n\tfloat: left;\n}\n\n.text-main-div {\n\twidth: 60%;\n\tfloat: left;\n\ttext-align: center;\n\tcolor: white;\n\tmargin-top: 16px;\n}\n\n.text-main-div-title {\n\tfont-weight: bold !important;\n\tcolor: white;\n\ttext-align: center;\n}\n\n.text-main-div-paragraph {\n\tcolor: white;\n}\n\n/* End main header */\n\n/* Vault icons */\n\n.updraftplus-vault-cta {\n\twidth: 100%;\n\ttext-align: center;\n\tmargin-bottom: 50px;\n}\n\n.updraftplus-vault-cta h1 {\n\tfont-weight: bold;\n}\n\n.updraftvault-buy {\n\twidth: 225px;\n\theight: 225px;\n\tborder: 2px solid #777;\n\tdisplay: inline-table;\n\tmargin: 0 auto;\n\tmargin-right: 50px;\n\tposition: relative;\n}\n\n.updraftplus-vault-cta > .vault-options > .center-vault {\n\twidth: 275px;\n\theight: 275px;\n}\n\n.updraftplus-vault-cta > .vault-options > .center-vault > a {\n\tright: 21%;\n\tfont-size: 16px;\n\tborder-width: 4px !important;\n}\n\n.updraftplus-vault-cta > .vault-options > .center-vault > p {\n\tfont-size: 16px;\n}\n\n.updraftvault-buy .button-purchase {\n\tright: 24%;\n\tmargin-left: 0;\n\tline-height: 1.7em;\n}\n\n.updraftvault-buy hr {\n\theight: 2px;\n\tbackground-color: #777;\n\tmargin-top: 18px;\n}\n\n.right {\n\tmargin-right: 0px;\n}\n\n.updraftvault-buy .addon-logo-100 {\n\theight: 100px;\n\twidth: 125px;\n\tmargin-top: 7px;\n}\n\n.updraftvault-buy .addon-logo-large {\n\tmargin-top: 7px;\n}\n\n.updraftvault-buy .button-buy-vault {\n\tfont-size: 12px;\n\tcolor: #DF6926;\n\tborder-color: #DF6926;\n\tborder-width: 2px !important;\n\tposition: absolute;\n\tright: 29%;\n\tbottom: 2%;\n}\n\n.premium-addon-div .button-purchase {\n\tline-height: 1.7em;\n}\n\n.updraftvault-buy .button-buy-vault:hover {\n\tborder-color: darkgrey;\n\tcolor: darkgrey;\n}\n\n/* End Vault icons */\n\n/* Premium addons */\n\n.premium-addons {\n\tmargin-top: 80px;\n\twidth: 100%;\n\tmargin: 0 auto;\n\tdisplay: table;\n}\n\n.addon-list {\n\t/* margin-left: 32px; */\n\tdisplay: table;\n\ttext-align: center;\n}\n\n.premium-addons h1 {\n\ttext-align: center;\n\tfont-weight: bold;\n}\n\n.premium-addons p {\n\ttext-align: center;\n}\n\n.premium-addons .premium-addon-div {\n\twidth: 200px;\n\theight: 250px;\n\tborder: 2px solid #777;\n\tdisplay: inline-table;\n\tmargin: 0 auto;\n\tmargin-right: 25px;\n\tmargin-top: 25px;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.premium-addons .premium-addon-div p {\n\tmargin-left: 2px;\n\tmargin-right: 2px;\n}\n\n.premium-addons .premium-addon-div img {\n\twidth: auto;\n\theight: 50px;\n\tmargin-top: 7px;\n}\n\n.premium-addons .premium-addon-div .hr-alignment {\n\tmargin-top: 44px;\n}\n\n.premium-addons .premium-addon-div .dropbox-logo {\n\theight: 39px;\n\twidth: 150px;\n}\n\n.premium-addons .premium-addon-div .azure-logo, .premium-addons .premium-addon-div .onedrive-logo {\n\twidth: 75%;\n\theight: 24px;\n}\n\n.button-purchase {\n\tfont-size: 12px;\n\tcolor: #DF6926;\n\tborder-color: #DF6926;\n\tborder-width: 2px !important;\n\tposition: absolute;\n\tright: 25%;\n\tbottom: 2%;\n}\n\n.button-purchase:hover {\n\tcolor: darkgrey;\n\tborder-color: darkgrey;\n}\n\n.premium-addons .premium-addon-div hr {\n\theight: 2px;\n\tbackground-color: #777;\n\tmargin-top: 18px;\n}\n\n.premium-addon-div p {\n\tfont-style: italic;\n}\n\n.addon-list > .premium-addon-div > .onedrive-fix,\n.addon-list > .premium-addon-div > .azure-logo {\n\tmargin-top: 33px;\n}\n\n.addon-list > .premium-addon-div > .dropbox-fix {\n\tmargin-top: 18px;\n}\n\n/* End premium addons */\n\n\n/* Forgotton something (that is the name of the div rather than a mental note!) */\n\n.premium-forgotton-something {\n\tmargin-top: 5%;\n}\n\n.premium-forgotton-something h1 {\n\ttext-align: center;\n\tfont-weight: bold;\n}\n\n.premium-forgotton-something p {\n\ttext-align: center;\n\tfont-weight: normal;\n}\n\n.premium-forgotton-something .button-faq {\n\tcolor: #DF6926;\n\tborder-color: #DF6926;\n\tmargin: 0 auto;\n\tdisplay: table;\n}\n\n.premium-forgotton-something .button-faq:hover {\n\tcolor: #777;\n\tborder-color: #777;\n}\n\n/* End of forgotton something */\n\n.updraftplusmethod.updraftvault #vaultlogo {\n\tpadding-left: 40px;\n}\n\n.updraftplusmethod.updraftvault .vault_primary_option {\n\tfloat: left;\n\twidth: 50%;\n\ttext-align: center;\n\tpadding-bottom: 20px;\n}\n\n.updraftplusmethod.updraftvault .vault_primary_option div {\n\tclear: right;\n\tpadding-top: 20px;\n}\n\n.updraftplusmethod.updraftvault .clear-left {\n\tclear: left;\n}\n\n.updraftplusmethod.updraftvault .padding-top-20px {\n\tpadding-top: 20px;\n}\n\n.updraftplusmethod.updraftvault .padding-top-14px {\n\tpadding-top: 14px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary, .updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary {\n\tfont-size: 18px !important;\n\tpadding-bottom: 20px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_showoptions, .updraftplusmethod.updraftvault #updraftvault_connect {\n\tmargin-top: 8px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_settings_connect input {\n\tmargin-right: 10px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_email {\n\twidth: 280px;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_pass {\n\twidth: 200px;\n}\n\n.updraftplusmethod.updraftvault #vault-is-connected {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.updraftplusmethod.updraftvault #updraftvault_settings_default p {\n\tclear: left;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option {\n\tfloat: left;\n\twidth: 33%;\n\ttext-align: center;\n\tpadding-top: 20px;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option-size {\n\tfont-size: 200%;\n\tfont-weight: bold;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option-link {\n\tclear: both;\n\tfont-size: 150%;\n}\n\n.updraftplusmethod.updraftvault .vault-purchase-option-or {\n\tclear: both;\n\tfont-size: 115%;\n\tfont-style: italic;\n}\n\n/* Automation Backup Advert by B */\n.autobackup-image {\n/* \tdisplay: inline-block; */\n/*\tmin-width: 10%;\n\tmax-width:25%;*/\n/*\tfloat: left;*/\n\tclear: left;\n\tfloat: left;\n\twidth: 110px;\n\theight: 110px;\n}\n\n.autobackup-description {\n\twidth: 100%;\n}\n\n.advert-description {\n\tfloat: left;\n\tclear: right;\n\tpadding: 4px 10px 8px 10px;\n\twidth: 70%;\n\tclear: right;\n\tvertical-align: top;\n}\n\n.advert-btn {\n\tdisplay: inline-block;\n\tmin-width: 10%;\n\tvertical-align: top;\n\tmargin-bottom: 8px;\n}\n\n.advert-btn:first-of-type {\n\tmargin-top: 25px;\n}\n\n.advert-btn a {\n\tdisplay: block;\n\tcursor: pointer;\n}\n\na.btn-get-started {\n\tbackground: #FFF;\n\tborder: 2px solid #DF6926;\n\tborder-radius: 4px;\n\tcolor: #DF6926;\n\tdisplay: inline-block;\n\tmargin-left: 10px !important;\n\tmargin-bottom: 7px !important;\n\tfont-size: 18px !important;\n\tline-height: 20px;\n\tmin-height: 28px;\n\tpadding: 11px 10px 5px 10px;\n\ttext-transform: uppercase;\n\ttext-decoration: none;\n}\n\n.circle-dblarrow {\n\tborder: 1px solid #DF6926;\n\tborder-radius: 100%;\n\tdisplay: inline-block;\n\tfont-size: 17px;\n\tline-height: 17px;\n\tmargin-left: 5px;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n}\n\n@media screen and (max-width: 782px) {\n/*\t.advert-description {\n\t\tmin-width: 75%;\n\t\tmargin-bottom: 5px;\n\t}\n\n\t.advert-btn {\n\t\tmargin-top: 15px;\n\t\tmargin-left:86px;\n\t\tmin-width: 100%;\n\t}*/\n}\n\n/* End Automation Backup Advert by B */\n/* New Responsive Pretty Advanced Settings */\n.expertmode .advanced_settings_container {\n\theight: auto;\n\toverflow: hidden;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu {\n\tfloat: none;\n\tborder-bottom: 1px solid rgb(204, 204, 204);\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content {\n\tpadding-top: 5px;\n\tfloat: none;\n\twidth: auto;\n\toverflow: auto;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content h3 {\n\tmargin-top: 5px !important;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools {\n\tdisplay: none;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content .site_info {\n\tdisplay: block;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\n\tdisplay: inline-block;\n\tcursor: pointer;\n\tpadding: 5px;\n\tcolor: #000;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text {\n\tfont-size: 16px;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover {\n\tbackground-color: #EAEAEA;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .active {\n\tbackground-color: #3498DB;\n\tcolor: #FFF;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_menu .active:hover {\n\tbackground-color: #72C5FD;\n\tcolor: #FFF;\n}\n\n.expertmode .advanced_settings_container .advanced_settings_content input#import_settings {\n\theight: auto !important;\n}\n\ndiv#updraft-wrap a {\n\tcursor: pointer !important;\n}\n\n@media screen and (min-width: 670px) {\n\n\t.expertmode .advanced_settings_container .advanced_settings_menu {\n\t\tfloat: left;\n\t\twidth: 215px;\n\t\tborder-right: 1px solid rgb(204, 204, 204);\n\t\tborder-bottom: none;\n\t}\n\n\t.expertmode .advanced_settings_container .advanced_settings_content {\n\t\tpadding-left: 10px;\n\t\tpadding-top: 0px;\n\t}\n\n\t.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\n\t\tdisplay: block;\n\t}\n\n}\n"]}
1
+ {"version":3,"sources":["css/admin.css"],"names":[],"mappings":"AAAA,uBAAuB;AACvB;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED,2BAA2B;;AAE3B,kBAAkB;AAClB;CACC,sBAAsB;CACtB;;AAED;CACC,kBAAkB;CAClB;;AAED,sBAAsB;AACtB,eAAe;AACf;CACC,mBAAmB;CACnB;;AAED,sBAAsB;AACtB,aAAa;AACb;CACC,sBAAsB;CACtB;;AAED,oBAAoB;;AAEpB;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,iBAAiB;CACjB;;AAED,iBAAiB;;AAEjB;CACC,mBAAmB;CACnB,kBAAkB;CAClB,uBAAuB;CACvB,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB;;AAED,qBAAqB;;AAErB,kBAAkB;AAClB;CACC,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,kBAAkB;CAClB,oBAAoB;CACpB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,wBAAwB;CACxB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,yBAAyB;CACzB,uBAAuB;CACvB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,sBAAsB;CACtB;;AAED;CACC,gCAAgC;CAChC,yBAAyB;CACzB;;AAED;CACC,kBAAkB;CAClB,aAAa;CACb,mBAAmB;CACnB;;AAED;;;CAGC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,yBAAyB;CACzB,gCAAgC;CAChC;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,eAAe;CACf,sBAAsB;CACtB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,mBAAmB;CACnB;;AAED;CACC,gBAAgB;CAChB,uBAAuB;CACvB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,aAAa;CACb;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,kBAAkB;CAClB;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf,sBAAsB;CACtB,gBAAgB;CAChB,aAAa;CACb;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB,0BAA0B;CAC1B,yBAAyB;CACzB,YAAY;CACZ,eAAe;CACf;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,cAAc;CACd,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED,sBAAsB;;AAEtB,4BAA4B;;AAE5B;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,oBAAoB;CACpB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,cAAc;CACd,YAAY;CACZ;;AAED;CACC,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,aAAa;CACb,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,eAAe;CACf,aAAa;CACb,eAAe;CACf,mBAAmB;CACnB,UAAU;CACV,UAAU;CACV;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED,mCAAmC;;AAEnC;CACC,iBAAiB;CACjB;;AAED;CACC,uBAAuB;CACvB;;AAED;CACC,cAAc;CACd;;AAED;CACC,8BAA8B;CAC9B,aAAa;CACb,eAAe;CACf,2BAA2B;CAC3B,gBAAgB;CAChB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,4BAA4B;CAC5B,8BAA8B;CAC9B,2BAA2B;CAC3B,iBAAiB;CACjB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB,uBAAuB;CACvB;;AAED;CACC,WAAW;CACX;;AAED,mBAAmB;;AAEnB,oEAAoE;AACpE;;CAEC,wBAAwB;CACxB;;AAED;;CAEC,gCAAgC;CAChC;;AAED;;CAEC,+BAA+B;CAC/B;;AAED;;CAEC,wBAAwB;CACxB;;AAED,+BAA+B;AAC/B;CACC,mBAAmB;CACnB,cAAc;CACd,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,aAAa;CACb,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,cAAc;CACd,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf;;AAED,8BAA8B;AAC9B;CACC,mBAAmB;CACnB,cAAc;CACd,cAAc;CACd,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,OAAO;CACP,SAAS;CACT;;AAED;CACC,aAAa;CACb,YAAY;CACZ,eAAe;CACf;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB;;AAED;CACC,cAAc;CACd;;AAED;CACC,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB,2BAA2B;CAC3B;;AAED;CACC,aAAa;CACb;;AAED;CACC,0BAA0B;CAC1B,0BAA0B;CAC1B,aAAa;CACb,uBAAuB;CACvB,kBAAkB;CAClB;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,uBAAuB;CACvB,YAAY;CACZ,uBAAuB;CACvB,aAAa;CACb,aAAa;CACb,kBAAkB;CAClB,mBAAmB;CACnB,YAAY;CACZ;;AAED;CACC,aAAa;CACb,8BAA8B;CAC9B,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,uBAAuB;CACvB,YAAY;CACZ,uBAAuB;CACvB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,yBAAyB;CACzB;;AAED;CACC,wBAAwB;CACxB,0BAA0B;CAC1B;;AAED;CACC,eAAe;CACf;;AAED;CACC,wBAAwB;CACxB,cAAc;CACd;;AAED;CACC,oBAAoB;CACpB,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;CACC,aAAa;CACb,oBAAoB;CACpB,uBAAuB;CACvB,cAAc;CACd;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf;;AAED;CACC,YAAY;CACZ;;AAED;CACC,qCAAqC;CACrC,kBAAkB;CAClB;;AAED;CACC,wBAAwB;CACxB,0BAA0B;CAC1B,gBAAgB;CAChB,wBAAwB;CACxB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,gBAAgB;CAChB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,cAAc;CACd,aAAa;CACb;;AAED;CACC,UAAU;CACV,oBAAoB;CACpB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,WAAW;CACX,gBAAgB;CAChB,kBAAkB;CAClB,YAAY;CACZ,mBAAmB;CACnB,aAAa;CACb,cAAc;CACd;;AAED;CACC,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,cAAc;CACd,YAAY;CACZ;;AAED;CACC,cAAc;CACd;;AAED;;CAEC;EACC,eAAe;EACf,YAAY;EACZ,mBAAmB;EACnB;;CAED;;AAED,oCAAoC;AACpC;CACC,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;;AAEH;CACC,iBAAiB;CACjB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,+BAA+B;CAC/B,uBAAuB;CACvB,wBAAwB;CACxB;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,yBAAyB;CACzB;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,YAAY;CACZ,YAAY;CACZ,yBAAyB;CACzB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,0BAA0B;CAC1B,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,kBAAkB;CAClB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,wBAAwB;CACxB,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX;;AAED;CACC,cAAc;CACd,oBAAoB;CACpB;;AAED;CACC,cAAc;CACd,gBAAgB;CAChB,WAAW;CACX,SAAS;CACT,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,aAAa;CACb;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf;;AAED;CACC,cAAc;CACd;;AAED;CACC,cAAc;CACd,oBAAoB;CACpB,mBAAmB;CACnB;;AAED;CACC,wBAAwB;CACxB,aAAa;CACb;;AAED;CACC,oBAAoB;CACpB,iBAAiB;CACjB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,qBAAqB;CACrB;;AAED;CACC,iBAAiB;CACjB,iBAAiB;CACjB,mBAAmB;CACnB,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,UAAU;CACV,SAAS;CACT,mBAAmB;CACnB,0BAA0B;CAC1B;;AAED;CACC,mBAAmB;CACnB,gBAAgB;CAChB,iBAAiB;CACjB,uBAAuB;CACvB,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB;;AAED;CACC,WAAW;CACX,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB,kBAAkB;CAClB,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,uBAAuB;CACvB;;AAED;CAGC,uBAAuB;CACvB,iBAAiB;CACjB,WAAW;CACX;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,qBAAqB;CACrB;;AAED;;GAEG;;AAEH;CACC,eAAe;CACf,WAAW;CACX;;AAED;CACC,eAAe;CACf;;AAED,6BAA6B;AAC7B;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,gBAAgB;CAChB;;AAED,aAAa;AACb,oHAAoH;;AAEpH;CACC,qBAAqB;CACrB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX;;AAED,iBAAiB;;AAEjB;CACC,0BAA0B;CAC1B,cAAc;CACd,YAAY;CACZ;;AAED;CACC,aAAa;CACb,oBAAoB;CACpB,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX,YAAY;CACZ;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB,aAAa;CACb,iBAAiB;CACjB;;AAED;CACC,6BAA6B;CAC7B,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb;;AAED,qBAAqB;;AAErB,iBAAiB;;AAEjB;CACC,YAAY;CACZ,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,aAAa;CACb,cAAc;CACd,uBAAuB;CACvB,sBAAsB;CACtB,eAAe;CACf,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,cAAc;CACd;;AAED;CACC,WAAW;CACX,gBAAgB;CAChB,6BAA6B;CAC7B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,WAAW;CACX,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB,iBAAiB;CACjB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,uBAAuB;CACvB,gBAAgB;CAChB;;AAED,qBAAqB;;AAErB,oBAAoB;;AAEpB;CACC,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,eAAe;CACf;;AAED;CACC,wBAAwB;CACxB,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,cAAc;CACd,uBAAuB;CACvB,sBAAsB;CACtB,eAAe;CACf,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,WAAW;CACX,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX;;AAED;CACC,gBAAgB;CAChB,uBAAuB;CACvB;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB,iBAAiB;CACjB;;AAED;CACC,mBAAmB;CACnB;;AAED;;CAEC,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB;;AAED,wBAAwB;;;AAGxB,mFAAmF;;AAEnF;CACC,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,eAAe;CACf,sBAAsB;CACtB,eAAe;CACf,eAAe;CACf;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB;;AAED,gCAAgC;;AAEhC;CACC,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,qBAAqB;CACrB;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,2BAA2B;CAC3B,qBAAqB;CACrB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB;;AAED,mCAAmC;AACnC;AACA,6BAA6B;AAC7B;iBACiB;AACjB,iBAAiB;CAChB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,cAAc;CACd;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,2BAA2B;CAC3B,WAAW;CACX,aAAa;CACb,oBAAoB;CACpB;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf,oBAAoB;CACpB,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,eAAe;CACf,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,0BAA0B;CAC1B,mBAAmB;CACnB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,kBAAkB;CAClB,iBAAiB;CACjB,4BAA4B;CAC5B,0BAA0B;CAC1B,sBAAsB;CACtB;;AAED;CACC,0BAA0B;CAC1B,oBAAoB;CACpB,sBAAsB;CACtB,gBAAgB;CAChB,kBAAkB;CAClB,iBAAiB;CACjB,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB;;AAED;AACA;;;;;;;;;IASI;CACH;;AAED,uCAAuC;AACvC,6CAA6C;AAC7C;CACC,aAAa;CACb,iBAAiB;CACjB;;AAED;CACC,YAAY;CACZ,4CAA4C;CAC5C;;AAED;CACC,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,cAAc;CACd;;AAED;CACC,eAAe;CACf;;AAED;CACC,sBAAsB;CACtB,gBAAgB;CAChB,aAAa;CACb,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,0BAA0B;CAC1B;;AAED;CACC,0BAA0B;CAC1B,YAAY;CACZ;;AAED;CACC,0BAA0B;CAC1B,YAAY;CACZ;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,2BAA2B;CAC3B;;AAED;;CAEC;EACC,YAAY;EACZ,aAAa;EACb,2CAA2C;EAC3C,oBAAoB;EACpB;;CAED;EACC,mBAAmB;EACnB,iBAAiB;EACjB;;CAED;EACC,eAAe;EACf;;CAED","file":"admin.min.css","sourcesContent":["/* Widths and sizing */\r\n.max-width-600 {\r\n\tmax-width: 600px;\r\n}\r\n\r\n.width-900 {\r\n\twidth: 900px;\r\n}\r\n\r\n.width-80 {\r\n\twidth: 80%;\r\n}\r\n\r\n/* End widths and sizing */\r\n\r\n/* Font styling */\r\n.no-decoration {\r\n\ttext-decoration: none;\r\n}\r\n\r\n.bold {\r\n\tfont-weight: bold;\r\n}\r\n\r\n/* End font styling */\r\n/* Alignment */\r\n.center-align-td {\r\n\ttext-align: center;\r\n}\r\n\r\n/* End of Alignment */\r\n/* Padding */\r\n.remove-padding {\r\n\tpadding: 0 !important;\r\n}\r\n\r\n/* End of padding */\r\n\r\n.updraft-text-center {\r\n\ttext-align: center;\r\n}\r\n\r\n.autobackup {\r\n\tpadding: 6px;\r\n\tmargin: 8px 0px;\r\n}\r\n\r\nul .disc {\r\n\tlist-style: disc inside;\r\n}\r\n\r\n.dashicons-log-fix {\r\n\tdisplay: inherit;\r\n}\r\n\r\n/* Input boxes */\r\n\r\ninput {\r\n\tborder-radius: 4px;\r\n\tline-height: 1.42;\r\n\tborder: 1px solid #CCC;\r\n\theight: 27px;\r\n\tpadding: 2px 6px;\r\n\tcolor: #555;\r\n}\r\n\r\ninput[type=\"text\"] {\r\n\tfont-size: 14px;\r\n}\r\n\r\ninput[type=\"number\"] {\r\n\theight: 31px;\r\n}\r\n\r\nselect {\r\n\tborder-radius: 4px;\r\n}\r\n\r\n/* End input boxes */\r\n\r\n/* Main Buttons */\r\n.main-dashboard-buttons {\r\n\tborder-width: 4px;\r\n\tborder-radius: 12px;\r\n\tletter-spacing: 0px;\r\n\tfont-size: 17px;\r\n\tfont-weight: bold;\r\n\tpadding-left: 0.7em;\r\n\tpadding-right: 2em;\r\n\tpadding: 0.3em 1em;\r\n\tline-height: 1.7em;\r\n\tbackground: transparent;\r\n\tposition: relative;\r\n\tborder: 2px solid;\r\n\ttransition: all 0.2s;\r\n\tvertical-align: baseline;\r\n\tbox-sizing: border-box;\r\n\ttext-align: center;\r\n\tline-height: 1.3em;\r\n\tmargin-left: .3em;\r\n\ttext-transform: none;\r\n\tline-height: 1;\r\n\ttext-decoration: none;\r\n}\r\n\r\n.button-restore {\r\n\tborder-color: rgb(98, 158, 192);\r\n\tcolor: rgb(98, 158, 192);\r\n}\r\n\r\n.dashboard-main-sizing {\r\n\tborder-width: 4px;\r\n\twidth: 190px;\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.button-restore:hover, .button-migrate:hover, .button-backup:hover,\r\n.button-view-log:hover, .button-mass-selectors:hover,\r\n.button-delete:hover, .button-entity-backup:hover, .udp-button-primary:hover {\r\n\tborder-color: #DF6926;\r\n\tcolor: #DF6926;\r\n}\r\n\r\n.button-migrate {\r\n\tcolor: rgb(238, 169, 32);\r\n\tborder-color: rgb(238, 169, 32);\r\n}\r\n\r\n.button-backup {\r\n\tborder-color: #84CA1B;\r\n\tcolor: #84CA1B;\r\n}\r\n\r\n.existing-backups-buttons {\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 3px;\r\n}\r\n\r\n.existing-backups-restore-buttons {\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 3px;\r\n}\r\n\r\n.button-delete {\r\n\tcolor: #E23900;\r\n\tborder-color: #E23900;\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-right: 10px;\r\n}\r\n\r\n.button-view-log, .button-mass-selectors {\r\n\tcolor: darkgrey;\r\n\tborder-color: darkgrey;\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-top: -1px;\r\n}\r\n\r\n.button-view-log {\r\n\twidth: 120px;\r\n}\r\n\r\n.button-existing-restore {\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\twidth: 110px;\r\n}\r\n\r\n.main-restore {\r\n\tmargin-right: 3%;\r\n\tmargin-left: 3%;\r\n}\r\n\r\n.button-entity-backup {\r\n\tcolor: #555;\r\n\tborder-color: #555;\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-right: 5px;\r\n}\r\n\r\n.button-select-all {\r\n\twidth: 122px;\r\n}\r\n\r\n.button-deselect {\r\n\twidth: 92px;\r\n}\r\n\r\n#ud_massactions > .display-flex > .mass-selectors-margins {\r\n\tmargin-right: -4px;\r\n}\r\n\r\n.udp-button-primary {\r\n\tborder-width: 4px;\r\n\tcolor: #0073AA;\r\n\tborder-color: #0073AA;\r\n\tfont-size: 14px;\r\n\theight: 40px;\r\n}\r\n\r\n#ud_massactions .button-delete {\r\n\tmargin-right: 0px;\r\n}\r\n\r\n.stored_local {\r\n\tborder-radius: 5px;\r\n\tbackground-color: #007FE7;\r\n\tpadding: 3px 5px 5px 5px;\r\n\tcolor: #FFF;\r\n\tfont-size: 75%;\r\n}\r\n\r\n.form-table td.updraft_existingbackup_date {\r\n\tpadding-bottom: 5px;\r\n}\r\n\r\nspan#updraft_lastlogcontainer {\r\n\tword-break: break-all;\r\n}\r\n\r\n.stored_icon {\r\n\theight: 1.3em;\r\n\tposition: relative;\r\n\ttop: 0.2em;\r\n}\r\n\r\n.backup_date_label .clear-right {\r\n\tclear: right;\r\n}\r\n\r\n/* End Main Buttons */\r\n\r\n/* End of common elements */\r\n\r\n.udp-logo-70 {\r\n\twidth: 70px;\r\n\theight: 70px;\r\n\tfloat: left;\r\n\tpadding-right: 25px;\r\n}\r\n\r\nh3 .thank-you {\r\n\tmargin-top: 0px;\r\n}\r\n\r\n.ws_advert {\r\n\tmax-width: 800px;\r\n\tfont-size: 140%;\r\n\tline-height: 140%;\r\n\tpadding: 14px;\r\n\tclear: left;\r\n}\r\n\r\n.dismiss-dash-notice {\r\n\tfloat: right;\r\n\tposition: relative;\r\n\ttop: -20px;\r\n}\r\n\r\n#updraft_report_cell .updraft_reportbox {\r\n\tpadding: 8px;\r\n\tmargin: 8px 0;\r\n\tborder: 1px dotted;\r\n\tclear: left;\r\n\tfloat: left;\r\n}\r\n\r\n#updraft_report_cell button.updraft_reportbox_delete {\r\n\tfont-size: 50%;\r\n\tfloat: right;\r\n\tpadding: 0 3px;\r\n\tposition: relative;\r\n\ttop: -4px;\r\n\tleft: 4px;\r\n}\r\n\r\n#updraft-navtab-settings-content .updraft-test-button {\r\n\tfont-size: 18px !important;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_checkbox {\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_email {\r\n\twidth: 300px;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_another_p {\r\n\tclear: left;\r\n}\r\n\r\n/* Taken straight from admin.php */\r\n\r\n#updraft-navtab-settings-content table.form-table p {\r\n\tmax-width: 700px;\r\n}\r\n\r\n#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected {\r\n\tbackground-color: #CCC;\r\n}\r\n\r\n.updraft_settings_sectionheading {\r\n\tdisplay: none;\r\n}\r\n\r\n.updraft-backupentitybutton-disabled {\r\n\tbackground-color: transparent;\r\n\tborder: none;\r\n\tcolor: #0074A2;\r\n\ttext-decoration: underline;\r\n\tcursor: pointer;\r\n\tclear: none;\r\n\tfloat: left;\r\n}\r\n\r\n.updraft-backupentitybutton {\r\n\tmargin-left: 8px;\r\n}\r\n\r\n.updraft-bigbutton {\r\n\tpadding: 2px 0px !important;\r\n\tmargin-right: 14px !important;\r\n\tfont-size: 22px !important;\r\n\tmin-height: 32px;\r\n\tmin-width: 180px;\r\n}\r\n\r\n.updraft_debugrow th {\r\n\tfloat: right;\r\n\ttext-align: right;\r\n\tfont-weight: bold;\r\n\tpadding-right: 8px;\r\n\tmin-width: 140px;\r\n}\r\n\r\n.updraft_debugrow td {\r\n\tmin-width: 300px;\r\n\tvertical-align: bottom;\r\n}\r\n\r\n#updraft_webdav_host_error {\r\n\tcolor: red;\r\n}\r\n\r\n/* jstree styles */\r\n\r\n/* these styles hide the dots from the parent but keep the arrows */\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-node,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-node {\r\n\tbackground: transparent;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl {\r\n\tbackground-position: -36px -4px;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl {\r\n\tbackground-position: -4px -4px;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl {\r\n\tbackground: transparent;\r\n}\r\n\r\n/* zip browser jstree styles */\r\n#updraft_zip_files_container {\r\n\tposition: relative;\r\n\theight: 450px;\r\n\toverflow: none;\r\n}\r\n\r\n#updraft_zip_info_container {\r\n\tposition: relative;\r\n\theight: auto;\r\n\twidth: 100%;\r\n\tborder: 1px dotted;\r\n\tmargin-bottom: 5px;\r\n}\r\n\r\n#updraft_zip_info_container p {\r\n\tmargin: 1px;\r\n\tpadding-left: 10px;\r\n\tfont-size: 14px;\r\n}\r\n\r\n#updraft_zip_download_item {\r\n\tdisplay: none;\r\n\tcolor: #0073AA;\r\n\tpadding-left: 10px;\r\n}\r\n\r\n#updraft_zip_download_notice {\r\n\tpadding-left: 10px;\r\n}\r\n\r\n#updraft_zip_files_jstree_container {\r\n\tposition: relative;\r\n\tborder: 1px dotted;\r\n\theight: 80%;\r\n\twidth: 100%;\r\n\toverflow: auto;\r\n}\r\n\r\n/* More files jstree styles */\r\n#updraft_more_files_container {\r\n\tposition: relative;\r\n\tdisplay: none;\r\n\theight: 300px;\r\n\twidth: 100%;\r\n\tborder: 1px dotted;\r\n\tmargin-bottom: 5px;\r\n}\r\n\r\n#updraft_jstree_buttons {\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tright: 0;\r\n}\r\n\r\n#updraft_jstree_container {\r\n\theight: 100%;\r\n\twidth: 100%;\r\n\toverflow: auto;\r\n}\r\n\r\n#updraft_more_files_container button {\r\n\theight: 22px;\r\n\tline-height: 20px;\r\n}\r\n\r\n#updraft_jstree_confirm, #updraft_jstree_cancel {\r\n\tdisplay: none;\r\n}\r\n\r\n.updraftplus-morefiles-row-delete {\r\n\tcursor: pointer;\r\n\tcolor: red;\r\n\tfont-size: 23px !important;\r\n}\r\n\r\n.updraftplus-morefiles-row-edit {\r\n\tcursor: pointer;\r\n\tfont-size: 24px !important;\r\n}\r\n\r\n#updraft-wrap .form-table th {\r\n\twidth: 230px;\r\n}\r\n\r\n.updraftplus-remove {\r\n\tbackground-color: #C00000;\r\n\tborder: 1px solid #C00000;\r\n\theight: 22px;\r\n\tpadding: 4px 3px 0 3px;\r\n\tmargin-right: 6px;\r\n}\r\n\r\n.updraft-viewlogdiv form {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.updraft-viewlogdiv {\r\n\tbackground-color: #FFF;\r\n\tcolor: #000;\r\n\tborder: 1px solid #000;\r\n\theight: 26px;\r\n\tpadding: 0px;\r\n\tmargin: 0 4px 0 0;\r\n\tborder-radius: 3px;\r\n\tfloat: left;\r\n}\r\n\r\n.updraft-viewlogdiv input, .updraft-viewlogdiv a {\r\n\tborder: none;\r\n\tbackground-color: transparent;\r\n\tcolor: #000;\r\n\tmargin: 0px;\r\n\tpadding: 3px 4px;\r\n\tfont-size: 16px;\r\n\tline-height: 26px;\r\n}\r\n\r\n.updraft-viewlogdiv:hover {\r\n\tbackground-color: #000;\r\n\tcolor: #FFF;\r\n\tborder: 1px solid #FFF;\r\n\tcursor: pointer;\r\n}\r\n\r\n.updraft-viewlogdiv input:hover, .updraft-viewlogdiv a:hover {\r\n\tcolor: #FFF;\r\n\tcursor: pointer;\r\n}\r\n\r\n.updraftplus-remove a {\r\n\tcolor: white;\r\n\tpadding: 4px 4px 0px 4px;\r\n}\r\n\r\n.updraftplus-remove:hover {\r\n\tbackground-color: white;\r\n\tborder: 1px solid #C00000;\r\n}\r\n\r\n.updraftplus-remove a:hover {\r\n\tcolor: #C00000;\r\n}\r\n\r\n.drag-drop #drag-drop-area2 {\r\n\tborder: 4px dashed #DDD;\r\n\theight: 200px;\r\n}\r\n\r\n#drag-drop-area2 .drag-drop-inside {\r\n\tmargin: 36px auto 0;\r\n\twidth: 350px;\r\n}\r\n\r\n#filelist, #filelist2 {\r\n\twidth: 100%;\r\n}\r\n\r\n#filelist .file, #filelist2 .file, .ud_downloadstatus .file, #ud_downloadstatus2 .file {\r\n\tpadding: 5px;\r\n\tbackground: #ECECEC;\r\n\tborder: solid 1px #CCC;\r\n\tmargin: 4px 0;\r\n}\r\n\r\nul.updraft_premium_description_list {\r\n\tlist-style: disc inside;\r\n}\r\n\r\nul.updraft_premium_description_list li {\r\n\tdisplay: inline;\r\n}\r\n\r\nul.updraft_premium_description_list li::after {\r\n\tcontent: \" | \";\r\n}\r\n\r\nul.updraft_premium_description_list li.last::after {\r\n\tcontent: \"\";\r\n}\r\n\r\n.updraft_feature_cell {\r\n\tbackground-color: #F7D9C9 !important;\r\n\tpadding: 5px 10px;\r\n}\r\n\r\n.updraft_feat_table, .updraft_feat_th, .updraft_feat_table td {\r\n\tborder: 1px solid black;\r\n\tborder-collapse: collapse;\r\n\tfont-size: 120%;\r\n\tbackground-color: white;\r\n\ttext-align: center;\r\n}\r\n\r\n.updraft_feat_table p {\r\n\tpadding: 0px 10px;\r\n\tmargin: 5px 0px;\r\n\tfont-size: 16px;\r\n}\r\n\r\n.updraft_feat_table h4 {\r\n\tmargin: 5px 0px;\r\n}\r\n\r\n.updraft_feat_table .dashicons {\r\n\twidth: 25px;\r\n\theight: 25px;\r\n\tfont-size: 25px;\r\n\tline-height: 1;\r\n}\r\n\r\n.updraft_feat_table .dashicons-yes, .updraft_feat_table .updraft-yes {\r\n\tcolor: green;\r\n}\r\n\r\n.updraft_feat_table .dashicons-no-alt, .updraft_feat_table .updraft-no {\r\n\tcolor: red;\r\n}\r\n\r\n.updraft_tick_cell {\r\n\ttext-align: center;\r\n}\r\n\r\n.updraft_tick_cell img {\r\n\tmargin: 4px 0;\r\n\theight: 24px;\r\n}\r\n\r\n#filelist .fileprogress, #filelist2 .fileprogress, .ud_downloadstatus .dlfileprogress, #ud_downloadstatus2 .dlfileprogress {\r\n\twidth: 0%;\r\n\tbackground: #F6A828;\r\n\theight: 5px;\r\n}\r\n\r\n.ud_downloadstatus .raw, #ud_downloadstatus2 .raw {\r\n\tmargin-top: 8px;\r\n\tclear: left;\r\n}\r\n\r\n.ud_downloadstatus .file, #ud_downloadstatus2 .file {\r\n\tmargin-top: 8px;\r\n}\r\n\r\ntr.updraftplusmethod h3 {\r\n\tmargin: 0px;\r\n}\r\n\r\n#updraft_retain_db_rules .updraft_retain_rules_delete, #updraft_retain_files_rules .updraft_retain_rules_delete {\r\n\tcursor: pointer;\r\n\tcolor: red;\r\n\tfont-size: 120%;\r\n\tfont-weight: bold;\r\n\tborder: 0px;\r\n\tborder-radius: 3px;\r\n\tpadding: 2px;\r\n\tmargin: 0 6px;\r\n}\r\n\r\n#updraft_retain_db_rules .updraft_retain_rules_delete:hover, #updraft_retain_files_rules .updraft_retain_rules_delete:hover {\r\n\tcursor: pointer;\r\n\tcolor: white;\r\n\tbackground: red;\r\n}\r\n\r\n#updraft_backup_started {\r\n\tmax-width: 800px;\r\n\tfont-size: 140%;\r\n\tline-height: 140%;\r\n\tpadding: 14px;\r\n\tclear: left;\r\n}\r\n\r\n.udp-premium-image {\r\n\tdisplay: none;\r\n}\r\n\r\n@media screen and (min-width: 720px) {\r\n\r\n\t.udp-premium-image {\r\n\t\tdisplay: block;\r\n\t\tfloat: left;\r\n\t\tpadding-right: 5px;\r\n\t}\r\n\r\n}\r\n\r\n/* End stuff already in admin.php */\r\n#plupload-upload-ui2 {\r\n\twidth: 80%;\r\n}\r\n\r\n.backup-restored {\r\n\tpadding: 8px;\r\n}\r\n\r\n.backup-restored span {\r\n\tfont-size: 120%;\r\n}\r\n\r\n.memory-limit {\r\n\tpadding: 8px;\r\n}\r\n\r\n.updraft_list_errors {\r\n\tpadding: 8px;\r\n}\r\n\r\n/*.nav-tab {\r\n\tborder-radius: 20px 20px 0 0;\r\n\tborder-color: grey;\r\n\tborder-width: 2px;\r\n\tmargin-top: 34px;\r\n}\r\n\r\n.nav-tab:hover {\r\n\tborder-bottom: 0;\r\n}\r\n\r\n.nav-tab-active, .nav-tab-active:active {\r\n\tcolor: #df6926;\r\n\tborder-color: #D3D3D3;\r\n\tborder-width: 1px;\r\n\tborder-bottom: 0;\r\n}\r\n\r\n.nav-tab-active:focus {\r\n\tcolor: #df6926;\r\n}*/\r\n\r\n.nav-tab-wrapper {\r\n\tmargin: 14px 0px;\r\n}\r\n\r\n#updraft-poplog-content {\r\n\twhite-space: pre-wrap;\r\n}\r\n\r\n.next-backup {\r\n\tborder: 0px;\r\n\tpadding: 0px;\r\n\tmargin: 0 10px 0 0;\r\n}\r\n\r\n.not-scheduled {\r\n\tvertical-align: top !important;\r\n\tmargin: 0px !important;\r\n\tpadding: 0px !important;\r\n}\r\n\r\n.next-backup .updraft_scheduled {\r\n\t/* width: 124px;*/\r\n\tmargin: 0px;\r\n\tpadding: 2px 4px 2px 0px;\r\n}\r\n\r\n#next-backup-table-inner td {\r\n\tvertical-align: top;\r\n}\r\n\r\n.next-backup .updraft_all-files {\r\n\tcolor: blue;\r\n\tmargin: 0px;\r\n\tpadding: 2px 0px 0px 0px;\r\n}\r\n\r\n.multisite-advert-width {\r\n\twidth: 800px;\r\n}\r\n\r\n.updraft_settings_sectionheading {\r\n\tmargin-top: 6px;\r\n}\r\n\r\n.premium-upgrade-prompt {\r\n\tfont-size: 115%;\r\n}\r\n\r\n.updraft_feat_table {\r\n\tmargin-top: 30px;\r\n}\r\n\r\n.show_admin_restore_in_progress_notice {\r\n\tpadding: 8px;\r\n}\r\n\r\n.show_admin_restore_in_progress_notice .unfinished-restoration {\r\n\tfont-size: 120%;\r\n}\r\n\r\n#backupnow_includefiles_moreoptions, #backupnow_database_moreoptions {\r\n\tmargin: 4px 16px 6px 16px;\r\n\tborder: 1px dotted;\r\n\tpadding: 6px 10px;\r\n}\r\n\r\n#backupnow_database_moreoptions {\r\n\tmax-height: 250px;\r\n\toverflow: auto;\r\n}\r\n\r\n.form-table #updraft_activejobsrow .minimum-height {\r\n\tmin-height: 100px;\r\n}\r\n\r\n#updraft_lastlogmessagerow .last-message {\r\n\tpadding-top: 20px;\r\n\tdisplay: block;\r\n}\r\n\r\n.updraft_simplepie {\r\n\tvertical-align: top;\r\n}\r\n\r\n.download-backups {\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.download-backups .updraft_download_button {\r\n\tmargin-right: 6px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n.download-backups .choose-components-button {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.download-backups .ud-whitespace-warning {\r\n\tbackground-color: pink;\r\n\tpadding: 8px;\r\n\tmargin: 4px;\r\n\tborder: 1px dotted;\r\n}\r\n\r\n.download-backups .ul {\r\n\tlist-style: none inside;\r\n\tmax-width: 800px;\r\n\tmargin-top: 6px;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n#updraft-plupload-modal {\r\n\twidth: 75%;\r\n\tmargin: 16px;\r\n\tmargin-left: 100px;\r\n}\r\n\r\n.download-backups .upload {\r\n\tmax-width: 610px;\r\n}\r\n\r\n.download-backups #plupload-upload-ui {\r\n\twidth: 70%;\r\n}\r\n\r\n.ud_downloadstatus {\r\n\tpadding: 10px;\r\n\tbackground: #F1F1F1;\r\n}\r\n\r\n#ud_massactions {\r\n\tpadding: 14px;\r\n\tposition: fixed;\r\n\tright: 25%;\r\n\ttop: 25%;\r\n\tborder: 2px solid;\r\n\tborder-radius: 4px;\r\n\tbackground: rgb(241, 241, 241);\r\n\tfloat: right;\r\n}\r\n\r\n#ud_massactions .updraftplus-remove {\r\n\tclear: left;\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#ud_massactions .updraftplus-remove a {\r\n\ttext-decoration: none;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv {\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv a {\r\n\ttext-decoration: none;\r\n\tposition: relative;\r\n\ttop: 3px;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv a {\r\n\ttext-decoration: none;\r\n\tposition: relative;\r\n\ttop: 3px;\r\n}\r\n\r\n#updraft-navtab-backups-content .updraft_existing_backups {\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n#updraft-message-modal-innards {\r\n\tpadding: 4px;\r\n}\r\n\r\n#updraft-authenticate-modal {\r\n\ttext-align: center;\r\n\tfont-size: 16px !important;\r\n}\r\n\r\n#updraft-authenticate-modal p {\r\n\tfont-size: 16px;\r\n}\r\n\r\n#updraft_delete_form p {\r\n\tmargin-top: 3px;\r\n\tpadding-top: 0;\r\n}\r\n\r\n#updraft_restore_form .cannot-restore {\r\n\tmargin: 8px 0;\r\n}\r\n\r\n#updraft_restorer_dboptions {\r\n\tpadding: 12px;\r\n\tmargin: 8px 0 4px 0;\r\n\tborder: dashed 1px;\r\n}\r\n\r\n#updraft_restorer_dboptions h4 {\r\n\tmargin: 0px 0px 6px 0px;\r\n\tpadding: 0px;\r\n}\r\n\r\n.updraft_debugrow th {\r\n\tvertical-align: top;\r\n\tpadding-top: 6px;\r\n}\r\n\r\n.expertmode p {\r\n\tfont-size: 125%;\r\n}\r\n\r\n.expertmode .call-wp-action {\r\n\twidth: 300px;\r\n\theight: 22px;\r\n}\r\n\r\n.updraftplus-lock-advert {\r\n\tclear: left;\r\n\tmax-width: 600px;\r\n}\r\n\r\n.uncompressed-data {\r\n\tclear: left;\r\n\tmax-width: 600px;\r\n}\r\n\r\n.delete-old-directories {\r\n\tpadding: 8px;\r\n\tpadding-bottom: 12px;\r\n}\r\n\r\n.active-jobs {\r\n\tmin-width: 480px;\r\n\tmin-height: 48px;\r\n\ttext-align: center;\r\n\tmargin-top: 4px;\r\n\tpadding: 8px;\r\n\tborder: 1px solid;\r\n\tfloat: left;\r\n\tclear: left;\r\n}\r\n\r\n.job-id {\r\n\tmin-width: 480px;\r\n\tmargin-top: 4px;\r\n\tpadding: 8px;\r\n\tborder: 1px solid;\r\n\tclear: left;\r\n\tfloat: left;\r\n}\r\n\r\n.next-resumption {\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraft_percentage {\r\n\tz-index: -1;\r\n\tposition: absolute;\r\n\tleft: 0px;\r\n\ttop: 0px;\r\n\ttext-align: center;\r\n\tbackground-color: #F6A828;\r\n}\r\n\r\n.curstage {\r\n\tborder-radius: 4px;\r\n\tmargin-top: 8px;\r\n\tpadding-top: 4px;\r\n\tborder: 1px solid #AAA;\r\n\twidth: 100%;\r\n\theight: 22px;\r\n\tposition: relative;\r\n\ttext-align: center;\r\n\tfont-style: italic;\r\n}\r\n\r\n.retain-files {\r\n\twidth: 48px;\r\n}\r\n\r\n.backup-interval-description tr td div {\r\n\tmax-width: 670px;\r\n}\r\n\r\n#updraft-manualdecrypt-modal {\r\n\twidth: 85%;\r\n\tmargin: 6px;\r\n\tmargin-left: 100px;\r\n}\r\n\r\n.directory-permissions {\r\n\tfont-size: 110%;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.double-warning {\r\n\tborder: 1px solid;\r\n\tpadding: 6px;\r\n}\r\n\r\n.raw-backup-info {\r\n\tfont-style: italic;\r\n\tfont-weight: bold;\r\n\tfont-size: 120%;\r\n}\r\n\r\n.updraft_existingbackup_date {\r\n\twidth: 22%;\r\n\tmax-width: 140px;\r\n}\r\n\r\n.existing-backups-table {\r\n\tmargin-top: 20px;\r\n\tmargin-left: 20px;\r\n\twidth: 80%;\r\n}\r\n\r\n.tr-bottom-4 {\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.form-table .backup-date {\r\n\twidth: 172px;\r\n\tpadding: 0;\r\n\tpadding-left: 15px;\r\n}\r\n\r\n.form-table .backup-data {\r\n\twidth: 426px;\r\n\tpadding: 0;\r\n\tpadding-left: 15px;\r\n}\r\n\r\n.form-table .updraft_backup_actions {\r\n\twidth: 272px;\r\n\tpadding: 0 0 10px 15px;\r\n}\r\n\r\n.existing-date {\r\n\t-webkit-box-sizing: border-box;\r\n\t-moz-box-sizing: border-box;\r\n\tbox-sizing: border-box;\r\n\tmax-width: 140px;\r\n\twidth: 25%;\r\n}\r\n\r\n.line-break-tr {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.line-break-td {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.td-line-color {\r\n\theight: 2px;\r\n\tbackground-color: #888;\r\n}\r\n\r\n.raw-backup {\r\n\tmax-width: 140px;\r\n}\r\n\r\n.existing-backups-actions {\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.existing-backups-border {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.existing-backups-border > td {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.existing-backups-border > div {\r\n\theight: 2px;\r\n\tbackground-color: #AAA;\r\n}\r\n\r\n.updraft_existing_backup_date {\r\n\tmax-width: 140px;\r\n}\r\n\r\n.restore-button {\r\n\tmargin-right: 6px;\r\n\tfloat: left;\r\n\tclear: none;\r\n}\r\n\r\n.updraftplus-remove {\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n}\r\n\r\n.before-restore-button {\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.table-separator-tr {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.table-separator-td {\r\n\tmargin: 0px;\r\n\tpadding: 0px;\r\n}\r\n\r\n.end-of-table-div {\r\n\theight: 2px;\r\n\tbackground-color: #AAA;\r\n}\r\n\r\n.last-backup-job {\r\n\tpadding-top: 3% !important;\r\n}\r\n\r\n.line-height-03 {\r\n\tline-height: 0.3 !important;\r\n}\r\n\r\n.line-height-13 {\r\n\tline-height: 1.3 !important;\r\n}\r\n\r\n.line-height-23 {\r\n\tline-height: 2.3 !important;\r\n}\r\n\r\n#updraft_diskspaceused {\r\n\tcolor: #DF6926;\r\n}\r\n\r\n.updraft_premium_description_list {\r\n\ttext-align: left;\r\n}\r\n\r\n#updraft_delete_old_dirs_pagediv {\r\n\tpadding-bottom: 10px;\r\n}\r\n\r\n/*#updraft_lastlogmessagerow > td, #updraft_last_backup > td {\r\n\tpadding: 0;\r\n}*/\r\n\r\n.job-id {\r\n\tmargin: 0 auto;\r\n\twidth: 20%;\r\n}\r\n\r\n.updraft_all-files {\r\n\tcolor: #DF6926;\r\n}\r\n\r\n/* Time + scheduling add-on*/\r\n.fix-time {\r\n\twidth: 70px;\r\n}\r\n\r\n.retain-files {\r\n\twidth: 70px;\r\n}\r\n\r\n.number-input {\r\n\tmin-width: 50px;\r\n\tmax-width: 70px;\r\n}\r\n\r\n.additional-rule-width {\r\n\tmin-width: 60px;\r\n\tmax-width: 70px;\r\n}\r\n\r\n/* Add-ons */\r\n/* Want to fix the WordPress icons so that they fit inline with the text, and don't push everything out of place. */\r\n\r\n.dashicons {\r\n\tline-height: inherit;\r\n\tfont-size: inherit;\r\n}\r\n\r\n.addon-logo-150 {\r\n\tmargin-left: 30px;\r\n\tmargin-top: 33px;\r\n\theight: 125px;\r\n\twidth: 150px;\r\n}\r\n\r\n.margin-bottom-50 {\r\n\tmargin-bottom: 50px;\r\n}\r\n\r\n.premium-container {\r\n\twidth: 80%;\r\n}\r\n\r\n/* Main Header */\r\n\r\n.main-header {\r\n\tbackground-color: #DF6926;\r\n\theight: 200px;\r\n\twidth: 100%;\r\n}\r\n\r\n.button-add-to-cart {\r\n\tcolor: white;\r\n\tborder-color: white;\r\n\tfloat: none;\r\n\tmargin-right: 17px;\r\n}\r\n\r\n.button-add-to-cart:hover, .button-add-to-cart:focus, .button-add-to-cart:active {\r\n\tborder-color: #A0A5AA;\r\n\tcolor: #A0A5AA;\r\n}\r\n\r\n.addon-title {\r\n\tmargin-top: 25px;\r\n}\r\n\r\n.addon-text {\r\n\tmargin-top: 75px;\r\n}\r\n\r\n.image-main-div {\r\n\twidth: 25%;\r\n\tfloat: left;\r\n}\r\n\r\n.text-main-div {\r\n\twidth: 60%;\r\n\tfloat: left;\r\n\ttext-align: center;\r\n\tcolor: white;\r\n\tmargin-top: 16px;\r\n}\r\n\r\n.text-main-div-title {\r\n\tfont-weight: bold !important;\r\n\tcolor: white;\r\n\ttext-align: center;\r\n}\r\n\r\n.text-main-div-paragraph {\r\n\tcolor: white;\r\n}\r\n\r\n/* End main header */\r\n\r\n/* Vault icons */\r\n\r\n.updraftplus-vault-cta {\r\n\twidth: 100%;\r\n\ttext-align: center;\r\n\tmargin-bottom: 50px;\r\n}\r\n\r\n.updraftplus-vault-cta h1 {\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraftvault-buy {\r\n\twidth: 225px;\r\n\theight: 225px;\r\n\tborder: 2px solid #777;\r\n\tdisplay: inline-table;\r\n\tmargin: 0 auto;\r\n\tmargin-right: 50px;\r\n\tposition: relative;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault {\r\n\twidth: 275px;\r\n\theight: 275px;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault > a {\r\n\tright: 21%;\r\n\tfont-size: 16px;\r\n\tborder-width: 4px !important;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault > p {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.updraftvault-buy .button-purchase {\r\n\tright: 24%;\r\n\tmargin-left: 0;\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.updraftvault-buy hr {\r\n\theight: 2px;\r\n\tbackground-color: #777;\r\n\tmargin-top: 18px;\r\n}\r\n\r\n.right {\r\n\tmargin-right: 0px;\r\n}\r\n\r\n.updraftvault-buy .addon-logo-100 {\r\n\theight: 100px;\r\n\twidth: 125px;\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.updraftvault-buy .addon-logo-large {\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.updraftvault-buy .button-buy-vault {\r\n\tfont-size: 12px;\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tborder-width: 2px !important;\r\n\tposition: absolute;\r\n\tright: 29%;\r\n\tbottom: 2%;\r\n}\r\n\r\n.premium-addon-div .button-purchase {\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.updraftvault-buy .button-buy-vault:hover {\r\n\tborder-color: darkgrey;\r\n\tcolor: darkgrey;\r\n}\r\n\r\n/* End Vault icons */\r\n\r\n/* Premium addons */\r\n\r\n.premium-addons {\r\n\tmargin-top: 80px;\r\n\twidth: 100%;\r\n\tmargin: 0 auto;\r\n\tdisplay: table;\r\n}\r\n\r\n.addon-list {\r\n\t/* margin-left: 32px; */\r\n\tdisplay: table;\r\n\ttext-align: center;\r\n}\r\n\r\n.premium-addons h1 {\r\n\ttext-align: center;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.premium-addons p {\r\n\ttext-align: center;\r\n}\r\n\r\n.premium-addons .premium-addon-div {\r\n\twidth: 200px;\r\n\theight: 250px;\r\n\tborder: 2px solid #777;\r\n\tdisplay: inline-table;\r\n\tmargin: 0 auto;\r\n\tmargin-right: 25px;\r\n\tmargin-top: 25px;\r\n\ttext-align: center;\r\n\tposition: relative;\r\n}\r\n\r\n.premium-addons .premium-addon-div p {\r\n\tmargin-left: 2px;\r\n\tmargin-right: 2px;\r\n}\r\n\r\n.premium-addons .premium-addon-div img {\r\n\twidth: auto;\r\n\theight: 50px;\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .hr-alignment {\r\n\tmargin-top: 44px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .dropbox-logo {\r\n\theight: 39px;\r\n\twidth: 150px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .azure-logo, .premium-addons .premium-addon-div .onedrive-logo {\r\n\twidth: 75%;\r\n\theight: 24px;\r\n}\r\n\r\n.button-purchase {\r\n\tfont-size: 12px;\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tborder-width: 2px !important;\r\n\tposition: absolute;\r\n\tright: 25%;\r\n\tbottom: 2%;\r\n}\r\n\r\n.button-purchase:hover {\r\n\tcolor: darkgrey;\r\n\tborder-color: darkgrey;\r\n}\r\n\r\n.premium-addons .premium-addon-div hr {\r\n\theight: 2px;\r\n\tbackground-color: #777;\r\n\tmargin-top: 18px;\r\n}\r\n\r\n.premium-addon-div p {\r\n\tfont-style: italic;\r\n}\r\n\r\n.addon-list > .premium-addon-div > .onedrive-fix,\r\n.addon-list > .premium-addon-div > .azure-logo {\r\n\tmargin-top: 33px;\r\n}\r\n\r\n.addon-list > .premium-addon-div > .dropbox-fix {\r\n\tmargin-top: 18px;\r\n}\r\n\r\n/* End premium addons */\r\n\r\n\r\n/* Forgotton something (that is the name of the div rather than a mental note!) */\r\n\r\n.premium-forgotton-something {\r\n\tmargin-top: 5%;\r\n}\r\n\r\n.premium-forgotton-something h1 {\r\n\ttext-align: center;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.premium-forgotton-something p {\r\n\ttext-align: center;\r\n\tfont-weight: normal;\r\n}\r\n\r\n.premium-forgotton-something .button-faq {\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tmargin: 0 auto;\r\n\tdisplay: table;\r\n}\r\n\r\n.premium-forgotton-something .button-faq:hover {\r\n\tcolor: #777;\r\n\tborder-color: #777;\r\n}\r\n\r\n/* End of forgotton something */\r\n\r\n.updraftplusmethod.updraftvault #vaultlogo {\r\n\tpadding-left: 40px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault_primary_option {\r\n\tfloat: left;\r\n\twidth: 50%;\r\n\ttext-align: center;\r\n\tpadding-bottom: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault_primary_option div {\r\n\tclear: right;\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .clear-left {\r\n\tclear: left;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .padding-top-20px {\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .padding-top-14px {\r\n\tpadding-top: 14px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary, .updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary {\r\n\tfont-size: 18px !important;\r\n\tpadding-bottom: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_showoptions, .updraftplusmethod.updraftvault #updraftvault_connect {\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_connect input {\r\n\tmargin-right: 10px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_email {\r\n\twidth: 280px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_pass {\r\n\twidth: 200px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #vault-is-connected {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_default p {\r\n\tclear: left;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option {\r\n\tfloat: left;\r\n\twidth: 33%;\r\n\ttext-align: center;\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-size {\r\n\tfont-size: 200%;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-link {\r\n\tclear: both;\r\n\tfont-size: 150%;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-or {\r\n\tclear: both;\r\n\tfont-size: 115%;\r\n\tfont-style: italic;\r\n}\r\n\r\n/* Automation Backup Advert by B */\r\n.autobackup-image {\r\n/* \tdisplay: inline-block; */\r\n/*\tmin-width: 10%;\r\n\tmax-width:25%;*/\r\n/*\tfloat: left;*/\r\n\tclear: left;\r\n\tfloat: left;\r\n\twidth: 110px;\r\n\theight: 110px;\r\n}\r\n\r\n.autobackup-description {\r\n\twidth: 100%;\r\n}\r\n\r\n.advert-description {\r\n\tfloat: left;\r\n\tclear: right;\r\n\tpadding: 4px 10px 8px 10px;\r\n\twidth: 70%;\r\n\tclear: right;\r\n\tvertical-align: top;\r\n}\r\n\r\n.advert-btn {\r\n\tdisplay: inline-block;\r\n\tmin-width: 10%;\r\n\tvertical-align: top;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.advert-btn:first-of-type {\r\n\tmargin-top: 25px;\r\n}\r\n\r\n.advert-btn a {\r\n\tdisplay: block;\r\n\tcursor: pointer;\r\n}\r\n\r\na.btn-get-started {\r\n\tbackground: #FFF;\r\n\tborder: 2px solid #DF6926;\r\n\tborder-radius: 4px;\r\n\tcolor: #DF6926;\r\n\tdisplay: inline-block;\r\n\tmargin-left: 10px !important;\r\n\tmargin-bottom: 7px !important;\r\n\tfont-size: 18px !important;\r\n\tline-height: 20px;\r\n\tmin-height: 28px;\r\n\tpadding: 11px 10px 5px 10px;\r\n\ttext-transform: uppercase;\r\n\ttext-decoration: none;\r\n}\r\n\r\n.circle-dblarrow {\r\n\tborder: 1px solid #DF6926;\r\n\tborder-radius: 100%;\r\n\tdisplay: inline-block;\r\n\tfont-size: 17px;\r\n\tline-height: 17px;\r\n\tmargin-left: 5px;\r\n\twidth: 20px;\r\n\theight: 20px;\r\n\ttext-align: center;\r\n}\r\n\r\n@media screen and (max-width: 782px) {\r\n/*\t.advert-description {\r\n\t\tmin-width: 75%;\r\n\t\tmargin-bottom: 5px;\r\n\t}\r\n\r\n\t.advert-btn {\r\n\t\tmargin-top: 15px;\r\n\t\tmargin-left:86px;\r\n\t\tmin-width: 100%;\r\n\t}*/\r\n}\r\n\r\n/* End Automation Backup Advert by B */\r\n/* New Responsive Pretty Advanced Settings */\r\n.expertmode .advanced_settings_container {\r\n\theight: auto;\r\n\toverflow: hidden;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu {\r\n\tfloat: none;\r\n\tborder-bottom: 1px solid rgb(204, 204, 204);\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content {\r\n\tpadding-top: 5px;\r\n\tfloat: none;\r\n\twidth: auto;\r\n\toverflow: auto;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content h3 {\r\n\tmargin-top: 5px !important;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools {\r\n\tdisplay: none;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content .site_info {\r\n\tdisplay: block;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\r\n\tdisplay: inline-block;\r\n\tcursor: pointer;\r\n\tpadding: 5px;\r\n\tcolor: #000;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover {\r\n\tbackground-color: #EAEAEA;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .active {\r\n\tbackground-color: #3498DB;\r\n\tcolor: #FFF;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .active:hover {\r\n\tbackground-color: #72C5FD;\r\n\tcolor: #FFF;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content input#import_settings {\r\n\theight: auto !important;\r\n}\r\n\r\ndiv#updraft-wrap a {\r\n\tcursor: pointer !important;\r\n}\r\n\r\n@media screen and (min-width: 670px) {\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_menu {\r\n\t\tfloat: left;\r\n\t\twidth: 215px;\r\n\t\tborder-right: 1px solid rgb(204, 204, 204);\r\n\t\tborder-bottom: none;\r\n\t}\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_content {\r\n\t\tpadding-left: 10px;\r\n\t\tpadding-top: 0px;\r\n\t}\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\r\n\t\tdisplay: block;\r\n\t}\r\n\r\n}\r\n"]}
example-decrypt.php CHANGED
@@ -1,16 +1,15 @@
1
  <?php
2
-
3
  /*
4
-
5
  To dump the decrypted file using the given key on stdout, call:
6
 
7
- rijndael_decrypt_file( '../path/to/file.crypt' , 'mykey' );
8
 
9
  Thus, here are the easy instructions:
10
 
11
  1) Add a line like the above into this PHP file (not inside these comments, but outside)
12
  e.g.
13
- rijndael_decrypt_file( '/home/myself/myfile.crypt' , 'MYKEY' );
14
 
15
  2) Run this file (and make sure that includes/Rijndael.php is available, if you are moving this file around)
16
  e.g.
@@ -21,10 +20,17 @@ e.g.
21
  gunzip output.sql.gz
22
 
23
  */
24
-
 
 
 
 
 
 
 
25
  function rijndael_decrypt_file($file, $key) {
26
 
27
- require_once(dirname(__FILE__).'/vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php');
28
 
29
  $rijndael = new Crypt_Rijndael();
30
 
1
  <?php
2
+ // @codingStandardsIgnoreStart
3
  /*
 
4
  To dump the decrypted file using the given key on stdout, call:
5
 
6
+ rijndael_decrypt_file('../path/to/file.crypt' , 'mykey');
7
 
8
  Thus, here are the easy instructions:
9
 
10
  1) Add a line like the above into this PHP file (not inside these comments, but outside)
11
  e.g.
12
+ rijndael_decrypt_file('/home/myself/myfile.crypt' , 'MYKEY');
13
 
14
  2) Run this file (and make sure that includes/Rijndael.php is available, if you are moving this file around)
15
  e.g.
20
  gunzip output.sql.gz
21
 
22
  */
23
+ // @codingStandardsIgnoreEnd
24
+
25
+ /**
26
+ * An example of how to decrypt a file
27
+ *
28
+ * @param String $file Full path to file to decrypt
29
+ * @param String $key Key or salting to be used
30
+ */
31
  function rijndael_decrypt_file($file, $key) {
32
 
33
+ include_once(dirname(__FILE__).'/vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php');
34
 
35
  $rijndael = new Crypt_Rijndael();
36
 
includes/S3.php CHANGED
@@ -44,7 +44,6 @@ class UpdraftPlus_S3
44
  const ACL_AUTHENTICATED_READ = 'authenticated-read';
45
 
46
  const STORAGE_CLASS_STANDARD = 'STANDARD';
47
- const STORAGE_CLASS_RRS = 'REDUCED_REDUNDANCY';
48
 
49
  private static $__accessKey = null; // AWS Access key
50
  private static $__secretKey = null; // AWS Secret key
44
  const ACL_AUTHENTICATED_READ = 'authenticated-read';
45
 
46
  const STORAGE_CLASS_STANDARD = 'STANDARD';
 
47
 
48
  private static $__accessKey = null; // AWS Access key
49
  private static $__secretKey = null; // AWS Secret key
includes/S3compat.php CHANGED
@@ -1,49 +1,50 @@
1
  <?php
2
-
3
  // This is a compatibility library, using Amazon's official PHP SDK (PHP 5.3.3+), but providing the methods of Donovan Schönknecht's S3.php library (which we used to always use) - but we've only cared about making code-paths in UpdraftPlus work, so be careful if re-deploying this in another project. And, we have a few bits of UpdraftPlus-specific code below, for logging.
4
 
5
  /**
6
- *
7
- * Copyright (c) 2012-5, David Anderson (https://www.simbahosting.co.uk). All rights reserved.
8
- * Portions copyright (c) 2011, Donovan Schönknecht. All rights reserved.
9
- *
10
- * Redistribution and use in source and binary forms, with or without
11
- * modification, are permitted provided that the following conditions are met:
12
- *
13
- * - Redistributions of source code must retain the above copyright notice,
14
- * this list of conditions and the following disclaimer.
15
- * - Redistributions in binary form must reproduce the above copyright
16
- * notice, this list of conditions and the following disclaimer in the
17
- * documentation and/or other materials provided with the distribution.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
- * POSSIBILITY OF SUCH DAMAGE.
30
- *
31
- * Amazon S3 is a trademark of Amazon.com, Inc. or its affiliates.
32
- */
 
33
 
34
  require_once(UPDRAFTPLUS_DIR.'/vendor/autoload.php');
35
 
36
- # SDK uses namespacing - requires PHP 5.3 (actually the SDK states its requirements as 5.3.3)
37
  use Aws\S3;
38
 
39
  /**
40
- * Amazon S3 PHP class
41
- *
42
- * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
43
- * @version 0.5.0-dev
44
- */
45
- class UpdraftPlus_S3_Compat
46
- {
47
  // ACL flags
48
  const ACL_PRIVATE = 'private';
49
  const ACL_PUBLIC_READ = 'public-read';
@@ -51,57 +52,64 @@ class UpdraftPlus_S3_Compat
51
  const ACL_AUTHENTICATED_READ = 'authenticated-read';
52
 
53
  const STORAGE_CLASS_STANDARD = 'STANDARD';
54
- const STORAGE_CLASS_RRS = 'REDUCED_REDUNDANCY';
55
-
56
  private $config = array('scheme' => 'https', 'service' => 's3');
57
 
58
- private $__accessKey = null; // AWS Access key
59
- private $__secretKey = null; // AWS Secret key
60
- private $__sslKey = null;
 
 
61
 
62
  public $endpoint = 's3.amazonaws.com';
 
63
  public $proxy = null;
 
64
  private $region = 'us-east-1';
65
 
66
  // Added to cope with a particular situation where the user had no pernmission to check the bucket location, which necessitated using DNS-based endpoints.
67
  public $use_dns_bucket_name = false;
68
 
69
- public $useSSL = false;
70
- public $useSSLValidation = true;
71
- public $useExceptions = false;
 
 
72
 
73
- private $_serverSideEncryption = null;
74
 
75
  // SSL CURL SSL options - only needed if you are experiencing problems with your OpenSSL configuration
76
- public $sslKey = null;
77
- public $sslCert = null;
78
- public $sslCACert = null;
 
 
79
 
80
  /**
81
- * Constructor - if you're not using the class statically
82
- *
83
- * @param string $accessKey Access key
84
- * @param string $secretKey Secret key
85
- * @param boolean $useSSL Enable SSL
86
- * @param string|boolean $sslCACert - certificate authority (true = bundled Guzzle version; false = no verify, 'system' = system version; otherwise, path)
87
- * @return void
88
- */
89
- public function __construct($accessKey = null, $secretKey = null, $useSSL = true, $sslCACert = true, $endpoint = null)
90
- {
91
- if ($accessKey !== null && $secretKey !== null)
92
- $this->setAuth($accessKey, $secretKey);
93
-
94
- $this->useSSL = $useSSL;
95
- $this->sslCACert = $sslCACert;
96
 
97
  $opts = array(
98
- 'key' => $accessKey,
99
- 'secret' => $secretKey,
100
- 'scheme' => ($useSSL) ? 'https' : 'http',
101
  // Using signature v4 requires a region
102
- // 'signature' => 'v4',
103
- // 'region' => $this->region
104
- // 'endpoint' => 'somethingorother.s3.amazonaws.com'
105
  );
106
 
107
  if ($endpoint) {
@@ -114,55 +122,56 @@ class UpdraftPlus_S3_Compat
114
  $opts['region'] = $this->region;
115
  }
116
 
117
- if ($useSSL) $opts['ssl.certificate_authority'] = $sslCACert;
118
 
119
  $this->client = Aws\S3\S3Client::factory($opts);
120
  }
121
 
122
  /**
123
- * Set AWS access key and secret key
124
- *
125
- * @param string $accessKey Access key
126
- * @param string $secretKey Secret key
127
- * @return void
128
- */
129
- public function setAuth($accessKey, $secretKey)
130
- {
131
- $this->__accessKey = $accessKey;
132
- $this->__secretKey = $secretKey;
133
  }
134
 
135
- // Example value: 'AES256'. See: https://docs.aws.amazon.com/AmazonS3/latest/dev/SSEUsingPHPSDK.html
136
- // Or, false to turn off.
137
- public function setServerSideEncryption($value)
138
- {
 
 
 
139
  $this->_serverSideEncryption = $value;
140
  }
141
 
142
  /**
143
- * Set the service region
144
- *
145
- * @param string $region Region
146
- * @return void
147
- */
148
- public function setRegion($region)
149
- {
150
  $this->region = $region;
151
  if ('eu-central-1' == $region || 'cn-north-1' == $region) {
152
- // $this->config['signature'] = new Aws\S3\S3SignatureV4('s3');
153
- // $this->client->setConfig($this->config);
154
  }
155
  $this->client->setRegion($region);
156
  }
157
 
158
  /**
159
- * Set the service endpoint
160
- *
161
- * @param string $host Hostname
162
- * @return void
163
- */
164
- public function setEndpoint($host, $region)
165
- {
166
  $this->endpoint = $host;
167
  $this->region = $region;
168
  $this->config['endpoint_provider'] = $this->return_provider();
@@ -173,7 +182,7 @@ class UpdraftPlus_S3_Compat
173
  $our_endpoints = array(
174
  'endpoint' => $this->endpoint
175
  );
176
- if ($this->region == 'eu-central-1' || $this->region == 'cn-north-1') $our_endpoints['signatureVersion'] = 'v4';
177
  $endpoints = array(
178
  'version' => 2,
179
  'endpoints' => array(
@@ -184,91 +193,87 @@ class UpdraftPlus_S3_Compat
184
  }
185
 
186
  /**
187
- * Set SSL on or off
188
- *
189
- * @param boolean $enabled SSL enabled
190
- * @param boolean $validate SSL certificate validation
191
- * @return void
192
- */
193
- // This code relies upon the particular pattern of SSL options-setting in s3.php in UpdraftPlus
194
- public function setSSL($enabled, $validate = true)
195
- {
196
- $this->useSSL = $enabled;
197
- $this->useSSLValidation = $validate;
198
  // http://guzzle.readthedocs.org/en/latest/clients.html#verify
199
  if ($enabled) {
200
 
201
  // Do nothing - in UpdraftPlus, setSSLAuth will be called later, and we do the calls there
202
 
203
- // $verify_peer = ($validate) ? true : false;
204
- // $verify_host = ($validate) ? 2 : 0;
205
  //
206
- // $this->config['scheme'] = 'https';
207
- // $this->client->setConfig($this->config);
208
  //
209
- // $this->client->setSslVerification($validate, $verify_peer, $verify_host);
210
 
211
 
212
  } else {
213
  $this->config['scheme'] = 'http';
214
- // $this->client->setConfig($this->config);
215
  }
216
  $this->client->setConfig($this->config);
217
  }
218
 
219
- public function getuseSSL()
220
- {
221
- return $this->useSSL;
222
  }
223
 
224
  /**
225
- * Set SSL client certificates (experimental)
226
- *
227
- * @param string $sslCert SSL client certificate
228
- * @param string $sslKey SSL client key
229
- * @param string $sslCACert SSL CA cert (only required if you are having problems with your system CA cert)
230
- * @return void
231
- */
232
- public function setSSLAuth($sslCert = null, $sslKey = null, $sslCACert = null)
233
- {
234
- if (!$this->useSSL) return;
235
-
236
- if (!$this->useSSLValidation) {
237
  $this->client->setSslVerification(false);
238
  } else {
239
- if (!$sslCACert) {
240
  $client = $this->client;
241
  $this->config[$client::SSL_CERT_AUTHORITY] = false;
242
  $this->client->setConfig($this->config);
243
  } else {
244
- $this->client->setSslVerification(realpath($sslCACert), true, 2);
245
  }
246
  }
247
 
248
- // $this->client->setSslVerification($sslCACert, $verify_peer, $verify_host);
249
- // $this->config['ssl.certificate_authority'] = $sslCACert;
250
- // $this->client->setConfig($this->config);
251
  }
252
 
253
  /**
254
- * Set proxy information
255
- *
256
- * @param string $host Proxy hostname and port (localhost:1234)
257
- * @param string $user Proxy username
258
- * @param string $pass Proxy password
259
- * @param constant $type CURL proxy type
260
- * @return void
261
- */
262
- public function setProxy($host, $user = null, $pass = null, $type = CURLPROXY_SOCKS5, $port = null)
263
- {
264
 
265
  $this->proxy = array('host' => $host, 'type' => $type, 'user' => $user, 'pass' => $pass, 'port' => $port);
266
 
267
  if (!$host) return;
268
 
269
- $wp_proxy = new WP_HTTP_Proxy();
270
- if ($wp_proxy->send_through_proxy('https://s3.amazonaws.com'))
271
- {
272
 
273
  global $updraftplus;
274
  $updraftplus->log("setProxy: host=$host, user=$user, port=$port");
@@ -291,19 +296,23 @@ class UpdraftPlus_S3_Compat
291
  }
292
 
293
  /**
294
- * Set the error mode to exceptions
295
- *
296
- * @param boolean $enabled Enable exceptions
297
- * @return void
298
- */
299
- public function setExceptions($enabled = true)
300
- {
301
  $this->useExceptions = $enabled;
302
  }
303
 
304
- // A no-op in this compatibility layer (for now - not yet found a use)...
305
- public function useDNSBucketName($use = true, $bucket = '')
306
- {
 
 
 
 
 
307
  $this->use_dns_bucket_name = $use;
308
  if ($use && $bucket) {
309
  $this->setEndpoint($bucket.'.s3.amazonaws.com', $this->region);
@@ -311,31 +320,29 @@ class UpdraftPlus_S3_Compat
311
  return true;
312
  }
313
 
314
- /*
315
- * Get contents for a bucket
316
- *
317
- * If maxKeys is null this method will loop through truncated result sets
318
- *
319
- * @param string $bucket Bucket name
320
- * @param string $prefix Prefix
321
- * @param string $marker Marker (last file listed)
322
- * @param string $maxKeys Max keys (maximum number of keys to return)
323
- * @param string $delimiter Delimiter
324
- * @param boolean $returnCommonPrefixes Set to true to return CommonPrefixes
325
- * @return array | false
326
- */
327
- // N.B. UpdraftPlus does not use the $delimiter or $returnCommonPrefixes parameters (nor set $prefix or $marker to anything other than null)
328
- // $returnCommonPrefixes is not implemented below
329
- public function getBucket($bucket, $prefix = null, $marker = null, $maxKeys = null, $delimiter = null, $returnCommonPrefixes = false)
330
- {
331
  try {
332
- if ($maxKeys == 0) $maxKeys = null;
333
 
334
  $vars = array('Bucket' => $bucket);
335
- if ($prefix !== null && $prefix !== '') $vars['Prefix'] = $prefix;
336
- if ($marker !== null && $marker !== '') $vars['Marker'] = $marker;
337
- if ($maxKeys !== null && $maxKeys !== '') $vars['MaxKeys'] = $maxKeys;
338
- if ($delimiter !== null && $delimiter !== '') $vars['Delimiter'] = $delimiter;
339
  $result = $this->client->listObjects($vars);
340
 
341
  if (!is_a($result, 'Guzzle\Service\Resource\Model')) {
@@ -343,53 +350,50 @@ class UpdraftPlus_S3_Compat
343
  }
344
 
345
  $results = array();
346
- $nextMarker = null;
347
  // http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingPHP.html
348
  // UpdraftPlus does not use the 'hash' result
349
  if (empty($result['Contents'])) $result['Contents'] = array();
350
- foreach ($result['Contents'] as $c)
351
- {
352
- $results[(string)$c['Key']] = array(
353
- 'name' => (string)$c['Key'],
354
- 'time' => strtotime((string)$c['LastModified']),
355
- 'size' => (int)$c['Size'],
356
- // 'hash' => trim((string)$c['ETag'])
357
- // 'hash' => substr((string)$c['ETag'], 1, -1)
358
  );
359
- $nextMarker = (string)$c['Key'];
360
  }
361
 
362
  if (isset($result['IsTruncated']) && empty($result['IsTruncated'])) return $results;
363
 
364
- if (isset($result['NextMarker'])) $nextMarker = (string)$result['NextMarker'];
365
 
366
- // Loop through truncated results if maxKeys isn't specified
367
- if ($maxKeys == null && $nextMarker !== null && !empty($result['IsTruncated']))
368
- do
369
- {
370
- $vars['Marker'] = $nextMarker;
371
  $result = $this->client->listObjects($vars);
372
 
373
  if (!is_a($result, 'Guzzle\Service\Resource\Model') || empty($result['Contents'])) break;
374
 
375
- foreach ($result['Contents'] as $c)
376
- {
377
- $results[(string)$c['Key']] = array(
378
- 'name' => (string)$c['Key'],
379
- 'time' => strtotime((string)$c['LastModified']),
380
- 'size' => (int)$c['Size'],
381
- // 'hash' => trim((string)$c['ETag'])
382
- // 'hash' => substr((string)$c['ETag'], 1, -1)
383
  );
384
- $nextMarker = (string)$c['Key'];
385
  }
386
 
387
- // if ($returnCommonPrefixes && isset($response->body, $response->body->CommonPrefixes))
388
- // foreach ($response->body->CommonPrefixes as $c)
389
- // $results[(string)$c->Prefix] = array('prefix' => (string)$c->Prefix);
390
 
391
  if (isset($response['NextMarker']))
392
- $nextMarker = (string)$response['NextMarker'];
393
 
394
  } while (is_a($result, 'Guzzle\Service\Resource\Model') && !empty($result['Contents']) && !empty($result['IsTruncated']));
395
 
@@ -404,7 +408,12 @@ class UpdraftPlus_S3_Compat
404
  }
405
  }
406
 
407
- // This is crude - nothing is returned
 
 
 
 
 
408
  public function waitForBucket($bucket) {
409
  try {
410
  $this->client->waitUntil('BucketExists', array('Bucket' => $bucket));
@@ -418,15 +427,14 @@ class UpdraftPlus_S3_Compat
418
  }
419
 
420
  /**
421
- * Put a bucket
422
- *
423
- * @param string $bucket Bucket name
424
- * @param constant $acl ACL flag
425
- * @param string $location Set as "EU" to create buckets hosted in Europe
426
- * @return boolean
427
- */
428
- public function putBucket($bucket, $acl = self::ACL_PRIVATE, $location = false)
429
- {
430
  if (!$location) {
431
  $location = $this->region;
432
  } else {
@@ -455,24 +463,23 @@ class UpdraftPlus_S3_Compat
455
  }
456
 
457
  /**
458
- * Initiate a multi-part upload (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadInitiate.html)
459
- *
460
- * @param string $bucket Bucket name
461
- * @param string $uri Object URI
462
- * @param constant $acl ACL constant
463
- * @param array $metaHeaders Array of x-amz-meta-* headers
464
- * @param array $requestHeaders Array of request headers or content type as a string
465
- * @param constant $storageClass Storage class constant
466
- * @return string | false
467
- */
468
- public function initiateMultipartUpload ($bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(), $storageClass = self::STORAGE_CLASS_STANDARD)
469
- {
470
  $vars = array(
471
  'ACL' => $acl,
472
  'Bucket' => $bucket,
473
  'Key' => $uri,
474
- 'Metadata' => $metaHeaders,
475
- 'StorageClass' => $storageClass
476
  );
477
 
478
  $vars['ContentType'] = ('.gz' == strtolower(substr($uri, -3, 3))) ? 'application/octet-stream' : 'application/zip';
@@ -493,41 +500,40 @@ class UpdraftPlus_S3_Compat
493
  }
494
 
495
  /**
496
- /* Upload a part of a multi-part set (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadUploadPart.html)
497
- * The chunk is read into memory, so make sure that you have enough (or patch this function to work another way!)
498
- *
499
- * @param string $bucket Bucket name
500
- * @param string $uri Object URI
501
- * @param string $uploadId uploadId returned previously from initiateMultipartUpload
502
- * @param integer $partNumber sequential part number to upload
503
- * @param string $filePath file to upload content from
504
- * @param integer $partSize number of bytes in each part (though final part may have fewer) - pass the same value each time (for this particular upload) - default 5Mb (which is Amazon's minimum)
505
- * @return string (ETag) | false
506
- */
507
- public function uploadPart ($bucket, $uri, $uploadId, $filePath, $partNumber, $partSize = 5242880)
508
- {
509
  $vars = array(
510
  'Bucket' => $bucket,
511
  'Key' => $uri,
512
- 'PartNumber' => $partNumber,
513
- 'UploadId' => $uploadId
514
  );
515
 
516
  // Where to begin
517
- $fileOffset = ($partNumber - 1 ) * $partSize;
518
 
519
  // Download the smallest of the remaining bytes and the part size
520
- $fileBytes = min(filesize($filePath) - $fileOffset, $partSize);
521
- if ($fileBytes < 0) $fileBytes = 0;
522
 
523
- // $rest->setHeader('Content-Type', 'application/octet-stream');
524
  $data = "";
525
 
526
- if ($handle = fopen($filePath, "rb")) {
527
- if ($fileOffset >0) fseek($handle, $fileOffset);
528
  $bytes_read = 0;
529
- while ($fileBytes>0 && $read = fread($handle, max($fileBytes, 131072))) {
530
- $fileBytes = $fileBytes - strlen($read);
531
  $bytes_read += strlen($read);
532
  $data .= $read;
533
  }
@@ -553,20 +559,19 @@ class UpdraftPlus_S3_Compat
553
  }
554
 
555
  /**
556
- * Complete a multi-part upload (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadComplete.html)
557
- *
558
- * @param string $bucket Bucket name
559
- * @param string $uri Object URI
560
- * @param string $uploadId uploadId returned previously from initiateMultipartUpload
561
- * @param array $parts an ordered list of eTags of previously uploaded parts from uploadPart
562
- * @return boolean
563
- */
564
- public function completeMultipartUpload ($bucket, $uri, $uploadId, $parts)
565
- {
566
  $vars = array(
567
  'Bucket' => $bucket,
568
  'Key' => $uri,
569
- 'UploadId' => $uploadId
570
  );
571
 
572
  $partno = 1;
@@ -592,29 +597,29 @@ class UpdraftPlus_S3_Compat
592
  }
593
 
594
  /**
595
- * Put an object from a file (legacy function)
596
- *
597
- * @param string $file Input file path
598
- * @param string $bucket Bucket name
599
- * @param string $uri Object URI
600
- * @param constant $acl ACL constant
601
- * @param array $metaHeaders Array of x-amz-meta-* headers
602
- * @param string $contentType Content type
603
- * @return boolean
604
- */
605
- public function putObjectFile($file, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = null, $storageClass = self::STORAGE_CLASS_STANDARD)
606
- {
607
  try {
608
  $options = array(
609
  'Bucket' => $bucket,
610
  'Key' => $uri,
611
  'SourceFile' => $file,
612
- 'StorageClass' => $storageClass,
613
  'ACL' => $acl
614
  );
615
- if ($contentType) $options['ContentType'] = $contentType;
616
  if (!empty($this->_serverSideEncryption)) $options['ServerSideEncryption'] = $this->_serverSideEncryption;
617
- if (!empty($metaHeaders)) $options['Metadata'] = $metaHeaders;
618
  $result = $this->client->putObject($options);
619
  if (is_object($result) && method_exists($result, 'get') && '' != $result->get('RequestId')) return true;
620
  } catch (Exception $e) {
@@ -629,25 +634,24 @@ class UpdraftPlus_S3_Compat
629
 
630
 
631
  /**
632
- * Put an object from a string (legacy function)
633
- *
634
- * @param string $string Input data
635
- * @param string $bucket Bucket name
636
- * @param string $uri Object URI
637
- * @param constant $acl ACL constant
638
- * @param array $metaHeaders Array of x-amz-meta-* headers
639
- * @param string $contentType Content type
640
- * @return boolean
641
- */
642
- // Only the first 3 parameters vary in UpdraftPlus
643
- public function putObjectString($string, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = 'text/plain')
644
- {
645
  try {
646
  $result = $this->client->putObject(array(
647
  'Bucket' => $bucket,
648
  'Key' => $uri,
649
  'Body' => $string,
650
- 'ContentType' => $contentType
651
  ));
652
  if (is_object($result) && method_exists($result, 'get') && '' != $result->get('RequestId')) return true;
653
  } catch (Exception $e) {
@@ -662,34 +666,33 @@ class UpdraftPlus_S3_Compat
662
 
663
 
664
  /**
665
- * Get an object
666
- *
667
- * @param string $bucket Bucket name
668
- * @param string $uri Object URI
669
- * @param mixed $saveTo Filename or resource to write to
670
- * @param mixed $resume - if $saveTo is a resource, then this is either false or the value for a Range: header; otherwise, a boolean, indicating whether to resume if possible.
671
- * @return mixed
672
- */
673
- public function getObject($bucket, $uri, $saveTo = false, $resume = false)
674
- {
675
  try {
676
  // SaveAs: "Specify where the contents of the object should be downloaded. Can be the path to a file, a resource returned by fopen, or a Guzzle\Http\EntityBodyInterface object." - http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.S3Client.html#_getObject
677
 
678
  $range_header = false;
679
- if (is_resource($saveTo)) {
680
- $fp = $saveTo;
681
  if (!is_bool($resume)) $range_header = $resume;
682
- } elseif (file_exists($saveTo)) {
683
- if ($resume && ($fp = @fopen($saveTo, 'ab')) !== false) {
684
- $range_header = "bytes=".filesize($saveTo).'-';
685
  } else {
686
- throw new Exception('Unable to open save file for writing: '.$saveTo);
687
  }
688
  } else {
689
- if (($fp = @fopen($saveTo, 'wb')) !== false) {
690
  $range_header = false;
691
  } else {
692
- throw new Exception('Unable to open save file for writing: '.$saveTo);
693
  }
694
  }
695
 
@@ -715,13 +718,12 @@ class UpdraftPlus_S3_Compat
715
 
716
 
717
  /**
718
- * Get a bucket's location
719
- *
720
- * @param string $bucket Bucket name
721
- * @return string | false
722
- */
723
- public function getBucketLocation($bucket)
724
- {
725
  try {
726
  $result = $this->client->getBucketLocation(array('Bucket' => $bucket));
727
  $location = $result->get('Location');
@@ -743,14 +745,13 @@ class UpdraftPlus_S3_Compat
743
  }
744
 
745
  /**
746
- * Delete an object
747
- *
748
- * @param string $bucket Bucket name
749
- * @param string $uri Object URI
750
- * @return boolean
751
- */
752
- public function deleteObject($bucket, $uri)
753
- {
754
  try {
755
  $result = $this->client->deleteObject(array(
756
  'Bucket' => $bucket,
@@ -767,8 +768,7 @@ class UpdraftPlus_S3_Compat
767
  return false;
768
  }
769
 
770
- public function setCORS($policy)
771
- {
772
  try {
773
  $cors = $this->client->putBucketCors($policy);
774
  if (is_object($cors) && method_exists($cors, 'get') && '' != $cors->get('RequestId')) return true;
@@ -782,6 +782,4 @@ class UpdraftPlus_S3_Compat
782
  return false;
783
 
784
  }
785
-
786
  }
787
-
1
  <?php
2
+ // @codingStandardsIgnoreStart
3
  // This is a compatibility library, using Amazon's official PHP SDK (PHP 5.3.3+), but providing the methods of Donovan Schönknecht's S3.php library (which we used to always use) - but we've only cared about making code-paths in UpdraftPlus work, so be careful if re-deploying this in another project. And, we have a few bits of UpdraftPlus-specific code below, for logging.
4
 
5
  /**
6
+ *
7
+ * Copyright (c) 2012-5, David Anderson (https://www.simbahosting.co.uk). All rights reserved.
8
+ * Portions copyright (c) 2011, Donovan Schönknecht. All rights reserved.
9
+ *
10
+ * Redistribution and use in source and binary forms, with or without
11
+ * modification, are permitted provided that the following conditions are met:
12
+ *
13
+ * - Redistributions of source code must retain the above copyright notice,
14
+ * this list of conditions and the following disclaimer.
15
+ * - Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in the
17
+ * documentation and/or other materials provided with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ * POSSIBILITY OF SUCH DAMAGE.
30
+ *
31
+ * Amazon S3 is a trademark of Amazon.com, Inc. or its affiliates.
32
+ */
33
+ // @codingStandardsIgnoreEnd
34
 
35
  require_once(UPDRAFTPLUS_DIR.'/vendor/autoload.php');
36
 
37
+ // SDK uses namespacing - requires PHP 5.3 (actually the SDK states its requirements as 5.3.3)
38
  use Aws\S3;
39
 
40
  /**
41
+ * Amazon S3 PHP class
42
+ * http://undesigned.org.za/2007/10/22/amazon-s3-php-cla
43
+ *
44
+ * @version Release: 0.5.0-dev
45
+ */
46
+ class UpdraftPlus_S3_Compat {
47
+
48
  // ACL flags
49
  const ACL_PRIVATE = 'private';
50
  const ACL_PUBLIC_READ = 'public-read';
52
  const ACL_AUTHENTICATED_READ = 'authenticated-read';
53
 
54
  const STORAGE_CLASS_STANDARD = 'STANDARD';
55
+
 
56
  private $config = array('scheme' => 'https', 'service' => 's3');
57
 
58
+ private $__access_key = null; // AWS Access key
59
+
60
+ private $__secret_key = null; // AWS Secret key
61
+
62
+ private $__ssl_key = null;
63
 
64
  public $endpoint = 's3.amazonaws.com';
65
+
66
  public $proxy = null;
67
+
68
  private $region = 'us-east-1';
69
 
70
  // Added to cope with a particular situation where the user had no pernmission to check the bucket location, which necessitated using DNS-based endpoints.
71
  public $use_dns_bucket_name = false;
72
 
73
+ public $use_ssl = false;
74
+
75
+ public $use_ssl_validation = true;
76
+
77
+ public $use_exceptions = false;
78
 
79
+ private $_server_side_encryption = null;
80
 
81
  // SSL CURL SSL options - only needed if you are experiencing problems with your OpenSSL configuration
82
+ public $ssl_key = null;
83
+
84
+ public $ssl_cert = null;
85
+
86
+ public $ssl_ca_cert = null;
87
 
88
  /**
89
+ * Constructor - if you're not using the class statically
90
+ *
91
+ * @param string $access_key Access key
92
+ * @param string $secret_key Secret key
93
+ * @param boolean $use_ssl Enable SSL
94
+ * @param string|boolean $ssl_ca_cert Certificate authority (true = bundled Guzzle version; false = no verify, 'system' = system version; otherwise, path)
95
+ * @param string $endpoint Endpoint
96
+ * @return void
97
+ */
98
+ public function __construct($access_key = null, $secret_key = null, $use_ssl = true, $ssl_ca_cert = true, $endpoint = null) {
99
+ if (null !== $access_key && null !== $secret_key)
100
+ $this->setAuth($access_key, $secret_key);
101
+
102
+ $this->use_ssl = $use_ssl;
103
+ $this->ssl_ca_cert = $ssl_ca_cert;
104
 
105
  $opts = array(
106
+ 'key' => $access_key,
107
+ 'secret' => $secret_key,
108
+ 'scheme' => ($use_ssl) ? 'https' : 'http',
109
  // Using signature v4 requires a region
110
+ // 'signature' => 'v4',
111
+ // 'region' => $this->region
112
+ // 'endpoint' => 'somethingorother.s3.amazonaws.com'
113
  );
114
 
115
  if ($endpoint) {
122
  $opts['region'] = $this->region;
123
  }
124
 
125
+ if ($use_ssl) $opts['ssl.certificate_authority'] = $ssl_ca_cert;
126
 
127
  $this->client = Aws\S3\S3Client::factory($opts);
128
  }
129
 
130
  /**
131
+ * Set AWS access key and secret key
132
+ *
133
+ * @param string $access_key Access key
134
+ * @param string $secret_key Secret key
135
+ * @return void
136
+ */
137
+ public function setAuth($access_key, $secret_key) {
138
+ $this->__access_key = $access_key;
139
+ $this->__secret_key = $secret_key;
 
140
  }
141
 
142
+ /**
143
+ * Example value: 'AES256'. See: https://docs.aws.amazon.com/AmazonS3/latest/dev/SSEUsingPHPSDK.html
144
+ * Or, false to turn off.
145
+ *
146
+ * @param boolean $value Set if Value
147
+ */
148
+ public function setServerSideEncryption($value) {
149
  $this->_serverSideEncryption = $value;
150
  }
151
 
152
  /**
153
+ * Set the service region
154
+ *
155
+ * @param string $region Region
156
+ * @return void
157
+ */
158
+ public function setRegion($region) {
 
159
  $this->region = $region;
160
  if ('eu-central-1' == $region || 'cn-north-1' == $region) {
161
+ // $this->config['signature'] = new Aws\S3\S3SignatureV4('s3');
162
+ // $this->client->setConfig($this->config);
163
  }
164
  $this->client->setRegion($region);
165
  }
166
 
167
  /**
168
+ * Set the service endpoint
169
+ *
170
+ * @param string $host Hostname
171
+ * @param string $region Region
172
+ * @return void
173
+ */
174
+ public function setEndpoint($host, $region) {
175
  $this->endpoint = $host;
176
  $this->region = $region;
177
  $this->config['endpoint_provider'] = $this->return_provider();
182
  $our_endpoints = array(
183
  'endpoint' => $this->endpoint
184
  );
185
+ if ('eu-central-1' == $this->region || 'cn-north-1' == $this->region) $our_endpoints['signatureVersion'] = 'v4';
186
  $endpoints = array(
187
  'version' => 2,
188
  'endpoints' => array(
193
  }
194
 
195
  /**
196
+ * Set SSL on or off
197
+ * This code relies upon the particular pattern of SSL options-setting in s3.php in UpdraftPlus
198
+ *
199
+ * @param boolean $enabled SSL enabled
200
+ * @param boolean $validate SSL certificate validation
201
+ * @return void
202
+ */
203
+ public function setSSL($enabled, $validate = true) {
204
+ $this->use_ssl = $enabled;
205
+ $this->use_ssl_validation = $validate;
 
206
  // http://guzzle.readthedocs.org/en/latest/clients.html#verify
207
  if ($enabled) {
208
 
209
  // Do nothing - in UpdraftPlus, setSSLAuth will be called later, and we do the calls there
210
 
211
+ // $verify_peer = ($validate) ? true : false;
212
+ // $verify_host = ($validate) ? 2 : 0;
213
  //
214
+ // $this->config['scheme'] = 'https';
215
+ // $this->client->setConfig($this->config);
216
  //
217
+ // $this->client->setSslVerification($validate, $verify_peer, $verify_host);
218
 
219
 
220
  } else {
221
  $this->config['scheme'] = 'http';
222
+ // $this->client->setConfig($this->config);
223
  }
224
  $this->client->setConfig($this->config);
225
  }
226
 
227
+ public function getuseSSL() {
228
+ return $this->use_ssl;
 
229
  }
230
 
231
  /**
232
+ * Set SSL client certificates (experimental)
233
+ *
234
+ * @param string $ssl_cert SSL client certificate
235
+ * @param string $ssl_key SSL client key
236
+ * @param string $ssl_ca_cert SSL CA cert (only required if you are having problems with your system CA cert)
237
+ * @return void
238
+ */
239
+ public function setSSLAuth($ssl_cert = null, $ssl_key = null, $ssl_ca_cert = null) {
240
+ if (!$this->use_ssl) return;
241
+
242
+ if (!$this->use_ssl_validation) {
 
243
  $this->client->setSslVerification(false);
244
  } else {
245
+ if (!$ssl_ca_cert) {
246
  $client = $this->client;
247
  $this->config[$client::SSL_CERT_AUTHORITY] = false;
248
  $this->client->setConfig($this->config);
249
  } else {
250
+ $this->client->setSslVerification(realpath($ssl_ca_cert), true, 2);
251
  }
252
  }
253
 
254
+ // $this->client->setSslVerification($ssl_ca_cert, $verify_peer, $verify_host);
255
+ // $this->config['ssl.certificate_authority'] = $ssl_ca_cert;
256
+ // $this->client->setConfig($this->config);
257
  }
258
 
259
  /**
260
+ * Set proxy information
261
+ *
262
+ * @param string $host Proxy hostname and port (localhost:1234)
263
+ * @param string $user Proxy username
264
+ * @param string $pass Proxy password
265
+ * @param constant $type CURL proxy type
266
+ * @param integer $port Port number
267
+ * @return void
268
+ */
269
+ public function setProxy($host, $user = null, $pass = null, $type = CURLPROXY_SOCKS5, $port = null) {
270
 
271
  $this->proxy = array('host' => $host, 'type' => $type, 'user' => $user, 'pass' => $pass, 'port' => $port);
272
 
273
  if (!$host) return;
274
 
275
+ $wp_proxy = new WP_HTTP_Proxy();
276
+ if ($wp_proxy->send_through_proxy('https://s3.amazonaws.com')) {
 
277
 
278
  global $updraftplus;
279
  $updraftplus->log("setProxy: host=$host, user=$user, port=$port");
296
  }
297
 
298
  /**
299
+ * Set the error mode to exceptions
300
+ *
301
+ * @param boolean $enabled Enable exceptions
302
+ * @return void
303
+ */
304
+ public function setExceptions($enabled = true) {
 
305
  $this->useExceptions = $enabled;
306
  }
307
 
308
+ /**
309
+ * A no-op in this compatibility layer (for now - not yet found a use)...
310
+ *
311
+ * @param boolean $use Bucket use
312
+ * @param string $bucket Bucket name
313
+ * @return boolean
314
+ */
315
+ public function useDNSBucketName($use = true, $bucket = '') {
316
  $this->use_dns_bucket_name = $use;
317
  if ($use && $bucket) {
318
  $this->setEndpoint($bucket.'.s3.amazonaws.com', $this->region);
320
  return true;
321
  }
322
 
323
+ /**
324
+ * Get contents for a bucket
325
+ * If max_keys is null this method will loop through truncated result sets
326
+ * N.B. UpdraftPlus does not use the $delimiter or $return_common_prefixes parameters (nor set $prefix or $marker to anything other than null)
327
+ * $return_common_prefixes is not implemented below
328
+ *
329
+ * @param string $bucket Bucket name
330
+ * @param string $prefix Prefix
331
+ * @param string $marker Marker (last file listed)
332
+ * @param string $max_keys Max keys (maximum number of keys to return)
333
+ * @param string $delimiter Delimiter
334
+ * @param boolean $return_common_prefixes Set to true to return CommonPrefixes
335
+ * @return array
336
+ */
337
+ public function getBucket($bucket, $prefix = null, $marker = null, $max_keys = null, $delimiter = null, $return_common_prefixes = false) {
 
 
338
  try {
339
+ if (0 == $max_keys) $max_keys = null;
340
 
341
  $vars = array('Bucket' => $bucket);
342
+ if (null !== $prefix && '' !== $prefix) $vars['Prefix'] = $prefix;
343
+ if (null !== $marker && '' !== $marker) $vars['Marker'] = $marker;
344
+ if (null !== $max_keys && '' !== $max_keys) $vars['MaxKeys'] = $max_keys;
345
+ if (null !== $delimiter && '' !== $delimiter) $vars['Delimiter'] = $delimiter;
346
  $result = $this->client->listObjects($vars);
347
 
348
  if (!is_a($result, 'Guzzle\Service\Resource\Model')) {
350
  }
351
 
352
  $results = array();
353
+ $next_marker = null;
354
  // http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingPHP.html
355
  // UpdraftPlus does not use the 'hash' result
356
  if (empty($result['Contents'])) $result['Contents'] = array();
357
+ foreach ($result['Contents'] as $c) {
358
+ $results[(string) $c['Key']] = array(
359
+ 'name' => (string) $c['Key'],
360
+ 'time' => strtotime((string) $c['LastModified']),
361
+ 'size' => (int) $c['Size'],
362
+ // 'hash' => trim((string)$c['ETag'])
363
+ // 'hash' => substr((string)$c['ETag'], 1, -1)
 
364
  );
365
+ $next_marker = (string) $c['Key'];
366
  }
367
 
368
  if (isset($result['IsTruncated']) && empty($result['IsTruncated'])) return $results;
369
 
370
+ if (isset($result['NextMarker'])) $next_marker = (string) $result['NextMarker'];
371
 
372
+ // Loop through truncated results if max_keys isn't specified
373
+ if (null == $max_keys && null !== $next_marker && !empty($result['IsTruncated']))
374
+ do {
375
+ $vars['Marker'] = $next_marker;
 
376
  $result = $this->client->listObjects($vars);
377
 
378
  if (!is_a($result, 'Guzzle\Service\Resource\Model') || empty($result['Contents'])) break;
379
 
380
+ foreach ($result['Contents'] as $c) {
381
+ $results[(string) $c['Key']] = array(
382
+ 'name' => (string) $c['Key'],
383
+ 'time' => strtotime((string) $c['LastModified']),
384
+ 'size' => (int) $c['Size'],
385
+ // 'hash' => trim((string)$c['ETag'])
386
+ // 'hash' => substr((string)$c['ETag'], 1, -1)
 
387
  );
388
+ $next_marker = (string) $c['Key'];
389
  }
390
 
391
+ // if ($return_common_prefixes && isset($response->body, $response->body->CommonPrefixes))
392
+ // foreach ($response->body->CommonPrefixes as $c)
393
+ // $results[(string)$c->Prefix] = array('prefix' => (string)$c->Prefix);
394
 
395
  if (isset($response['NextMarker']))
396
+ $next_marker = (string) $response['NextMarker'];
397
 
398
  } while (is_a($result, 'Guzzle\Service\Resource\Model') && !empty($result['Contents']) && !empty($result['IsTruncated']));
399
 
408
  }
409
  }
410
 
411
+ /**
412
+ * This is crude - nothing is returned
413
+ *
414
+ * @param string $bucket Name of the Bucket
415
+ * @return array Returns an array of results if bucket exists
416
+ */
417
  public function waitForBucket($bucket) {
418
  try {
419
  $this->client->waitUntil('BucketExists', array('Bucket' => $bucket));
427
  }
428
 
429
  /**
430
+ * Put a bucket
431
+ *
432
+ * @param string $bucket Bucket name
433
+ * @param constant $acl ACL flag
434
+ * @param string $location Set as "EU" to create buckets hosted in Europe
435
+ * @return boolean Returns true or false; or may throw an exception
436
+ */
437
+ public function putBucket($bucket, $acl = self::ACL_PRIVATE, $location = false) {
 
438
  if (!$location) {
439
  $location = $this->region;
440
  } else {
463
  }
464
 
465
  /**
466
+ * Initiate a multi-part upload (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadInitiate.html)
467
+ *
468
+ * @param string $bucket Bucket name
469
+ * @param string $uri Object URI
470
+ * @param constant $acl ACL constant
471
+ * @param array $meta_headers Array of x-amz-meta-* headers
472
+ * @param array $request_headers Array of request headers or content type as a string
473
+ * @param constant $storage_class Storage class constant
474
+ * @return string | false
475
+ */
476
+ public function initiateMultipartUpload($bucket, $uri, $acl = self::ACL_PRIVATE, $meta_headers = array(), $request_headers = array(), $storage_class = self::STORAGE_CLASS_STANDARD) {
 
477
  $vars = array(
478
  'ACL' => $acl,
479
  'Bucket' => $bucket,
480
  'Key' => $uri,
481
+ 'Metadata' => $meta_headers,
482
+ 'StorageClass' => $storage_class
483
  );
484
 
485
  $vars['ContentType'] = ('.gz' == strtolower(substr($uri, -3, 3))) ? 'application/octet-stream' : 'application/zip';
500
  }
501
 
502
  /**
503
+ * Upload a part of a multi-part set (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadUploadPart.html)
504
+ * The chunk is read into memory, so make sure that you have enough (or patch this function to work another way!)
505
+ *
506
+ * @param string $bucket Bucket name
507
+ * @param string $uri Object URI
508
+ * @param string $upload_id upload_id returned previously from initiateMultipartUpload
509
+ * @param string $file_path file to upload content from
510
+ * @param integer $part_number sequential part number to upload
511
+ * @param integer $part_size number of bytes in each part (though final part may have fewer) - pass the same value each time (for this particular upload) - default 5Mb (which is Amazon's minimum)
512
+ * @return string (ETag) | false]
513
+ */
514
+ public function uploadPart($bucket, $uri, $upload_id, $file_path, $part_number, $part_size = 5242880) {
 
515
  $vars = array(
516
  'Bucket' => $bucket,
517
  'Key' => $uri,
518
+ 'PartNumber' => $part_number,
519
+ 'UploadId' => $upload_id
520
  );
521
 
522
  // Where to begin
523
+ $file_offset = ($part_number - 1 ) * $part_size;
524
 
525
  // Download the smallest of the remaining bytes and the part size
526
+ $file_bytes = min(filesize($file_path) - $file_offset, $part_size);
527
+ if ($file_bytes < 0) $file_bytes = 0;
528
 
529
+ // $rest->setHeader('Content-Type', 'application/octet-stream');
530
  $data = "";
531
 
532
+ if ($handle = fopen($file_path, "rb")) {
533
+ if ($file_offset > 0) fseek($handle, $file_offset);
534
  $bytes_read = 0;
535
+ while ($file_bytes > 0 && $read = fread($handle, max($file_bytes, 131072))) {
536
+ $file_bytes = $file_bytes - strlen($read);
537
  $bytes_read += strlen($read);
538
  $data .= $read;
539
  }
559
  }
560
 
561
  /**
562
+ * Complete a multi-part upload (http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadComplete.html)
563
+ *
564
+ * @param string $bucket Bucket name
565
+ * @param string $uri Object URI
566
+ * @param string $upload_id upload_id returned previously from initiateMultipartUpload
567
+ * @param array $parts an ordered list of eTags of previously uploaded parts from uploadPart
568
+ * @return boolean Returns either true of false
569
+ */
570
+ public function completeMultipartUpload($bucket, $uri, $upload_id, $parts) {
 
571
  $vars = array(
572
  'Bucket' => $bucket,
573
  'Key' => $uri,
574
+ 'UploadId' => $upload_id
575
  );
576
 
577
  $partno = 1;
597
  }
598
 
599
  /**
600
+ * Put an object from a file (legacy function)
601
+ *
602
+ * @param string $file Input file path
603
+ * @param string $bucket Bucket name
604
+ * @param string $uri Object URI
605
+ * @param constant $acl ACL constant
606
+ * @param array $meta_headers Array of x-amz-meta-* headers
607
+ * @param string $content_type Content type
608
+ * @param string $storage_class STORAGE_CLASS_STANDARD constant
609
+ * @return boolean returns either true of false
610
+ */
611
+ public function putObjectFile($file, $bucket, $uri, $acl = self::ACL_PRIVATE, $meta_headers = array(), $content_type = null, $storage_class = self::STORAGE_CLASS_STANDARD) {
612
  try {
613
  $options = array(
614
  'Bucket' => $bucket,
615
  'Key' => $uri,
616
  'SourceFile' => $file,
617
+ 'StorageClass' => $storage_class,
618
  'ACL' => $acl
619
  );
620
+ if ($content_type) $options['ContentType'] = $content_type;
621
  if (!empty($this->_serverSideEncryption)) $options['ServerSideEncryption'] = $this->_serverSideEncryption;
622
+ if (!empty($meta_headers)) $options['Metadata'] = $meta_headers;
623
  $result = $this->client->putObject($options);
624
  if (is_object($result) && method_exists($result, 'get') && '' != $result->get('RequestId')) return true;
625
  } catch (Exception $e) {
634
 
635
 
636
  /**
637
+ * Put an object from a string (legacy function)
638
+ * Only the first 3 parameters vary in UpdraftPlus
639
+ *
640
+ * @param string $string Input data
641
+ * @param string $bucket Bucket name
642
+ * @param string $uri Object URI
643
+ * @param constant $acl ACL constant
644
+ * @param array $meta_headers Array of x-amz-meta-* headers
645
+ * @param string $content_type Content type
646
+ * @return boolean returns either true of false
647
+ */
648
+ public function putObjectString($string, $bucket, $uri, $acl = self::ACL_PRIVATE, $meta_headers = array(), $content_type = 'text/plain') {
 
649
  try {
650
  $result = $this->client->putObject(array(
651
  'Bucket' => $bucket,
652
  'Key' => $uri,
653
  'Body' => $string,
654
+ 'ContentType' => $content_type
655
  ));
656
  if (is_object($result) && method_exists($result, 'get') && '' != $result->get('RequestId')) return true;
657
  } catch (Exception $e) {
666
 
667
 
668
  /**
669
+ * Get an object
670
+ *
671
+ * @param string $bucket Bucket name
672
+ * @param string $uri Object URI
673
+ * @param mixed $save_to Filename or resource to write to
674
+ * @param mixed $resume - if $save_to is a resource, then this is either false or the value for a Range: header; otherwise, a boolean, indicating whether to resume if possible.
675
+ * @return mixed
676
+ */
677
+ public function getObject($bucket, $uri, $save_to = false, $resume = false) {
 
678
  try {
679
  // SaveAs: "Specify where the contents of the object should be downloaded. Can be the path to a file, a resource returned by fopen, or a Guzzle\Http\EntityBodyInterface object." - http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.S3Client.html#_getObject
680
 
681
  $range_header = false;
682
+ if (is_resource($save_to)) {
683
+ $fp = $save_to;
684
  if (!is_bool($resume)) $range_header = $resume;
685
+ } elseif (file_exists($save_to)) {
686
+ if ($resume && ($fp = @fopen($save_to, 'ab')) !== false) {
687
+ $range_header = "bytes=".filesize($save_to).'-';
688
  } else {
689
+ throw new Exception('Unable to open save file for writing: '.$save_to);
690
  }
691
  } else {
692
+ if (($fp = @fopen($save_to, 'wb')) !== false) {
693
  $range_header = false;
694
  } else {
695
+ throw new Exception('Unable to open save file for writing: '.$save_to);
696
  }
697
  }
698
 
718
 
719
 
720
  /**
721
+ * Get a bucket's location
722
+ *
723
+ * @param string $bucket Bucket name
724
+ * @return string | false
725
+ */
726
+ public function getBucketLocation($bucket) {
 
727
  try {
728
  $result = $this->client->getBucketLocation(array('Bucket' => $bucket));
729
  $location = $result->get('Location');
745
  }
746
 
747
  /**
748
+ * Delete an object
749
+ *
750
+ * @param string $bucket Bucket name
751
+ * @param string $uri Object URI
752
+ * @return boolean
753
+ */
754
+ public function deleteObject($bucket, $uri) {
 
755
  try {
756
  $result = $this->client->deleteObject(array(
757
  'Bucket' => $bucket,
768
  return false;
769
  }
770
 
771
+ public function setCORS($policy) {
 
772
  try {
773
  $cors = $this->client->putBucketCors($policy);
774
  if (is_object($cors) && method_exists($cors, 'get') && '' != $cors->get('RequestId')) return true;
782
  return false;
783
 
784
  }
 
785
  }
 
includes/class-commands.php CHANGED
@@ -18,14 +18,23 @@ class UpdraftPlus_Commands {
18
 
19
  private $_uc_helper;
20
 
21
- // The 'helper' needs to provide the method _updraftplus_background_operation_started
 
 
 
 
22
  public function __construct($uc_helper) {
23
  $this->_uc_helper = $uc_helper;
24
  }
25
 
26
- //Get the Advanced Tools HTMl and return to Central
 
 
 
 
 
27
  public function get_advanced_settings($options) {
28
- //load global updraftplus and admin
29
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
30
  if (false === ($updraftplus = $this->_load_ud())) return new WP_Error('no_updraftplus');
31
 
@@ -35,8 +44,8 @@ class UpdraftPlus_Commands {
35
  }
36
 
37
  public function get_download_status($items) {
38
- //load global updraftplus and admin
39
- if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
40
 
41
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
42
 
@@ -109,7 +118,7 @@ class UpdraftPlus_Commands {
109
 
110
  private function _load_ud_admin() {
111
  if (!defined('UPDRAFTPLUS_DIR') || !is_file(UPDRAFTPLUS_DIR.'/admin.php')) return false;
112
- require_once(UPDRAFTPLUS_DIR.'/admin.php');
113
  global $updraftplus_admin;
114
  return $updraftplus_admin;
115
  }
@@ -132,7 +141,7 @@ class UpdraftPlus_Commands {
132
 
133
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
134
 
135
- return $updraftplus_admin->activejobs_delete((string)$job_id);
136
 
137
  }
138
 
@@ -142,7 +151,7 @@ class UpdraftPlus_Commands {
142
 
143
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
144
 
145
- $results = $updraftplus_admin->delete_set($what);
146
 
147
  $get_history_opts = isset($what['get_history_opts']) ? $what['get_history_opts'] : array();
148
 
@@ -159,7 +168,12 @@ class UpdraftPlus_Commands {
159
 
160
  }
161
 
162
- // Slightly misnamed - this doesn't always rescan, but it does always return the history status (possibly after a rescan)
 
 
 
 
 
163
  public function rescan($what) {
164
 
165
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
@@ -250,7 +264,7 @@ class UpdraftPlus_Commands {
250
 
251
  $echo_results = empty($params['immediate_echo']) ? false : true;
252
 
253
- $results = (array)$updraftplus_admin->get_updraftvault()->ajax_vault_disconnect($echo_results);
254
 
255
  return $results;
256
 
@@ -268,6 +282,7 @@ class UpdraftPlus_Commands {
268
 
269
  /**
270
  * A handler method to call the UpdraftPlus admin save settings method. It will check if the settings passed to it are in the format of a string if so it converts it to an array otherwise just pass the array
 
271
  * @param String/Array $settings Settings to be saved to UpdraftPlus either in the form of a string ready to be converted to an array or already an array ready to be passed to the save settings function in UpdraftPlus.
272
  * @return Array An Array response to be sent back
273
  */
@@ -282,7 +297,7 @@ class UpdraftPlus_Commands {
282
  if (is_string($settings)) {
283
  parse_str($settings, $settings_as_array);
284
  } elseif (is_array($settings)) {
285
- $settings_as_array = $settings;
286
  } else {
287
  return new WP_Error('invalid_settings');
288
  }
@@ -312,7 +327,7 @@ class UpdraftPlus_Commands {
312
  $data = $updraftplus_addon_cloudfilesenhanced->create_api_user($data);
313
  }
314
 
315
- if ($data["e"] === 0) {
316
  return $data;
317
  } else {
318
  return new WP_Error('error', '', $data);
@@ -335,57 +350,57 @@ class UpdraftPlus_Commands {
335
  switch ($fragment) {
336
 
337
  case 'last_backup_html':
338
- $output = $updraftplus_admin->last_backup_html();
339
  break;
340
 
341
  case 's3_new_api_user_form':
342
- ob_start();
343
- do_action('updraft_s3_print_new_api_user_form', false);
344
- $output = ob_get_contents();
345
- ob_end_clean();
346
  break;
347
 
348
  case 'cloudfiles_new_api_user_form':
349
- global $updraftplus_addon_cloudfilesenhanced;
350
- if (!is_a($updraftplus_addon_cloudfilesenhanced, 'UpdraftPlus_Addon_CloudFilesEnhanced')) {
351
  $error = true;
352
  $output = 'cloudfiles_addon_not_found';
353
- } else {
354
- $output = array(
355
- 'accounts' => $updraftplus_addon_cloudfilesenhanced->account_options(),
356
- 'regions' => $updraftplus_addon_cloudfilesenhanced->region_options(),
357
- );
358
- }
359
  break;
360
 
361
  case 'backupnow_modal_contents':
362
- $updraft_dir = $updraftplus->backups_dir_location();
363
- if (!$updraftplus->really_is_writable($updraft_dir)) {
364
  $output = array('error' => true, 'html' => __("The 'Backup Now' button is disabled as your backup directory is not writable (go to the 'Settings' tab and find the relevant option).", 'updraftplus'));
365
- } else {
366
- $output = array('html' => $updraftplus_admin->backupnow_modal_contents());
367
- }
368
- break;
369
 
370
  case 'panel_download_and_restore':
371
- $backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
372
- if (empty($backup_history)) {
373
  $updraftplus->rebuild_backup_history();
374
  $backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
375
- }
376
- $backup_history = is_array($backup_history) ? $backup_history : array();
377
 
378
- $output = $updraftplus_admin->settings_downloading_and_restoring($backup_history, true, $data);
379
- break;
380
 
381
  case 'disk_usage':
382
- $output = $updraftplus_admin->get_disk_space_used($data);
383
- break;
384
  default:
385
- // We just return a code - translation is done on the other side
386
- $output = 'ud_get_fragment_could_not_return';
387
- $error = true;
388
- break;
389
  }
390
 
391
  if (!$error) {
@@ -398,7 +413,12 @@ class UpdraftPlus_Commands {
398
 
399
  }
400
 
401
- //This gets the http_get function from admin to grab information on a url
 
 
 
 
 
402
  public function http_get($uri) {
403
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
404
 
@@ -406,20 +426,25 @@ class UpdraftPlus_Commands {
406
  return new WP_Error('error', '', 'no_uri');
407
  }
408
 
409
- $response = $updraftplus_admin->http_get($uri, false);
410
  $response_decode = json_decode($response);
411
 
412
- if (isset($response_decode->e)) {
413
- return new WP_Error('error', '', htmlspecialchars($response_decode->e));
414
- }
415
-
416
- return array(
417
- 'status' => $response_decode->code,
418
- 'response' => $response_decode->html_response
419
- );
420
- }
421
-
422
- //This gets the http_get function from admin to grab cURL information on a url
 
 
 
 
 
423
  public function http_get_curl($uri) {
424
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
425
 
@@ -431,13 +456,13 @@ class UpdraftPlus_Commands {
431
  return new WP_Error('error', '', 'no_curl');
432
  }
433
 
434
- $response_encode = $updraftplus_admin->http_get($uri, true);
435
  $response_decode = json_decode($response_encode);
436
 
437
  $response = 'Curl Info: ' . $response_decode->verb
438
  .'Response: ' . $response_decode->response;
439
 
440
- if($response_decode->response === false) {
441
  return new WP_Error('error', '', array(
442
  'error' => htmlspecialchars($response_decode->e),
443
  "status" => $response_decode->status,
@@ -452,12 +477,16 @@ class UpdraftPlus_Commands {
452
  );
453
  }
454
 
455
- // Display raw backup and file list
 
 
 
 
456
  public function show_raw_backup_and_file_list() {
457
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
458
 
459
  /*
460
- need to remove the pre tags as the modal assumes a <pre> is for a new box.
461
  This cause issues specifically with fetch log events. Do this by passing true
462
  to the method show_raw_backups
463
  */
@@ -481,7 +510,7 @@ class UpdraftPlus_Commands {
481
 
482
  global $updraftplus_addons_migrator;
483
 
484
- if (!is_a( $updraftplus_addons_migrator, 'UpdraftPlus_Addons_Migrator')) {
485
  return new WP_Error('error', 'no_object_found');
486
  }
487
 
@@ -503,7 +532,7 @@ class UpdraftPlus_Commands {
503
  return new WP_Error('error', '', 'no_class_found');
504
  }
505
 
506
- if(!is_a( $updraftplus_addon_lockadmin, "UpdraftPlus_Addon_LockAdmin")) {
507
  return new WP_Error('error', '', 'no_object_found');
508
  }
509
 
@@ -519,11 +548,11 @@ class UpdraftPlus_Commands {
519
 
520
  $options = $updraftplus_addon_lockadmin->return_opts();
521
 
522
- if($old_password == $options['password']) {
523
 
524
- $options['password'] = (string)$password;
525
- $options['support_url'] = (string)$support_url;
526
- $options['session_length'] = (int)$session_length;
527
  UpdraftPlus_Options::update_updraft_option('updraft_adminlocking', $options);
528
 
529
  return "lock_changed";
@@ -569,6 +598,7 @@ class UpdraftPlus_Commands {
569
 
570
  /**
571
  * A handler method to call the UpdraftPlus admin wipe settings method
 
572
  * @return Array An Array response to be sent back
573
  */
574
  public function wipe_settings() {
18
 
19
  private $_uc_helper;
20
 
21
+ /**
22
+ * Constructor
23
+ *
24
+ * @param string $uc_helper The 'helper' needs to provide the method _updraftplus_background_operation_started
25
+ */
26
  public function __construct($uc_helper) {
27
  $this->_uc_helper = $uc_helper;
28
  }
29
 
30
+ /**
31
+ * Get the Advanced Tools HTMl and return to Central
32
+ *
33
+ * @param string $options Options for advanced settings
34
+ * @return string
35
+ */
36
  public function get_advanced_settings($options) {
37
+ // load global updraftplus and admin
38
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
39
  if (false === ($updraftplus = $this->_load_ud())) return new WP_Error('no_updraftplus');
40
 
44
  }
45
 
46
  public function get_download_status($items) {
47
+ // load global updraftplus and admin
48
+ if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
49
 
50
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
51
 
118
 
119
  private function _load_ud_admin() {
120
  if (!defined('UPDRAFTPLUS_DIR') || !is_file(UPDRAFTPLUS_DIR.'/admin.php')) return false;
121
+ include_once(UPDRAFTPLUS_DIR.'/admin.php');
122
  global $updraftplus_admin;
123
  return $updraftplus_admin;
124
  }
141
 
142
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
143
 
144
+ return $updraftplus_admin->activejobs_delete((string) $job_id);
145
 
146
  }
147
 
151
 
152
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
153
 
154
+ $results = $updraftplus_admin->delete_set($what);
155
 
156
  $get_history_opts = isset($what['get_history_opts']) ? $what['get_history_opts'] : array();
157
 
168
 
169
  }
170
 
171
+ /**
172
+ * Slightly misnamed - this doesn't always rescan, but it does always return the history status (possibly after a rescan)
173
+ *
174
+ * @param string $what speific string to scan
175
+ * @return array retuns an array of history statuses
176
+ */
177
  public function rescan($what) {
178
 
179
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
264
 
265
  $echo_results = empty($params['immediate_echo']) ? false : true;
266
 
267
+ $results = (array) $updraftplus_admin->get_updraftvault()->ajax_vault_disconnect($echo_results);
268
 
269
  return $results;
270
 
282
 
283
  /**
284
  * A handler method to call the UpdraftPlus admin save settings method. It will check if the settings passed to it are in the format of a string if so it converts it to an array otherwise just pass the array
285
+ *
286
  * @param String/Array $settings Settings to be saved to UpdraftPlus either in the form of a string ready to be converted to an array or already an array ready to be passed to the save settings function in UpdraftPlus.
287
  * @return Array An Array response to be sent back
288
  */
297
  if (is_string($settings)) {
298
  parse_str($settings, $settings_as_array);
299
  } elseif (is_array($settings)) {
300
+ $settings_as_array = $settings;
301
  } else {
302
  return new WP_Error('invalid_settings');
303
  }
327
  $data = $updraftplus_addon_cloudfilesenhanced->create_api_user($data);
328
  }
329
 
330
+ if (0 === $data["e"]) {
331
  return $data;
332
  } else {
333
  return new WP_Error('error', '', $data);
350
  switch ($fragment) {
351
 
352
  case 'last_backup_html':
353
+ $output = $updraftplus_admin->last_backup_html();
354
  break;
355
 
356
  case 's3_new_api_user_form':
357
+ ob_start();
358
+ do_action('updraft_s3_print_new_api_user_form', false);
359
+ $output = ob_get_contents();
360
+ ob_end_clean();
361
  break;
362
 
363
  case 'cloudfiles_new_api_user_form':
364
+ global $updraftplus_addon_cloudfilesenhanced;
365
+ if (!is_a($updraftplus_addon_cloudfilesenhanced, 'UpdraftPlus_Addon_CloudFilesEnhanced')) {
366
  $error = true;
367
  $output = 'cloudfiles_addon_not_found';
368
+ } else {
369
+ $output = array(
370
+ 'accounts' => $updraftplus_addon_cloudfilesenhanced->account_options(),
371
+ 'regions' => $updraftplus_addon_cloudfilesenhanced->region_options(),
372
+ );
373
+ }
374
  break;
375
 
376
  case 'backupnow_modal_contents':
377
+ $updraft_dir = $updraftplus->backups_dir_location();
378
+ if (!$updraftplus->really_is_writable($updraft_dir)) {
379
  $output = array('error' => true, 'html' => __("The 'Backup Now' button is disabled as your backup directory is not writable (go to the 'Settings' tab and find the relevant option).", 'updraftplus'));
380
+ } else {
381
+ $output = array('html' => $updraftplus_admin->backupnow_modal_contents());
382
+ }
383
+ break;
384
 
385
  case 'panel_download_and_restore':
386
+ $backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
387
+ if (empty($backup_history)) {
388
  $updraftplus->rebuild_backup_history();
389
  $backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
390
+ }
391
+ $backup_history = is_array($backup_history) ? $backup_history : array();
392
 
393
+ $output = $updraftplus_admin->settings_downloading_and_restoring($backup_history, true, $data);
394
+ break;
395
 
396
  case 'disk_usage':
397
+ $output = $updraftplus_admin->get_disk_space_used($data);
398
+ break;
399
  default:
400
+ // We just return a code - translation is done on the other side
401
+ $output = 'ud_get_fragment_could_not_return';
402
+ $error = true;
403
+ break;
404
  }
405
 
406
  if (!$error) {
413
 
414
  }
415
 
416
+ /**
417
+ * This gets the http_get function from admin to grab information on a url
418
+ *
419
+ * @param string $uri URL to be used
420
+ * @return array returns response from specific URL
421
+ */
422
  public function http_get($uri) {
423
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
424
 
426
  return new WP_Error('error', '', 'no_uri');
427
  }
428
 
429
+ $response = $updraftplus_admin->http_get($uri, false);
430
  $response_decode = json_decode($response);
431
 
432
+ if (isset($response_decode->e)) {
433
+ return new WP_Error('error', '', htmlspecialchars($response_decode->e));
434
+ }
435
+
436
+ return array(
437
+ 'status' => $response_decode->code,
438
+ 'response' => $response_decode->html_response
439
+ );
440
+ }
441
+
442
+ /**
443
+ * This gets the http_get function from admin to grab cURL information on a url
444
+ *
445
+ * @param string $uri URL to be used
446
+ * @return array
447
+ */
448
  public function http_get_curl($uri) {
449
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
450
 
456
  return new WP_Error('error', '', 'no_curl');
457
  }
458
 
459
+ $response_encode = $updraftplus_admin->http_get($uri, true);
460
  $response_decode = json_decode($response_encode);
461
 
462
  $response = 'Curl Info: ' . $response_decode->verb
463
  .'Response: ' . $response_decode->response;
464
 
465
+ if (false === $response_decode->response) {
466
  return new WP_Error('error', '', array(
467
  'error' => htmlspecialchars($response_decode->e),
468
  "status" => $response_decode->status,
477
  );
478
  }
479
 
480
+ /**
481
+ * Display raw backup and file list
482
+ *
483
+ * @return string
484
+ */
485
  public function show_raw_backup_and_file_list() {
486
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
487
 
488
  /*
489
+ Need to remove the pre tags as the modal assumes a <pre> is for a new box.
490
  This cause issues specifically with fetch log events. Do this by passing true
491
  to the method show_raw_backups
492
  */
510
 
511
  global $updraftplus_addons_migrator;
512
 
513
+ if (!is_a($updraftplus_addons_migrator, 'UpdraftPlus_Addons_Migrator')) {
514
  return new WP_Error('error', 'no_object_found');
515
  }
516
 
532
  return new WP_Error('error', '', 'no_class_found');
533
  }
534
 
535
+ if (!is_a($updraftplus_addon_lockadmin, "UpdraftPlus_Addon_LockAdmin")) {
536
  return new WP_Error('error', '', 'no_object_found');
537
  }
538
 
548
 
549
  $options = $updraftplus_addon_lockadmin->return_opts();
550
 
551
+ if ($old_password == $options['password']) {
552
 
553
+ $options['password'] = (string) $password;
554
+ $options['support_url'] = (string) $support_url;
555
+ $options['session_length'] = (int) $session_length;
556
  UpdraftPlus_Options::update_updraft_option('updraft_adminlocking', $options);
557
 
558
  return "lock_changed";
598
 
599
  /**
600
  * A handler method to call the UpdraftPlus admin wipe settings method
601
+ *
602
  * @return Array An Array response to be sent back
603
  */
604
  public function wipe_settings() {
includes/class-database-utility.php CHANGED
@@ -5,7 +5,9 @@ if (!defined('UPDRAFTPLUS_DIR')) die('No direct access allowed');
5
  class UpdraftPlus_Database_Utility {
6
 
7
  private $whichdb;
 
8
  private $table_prefix_raw;
 
9
  private $dbhandle;
10
 
11
  public function __construct($whichdb, $table_prefix_raw, $dbhandle) {
@@ -16,6 +18,7 @@ class UpdraftPlus_Database_Utility {
16
 
17
  /**
18
  * The purpose of this function is to make sure that the options table is put in the database first, then the users table, then the site + blogs tables (if present - multisite), then the usermeta table; and after that the core WP tables - so that when restoring we restore the core tables first
 
19
  * @param [array] $a_arr the first array
20
  * @param [array] $b_arr the second array
21
  * @return [array] returns a sorted array
@@ -37,15 +40,15 @@ class UpdraftPlus_Database_Utility {
37
  if ($a == $b) return 0;
38
  $our_table_prefix = $this->table_prefix_raw;
39
  if ($a == $our_table_prefix.'options') return -1;
40
- if ($b == $our_table_prefix.'options') return 1;
41
  if ($a == $our_table_prefix.'site') return -1;
42
- if ($b == $our_table_prefix.'site') return 1;
43
  if ($a == $our_table_prefix.'blogs') return -1;
44
- if ($b == $our_table_prefix.'blogs') return 1;
45
  if ($a == $our_table_prefix.'users') return -1;
46
- if ($b == $our_table_prefix.'users') return 1;
47
  if ($a == $our_table_prefix.'usermeta') return -1;
48
- if ($b == $our_table_prefix.'usermeta') return 1;
49
 
50
  if (empty($our_table_prefix)) return strcmp($a, $b);
51
 
@@ -68,7 +71,8 @@ class UpdraftPlus_Database_Utility {
68
  class UpdraftPlus_WPDB_OtherDB_Utility extends wpdb {
69
  /**
70
  * This adjusted bail() does two things: 1) Never dies and 2) logs in the UD log
71
- * @param [string] $message a string containing a message
 
72
  * @param [string] $error_code a string containing an error code
73
  * @return [bool] returns false
74
  */
@@ -76,11 +80,10 @@ class UpdraftPlus_WPDB_OtherDB_Utility extends wpdb {
76
  global $updraftplus;
77
  if ('db_connect_fail' == $error_code) $message = 'Connection failed: check your access details, that the database server is up, and that the network connection is not firewalled.';
78
  $updraftplus->log("WPDB_OtherDB error: $message ($error_code)");
79
- # Now do the things that would have been done anyway
80
- if ( class_exists( 'WP_Error' ) )
81
  $this->error = new WP_Error($error_code, $message);
82
- else
83
- $this->error = $message;
84
  return false;
85
  }
86
- }
5
  class UpdraftPlus_Database_Utility {
6
 
7
  private $whichdb;
8
+
9
  private $table_prefix_raw;
10
+
11
  private $dbhandle;
12
 
13
  public function __construct($whichdb, $table_prefix_raw, $dbhandle) {
18
 
19
  /**
20
  * The purpose of this function is to make sure that the options table is put in the database first, then the users table, then the site + blogs tables (if present - multisite), then the usermeta table; and after that the core WP tables - so that when restoring we restore the core tables first
21
+ *
22
  * @param [array] $a_arr the first array
23
  * @param [array] $b_arr the second array
24
  * @return [array] returns a sorted array
40
  if ($a == $b) return 0;
41
  $our_table_prefix = $this->table_prefix_raw;
42
  if ($a == $our_table_prefix.'options') return -1;
43
+ if ($b == $our_table_prefix.'options') return 1;
44
  if ($a == $our_table_prefix.'site') return -1;
45
+ if ($b == $our_table_prefix.'site') return 1;
46
  if ($a == $our_table_prefix.'blogs') return -1;
47
+ if ($b == $our_table_prefix.'blogs') return 1;
48
  if ($a == $our_table_prefix.'users') return -1;
49
+ if ($b == $our_table_prefix.'users') return 1;
50
  if ($a == $our_table_prefix.'usermeta') return -1;
51
+ if ($b == $our_table_prefix.'usermeta') return 1;
52
 
53
  if (empty($our_table_prefix)) return strcmp($a, $b);
54
 
71
  class UpdraftPlus_WPDB_OtherDB_Utility extends wpdb {
72
  /**
73
  * This adjusted bail() does two things: 1) Never dies and 2) logs in the UD log
74
+ *
75
+ * @param [string] $message a string containing a message
76
  * @param [string] $error_code a string containing an error code
77
  * @return [bool] returns false
78
  */
80
  global $updraftplus;
81
  if ('db_connect_fail' == $error_code) $message = 'Connection failed: check your access details, that the database server is up, and that the network connection is not firewalled.';
82
  $updraftplus->log("WPDB_OtherDB error: $message ($error_code)");
83
+ // Now do the things that would have been done anyway
84
+ if (class_exists('WP_Error'))
85
  $this->error = new WP_Error($error_code, $message);
86
+ else $this->error = $message;
 
87
  return false;
88
  }
89
+ }
includes/class-semaphore.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
- // Adapted from WP Social under the GPL - thanks to Alex King (https://github.com/crowdfavorite/wp-social)
3
  /**
4
  * Semaphore Lock Management
 
5
  */
6
  class UpdraftPlus_Semaphore {
7
 
@@ -16,7 +16,9 @@ class UpdraftPlus_Semaphore {
16
  }
17
 
18
  /**
19
- * @var bool
 
 
20
  */
21
  protected $lock_broke = false;
22
 
@@ -37,7 +39,7 @@ class UpdraftPlus_Semaphore {
37
  WHERE option_name = 'updraftplus_unlocked_".$this->lock_name."'
38
  ");
39
 
40
- if ($affected == '0' and !$this->stuck_check()) {
41
  $updraftplus->log('Semaphore lock ('.$this->lock_name.', '.$wpdb->options.') failed (line '.__LINE__.')');
42
  return false;
43
  }
@@ -49,7 +51,7 @@ class UpdraftPlus_Semaphore {
49
  WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
50
  AND option_value = '0'
51
  ");
52
- if ($affected != '1') {
53
  if (!$this->stuck_check()) {
54
  $updraftplus->log('Semaphore lock ('.$this->lock_name.', '.$wpdb->options.') failed (line '.__LINE__.')');
55
  return false;
@@ -80,7 +82,7 @@ class UpdraftPlus_Semaphore {
80
  /**
81
  * Increment the semaphore.
82
  *
83
- * @param array $filters
84
  * @return Social_Semaphore
85
  */
86
  public function increment(array $filters = array()) {
@@ -93,8 +95,7 @@ class UpdraftPlus_Semaphore {
93
  $this->increment();
94
  }
95
  }
96
- }
97
- else {
98
  $wpdb->query("
99
  UPDATE $wpdb->options
100
  SET option_value = CAST(option_value AS UNSIGNED) + 1
@@ -140,7 +141,7 @@ class UpdraftPlus_Semaphore {
140
  WHERE option_name = 'updraftplus_locked_".$this->lock_name."'
141
  ");
142
 
143
- if ($result == '1') {
144
  $updraftplus->log('Semaphore ('.$this->lock_name.') unlocked');
145
  return true;
146
  }
@@ -180,5 +181,4 @@ class UpdraftPlus_Semaphore {
180
 
181
  return false;
182
  }
183
-
184
  } // End UpdraftPlus_Semaphore
1
  <?php
 
2
  /**
3
  * Semaphore Lock Management
4
+ * Adapted from WP Social under the GPL - thanks to Alex King (https://github.com/crowdfavorite/wp-social)
5
  */
6
  class UpdraftPlus_Semaphore {
7
 
16
  }
17
 
18
  /**
19
+ * Lock Broke
20
+ *
21
+ * @var boolean
22
  */
23
  protected $lock_broke = false;
24
 
39
  WHERE option_name = 'updraftplus_unlocked_".$this->lock_name."'
40
  ");
41
 
42
+ if ('0' == $affected && !$this->stuck_check()) {
43
  $updraftplus->log('Semaphore lock ('.$this->lock_name.', '.$wpdb->options.') failed (line '.__LINE__.')');
44
  return false;
45
  }
51
  WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
52
  AND option_value = '0'
53
  ");
54
+ if ('1' != $affected) {
55
  if (!$this->stuck_check()) {
56
  $updraftplus->log('Semaphore lock ('.$this->lock_name.', '.$wpdb->options.') failed (line '.__LINE__.')');
57
  return false;
82
  /**
83
  * Increment the semaphore.
84
  *
85
+ * @param array $filters
86
  * @return Social_Semaphore
87
  */
88
  public function increment(array $filters = array()) {
95
  $this->increment();
96
  }
97
  }
98
+ } else {
 
99
  $wpdb->query("
100
  UPDATE $wpdb->options
101
  SET option_value = CAST(option_value AS UNSIGNED) + 1
141
  WHERE option_name = 'updraftplus_locked_".$this->lock_name."'
142
  ");
143
 
144
+ if ('1' == $result) {
145
  $updraftplus->log('Semaphore ('.$this->lock_name.') unlocked');
146
  return true;
147
  }
181
 
182
  return false;
183
  }
 
184
  } // End UpdraftPlus_Semaphore
includes/class-updraftcentral-updraftplus-commands.php CHANGED
@@ -15,7 +15,7 @@ class UpdraftCentral_UpdraftPlus_Commands extends UpdraftCentral_Commands {
15
 
16
  parent::__construct($rc);
17
 
18
- if (!class_exists('UpdraftPlus_Commands')) require_once(UPDRAFTPLUS_DIR.'/includes/class-commands.php');
19
  $this->commands = new UpdraftPlus_Commands($this);
20
 
21
  }
@@ -58,5 +58,4 @@ class UpdraftCentral_UpdraftPlus_Commands extends UpdraftCentral_Commands {
58
  $updraftplus->close_browser_connection($encoded);
59
 
60
  }
61
-
62
  }
15
 
16
  parent::__construct($rc);
17
 
18
+ if (!class_exists('UpdraftPlus_Commands')) include_once(UPDRAFTPLUS_DIR.'/includes/class-commands.php');
19
  $this->commands = new UpdraftPlus_Commands($this);
20
 
21
  }
58
  $updraftplus->close_browser_connection($encoded);
59
 
60
  }
 
61
  }
includes/class-wpadmin-commands.php CHANGED
@@ -8,14 +8,22 @@ if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
8
 
9
  if (!class_exists('UpdraftPlus_Commands')) require_once(UPDRAFTPLUS_DIR.'/includes/class-commands.php');
10
 
11
- // An extension, because commands available via wp-admin are a super-set of those which are available through all mechanisms
 
 
12
  class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
13
 
14
  private $_uc_helper;
 
15
  private $_updraftplus_admin;
 
16
  private $_updraftplus;
17
 
18
- // The 'helper' needs to provide the method _updraftplus_background_operation_started
 
 
 
 
19
  public function __construct($uc_helper) {
20
  $this->_uc_helper = $uc_helper;
21
  global $updraftplus_admin, $updraftplus;
@@ -27,7 +35,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
27
  public function forcescheduledresumption($info) {
28
 
29
  // Casting $resumption to int is absolutely necessary, as the WP cron system uses a hashed serialisation of the parameters for identifying jobs. Different type => different hash => does not match
30
- $resumption = (int)$info['resumption'];
31
  $job_id = $info['job_id'];
32
  $get_cron = $this->_updraftplus_admin->get_cron($job_id);
33
  if (!is_array($get_cron)) {
@@ -52,11 +60,11 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
52
 
53
  die;
54
 
55
- // return array(
56
- // 'response' => $response['response'],
57
- // 'status' => $response['status'],
58
- // 'log' => $response['log']
59
- // );
60
  }
61
 
62
  public function updraftcentral_delete_key($params) {
@@ -84,14 +92,14 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
84
  return array('error' => 'UpdraftPlus_UpdraftCentral_Main object not found');
85
  }
86
  return call_user_func(array($updraftplus_updraftcentral_main, 'create_key'), $params);
87
- }
88
 
89
  public function restore_alldownloaded($params) {
90
 
91
  $backups = $this->_updraftplus->get_backup_history();
92
  $updraft_dir = $this->_updraftplus->backups_dir_location();
93
 
94
- $timestamp = (int)$params['timestamp'];
95
  if (!isset($backups[$timestamp])) {
96
  return array('m' => '', 'w' => '', 'e' => __('No such backup set exists', 'updraftplus'));
97
  }
@@ -105,10 +113,11 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
105
 
106
  $elements = array_flip($res['updraft_restore']);
107
 
108
- $warn = array(); $err = array();
 
109
 
110
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
111
- $max_execution_time = (int)@ini_get('max_execution_time');
112
 
113
  if ($max_execution_time>0 && $max_execution_time<61) {
114
  $warn[] = sprintf(__('The PHP setup on this webserver allows only %s seconds for PHP to run, and does not allow this limit to be raised. If you have a lot of data to import, and if the restore operation times out, then you will need to ask your web hosting company for ways to raise this limit (or attempt the restoration piece-by-piece).', 'updraftplus'), $max_execution_time);
@@ -156,9 +165,12 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
156
  ksort($whatwegot);
157
  $outof = false;
158
  foreach ($whatwegot as $index => $file) {
159
- if (preg_match('/\d+of(\d+)\.zip/', $file, $omatch)) { $outof = max($matches[1], 1); }
160
- if ($index != $expected_index) {
161
- $missing .= ($missing == '') ? (1+$expected_index) : ",".(1+$expected_index);
 
 
 
162
  }
163
  if (!file_exists($updraft_dir.'/'.$file)) {
164
  $err[] = sprintf(__('File not found (you need to upload it): %s', 'updraftplus'), $updraft_dir.'/'.$file);
@@ -166,7 +178,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
166
  $err[] = sprintf(__('File was found, but is zero-sized (you need to re-upload it): %s', 'updraftplus'), $file);
167
  } else {
168
  $itext = (0 == $index) ? '' : $index;
169
- if (!empty($backups[$timestamp][$type.$itext.'-size']) && $backups[$timestamp][$type.$itext.'-size'] != filesize($updraft_dir.'/'.$file)) {
170
  if (empty($warn['doublecompressfixed'])) {
171
  $warn[] = sprintf(__('File (%s) was found, but has a different size (%s) from what was expected (%s) - it may be corrupt.', 'updraftplus'), $file, filesize($updraft_dir.'/'.$file), $backups[$timestamp][$type.$itext.'-size']);
172
  }
@@ -179,7 +191,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
179
  // Detect missing archives where they are missing from the end of the set
180
  if ($outof>0 && $expected_index < $outof) {
181
  for ($j = $expected_index; $j<$outof; $j++) {
182
- $missing .= ($missing == '') ? (1+$j) : ",".(1+$j);
183
  }
184
  }
185
  if ('' != $missing) {
@@ -217,8 +229,11 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
217
 
218
  }
219
 
220
- // The purpose of this is to detect brokenness caused by extra line feeds in plugins/themes - before it breaks other AJAX operations and leads to support requests
221
- // Returns a string
 
 
 
222
  public function ping() {
223
  return 'pong';
224
  }
@@ -260,8 +275,10 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
260
  return $show_raw_data['html'];
261
  }
262
 
263
- // N.B. Not exactly the same as the phpinfo method in the UpdraftCentral core class
264
- // Returns a string, as it is directly fetched as the source of an iframe
 
 
265
  public function phpinfo() {
266
 
267
  ob_start();
@@ -286,7 +303,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
286
 
287
  public function check_overdue_crons() {
288
  $how_many_overdue = $this->_updraftplus_admin->howmany_overdue_crons();
289
- return ($how_many_overdue >= 4) ? array('m' => $this->_updraftplus_admin->show_admin_warning_overdue_crons($how_many_overdue)) : array();
290
  }
291
 
292
  public function whichdownloadsneeded($params) {
@@ -307,7 +324,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
307
  $retain_string = '';
308
  foreach ($indexes as $index) {
309
  $retain = true; // default
310
- $findex = (0 == $index) ? '' : (string)$index;
311
  $files = $backup[$entity];
312
  if (!is_array($files)) $files = array($files);
313
  $size_key = $entity.$findex.'-size';
@@ -339,6 +356,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
339
 
340
  /**
341
  * This is an handler function that checks what entity has been specified in the $params and calls the required method
 
342
  * @param [array] $params this is an array of parameters sent via ajax it can include various things depending on what has called this method, this method only cares about the entity parameter which is used to call the correct method and return tree nodes based on that
343
  * @return [array] returns an array of jstree nodes
344
  */
@@ -346,7 +364,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
346
 
347
  if ('filebrowser' == $params['entity']) {
348
  $node_array = $this->_updraft_jstree_directory($params);
349
- } elseif ($params['entity'] == 'zipbrowser') {
350
  $node_array = $this->_updraft_jstree_zip($params);
351
  }
352
  return empty($node_array['error']) ? array('nodes' => $node_array) : $node_array;
@@ -354,6 +372,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
354
 
355
  /**
356
  * This creates an array of nodes, built from either ABSPATH or the given directory ready to be returned to the jstree object.
 
357
  * @param [array] $params this is an array of parameters sent via ajax it can include the following:
358
  * node - this is a jstree node object containing information about the selected node
359
  * path - this is a path if provided this will be used to build the tree otherwise ABSPATH is used
@@ -364,7 +383,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
364
  $node_array = array();
365
 
366
  // # is the root node if it's the root node then this is the first call so create a parent node otherwise it's a child node and we should get the path from the node id
367
- if ($params['node']['id'] == '#') {
368
  $path = ABSPATH;
369
 
370
  if (!empty($params['path'])) $path = $params['path'];
@@ -399,7 +418,8 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
399
  'icon' => 'jstree-folder'
400
  );
401
  } else {
402
- $node_array[] = array('text' => $value,
 
403
  'children' => false,
404
  'id' => $path . DIRECTORY_SEPARATOR . $value,
405
  'type' => 'file',
@@ -415,6 +435,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
415
 
416
  /**
417
  * This creates an array of nodes, built from a unzipped zip file structure.
 
418
  * @param [array] $params this is an array of parameters sent via ajax it can include the following:
419
  * node - this is a jstree node object containing information about the selected node
420
  * timestamp - this is the backup timestamp and is used to get the backup archive
@@ -428,11 +449,11 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
428
 
429
  $node_array = array();
430
 
431
- require_once(UPDRAFTPLUS_DIR.'/class-zip.php');
432
 
433
  $zip_object = 'UpdraftPlus_ZipArchive';
434
 
435
- # In tests, PclZip was found to be 25% slower than ZipArchive
436
  if (((defined('UPDRAFTPLUS_PREFERPCLZIP') && UPDRAFTPLUS_PREFERPCLZIP == true) || !class_exists('ZipArchive') || !class_exists('UpdraftPlus_ZipArchive') || (!extension_loaded('zip') && !method_exists('ZipArchive', 'AddFile')))) {
437
  $zip_object = 'UpdraftPlus_PclZip';
438
  }
@@ -448,7 +469,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
448
  $file = $backup_history[$params['timestamp']][$params['type']];
449
 
450
  // Get date in human readable form
451
- $pretty_date = get_date_from_gmt(gmdate('Y-m-d H:i:s', (int)$params['timestamp']), 'M d, Y G:i');
452
 
453
  $backupable_entities = $updraftplus->get_backupable_file_entities(true, true);
454
 
@@ -464,7 +485,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
464
 
465
  if ('1/1' == $archive_set) $archive_set = '';
466
 
467
- $parent_name = $archive_name . ' ' . __('archive','updraftplus') . ' ' . $archive_set . ' ' . $pretty_date;
468
 
469
  // Deal with multi-archive sets
470
  if (is_array($file)) $file = $file[$params['findex']];
@@ -490,7 +511,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
490
  if (true !== $zip_opened) {
491
  return array('error' => 'UpdraftPlus: opening zip (' . $fullpath . '): failed to open this zip file (object='.$zip_object.', code: '.$zip_opened.')');
492
  } else {
493
- if ($zip_object == 'UpdraftPlus_PclZip') {
494
  $numfiles = $zip->numAll;
495
  if (false === $numfiles) {
496
  return array('error' => 'UpdraftPlus: reading zip: '.$zip->last_error);
@@ -506,7 +527,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
506
  $si['name'] = str_replace("/", DIRECTORY_SEPARATOR, $si['name']);
507
 
508
  // if it's a dot then we don't want to append this as it will break the id's and the tree structure
509
- if ('.' == dirname($si['name'])){
510
  $node_id = $parent_name;
511
  } else {
512
  $node_id = $parent_name . DIRECTORY_SEPARATOR . dirname($si['name']) . DIRECTORY_SEPARATOR;
@@ -532,7 +553,8 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
532
  'type' => 'file',
533
  'icon' => 'jstree-file',
534
  'li_attr' => array(
535
- 'path' => $parent_name . DIRECTORY_SEPARATOR . $si['name'], 'size' => $updraftplus->convert_numeric_size_to_text($si['size'])
 
536
  )
537
  );
538
  }
@@ -542,7 +564,7 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
542
  if ('uploads' == $params['type']) $node_array[] = array(
543
  'text' => 'uploads',
544
  'parent' => $parent_name,
545
- 'id' => $parent_name . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR,
546
  'icon' => 'jstree-folder',
547
  'li_attr' => array(
548
  'path' => $parent_name . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR
8
 
9
  if (!class_exists('UpdraftPlus_Commands')) require_once(UPDRAFTPLUS_DIR.'/includes/class-commands.php');
10
 
11
+ /**
12
+ * An extension, because commands available via wp-admin are a super-set of those which are available through all mechanisms
13
+ */
14
  class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
15
 
16
  private $_uc_helper;
17
+
18
  private $_updraftplus_admin;
19
+
20
  private $_updraftplus;
21
 
22
+ /**
23
+ * Constructor
24
+ *
25
+ * @param string $uc_helper The 'helper' needs to provide the method _updraftplus_background_operation_started
26
+ */
27
  public function __construct($uc_helper) {
28
  $this->_uc_helper = $uc_helper;
29
  global $updraftplus_admin, $updraftplus;
35
  public function forcescheduledresumption($info) {
36
 
37
  // Casting $resumption to int is absolutely necessary, as the WP cron system uses a hashed serialisation of the parameters for identifying jobs. Different type => different hash => does not match
38
+ $resumption = (int) $info['resumption'];
39
  $job_id = $info['job_id'];
40
  $get_cron = $this->_updraftplus_admin->get_cron($job_id);
41
  if (!is_array($get_cron)) {
60
 
61
  die;
62
 
63
+ // return array(
64
+ // 'response' => $response['response'],
65
+ // 'status' => $response['status'],
66
+ // 'log' => $response['log']
67
+ // );
68
  }
69
 
70
  public function updraftcentral_delete_key($params) {
92
  return array('error' => 'UpdraftPlus_UpdraftCentral_Main object not found');
93
  }
94
  return call_user_func(array($updraftplus_updraftcentral_main, 'create_key'), $params);
95
+ }
96
 
97
  public function restore_alldownloaded($params) {
98
 
99
  $backups = $this->_updraftplus->get_backup_history();
100
  $updraft_dir = $this->_updraftplus->backups_dir_location();
101
 
102
+ $timestamp = (int) $params['timestamp'];
103
  if (!isset($backups[$timestamp])) {
104
  return array('m' => '', 'w' => '', 'e' => __('No such backup set exists', 'updraftplus'));
105
  }
113
 
114
  $elements = array_flip($res['updraft_restore']);
115
 
116
+ $warn = array();
117
+ $err = array();
118
 
119
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
120
+ $max_execution_time = (int) @ini_get('max_execution_time');
121
 
122
  if ($max_execution_time>0 && $max_execution_time<61) {
123
  $warn[] = sprintf(__('The PHP setup on this webserver allows only %s seconds for PHP to run, and does not allow this limit to be raised. If you have a lot of data to import, and if the restore operation times out, then you will need to ask your web hosting company for ways to raise this limit (or attempt the restoration piece-by-piece).', 'updraftplus'), $max_execution_time);
165
  ksort($whatwegot);
166
  $outof = false;
167
  foreach ($whatwegot as $index => $file) {
168
+ if (preg_match('/\d+of(\d+)\.zip/', $file, $omatch)) {
169
+ $outof = max($matches[1], 1);
170
+ }
171
+ while ($expected_index < $index) {
172
+ $missing .= ('' == $missing) ? (1+$expected_index) : ",".(1+$expected_index);
173
+ $expected_index++;
174
  }
175
  if (!file_exists($updraft_dir.'/'.$file)) {
176
  $err[] = sprintf(__('File not found (you need to upload it): %s', 'updraftplus'), $updraft_dir.'/'.$file);
178
  $err[] = sprintf(__('File was found, but is zero-sized (you need to re-upload it): %s', 'updraftplus'), $file);
179
  } else {
180
  $itext = (0 == $index) ? '' : $index;
181
+ if (!empty($backups[$timestamp][$type.$itext.'-size']) && filesize($updraft_dir.'/'.$file) != $backups[$timestamp][$type.$itext.'-size']) {
182
  if (empty($warn['doublecompressfixed'])) {
183
  $warn[] = sprintf(__('File (%s) was found, but has a different size (%s) from what was expected (%s) - it may be corrupt.', 'updraftplus'), $file, filesize($updraft_dir.'/'.$file), $backups[$timestamp][$type.$itext.'-size']);
184
  }
191
  // Detect missing archives where they are missing from the end of the set
192
  if ($outof>0 && $expected_index < $outof) {
193
  for ($j = $expected_index; $j<$outof; $j++) {
194
+ $missing .= ('' == $missing) ? (1+$j) : ",".(1+$j);
195
  }
196
  }
197
  if ('' != $missing) {
229
 
230
  }
231
 
232
+ /**
233
+ * The purpose of this is to detect brokenness caused by extra line feeds in plugins/themes - before it breaks other AJAX operations and leads to support requests
234
+ *
235
+ * @return string
236
+ */
237
  public function ping() {
238
  return 'pong';
239
  }
275
  return $show_raw_data['html'];
276
  }
277
 
278
+ /**
279
+ * N.B. Not exactly the same as the phpinfo method in the UpdraftCentral core class
280
+ * Returns a string, as it is directly fetched as the source of an iframe
281
+ */
282
  public function phpinfo() {
283
 
284
  ob_start();
303
 
304
  public function check_overdue_crons() {
305
  $how_many_overdue = $this->_updraftplus_admin->howmany_overdue_crons();
306
+ return ($how_many_overdue >= 4) ? array('m' => $this->_updraftplus_admin->show_admin_warning_overdue_crons($how_many_overdue)) : array();
307
  }
308
 
309
  public function whichdownloadsneeded($params) {
324
  $retain_string = '';
325
  foreach ($indexes as $index) {
326
  $retain = true; // default
327
+ $findex = (0 == $index) ? '' : (string) $index;
328
  $files = $backup[$entity];
329
  if (!is_array($files)) $files = array($files);
330
  $size_key = $entity.$findex.'-size';
356
 
357
  /**
358
  * This is an handler function that checks what entity has been specified in the $params and calls the required method
359
+ *
360
  * @param [array] $params this is an array of parameters sent via ajax it can include various things depending on what has called this method, this method only cares about the entity parameter which is used to call the correct method and return tree nodes based on that
361
  * @return [array] returns an array of jstree nodes
362
  */
364
 
365
  if ('filebrowser' == $params['entity']) {
366
  $node_array = $this->_updraft_jstree_directory($params);
367
+ } elseif ('zipbrowser' == $params['entity']) {
368
  $node_array = $this->_updraft_jstree_zip($params);
369
  }
370
  return empty($node_array['error']) ? array('nodes' => $node_array) : $node_array;
372
 
373
  /**
374
  * This creates an array of nodes, built from either ABSPATH or the given directory ready to be returned to the jstree object.
375
+ *
376
  * @param [array] $params this is an array of parameters sent via ajax it can include the following:
377
  * node - this is a jstree node object containing information about the selected node
378
  * path - this is a path if provided this will be used to build the tree otherwise ABSPATH is used
383
  $node_array = array();
384
 
385
  // # is the root node if it's the root node then this is the first call so create a parent node otherwise it's a child node and we should get the path from the node id
386
+ if ('#' == $params['node']['id']) {
387
  $path = ABSPATH;
388
 
389
  if (!empty($params['path'])) $path = $params['path'];
418
  'icon' => 'jstree-folder'
419
  );
420
  } else {
421
+ $node_array[] = array(
422
+ 'text' => $value,
423
  'children' => false,
424
  'id' => $path . DIRECTORY_SEPARATOR . $value,
425
  'type' => 'file',
435
 
436
  /**
437
  * This creates an array of nodes, built from a unzipped zip file structure.
438
+ *
439
  * @param [array] $params this is an array of parameters sent via ajax it can include the following:
440
  * node - this is a jstree node object containing information about the selected node
441
  * timestamp - this is the backup timestamp and is used to get the backup archive
449
 
450
  $node_array = array();
451
 
452
+ include_once(UPDRAFTPLUS_DIR.'/class-zip.php');
453
 
454
  $zip_object = 'UpdraftPlus_ZipArchive';
455
 
456
+ // In tests, PclZip was found to be 25% slower than ZipArchive
457
  if (((defined('UPDRAFTPLUS_PREFERPCLZIP') && UPDRAFTPLUS_PREFERPCLZIP == true) || !class_exists('ZipArchive') || !class_exists('UpdraftPlus_ZipArchive') || (!extension_loaded('zip') && !method_exists('ZipArchive', 'AddFile')))) {
458
  $zip_object = 'UpdraftPlus_PclZip';
459
  }
469
  $file = $backup_history[$params['timestamp']][$params['type']];
470
 
471
  // Get date in human readable form
472
+ $pretty_date = get_date_from_gmt(gmdate('Y-m-d H:i:s', (int) $params['timestamp']), 'M d, Y G:i');
473
 
474
  $backupable_entities = $updraftplus->get_backupable_file_entities(true, true);
475
 
485
 
486
  if ('1/1' == $archive_set) $archive_set = '';
487
 
488
+ $parent_name = $archive_name . ' ' . __('archive', 'updraftplus') . ' ' . $archive_set . ' ' . $pretty_date;
489
 
490
  // Deal with multi-archive sets
491
  if (is_array($file)) $file = $file[$params['findex']];
511
  if (true !== $zip_opened) {
512
  return array('error' => 'UpdraftPlus: opening zip (' . $fullpath . '): failed to open this zip file (object='.$zip_object.', code: '.$zip_opened.')');
513
  } else {
514
+ if ('UpdraftPlus_PclZip' == $zip_object) {
515
  $numfiles = $zip->numAll;
516
  if (false === $numfiles) {
517
  return array('error' => 'UpdraftPlus: reading zip: '.$zip->last_error);
527
  $si['name'] = str_replace("/", DIRECTORY_SEPARATOR, $si['name']);
528
 
529
  // if it's a dot then we don't want to append this as it will break the id's and the tree structure
530
+ if ('.' == dirname($si['name'])) {
531
  $node_id = $parent_name;
532
  } else {
533
  $node_id = $parent_name . DIRECTORY_SEPARATOR . dirname($si['name']) . DIRECTORY_SEPARATOR;
553
  'type' => 'file',
554
  'icon' => 'jstree-file',
555
  'li_attr' => array(
556
+ 'path' => $parent_name . DIRECTORY_SEPARATOR . $si['name'],
557
+ 'size' => $updraftplus->convert_numeric_size_to_text($si['size'])
558
  )
559
  );
560
  }
564
  if ('uploads' == $params['type']) $node_array[] = array(
565
  'text' => 'uploads',
566
  'parent' => $parent_name,
567
+ 'id' => $parent_name . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR,
568
  'icon' => 'jstree-folder',
569
  'li_attr' => array(
570
  'path' => $parent_name . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR
includes/deprecated-actions.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (!defined ('UPDRAFTPLUS_DIR')) die('No direct access allowed');
4
 
5
  /*
6
  These actions are no longer called, except in the case of someone restoring an old version of UD onto a new backend and not refreshing the page. We can keep them around a bit longer to handle that limited case. This generally means that they were replaced by calls to commands in the standardised UpdraftPlus_Commands class.
@@ -10,7 +10,7 @@ These have been removed from admin.php as part of the process of removing them e
10
 
11
  global $updraftplus, $updraftplus_admin;
12
 
13
- if (isset($_POST['subaction']) && $_POST['subaction'] == 'credentials_test') {
14
 
15
  $updraftplus_admin->do_credentials_test($_POST);
16
 
1
  <?php
2
 
3
+ if (!defined('UPDRAFTPLUS_DIR')) die('No direct access allowed');
4
 
5
  /*
6
  These actions are no longer called, except in the case of someone restoring an old version of UD onto a new backend and not refreshing the page. We can keep them around a bit longer to handle that limited case. This generally means that they were replaced by calls to commands in the standardised UpdraftPlus_Commands class.
10
 
11
  global $updraftplus, $updraftplus_admin;
12
 
13
+ if (isset($_POST['subaction']) && 'credentials_test' == $_POST['subaction']) {
14
 
15
  $updraftplus_admin->do_credentials_test($_POST);
16
 
includes/ftp.class.php CHANGED
@@ -2,19 +2,33 @@
2
 
3
  if (!defined('UPDRAFTPLUS_DIR')) die('No direct access allowed.');
4
 
5
- /* Adapted from http://www.solutionbot.com/2009/01/02/php-ftp-class/ */
 
 
6
  class UpdraftPlus_ftp_wrapper {
 
7
  private $conn_id;
 
8
  private $host;
 
9
  private $username;
 
10
  private $password;
 
11
  private $port;
12
- public $timeout = 60;
13
- public $passive = true;
14
- public $system_type = '';
 
 
 
 
15
  public $ssl = false;
 
16
  public $use_server_certs = false;
 
17
  public $disable_verify = true;
 
18
  public $login_type = 'non-encrypted';
19
 
20
  public function __construct($host, $username, $password, $port = 21) {
@@ -33,7 +47,7 @@ class UpdraftPlus_ftp_wrapper {
33
 
34
  if (!empty($result)) {
35
  ftp_set_option($this->conn_id, FTP_TIMEOUT_SEC, $this->timeout);
36
- ftp_pasv($this->conn_id, $this->passive);
37
  $this->system_type = ftp_systype($this->conn_id);
38
  return true;
39
  }
@@ -59,7 +73,8 @@ class UpdraftPlus_ftp_wrapper {
59
  if ($resume) {
60
  $existing_size = ftp_size($this->conn_id, $remote_file_path);
61
  if ($existing_size <=0) {
62
- $resume = false; $existing_size = 0;
 
63
  } else {
64
  if (is_a($updraftplus, 'UpdraftPlus')) $updraftplus->log("File already exists at remote site: size $existing_size. Will attempt resumption.");
65
  if ($existing_size >= $file_size) {
@@ -79,7 +94,7 @@ class UpdraftPlus_ftp_wrapper {
79
 
80
  // $existing_size can now be re-purposed
81
 
82
- while ($ret == FTP_MOREDATA) {
83
  if (is_a($updraftplus, 'UpdraftPlus')) {
84
  $new_size = ftell($fh);
85
  $record_after = 524288;
@@ -88,7 +103,7 @@ class UpdraftPlus_ftp_wrapper {
88
  }
89
  if ($new_size - $existing_size > $record_after) {
90
  $existing_size = $new_size;
91
- $percent = round(100*$new_size/$file_size,1);
92
  $updraftplus->record_uploaded_chunk($percent, '', $local_file_path);
93
  }
94
  }
@@ -98,7 +113,7 @@ class UpdraftPlus_ftp_wrapper {
98
 
99
  fclose($fh);
100
 
101
- if ($ret != FTP_FINISHED) {
102
  if (is_a($updraftplus, 'UpdraftPlus')) $updraftplus->log("FTP upload: error ($ret)");
103
  return false;
104
  }
@@ -107,7 +122,7 @@ class UpdraftPlus_ftp_wrapper {
107
 
108
  }
109
 
110
- public function get($local_file_path, $remote_file_path, $mode = FTP_BINARY, $resume = false, $updraftplus = false) {
111
 
112
  $file_last_size = 0;
113
 
@@ -123,12 +138,12 @@ class UpdraftPlus_ftp_wrapper {
123
 
124
  if (false == $ret) return false;
125
 
126
- while ($ret == FTP_MOREDATA) {
127
 
128
  if ($updraftplus) {
129
  $file_now_size = filesize($local_file_path);
130
  if ($file_now_size - $file_last_size > 524288) {
131
- $updraftplus->log("FTP fetch: file size is now: ".sprintf("%0.2f",filesize($local_file_path)/1048576)." Mb");
132
  $file_last_size = $file_now_size;
133
  }
134
  clearstatcache($local_file_path);
@@ -139,13 +154,13 @@ class UpdraftPlus_ftp_wrapper {
139
 
140
  fclose($fh);
141
 
142
- if ($ret == FTP_FINISHED) {
143
  if ($updraftplus) $updraftplus->log("FTP fetch: fetch complete");
144
  return true;
145
  } else {
146
  if ($updraftplus) $updraftplus->log("FTP fetch: fetch failed");
147
  return false;
148
- }
149
 
150
  }
151
 
@@ -183,23 +198,17 @@ class UpdraftPlus_ftp_wrapper {
183
  }
184
 
185
  public function rename($old_name, $new_name) {
186
- if (ftp_rename($this->conn_id, $old_name, $new_name))
187
- {
188
  return true;
189
- }
190
- else
191
- {
192
  return false;
193
  }
194
  }
195
 
196
  public function remove_dir($directory) {
197
- if (ftp_rmdir($this->conn_id, $directory))
198
- {
199
  return true;
200
- }
201
- else
202
- {
203
  return false;
204
  }
205
  }
@@ -221,11 +230,10 @@ class UpdraftPlus_ftp_wrapper {
221
  }
222
 
223
  private function is_octal($i) {
224
- return decoct(octdec($i)) == $i;
225
  }
226
 
227
  public function __destruct() {
228
  if ($this->conn_id) ftp_close($this->conn_id);
229
  }
230
  }
231
- ?>
2
 
3
  if (!defined('UPDRAFTPLUS_DIR')) die('No direct access allowed.');
4
 
5
+ /**
6
+ * Adapted from http://www.solutionbot.com/2009/01/02/php-ftp-class/
7
+ */
8
  class UpdraftPlus_ftp_wrapper {
9
+
10
  private $conn_id;
11
+
12
  private $host;
13
+
14
  private $username;
15
+
16
  private $password;
17
+
18
  private $port;
19
+
20
+ public $timeout = 60;
21
+
22
+ public $passive = true;
23
+
24
+ public $system_type = '';
25
+
26
  public $ssl = false;
27
+
28
  public $use_server_certs = false;
29
+
30
  public $disable_verify = true;
31
+
32
  public $login_type = 'non-encrypted';
33
 
34
  public function __construct($host, $username, $password, $port = 21) {
47
 
48
  if (!empty($result)) {
49
  ftp_set_option($this->conn_id, FTP_TIMEOUT_SEC, $this->timeout);
50
+ ftp_pasv($this->conn_id, $this->passive);
51
  $this->system_type = ftp_systype($this->conn_id);
52
  return true;
53
  }
73
  if ($resume) {
74
  $existing_size = ftp_size($this->conn_id, $remote_file_path);
75
  if ($existing_size <=0) {
76
+ $resume = false;
77
+ $existing_size = 0;
78
  } else {
79
  if (is_a($updraftplus, 'UpdraftPlus')) $updraftplus->log("File already exists at remote site: size $existing_size. Will attempt resumption.");
80
  if ($existing_size >= $file_size) {
94
 
95
  // $existing_size can now be re-purposed
96
 
97
+ while (FTP_MOREDATA == $ret) {
98
  if (is_a($updraftplus, 'UpdraftPlus')) {
99
  $new_size = ftell($fh);
100
  $record_after = 524288;
103
  }
104
  if ($new_size - $existing_size > $record_after) {
105
  $existing_size = $new_size;
106
+ $percent = round(100*$new_size/$file_size, 1);
107
  $updraftplus->record_uploaded_chunk($percent, '', $local_file_path);
108
  }
109
  }
113
 
114
  fclose($fh);
115
 
116
+ if (FTP_FINISHED != $ret) {
117
  if (is_a($updraftplus, 'UpdraftPlus')) $updraftplus->log("FTP upload: error ($ret)");
118
  return false;
119
  }
122
 
123
  }
124
 
125
+ public function get($local_file_path, $remote_file_path, $mode = FTP_BINARY, $resume = false, $updraftplus = false) {
126
 
127
  $file_last_size = 0;
128
 
138
 
139
  if (false == $ret) return false;
140
 
141
+ while (FTP_MOREDATA == $ret) {
142
 
143
  if ($updraftplus) {
144
  $file_now_size = filesize($local_file_path);
145
  if ($file_now_size - $file_last_size > 524288) {
146
+ $updraftplus->log("FTP fetch: file size is now: ".sprintf("%0.2f", filesize($local_file_path)/1048576)." Mb");
147
  $file_last_size = $file_now_size;
148
  }
149
  clearstatcache($local_file_path);
154
 
155
  fclose($fh);
156
 
157
+ if (FTP_FINISHED == $ret) {
158
  if ($updraftplus) $updraftplus->log("FTP fetch: fetch complete");
159
  return true;
160
  } else {
161
  if ($updraftplus) $updraftplus->log("FTP fetch: fetch failed");
162
  return false;
163
+ }
164
 
165
  }
166
 
198
  }
199
 
200
  public function rename($old_name, $new_name) {
201
+ if (ftp_rename($this->conn_id, $old_name, $new_name)) {
 
202
  return true;
203
+ } else {
 
 
204
  return false;
205
  }
206
  }
207
 
208
  public function remove_dir($directory) {
209
+ if (ftp_rmdir($this->conn_id, $directory)) {
 
210
  return true;
211
+ } else {
 
 
212
  return false;
213
  }
214
  }
230
  }
231
 
232
  private function is_octal($i) {
233
+ return decoct(octdec($i)) == $i;
234
  }
235
 
236
  public function __destruct() {
237
  if ($this->conn_id) ftp_close($this->conn_id);
238
  }
239
  }
 
includes/handlebars/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (C) 2011-2016 by Yehuda Katz
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
includes/handlebars/handlebars.js ADDED
@@ -0,0 +1,4840 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**!
2
+
3
+ @license
4
+ handlebars v4.0.10
5
+
6
+ Copyright (C) 2011-2016 by Yehuda Katz
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in
16
+ all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ THE SOFTWARE.
25
+
26
+ */
27
+ (function webpackUniversalModuleDefinition(root, factory) {
28
+ if(typeof exports === 'object' && typeof module === 'object')
29
+ module.exports = factory();
30
+ else if(typeof define === 'function' && define.amd)
31
+ define([], factory);
32
+ else if(typeof exports === 'object')
33
+ exports["Handlebars"] = factory();
34
+ else
35
+ root["Handlebars"] = factory();
36
+ })(this, function() {
37
+ return /******/ (function(modules) { // webpackBootstrap
38
+ /******/ // The module cache
39
+ /******/ var installedModules = {};
40
+
41
+ /******/ // The require function
42
+ /******/ function __webpack_require__(moduleId) {
43
+
44
+ /******/ // Check if module is in cache
45
+ /******/ if(installedModules[moduleId])
46
+ /******/ return installedModules[moduleId].exports;
47
+
48
+ /******/ // Create a new module (and put it into the cache)
49
+ /******/ var module = installedModules[moduleId] = {
50
+ /******/ exports: {},
51
+ /******/ id: moduleId,
52
+ /******/ loaded: false
53
+ /******/ };
54
+
55
+ /******/ // Execute the module function
56
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
57
+
58
+ /******/ // Flag the module as loaded
59
+ /******/ module.loaded = true;
60
+
61
+ /******/ // Return the exports of the module
62
+ /******/ return module.exports;
63
+ /******/ }
64
+
65
+
66
+ /******/ // expose the modules object (__webpack_modules__)
67
+ /******/ __webpack_require__.m = modules;
68
+
69
+ /******/ // expose the module cache
70
+ /******/ __webpack_require__.c = installedModules;
71
+
72
+ /******/ // __webpack_public_path__
73
+ /******/ __webpack_require__.p = "";
74
+
75
+ /******/ // Load entry module and return exports
76
+ /******/ return __webpack_require__(0);
77
+ /******/ })
78
+ /************************************************************************/
79
+ /******/ ([
80
+ /* 0 */
81
+ /***/ (function(module, exports, __webpack_require__) {
82
+
83
+ 'use strict';
84
+
85
+ var _interopRequireDefault = __webpack_require__(1)['default'];
86
+
87
+ exports.__esModule = true;
88
+
89
+ var _handlebarsRuntime = __webpack_require__(2);
90
+
91
+ var _handlebarsRuntime2 = _interopRequireDefault(_handlebarsRuntime);
92
+
93
+ // Compiler imports
94
+
95
+ var _handlebarsCompilerAst = __webpack_require__(35);
96
+
97
+ var _handlebarsCompilerAst2 = _interopRequireDefault(_handlebarsCompilerAst);
98
+
99
+ var _handlebarsCompilerBase = __webpack_require__(36);
100
+
101
+ var _handlebarsCompilerCompiler = __webpack_require__(41);
102
+
103
+ var _handlebarsCompilerJavascriptCompiler = __webpack_require__(42);
104
+
105
+ var _handlebarsCompilerJavascriptCompiler2 = _interopRequireDefault(_handlebarsCompilerJavascriptCompiler);
106
+
107
+ var _handlebarsCompilerVisitor = __webpack_require__(39);
108
+
109
+ var _handlebarsCompilerVisitor2 = _interopRequireDefault(_handlebarsCompilerVisitor);
110
+
111
+ var _handlebarsNoConflict = __webpack_require__(34);
112
+
113
+ var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
114
+
115
+ var _create = _handlebarsRuntime2['default'].create;
116
+ function create() {
117
+ var hb = _create();
118
+
119
+ hb.compile = function (input, options) {
120
+ return _handlebarsCompilerCompiler.compile(input, options, hb);
121
+ };
122
+ hb.precompile = function (input, options) {
123
+ return _handlebarsCompilerCompiler.precompile(input, options, hb);
124
+ };
125
+
126
+ hb.AST = _handlebarsCompilerAst2['default'];
127
+ hb.Compiler = _handlebarsCompilerCompiler.Compiler;
128
+ hb.JavaScriptCompiler = _handlebarsCompilerJavascriptCompiler2['default'];
129
+ hb.Parser = _handlebarsCompilerBase.parser;
130
+ hb.parse = _handlebarsCompilerBase.parse;
131
+
132
+ return hb;
133
+ }
134
+
135
+ var inst = create();
136
+ inst.create = create;
137
+
138
+ _handlebarsNoConflict2['default'](inst);
139
+
140
+ inst.Visitor = _handlebarsCompilerVisitor2['default'];
141
+
142
+ inst['default'] = inst;
143
+
144
+ exports['default'] = inst;
145
+ module.exports = exports['default'];
146
+
147
+ /***/ }),
148
+ /* 1 */
149
+ /***/ (function(module, exports) {
150
+
151
+ "use strict";
152
+
153
+ exports["default"] = function (obj) {
154
+ return obj && obj.__esModule ? obj : {
155
+ "default": obj
156
+ };
157
+ };
158
+
159
+ exports.__esModule = true;
160
+
161
+ /***/ }),
162
+ /* 2 */
163
+ /***/ (function(module, exports, __webpack_require__) {
164
+
165
+ 'use strict';
166
+
167
+ var _interopRequireWildcard = __webpack_require__(3)['default'];
168
+
169
+ var _interopRequireDefault = __webpack_require__(1)['default'];
170
+
171
+ exports.__esModule = true;
172
+
173
+ var _handlebarsBase = __webpack_require__(4);
174
+
175
+ var base = _interopRequireWildcard(_handlebarsBase);
176
+
177
+ // Each of these augment the Handlebars object. No need to setup here.
178
+ // (This is done to easily share code between commonjs and browse envs)
179
+
180
+ var _handlebarsSafeString = __webpack_require__(21);
181
+
182
+ var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);
183
+
184
+ var _handlebarsException = __webpack_require__(6);
185
+
186
+ var _handlebarsException2 = _interopRequireDefault(_handlebarsException);
187
+
188
+ var _handlebarsUtils = __webpack_require__(5);
189
+
190
+ var Utils = _interopRequireWildcard(_handlebarsUtils);
191
+
192
+ var _handlebarsRuntime = __webpack_require__(22);
193
+
194
+ var runtime = _interopRequireWildcard(_handlebarsRuntime);
195
+
196
+ var _handlebarsNoConflict = __webpack_require__(34);
197
+
198
+ var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
199
+
200
+ // For compatibility and usage outside of module systems, make the Handlebars object a namespace
201
+ function create() {
202
+ var hb = new base.HandlebarsEnvironment();
203
+
204
+ Utils.extend(hb, base);
205
+ hb.SafeString = _handlebarsSafeString2['default'];
206
+ hb.Exception = _handlebarsException2['default'];
207
+ hb.Utils = Utils;
208
+ hb.escapeExpression = Utils.escapeExpression;
209
+
210
+ hb.VM = runtime;
211
+ hb.template = function (spec) {
212
+ return runtime.template(spec, hb);
213
+ };
214
+
215
+ return hb;
216
+ }
217
+
218
+ var inst = create();
219
+ inst.create = create;
220
+
221
+ _handlebarsNoConflict2['default'](inst);
222
+
223
+ inst['default'] = inst;
224
+
225
+ exports['default'] = inst;
226
+ module.exports = exports['default'];
227
+
228
+ /***/ }),
229
+ /* 3 */
230
+ /***/ (function(module, exports) {
231
+
232
+ "use strict";
233
+
234
+ exports["default"] = function (obj) {
235
+ if (obj && obj.__esModule) {
236
+ return obj;
237
+ } else {
238
+ var newObj = {};
239
+
240
+ if (obj != null) {
241
+ for (var key in obj) {
242
+ if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
243
+ }
244
+ }
245
+
246
+ newObj["default"] = obj;
247
+ return newObj;
248
+ }
249
+ };
250
+
251
+ exports.__esModule = true;
252
+
253
+ /***/ }),
254
+ /* 4 */
255
+ /***/ (function(module, exports, __webpack_require__) {
256
+
257
+ 'use strict';
258
+
259
+ var _interopRequireDefault = __webpack_require__(1)['default'];
260
+
261
+ exports.__esModule = true;
262
+ exports.HandlebarsEnvironment = HandlebarsEnvironment;
263
+
264
+ var _utils = __webpack_require__(5);
265
+
266
+ var _exception = __webpack_require__(6);
267
+
268
+ var _exception2 = _interopRequireDefault(_exception);
269
+
270
+ var _helpers = __webpack_require__(10);
271
+
272
+ var _decorators = __webpack_require__(18);
273
+
274
+ var _logger = __webpack_require__(20);
275
+
276
+ var _logger2 = _interopRequireDefault(_logger);
277
+
278
+ var VERSION = '4.0.10';
279
+ exports.VERSION = VERSION;
280
+ var COMPILER_REVISION = 7;
281
+
282
+ exports.COMPILER_REVISION = COMPILER_REVISION;
283
+ var REVISION_CHANGES = {
284
+ 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
285
+ 2: '== 1.0.0-rc.3',
286
+ 3: '== 1.0.0-rc.4',
287
+ 4: '== 1.x.x',
288
+ 5: '== 2.0.0-alpha.x',
289
+ 6: '>= 2.0.0-beta.1',
290
+ 7: '>= 4.0.0'
291
+ };
292
+
293
+ exports.REVISION_CHANGES = REVISION_CHANGES;
294
+ var objectType = '[object Object]';
295
+
296
+ function HandlebarsEnvironment(helpers, partials, decorators) {
297
+ this.helpers = helpers || {};
298
+ this.partials = partials || {};
299
+ this.decorators = decorators || {};
300
+
301
+ _helpers.registerDefaultHelpers(this);
302
+ _decorators.registerDefaultDecorators(this);
303
+ }
304
+
305
+ HandlebarsEnvironment.prototype = {
306
+ constructor: HandlebarsEnvironment,
307
+
308
+ logger: _logger2['default'],
309
+ log: _logger2['default'].log,
310
+
311
+ registerHelper: function registerHelper(name, fn) {
312
+ if (_utils.toString.call(name) === objectType) {
313
+ if (fn) {
314
+ throw new _exception2['default']('Arg not supported with multiple helpers');
315
+ }
316
+ _utils.extend(this.helpers, name);
317
+ } else {
318
+ this.helpers[name] = fn;
319
+ }
320
+ },
321
+ unregisterHelper: function unregisterHelper(name) {
322
+ delete this.helpers[name];
323
+ },
324
+
325
+ registerPartial: function registerPartial(name, partial) {
326
+ if (_utils.toString.call(name) === objectType) {
327
+ _utils.extend(this.partials, name);
328
+ } else {
329
+ if (typeof partial === 'undefined') {
330
+ throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined');
331
+ }
332
+ this.partials[name] = partial;
333
+ }
334
+ },
335
+ unregisterPartial: function unregisterPartial(name) {
336
+ delete this.partials[name];
337
+ },
338
+
339
+ registerDecorator: function registerDecorator(name, fn) {
340
+ if (_utils.toString.call(name) === objectType) {
341
+ if (fn) {
342
+ throw new _exception2['default']('Arg not supported with multiple decorators');
343
+ }
344
+ _utils.extend(this.decorators, name);
345
+ } else {
346
+ this.decorators[name] = fn;
347
+ }
348
+ },
349
+ unregisterDecorator: function unregisterDecorator(name) {
350
+ delete this.decorators[name];
351
+ }
352
+ };
353
+
354
+ var log = _logger2['default'].log;
355
+
356
+ exports.log = log;
357
+ exports.createFrame = _utils.createFrame;
358
+ exports.logger = _logger2['default'];
359
+
360
+ /***/ }),
361
+ /* 5 */
362
+ /***/ (function(module, exports) {
363
+
364
+ 'use strict';
365
+
366
+ exports.__esModule = true;
367
+ exports.extend = extend;
368
+ exports.indexOf = indexOf;
369
+ exports.escapeExpression = escapeExpression;
370
+ exports.isEmpty = isEmpty;
371
+ exports.createFrame = createFrame;
372
+ exports.blockParams = blockParams;
373
+ exports.appendContextPath = appendContextPath;
374
+ var escape = {
375
+ '&': '&amp;',
376
+ '<': '&lt;',
377
+ '>': '&gt;',
378
+ '"': '&quot;',
379
+ "'": '&#x27;',
380
+ '`': '&#x60;',
381
+ '=': '&#x3D;'
382
+ };
383
+
384
+ var badChars = /[&<>"'`=]/g,
385
+ possible = /[&<>"'`=]/;
386
+
387
+ function escapeChar(chr) {
388
+ return escape[chr];
389
+ }
390
+
391
+ function extend(obj /* , ...source */) {
392
+ for (var i = 1; i < arguments.length; i++) {
393
+ for (var key in arguments[i]) {
394
+ if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
395
+ obj[key] = arguments[i][key];
396
+ }
397
+ }
398
+ }
399
+
400
+ return obj;
401
+ }
402
+
403
+ var toString = Object.prototype.toString;
404
+
405
+ exports.toString = toString;
406
+ // Sourced from lodash
407
+ // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
408
+ /* eslint-disable func-style */
409
+ var isFunction = function isFunction(value) {
410
+ return typeof value === 'function';
411
+ };
412
+ // fallback for older versions of Chrome and Safari
413
+ /* istanbul ignore next */
414
+ if (isFunction(/x/)) {
415
+ exports.isFunction = isFunction = function (value) {
416
+ return typeof value === 'function' && toString.call(value) === '[object Function]';
417
+ };
418
+ }
419
+ exports.isFunction = isFunction;
420
+
421
+ /* eslint-enable func-style */
422
+
423
+ /* istanbul ignore next */
424
+ var isArray = Array.isArray || function (value) {
425
+ return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;
426
+ };
427
+
428
+ exports.isArray = isArray;
429
+ // Older IE versions do not directly support indexOf so we must implement our own, sadly.
430
+
431
+ function indexOf(array, value) {
432
+ for (var i = 0, len = array.length; i < len; i++) {
433
+ if (array[i] === value) {
434
+ return i;
435
+ }
436
+ }
437
+ return -1;
438
+ }
439
+
440
+ function escapeExpression(string) {
441
+ if (typeof string !== 'string') {
442
+ // don't escape SafeStrings, since they're already safe
443
+ if (string && string.toHTML) {
444
+ return string.toHTML();
445
+ } else if (string == null) {
446
+ return '';
447
+ } else if (!string) {
448
+ return string + '';
449
+ }
450
+
451
+ // Force a string conversion as this will be done by the append regardless and
452
+ // the regex test will do this transparently behind the scenes, causing issues if
453
+ // an object's to string has escaped characters in it.
454
+ string = '' + string;
455
+ }
456
+
457
+ if (!possible.test(string)) {
458
+ return string;
459
+ }
460
+ return string.replace(badChars, escapeChar);
461
+ }
462
+
463
+ function isEmpty(value) {
464
+ if (!value && value !== 0) {
465
+ return true;
466
+ } else if (isArray(value) && value.length === 0) {
467
+ return true;
468
+ } else {
469
+ return false;
470
+ }
471
+ }
472
+
473
+ function createFrame(object) {
474
+ var frame = extend({}, object);
475
+ frame._parent = object;
476
+ return frame;
477
+ }
478
+
479
+ function blockParams(params, ids) {
480
+ params.path = ids;
481
+ return params;
482
+ }
483
+
484
+ function appendContextPath(contextPath, id) {
485
+ return (contextPath ? contextPath + '.' : '') + id;
486
+ }
487
+
488
+ /***/ }),
489
+ /* 6 */
490
+ /***/ (function(module, exports, __webpack_require__) {
491
+
492
+ 'use strict';
493
+
494
+ var _Object$defineProperty = __webpack_require__(7)['default'];
495
+
496
+ exports.__esModule = true;
497
+
498
+ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
499
+
500
+ function Exception(message, node) {
501
+ var loc = node && node.loc,
502
+ line = undefined,
503
+ column = undefined;
504
+ if (loc) {
505
+ line = loc.start.line;
506
+ column = loc.start.column;
507
+
508
+ message += ' - ' + line + ':' + column;
509
+ }
510
+
511
+ var tmp = Error.prototype.constructor.call(this, message);
512
+
513
+ // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
514
+ for (var idx = 0; idx < errorProps.length; idx++) {
515
+ this[errorProps[idx]] = tmp[errorProps[idx]];
516
+ }
517
+
518
+ /* istanbul ignore else */
519
+ if (Error.captureStackTrace) {
520
+ Error.captureStackTrace(this, Exception);
521
+ }
522
+
523
+ try {
524
+ if (loc) {
525
+ this.lineNumber = line;
526
+
527
+ // Work around issue under safari where we can't directly set the column value
528
+ /* istanbul ignore next */
529
+ if (_Object$defineProperty) {
530
+ Object.defineProperty(this, 'column', {
531
+ value: column,
532
+ enumerable: true
533
+ });
534
+ } else {
535
+ this.column = column;
536
+ }
537
+ }
538
+ } catch (nop) {
539
+ /* Ignore if the browser is very particular */
540
+ }
541
+ }
542
+
543
+ Exception.prototype = new Error();
544
+
545
+ exports['default'] = Exception;
546
+ module.exports = exports['default'];
547
+
548
+ /***/ }),
549
+ /* 7 */
550
+ /***/ (function(module, exports, __webpack_require__) {
551
+
552
+ module.exports = { "default": __webpack_require__(8), __esModule: true };
553
+
554
+ /***/ }),
555
+ /* 8 */
556
+ /***/ (function(module, exports, __webpack_require__) {
557
+
558
+ var $ = __webpack_require__(9);
559
+ module.exports = function defineProperty(it, key, desc){
560
+ return $.setDesc(it, key, desc);
561
+ };
562
+
563
+ /***/ }),
564
+ /* 9 */
565
+ /***/ (function(module, exports) {
566
+
567
+ var $Object = Object;
568
+ module.exports = {
569
+ create: $Object.create,
570
+ getProto: $Object.getPrototypeOf,
571
+ isEnum: {}.propertyIsEnumerable,
572
+ getDesc: $Object.getOwnPropertyDescriptor,
573
+ setDesc: $Object.defineProperty,
574
+ setDescs: $Object.defineProperties,
575
+ getKeys: $Object.keys,
576
+ getNames: $Object.getOwnPropertyNames,
577
+ getSymbols: $Object.getOwnPropertySymbols,
578
+ each: [].forEach
579
+ };
580
+
581
+ /***/ }),
582
+ /* 10 */
583
+ /***/ (function(module, exports, __webpack_require__) {
584
+
585
+ 'use strict';
586
+
587
+ var _interopRequireDefault = __webpack_require__(1)['default'];
588
+
589
+ exports.__esModule = true;
590
+ exports.registerDefaultHelpers = registerDefaultHelpers;
591
+
592
+ var _helpersBlockHelperMissing = __webpack_require__(11);
593
+
594
+ var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);
595
+
596
+ var _helpersEach = __webpack_require__(12);
597
+
598
+ var _helpersEach2 = _interopRequireDefault(_helpersEach);
599
+
600
+ var _helpersHelperMissing = __webpack_require__(13);
601
+
602
+ var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);
603
+
604
+ var _helpersIf = __webpack_require__(14);
605
+
606
+ var _helpersIf2 = _interopRequireDefault(_helpersIf);
607
+
608
+ var _helpersLog = __webpack_require__(15);
609
+
610
+ var _helpersLog2 = _interopRequireDefault(_helpersLog);
611
+
612
+ var _helpersLookup = __webpack_require__(16);
613
+
614
+ var _helpersLookup2 = _interopRequireDefault(_helpersLookup);
615
+
616
+ var _helpersWith = __webpack_require__(17);
617
+
618
+ var _helpersWith2 = _interopRequireDefault(_helpersWith);
619
+
620
+ function registerDefaultHelpers(instance) {
621
+ _helpersBlockHelperMissing2['default'](instance);
622
+ _helpersEach2['default'](instance);
623
+ _helpersHelperMissing2['default'](instance);
624
+ _helpersIf2['default'](instance);
625
+ _helpersLog2['default'](instance);
626
+ _helpersLookup2['default'](instance);
627
+ _helpersWith2['default'](instance);
628
+ }
629
+
630
+ /***/ }),
631
+ /* 11 */
632
+ /***/ (function(module, exports, __webpack_require__) {
633
+
634
+ 'use strict';
635
+
636
+ exports.__esModule = true;
637
+
638
+ var _utils = __webpack_require__(5);
639
+
640
+ exports['default'] = function (instance) {
641
+ instance.registerHelper('blockHelperMissing', function (context, options) {
642
+ var inverse = options.inverse,
643
+ fn = options.fn;
644
+
645
+ if (context === true) {
646
+ return fn(this);
647
+ } else if (context === false || context == null) {
648
+ return inverse(this);
649
+ } else if (_utils.isArray(context)) {
650
+ if (context.length > 0) {
651
+ if (options.ids) {
652
+ options.ids = [options.name];
653
+ }
654
+
655
+ return instance.helpers.each(context, options);
656
+ } else {
657
+ return inverse(this);
658
+ }
659
+ } else {
660
+ if (options.data && options.ids) {
661
+ var data = _utils.createFrame(options.data);
662
+ data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);
663
+ options = { data: data };
664
+ }
665
+
666
+ return fn(context, options);
667
+ }
668
+ });
669
+ };
670
+
671
+ module.exports = exports['default'];
672
+
673
+ /***/ }),
674
+ /* 12 */
675
+ /***/ (function(module, exports, __webpack_require__) {
676
+
677
+ 'use strict';
678
+
679
+ var _interopRequireDefault = __webpack_require__(1)['default'];
680
+
681
+ exports.__esModule = true;
682
+
683
+ var _utils = __webpack_require__(5);
684
+
685
+ var _exception = __webpack_require__(6);
686
+
687
+ var _exception2 = _interopRequireDefault(_exception);
688
+
689
+ exports['default'] = function (instance) {
690
+ instance.registerHelper('each', function (context, options) {
691
+ if (!options) {
692
+ throw new _exception2['default']('Must pass iterator to #each');
693
+ }
694
+
695
+ var fn = options.fn,
696
+ inverse = options.inverse,
697
+ i = 0,
698
+ ret = '',
699
+ data = undefined,
700
+ contextPath = undefined;
701
+
702
+ if (options.data && options.ids) {
703
+ contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
704
+ }
705
+
706
+ if (_utils.isFunction(context)) {
707
+ context = context.call(this);
708
+ }
709
+
710
+ if (options.data) {
711
+ data = _utils.createFrame(options.data);
712
+ }
713
+
714
+ function execIteration(field, index, last) {
715
+ if (data) {
716
+ data.key = field;
717
+ data.index = index;
718
+ data.first = index === 0;
719
+ data.last = !!last;
720
+
721
+ if (contextPath) {
722
+ data.contextPath = contextPath + field;
723
+ }
724
+ }
725
+
726
+ ret = ret + fn(context[field], {
727
+ data: data,
728
+ blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])
729
+ });
730
+ }
731
+
732
+ if (context && typeof context === 'object') {
733
+ if (_utils.isArray(context)) {
734
+ for (var j = context.length; i < j; i++) {
735
+ if (i in context) {
736
+ execIteration(i, i, i === context.length - 1);
737
+ }
738
+ }
739
+ } else {
740
+ var priorKey = undefined;
741
+
742
+ for (var key in context) {
743
+ if (context.hasOwnProperty(key)) {
744
+ // We're running the iterations one step out of sync so we can detect
745
+ // the last iteration without have to scan the object twice and create
746
+ // an itermediate keys array.
747
+ if (priorKey !== undefined) {
748
+ execIteration(priorKey, i - 1);
749
+ }
750
+ priorKey = key;
751
+ i++;
752
+ }
753
+ }
754
+ if (priorKey !== undefined) {
755
+ execIteration(priorKey, i - 1, true);
756
+ }
757
+ }
758
+ }
759
+
760
+ if (i === 0) {
761
+ ret = inverse(this);
762
+ }
763
+
764
+ return ret;
765
+ });
766
+ };
767
+
768
+ module.exports = exports['default'];
769
+
770
+ /***/ }),
771
+ /* 13 */
772
+ /***/ (function(module, exports, __webpack_require__) {
773
+
774
+ 'use strict';
775
+
776
+ var _interopRequireDefault = __webpack_require__(1)['default'];
777
+
778
+ exports.__esModule = true;
779
+
780
+ var _exception = __webpack_require__(6);
781
+
782
+ var _exception2 = _interopRequireDefault(_exception);
783
+
784
+ exports['default'] = function (instance) {
785
+ instance.registerHelper('helperMissing', function () /* [args, ]options */{
786
+ if (arguments.length === 1) {
787
+ // A missing field in a {{foo}} construct.
788
+ return undefined;
789
+ } else {
790
+ // Someone is actually trying to call something, blow up.
791
+ throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"');
792
+ }
793
+ });
794
+ };
795
+
796
+ module.exports = exports['default'];
797
+
798
+ /***/ }),
799
+ /* 14 */
800
+ /***/ (function(module, exports, __webpack_require__) {
801
+
802
+ 'use strict';
803
+
804
+ exports.__esModule = true;
805
+
806
+ var _utils = __webpack_require__(5);
807
+
808
+ exports['default'] = function (instance) {
809
+ instance.registerHelper('if', function (conditional, options) {
810
+ if (_utils.isFunction(conditional)) {
811
+ conditional = conditional.call(this);
812
+ }
813
+
814
+ // Default behavior is to render the positive path if the value is truthy and not empty.
815
+ // The `includeZero` option may be set to treat the condtional as purely not empty based on the
816
+ // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
817
+ if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {
818
+ return options.inverse(this);
819
+ } else {
820
+ return options.fn(this);
821
+ }
822
+ });
823
+
824
+ instance.registerHelper('unless', function (conditional, options) {
825
+ return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });
826
+ });
827
+ };
828
+
829
+ module.exports = exports['default'];
830
+
831
+ /***/ }),
832
+ /* 15 */
833
+ /***/ (function(module, exports) {
834
+
835
+ 'use strict';
836
+
837
+ exports.__esModule = true;
838
+
839
+ exports['default'] = function (instance) {
840
+ instance.registerHelper('log', function () /* message, options */{
841
+ var args = [undefined],
842
+ options = arguments[arguments.length - 1];
843
+ for (var i = 0; i < arguments.length - 1; i++) {
844
+ args.push(arguments[i]);
845
+ }
846
+
847
+ var level = 1;
848
+ if (options.hash.level != null) {
849
+ level = options.hash.level;
850
+ } else if (options.data && options.data.level != null) {
851
+ level = options.data.level;
852
+ }
853
+ args[0] = level;
854
+
855
+ instance.log.apply(instance, args);
856
+ });
857
+ };
858
+
859
+ module.exports = exports['default'];
860
+
861
+ /***/ }),
862
+ /* 16 */
863
+ /***/ (function(module, exports) {
864
+
865
+ 'use strict';
866
+
867
+ exports.__esModule = true;
868
+
869
+ exports['default'] = function (instance) {
870
+ instance.registerHelper('lookup', function (obj, field) {
871
+ return obj && obj[field];
872
+ });
873
+ };
874
+
875
+ module.exports = exports['default'];
876
+
877
+ /***/ }),
878
+ /* 17 */
879
+ /***/ (function(module, exports, __webpack_require__) {
880
+
881
+ 'use strict';
882
+
883
+ exports.__esModule = true;
884
+
885
+ var _utils = __webpack_require__(5);
886
+
887
+ exports['default'] = function (instance) {
888
+ instance.registerHelper('with', function (context, options) {
889
+ if (_utils.isFunction(context)) {
890
+ context = context.call(this);
891
+ }
892
+
893
+ var fn = options.fn;
894
+
895
+ if (!_utils.isEmpty(context)) {
896
+ var data = options.data;
897
+ if (options.data && options.ids) {
898
+ data = _utils.createFrame(options.data);
899
+ data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);
900
+ }
901
+
902
+ return fn(context, {
903
+ data: data,
904
+ blockParams: _utils.blockParams([context], [data && data.contextPath])
905
+ });
906
+ } else {
907
+ return options.inverse(this);
908
+ }
909
+ });
910
+ };
911
+
912
+ module.exports = exports['default'];
913
+
914
+ /***/ }),
915
+ /* 18 */
916
+ /***/ (function(module, exports, __webpack_require__) {
917
+
918
+ 'use strict';
919
+
920
+ var _interopRequireDefault = __webpack_require__(1)['default'];
921
+
922
+ exports.__esModule = true;
923
+ exports.registerDefaultDecorators = registerDefaultDecorators;
924
+
925
+ var _decoratorsInline = __webpack_require__(19);
926
+
927
+ var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);
928
+
929
+ function registerDefaultDecorators(instance) {
930
+ _decoratorsInline2['default'](instance);
931
+ }
932
+
933
+ /***/ }),
934
+ /* 19 */
935
+ /***/ (function(module, exports, __webpack_require__) {
936
+
937
+ 'use strict';
938
+
939
+ exports.__esModule = true;
940
+
941
+ var _utils = __webpack_require__(5);
942
+
943
+ exports['default'] = function (instance) {
944
+ instance.registerDecorator('inline', function (fn, props, container, options) {
945
+ var ret = fn;
946
+ if (!props.partials) {
947
+ props.partials = {};
948
+ ret = function (context, options) {
949
+ // Create a new partials stack frame prior to exec.
950
+ var original = container.partials;
951
+ container.partials = _utils.extend({}, original, props.partials);
952
+ var ret = fn(context, options);
953
+ container.partials = original;
954
+ return ret;
955
+ };
956
+ }
957
+
958
+ props.partials[options.args[0]] = options.fn;
959
+
960
+ return ret;
961
+ });
962
+ };
963
+
964
+ module.exports = exports['default'];
965
+
966
+ /***/ }),
967
+ /* 20 */
968
+ /***/ (function(module, exports, __webpack_require__) {
969
+
970
+ 'use strict';
971
+
972
+ exports.__esModule = true;
973
+
974
+ var _utils = __webpack_require__(5);
975
+
976
+ var logger = {
977
+ methodMap: ['debug', 'info', 'warn', 'error'],
978
+ level: 'info',
979
+
980
+ // Maps a given level value to the `methodMap` indexes above.
981
+ lookupLevel: function lookupLevel(level) {
982
+ if (typeof level === 'string') {
983
+ var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());
984
+ if (levelMap >= 0) {
985
+ level = levelMap;
986
+ } else {
987
+ level = parseInt(level, 10);
988
+ }
989
+ }
990
+
991
+ return level;
992
+ },
993
+
994
+ // Can be overridden in the host environment
995
+ log: function log(level) {
996
+ level = logger.lookupLevel(level);
997
+
998
+ if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {
999
+ var method = logger.methodMap[level];
1000
+ if (!console[method]) {
1001
+ // eslint-disable-line no-console
1002
+ method = 'log';
1003
+ }
1004
+
1005
+ for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
1006
+ message[_key - 1] = arguments[_key];
1007
+ }
1008
+
1009
+ console[method].apply(console, message); // eslint-disable-line no-console
1010
+ }
1011
+ }
1012
+ };
1013
+
1014
+ exports['default'] = logger;
1015
+ module.exports = exports['default'];
1016
+
1017
+ /***/ }),
1018
+ /* 21 */
1019
+ /***/ (function(module, exports) {
1020
+
1021
+ // Build out our basic SafeString type
1022
+ 'use strict';
1023
+
1024
+ exports.__esModule = true;
1025
+ function SafeString(string) {
1026
+ this.string = string;
1027
+ }
1028
+
1029
+ SafeString.prototype.toString = SafeString.prototype.toHTML = function () {
1030
+ return '' + this.string;
1031
+ };
1032
+
1033
+ exports['default'] = SafeString;
1034
+ module.exports = exports['default'];
1035
+
1036
+ /***/ }),
1037
+ /* 22 */
1038
+ /***/ (function(module, exports, __webpack_require__) {
1039
+
1040
+ 'use strict';
1041
+
1042
+ var _Object$seal = __webpack_require__(23)['default'];
1043
+
1044
+ var _interopRequireWildcard = __webpack_require__(3)['default'];
1045
+
1046
+ var _interopRequireDefault = __webpack_require__(1)['default'];
1047
+
1048
+ exports.__esModule = true;
1049
+ exports.checkRevision = checkRevision;
1050
+ exports.template = template;
1051
+ exports.wrapProgram = wrapProgram;
1052
+ exports.resolvePartial = resolvePartial;
1053
+ exports.invokePartial = invokePartial;
1054
+ exports.noop = noop;
1055
+
1056
+ var _utils = __webpack_require__(5);
1057
+
1058
+ var Utils = _interopRequireWildcard(_utils);
1059
+
1060
+ var _exception = __webpack_require__(6);
1061
+
1062
+ var _exception2 = _interopRequireDefault(_exception);
1063
+
1064
+ var _base = __webpack_require__(4);
1065
+
1066
+ function checkRevision(compilerInfo) {
1067
+ var compilerRevision = compilerInfo && compilerInfo[0] || 1,
1068
+ currentRevision = _base.COMPILER_REVISION;
1069
+
1070
+ if (compilerRevision !== currentRevision) {
1071
+ if (compilerRevision < currentRevision) {
1072
+ var runtimeVersions = _base.REVISION_CHANGES[currentRevision],
1073
+ compilerVersions = _base.REVISION_CHANGES[compilerRevision];
1074
+ throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');
1075
+ } else {
1076
+ // Use the embedded version info since the runtime doesn't know about this revision yet
1077
+ throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');
1078
+ }
1079
+ }
1080
+ }
1081
+
1082
+ function template(templateSpec, env) {
1083
+ /* istanbul ignore next */
1084
+ if (!env) {
1085
+ throw new _exception2['default']('No environment passed to template');
1086
+ }
1087
+ if (!templateSpec || !templateSpec.main) {
1088
+ throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);
1089
+ }
1090
+
1091
+ templateSpec.main.decorator = templateSpec.main_d;
1092
+
1093
+ // Note: Using env.VM references rather than local var references throughout this section to allow
1094
+ // for external users to override these as psuedo-supported APIs.
1095
+ env.VM.checkRevision(templateSpec.compiler);
1096
+
1097
+ function invokePartialWrapper(partial, context, options) {
1098
+ if (options.hash) {
1099
+ context = Utils.extend({}, context, options.hash);
1100
+ if (options.ids) {
1101
+ options.ids[0] = true;
1102
+ }
1103
+ }
1104
+
1105
+ partial = env.VM.resolvePartial.call(this, partial, context, options);
1106
+ var result = env.VM.invokePartial.call(this, partial, context, options);
1107
+
1108
+ if (result == null && env.compile) {
1109
+ options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);
1110
+ result = options.partials[options.name](context, options);
1111
+ }
1112
+ if (result != null) {
1113
+ if (options.indent) {
1114
+ var lines = result.split('\n');
1115
+ for (var i = 0, l = lines.length; i < l; i++) {
1116
+ if (!lines[i] && i + 1 === l) {
1117
+ break;
1118
+ }
1119
+
1120
+ lines[i] = options.indent + lines[i];
1121
+ }
1122
+ result = lines.join('\n');
1123
+ }
1124
+ return result;
1125
+ } else {
1126
+ throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');
1127
+ }
1128
+ }
1129
+
1130
+ // Just add water
1131
+ var container = {
1132
+ strict: function strict(obj, name) {
1133
+ if (!(name in obj)) {
1134
+ throw new _exception2['default']('"' + name + '" not defined in ' + obj);
1135
+ }
1136
+ return obj[name];
1137
+ },
1138
+ lookup: function lookup(depths, name) {
1139
+ var len = depths.length;
1140
+ for (var i = 0; i < len; i++) {
1141
+ if (depths[i] && depths[i][name] != null) {
1142
+ return depths[i][name];
1143
+ }
1144
+ }
1145
+ },
1146
+ lambda: function lambda(current, context) {
1147
+ return typeof current === 'function' ? current.call(context) : current;
1148
+ },
1149
+
1150
+ escapeExpression: Utils.escapeExpression,
1151
+ invokePartial: invokePartialWrapper,
1152
+
1153
+ fn: function fn(i) {
1154
+ var ret = templateSpec[i];
1155
+ ret.decorator = templateSpec[i + '_d'];
1156
+ return ret;
1157
+ },
1158
+
1159
+ programs: [],
1160
+ program: function program(i, data, declaredBlockParams, blockParams, depths) {
1161
+ var programWrapper = this.programs[i],
1162
+ fn = this.fn(i);
1163
+ if (data || depths || blockParams || declaredBlockParams) {
1164
+ programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);
1165
+ } else if (!programWrapper) {
1166
+ programWrapper = this.programs[i] = wrapProgram(this, i, fn);
1167
+ }
1168
+ return programWrapper;
1169
+ },
1170
+
1171
+ data: function data(value, depth) {
1172
+ while (value && depth--) {
1173
+ value = value._parent;
1174
+ }
1175
+ return value;
1176
+ },
1177
+ merge: function merge(param, common) {
1178
+ var obj = param || common;
1179
+
1180
+ if (param && common && param !== common) {
1181
+ obj = Utils.extend({}, common, param);
1182
+ }
1183
+
1184
+ return obj;
1185
+ },
1186
+ // An empty object to use as replacement for null-contexts
1187
+ nullContext: _Object$seal({}),
1188
+
1189
+ noop: env.VM.noop,
1190
+ compilerInfo: templateSpec.compiler
1191
+ };
1192
+
1193
+ function ret(context) {
1194
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
1195
+
1196
+ var data = options.data;
1197
+
1198
+ ret._setup(options);
1199
+ if (!options.partial && templateSpec.useData) {
1200
+ data = initData(context, data);
1201
+ }
1202
+ var depths = undefined,
1203
+ blockParams = templateSpec.useBlockParams ? [] : undefined;
1204
+ if (templateSpec.useDepths) {
1205
+ if (options.depths) {
1206
+ depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;
1207
+ } else {
1208
+ depths = [context];
1209
+ }
1210
+ }
1211
+
1212
+ function main(context /*, options*/) {
1213
+ return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);
1214
+ }
1215
+ main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);
1216
+ return main(context, options);
1217
+ }
1218
+ ret.isTop = true;
1219
+
1220
+ ret._setup = function (options) {
1221
+ if (!options.partial) {
1222
+ container.helpers = container.merge(options.helpers, env.helpers);
1223
+
1224
+ if (templateSpec.usePartial) {
1225
+ container.partials = container.merge(options.partials, env.partials);
1226
+ }
1227
+ if (templateSpec.usePartial || templateSpec.useDecorators) {
1228
+ container.decorators = container.merge(options.decorators, env.decorators);
1229
+ }
1230
+ } else {
1231
+ container.helpers = options.helpers;
1232
+ container.partials = options.partials;
1233
+ container.decorators = options.decorators;
1234
+ }
1235
+ };
1236
+
1237
+ ret._child = function (i, data, blockParams, depths) {
1238
+ if (templateSpec.useBlockParams && !blockParams) {
1239
+ throw new _exception2['default']('must pass block params');
1240
+ }
1241
+ if (templateSpec.useDepths && !depths) {
1242
+ throw new _exception2['default']('must pass parent depths');
1243
+ }
1244
+
1245
+ return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);
1246
+ };
1247
+ return ret;
1248
+ }
1249
+
1250
+ function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {
1251
+ function prog(context) {
1252
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
1253
+
1254
+ var currentDepths = depths;
1255
+ if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {
1256
+ currentDepths = [context].concat(depths);
1257
+ }
1258
+
1259
+ return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);
1260
+ }
1261
+
1262
+ prog = executeDecorators(fn, prog, container, depths, data, blockParams);
1263
+
1264
+ prog.program = i;
1265
+ prog.depth = depths ? depths.length : 0;
1266
+ prog.blockParams = declaredBlockParams || 0;
1267
+ return prog;
1268
+ }
1269
+
1270
+ function resolvePartial(partial, context, options) {
1271
+ if (!partial) {
1272
+ if (options.name === '@partial-block') {
1273
+ partial = options.data['partial-block'];
1274
+ } else {
1275
+ partial = options.partials[options.name];
1276
+ }
1277
+ } else if (!partial.call && !options.name) {
1278
+ // This is a dynamic partial that returned a string
1279
+ options.name = partial;
1280
+ partial = options.partials[partial];
1281
+ }
1282
+ return partial;
1283
+ }
1284
+
1285
+ function invokePartial(partial, context, options) {
1286
+ // Use the current closure context to save the partial-block if this partial
1287
+ var currentPartialBlock = options.data && options.data['partial-block'];
1288
+ options.partial = true;
1289
+ if (options.ids) {
1290
+ options.data.contextPath = options.ids[0] || options.data.contextPath;
1291
+ }
1292
+
1293
+ var partialBlock = undefined;
1294
+ if (options.fn && options.fn !== noop) {
1295
+ (function () {
1296
+ options.data = _base.createFrame(options.data);
1297
+ // Wrapper function to get access to currentPartialBlock from the closure
1298
+ var fn = options.fn;
1299
+ partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) {
1300
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
1301
+
1302
+ // Restore the partial-block from the closure for the execution of the block
1303
+ // i.e. the part inside the block of the partial call.
1304
+ options.data = _base.createFrame(options.data);
1305
+ options.data['partial-block'] = currentPartialBlock;
1306
+ return fn(context, options);
1307
+ };
1308
+ if (fn.partials) {
1309
+ options.partials = Utils.extend({}, options.partials, fn.partials);
1310
+ }
1311
+ })();
1312
+ }
1313
+
1314
+ if (partial === undefined && partialBlock) {
1315
+ partial = partialBlock;
1316
+ }
1317
+
1318
+ if (partial === undefined) {
1319
+ throw new _exception2['default']('The partial ' + options.name + ' could not be found');
1320
+ } else if (partial instanceof Function) {
1321
+ return partial(context, options);
1322
+ }
1323
+ }
1324
+
1325
+ function noop() {
1326
+ return '';
1327
+ }
1328
+
1329
+ function initData(context, data) {
1330
+ if (!data || !('root' in data)) {
1331
+ data = data ? _base.createFrame(data) : {};
1332
+ data.root = context;
1333
+ }
1334
+ return data;
1335
+ }
1336
+
1337
+ function executeDecorators(fn, prog, container, depths, data, blockParams) {
1338
+ if (fn.decorator) {
1339
+ var props = {};
1340
+ prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);
1341
+ Utils.extend(prog, props);
1342
+ }
1343
+ return prog;
1344
+ }
1345
+
1346
+ /***/ }),
1347
+ /* 23 */
1348
+ /***/ (function(module, exports, __webpack_require__) {
1349
+
1350
+ module.exports = { "default": __webpack_require__(24), __esModule: true };
1351
+
1352
+ /***/ }),
1353
+ /* 24 */
1354
+ /***/ (function(module, exports, __webpack_require__) {
1355
+
1356
+ __webpack_require__(25);
1357
+ module.exports = __webpack_require__(30).Object.seal;
1358
+
1359
+ /***/ }),
1360
+ /* 25 */
1361
+ /***/ (function(module, exports, __webpack_require__) {
1362
+
1363
+ // 19.1.2.17 Object.seal(O)
1364
+ var isObject = __webpack_require__(26);
1365
+
1366
+ __webpack_require__(27)('seal', function($seal){
1367
+ return function seal(it){
1368
+ return $seal && isObject(it) ? $seal(it) : it;
1369
+ };
1370
+ });
1371
+
1372
+ /***/ }),
1373
+ /* 26 */
1374
+ /***/ (function(module, exports) {
1375
+
1376
+ module.exports = function(it){
1377
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
1378
+ };
1379
+
1380
+ /***/ }),
1381
+ /* 27 */
1382
+ /***/ (function(module, exports, __webpack_require__) {
1383
+
1384
+ // most Object methods by ES6 should accept primitives
1385
+ var $export = __webpack_require__(28)
1386
+ , core = __webpack_require__(30)
1387
+ , fails = __webpack_require__(33);
1388
+ module.exports = function(KEY, exec){
1389
+ var fn = (core.Object || {})[KEY] || Object[KEY]
1390
+ , exp = {};
1391
+ exp[KEY] = exec(fn);
1392
+ $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
1393
+ };
1394
+
1395
+ /***/ }),
1396
+ /* 28 */
1397
+ /***/ (function(module, exports, __webpack_require__) {
1398
+
1399
+ var global = __webpack_require__(29)
1400
+ , core = __webpack_require__(30)
1401
+ , ctx = __webpack_require__(31)
1402
+ , PROTOTYPE = 'prototype';
1403
+
1404
+ var $export = function(type, name, source){
1405
+ var IS_FORCED = type & $export.F
1406
+ , IS_GLOBAL = type & $export.G
1407
+ , IS_STATIC = type & $export.S
1408
+ , IS_PROTO = type & $export.P
1409
+ , IS_BIND = type & $export.B
1410
+ , IS_WRAP = type & $export.W
1411
+ , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
1412
+ , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
1413
+ , key, own, out;
1414
+ if(IS_GLOBAL)source = name;
1415
+ for(key in source){
1416
+ // contains in native
1417
+ own = !IS_FORCED && target && key in target;
1418
+ if(own && key in exports)continue;
1419
+ // export native or passed
1420
+ out = own ? target[key] : source[key];
1421
+ // prevent global pollution for namespaces
1422
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
1423
+ // bind timers to global for call from export context
1424
+ : IS_BIND && own ? ctx(out, global)
1425
+ // wrap global constructors for prevent change them in library
1426
+ : IS_WRAP && target[key] == out ? (function(C){
1427
+ var F = function(param){
1428
+ return this instanceof C ? new C(param) : C(param);
1429
+ };
1430
+ F[PROTOTYPE] = C[PROTOTYPE];
1431
+ return F;
1432
+ // make static versions for prototype methods
1433
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
1434
+ if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
1435
+ }
1436
+ };
1437
+ // type bitmap
1438
+ $export.F = 1; // forced
1439
+ $export.G = 2; // global
1440
+ $export.S = 4; // static
1441
+ $export.P = 8; // proto
1442
+ $export.B = 16; // bind
1443
+ $export.W = 32; // wrap
1444
+ module.exports = $export;
1445
+
1446
+ /***/ }),
1447
+ /* 29 */
1448
+ /***/ (function(module, exports) {
1449
+
1450
+ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
1451
+ var global = module.exports = typeof window != 'undefined' && window.Math == Math
1452
+ ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
1453
+ if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
1454
+
1455
+ /***/ }),
1456
+ /* 30 */
1457
+ /***/ (function(module, exports) {
1458
+
1459
+ var core = module.exports = {version: '1.2.6'};
1460
+ if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
1461
+
1462
+ /***/ }),
1463
+ /* 31 */
1464
+ /***/ (function(module, exports, __webpack_require__) {
1465
+
1466
+ // optional / simple context binding
1467
+ var aFunction = __webpack_require__(32);
1468
+ module.exports = function(fn, that, length){
1469
+ aFunction(fn);
1470
+ if(that === undefined)return fn;
1471
+ switch(length){
1472
+ case 1: return function(a){
1473
+ return fn.call(that, a);
1474
+ };
1475
+ case 2: return function(a, b){
1476
+ return fn.call(that, a, b);
1477
+ };
1478
+ case 3: return function(a, b, c){
1479
+ return fn.call(that, a, b, c);
1480
+ };
1481
+ }
1482
+ return function(/* ...args */){
1483
+ return fn.apply(that, arguments);
1484
+ };
1485
+ };
1486
+
1487
+ /***/ }),
1488
+ /* 32 */
1489
+ /***/ (function(module, exports) {
1490
+
1491
+ module.exports = function(it){
1492
+ if(typeof it != 'function')throw TypeError(it + ' is not a function!');
1493
+ return it;
1494
+ };
1495
+
1496
+ /***/ }),
1497
+ /* 33 */
1498
+ /***/ (function(module, exports) {
1499
+
1500
+ module.exports = function(exec){
1501
+ try {
1502
+ return !!exec();
1503
+ } catch(e){
1504
+ return true;
1505
+ }
1506
+ };
1507
+
1508
+ /***/ }),
1509
+ /* 34 */
1510
+ /***/ (function(module, exports) {
1511
+
1512
+ /* WEBPACK VAR INJECTION */(function(global) {/* global window */
1513
+ 'use strict';
1514
+
1515
+ exports.__esModule = true;
1516
+
1517
+ exports['default'] = function (Handlebars) {
1518
+ /* istanbul ignore next */
1519
+ var root = typeof global !== 'undefined' ? global : window,
1520
+ $Handlebars = root.Handlebars;
1521
+ /* istanbul ignore next */
1522
+ Handlebars.noConflict = function () {
1523
+ if (root.Handlebars === Handlebars) {
1524
+ root.Handlebars = $Handlebars;
1525
+ }
1526
+ return Handlebars;
1527
+ };
1528
+ };
1529
+
1530
+ module.exports = exports['default'];
1531
+ /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
1532
+
1533
+ /***/ }),
1534
+ /* 35 */
1535
+ /***/ (function(module, exports) {
1536
+
1537
+ 'use strict';
1538
+
1539
+ exports.__esModule = true;
1540
+ var AST = {
1541
+ // Public API used to evaluate derived attributes regarding AST nodes
1542
+ helpers: {
1543
+ // a mustache is definitely a helper if:
1544
+ // * it is an eligible helper, and
1545
+ // * it has at least one parameter or hash segment
1546
+ helperExpression: function helperExpression(node) {
1547
+ return node.type === 'SubExpression' || (node.type === 'MustacheStatement' || node.type === 'BlockStatement') && !!(node.params && node.params.length || node.hash);
1548
+ },
1549
+
1550
+ scopedId: function scopedId(path) {
1551
+ return (/^\.|this\b/.test(path.original)
1552
+ );
1553
+ },
1554
+
1555
+ // an ID is simple if it only has one part, and that part is not
1556
+ // `..` or `this`.
1557
+ simpleId: function simpleId(path) {
1558
+ return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth;
1559
+ }
1560
+ }
1561
+ };
1562
+
1563
+ // Must be exported as an object rather than the root of the module as the jison lexer
1564
+ // must modify the object to operate properly.
1565
+ exports['default'] = AST;
1566
+ module.exports = exports['default'];
1567
+
1568
+ /***/ }),
1569
+ /* 36 */
1570
+ /***/ (function(module, exports, __webpack_require__) {
1571
+
1572
+ 'use strict';
1573
+
1574
+ var _interopRequireDefault = __webpack_require__(1)['default'];
1575
+
1576
+ var _interopRequireWildcard = __webpack_require__(3)['default'];
1577
+
1578
+ exports.__esModule = true;
1579
+ exports.parse = parse;
1580
+
1581
+ var _parser = __webpack_require__(37);
1582
+
1583
+ var _parser2 = _interopRequireDefault(_parser);
1584
+
1585
+ var _whitespaceControl = __webpack_require__(38);
1586
+
1587
+ var _whitespaceControl2 = _interopRequireDefault(_whitespaceControl);
1588
+
1589
+ var _helpers = __webpack_require__(40);
1590
+
1591
+ var Helpers = _interopRequireWildcard(_helpers);
1592
+
1593
+ var _utils = __webpack_require__(5);
1594
+
1595
+ exports.parser = _parser2['default'];
1596
+
1597
+ var yy = {};
1598
+ _utils.extend(yy, Helpers);
1599
+
1600
+ function parse(input, options) {
1601
+ // Just return if an already-compiled AST was passed in.
1602
+ if (input.type === 'Program') {
1603
+ return input;
1604
+ }
1605
+
1606
+ _parser2['default'].yy = yy;
1607
+
1608
+ // Altering the shared object here, but this is ok as parser is a sync operation
1609
+ yy.locInfo = function (locInfo) {
1610
+ return new yy.SourceLocation(options && options.srcName, locInfo);
1611
+ };
1612
+
1613
+ var strip = new _whitespaceControl2['default'](options);
1614
+ return strip.accept(_parser2['default'].parse(input));
1615
+ }
1616
+
1617
+ /***/ }),
1618
+ /* 37 */
1619
+ /***/ (function(module, exports) {
1620
+
1621
+ // File ignored in coverage tests via setting in .istanbul.yml
1622
+ /* Jison generated parser */
1623
+ "use strict";
1624
+
1625
+ exports.__esModule = true;
1626
+ var handlebars = (function () {
1627
+ var parser = { trace: function trace() {},
1628
+ yy: {},
1629
+ symbols_: { "error": 2, "root": 3, "program": 4, "EOF": 5, "program_repetition0": 6, "statement": 7, "mustache": 8, "block": 9, "rawBlock": 10, "partial": 11, "partialBlock": 12, "content": 13, "COMMENT": 14, "CONTENT": 15, "openRawBlock": 16, "rawBlock_repetition_plus0": 17, "END_RAW_BLOCK": 18, "OPEN_RAW_BLOCK": 19, "helperName": 20, "openRawBlock_repetition0": 21, "openRawBlock_option0": 22, "CLOSE_RAW_BLOCK": 23, "openBlock": 24, "block_option0": 25, "closeBlock": 26, "openInverse": 27, "block_option1": 28, "OPEN_BLOCK": 29, "openBlock_repetition0": 30, "openBlock_option0": 31, "openBlock_option1": 32, "CLOSE": 33, "OPEN_INVERSE": 34, "openInverse_repetition0": 35, "openInverse_option0": 36, "openInverse_option1": 37, "openInverseChain": 38, "OPEN_INVERSE_CHAIN": 39, "openInverseChain_repetition0": 40, "openInverseChain_option0": 41, "openInverseChain_option1": 42, "inverseAndProgram": 43, "INVERSE": 44, "inverseChain": 45, "inverseChain_option0": 46, "OPEN_ENDBLOCK": 47, "OPEN": 48, "mustache_repetition0": 49, "mustache_option0": 50, "OPEN_UNESCAPED": 51, "mustache_repetition1": 52, "mustache_option1": 53, "CLOSE_UNESCAPED": 54, "OPEN_PARTIAL": 55, "partialName": 56, "partial_repetition0": 57, "partial_option0": 58, "openPartialBlock": 59, "OPEN_PARTIAL_BLOCK": 60, "openPartialBlock_repetition0": 61, "openPartialBlock_option0": 62, "param": 63, "sexpr": 64, "OPEN_SEXPR": 65, "sexpr_repetition0": 66, "sexpr_option0": 67, "CLOSE_SEXPR": 68, "hash": 69, "hash_repetition_plus0": 70, "hashSegment": 71, "ID": 72, "EQUALS": 73, "blockParams": 74, "OPEN_BLOCK_PARAMS": 75, "blockParams_repetition_plus0": 76, "CLOSE_BLOCK_PARAMS": 77, "path": 78, "dataName": 79, "STRING": 80, "NUMBER": 81, "BOOLEAN": 82, "UNDEFINED": 83, "NULL": 84, "DATA": 85, "pathSegments": 86, "SEP": 87, "$accept": 0, "$end": 1 },
1630
+ terminals_: { 2: "error", 5: "EOF", 14: "COMMENT", 15: "CONTENT", 18: "END_RAW_BLOCK", 19: "OPEN_RAW_BLOCK", 23: "CLOSE_RAW_BLOCK", 29: "OPEN_BLOCK", 33: "CLOSE", 34: "OPEN_INVERSE", 39: "OPEN_INVERSE_CHAIN", 44: "INVERSE", 47: "OPEN_ENDBLOCK", 48: "OPEN", 51: "OPEN_UNESCAPED", 54: "CLOSE_UNESCAPED", 55: "OPEN_PARTIAL", 60: "OPEN_PARTIAL_BLOCK", 65: "OPEN_SEXPR", 68: "CLOSE_SEXPR", 72: "ID", 73: "EQUALS", 75: "OPEN_BLOCK_PARAMS", 77: "CLOSE_BLOCK_PARAMS", 80: "STRING", 81: "NUMBER", 82: "BOOLEAN", 83: "UNDEFINED", 84: "NULL", 85: "DATA", 87: "SEP" },
1631
+ productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 1], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]],
1632
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$
1633
+ /**/) {
1634
+
1635
+ var $0 = $$.length - 1;
1636
+ switch (yystate) {
1637
+ case 1:
1638
+ return $$[$0 - 1];
1639
+ break;
1640
+ case 2:
1641
+ this.$ = yy.prepareProgram($$[$0]);
1642
+ break;
1643
+ case 3:
1644
+ this.$ = $$[$0];
1645
+ break;
1646
+ case 4:
1647
+ this.$ = $$[$0];
1648
+ break;
1649
+ case 5:
1650
+ this.$ = $$[$0];
1651
+ break;
1652
+ case 6:
1653
+ this.$ = $$[$0];
1654
+ break;
1655
+ case 7:
1656
+ this.$ = $$[$0];
1657
+ break;
1658
+ case 8:
1659
+ this.$ = $$[$0];
1660
+ break;
1661
+ case 9:
1662
+ this.$ = {
1663
+ type: 'CommentStatement',
1664
+ value: yy.stripComment($$[$0]),
1665
+ strip: yy.stripFlags($$[$0], $$[$0]),
1666
+ loc: yy.locInfo(this._$)
1667
+ };
1668
+
1669
+ break;
1670
+ case 10:
1671
+ this.$ = {
1672
+ type: 'ContentStatement',
1673
+ original: $$[$0],
1674
+ value: $$[$0],
1675
+ loc: yy.locInfo(this._$)
1676
+ };
1677
+
1678
+ break;
1679
+ case 11:
1680
+ this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);
1681
+ break;
1682
+ case 12:
1683
+ this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] };
1684
+ break;
1685
+ case 13:
1686
+ this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);
1687
+ break;
1688
+ case 14:
1689
+ this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);
1690
+ break;
1691
+ case 15:
1692
+ this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
1693
+ break;
1694
+ case 16:
1695
+ this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
1696
+ break;
1697
+ case 17:
1698
+ this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
1699
+ break;
1700
+ case 18:
1701
+ this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] };
1702
+ break;
1703
+ case 19:
1704
+ var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),
1705
+ program = yy.prepareProgram([inverse], $$[$0 - 1].loc);
1706
+ program.chained = true;
1707
+
1708
+ this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true };
1709
+
1710
+ break;
1711
+ case 20:
1712
+ this.$ = $$[$0];
1713
+ break;
1714
+ case 21:
1715
+ this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) };
1716
+ break;
1717
+ case 22:
1718
+ this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);
1719
+ break;
1720
+ case 23:
1721
+ this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);
1722
+ break;
1723
+ case 24:
1724
+ this.$ = {
1725
+ type: 'PartialStatement',
1726
+ name: $$[$0 - 3],
1727
+ params: $$[$0 - 2],
1728
+ hash: $$[$0 - 1],
1729
+ indent: '',
1730
+ strip: yy.stripFlags($$[$0 - 4], $$[$0]),
1731
+ loc: yy.locInfo(this._$)
1732
+ };
1733
+
1734
+ break;
1735
+ case 25:
1736
+ this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);
1737
+ break;
1738
+ case 26:
1739
+ this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) };
1740
+ break;
1741
+ case 27:
1742
+ this.$ = $$[$0];
1743
+ break;
1744
+ case 28:
1745
+ this.$ = $$[$0];
1746
+ break;
1747
+ case 29:
1748
+ this.$ = {
1749
+ type: 'SubExpression',
1750
+ path: $$[$0 - 3],
1751
+ params: $$[$0 - 2],
1752
+ hash: $$[$0 - 1],
1753
+ loc: yy.locInfo(this._$)
1754
+ };
1755
+
1756
+ break;
1757
+ case 30:
1758
+ this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) };
1759
+ break;
1760
+ case 31:
1761
+ this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) };
1762
+ break;
1763
+ case 32:
1764
+ this.$ = yy.id($$[$0 - 1]);
1765
+ break;
1766
+ case 33:
1767
+ this.$ = $$[$0];
1768
+ break;
1769
+ case 34:
1770
+ this.$ = $$[$0];
1771
+ break;
1772
+ case 35:
1773
+ this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) };
1774
+ break;
1775
+ case 36:
1776
+ this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
1777
+ break;
1778
+ case 37:
1779
+ this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) };
1780
+ break;
1781
+ case 38:
1782
+ this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) };
1783
+ break;
1784
+ case 39:
1785
+ this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) };
1786
+ break;
1787
+ case 40:
1788
+ this.$ = $$[$0];
1789
+ break;
1790
+ case 41:
1791
+ this.$ = $$[$0];
1792
+ break;
1793
+ case 42:
1794
+ this.$ = yy.preparePath(true, $$[$0], this._$);
1795
+ break;
1796
+ case 43:
1797
+ this.$ = yy.preparePath(false, $$[$0], this._$);
1798
+ break;
1799
+ case 44:
1800
+ $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2];
1801
+ break;
1802
+ case 45:
1803
+ this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }];
1804
+ break;
1805
+ case 46:
1806
+ this.$ = [];
1807
+ break;
1808
+ case 47:
1809
+ $$[$0 - 1].push($$[$0]);
1810
+ break;
1811
+ case 48:
1812
+ this.$ = [$$[$0]];
1813
+ break;
1814
+ case 49:
1815
+ $$[$0 - 1].push($$[$0]);
1816
+ break;
1817
+ case 50:
1818
+ this.$ = [];
1819
+ break;
1820
+ case 51:
1821
+ $$[$0 - 1].push($$[$0]);
1822
+ break;
1823
+ case 58:
1824
+ this.$ = [];
1825
+ break;
1826
+ case 59:
1827
+ $$[$0 - 1].push($$[$0]);
1828
+ break;
1829
+ case 64:
1830
+ this.$ = [];
1831
+ break;
1832
+ case 65:
1833
+ $$[$0 - 1].push($$[$0]);
1834
+ break;
1835
+ case 70:
1836
+ this.$ = [];
1837
+ break;
1838
+ case 71:
1839
+ $$[$0 - 1].push($$[$0]);
1840
+ break;
1841
+ case 78:
1842
+ this.$ = [];
1843
+ break;
1844
+ case 79:
1845
+ $$[$0 - 1].push($$[$0]);
1846
+ break;
1847
+ case 82:
1848
+ this.$ = [];
1849
+ break;
1850
+ case 83:
1851
+ $$[$0 - 1].push($$[$0]);
1852
+ break;
1853
+ case 86:
1854
+ this.$ = [];
1855
+ break;
1856
+ case 87:
1857
+ $$[$0 - 1].push($$[$0]);
1858
+ break;
1859
+ case 90:
1860
+ this.$ = [];
1861
+ break;
1862
+ case 91:
1863
+ $$[$0 - 1].push($$[$0]);
1864
+ break;
1865
+ case 94:
1866
+ this.$ = [];
1867
+ break;
1868
+ case 95:
1869
+ $$[$0 - 1].push($$[$0]);
1870
+ break;
1871
+ case 98:
1872
+ this.$ = [$$[$0]];
1873
+ break;
1874
+ case 99:
1875
+ $$[$0 - 1].push($$[$0]);
1876
+ break;
1877
+ case 100:
1878
+ this.$ = [$$[$0]];
1879
+ break;
1880
+ case 101:
1881
+ $$[$0 - 1].push($$[$0]);
1882
+ break;
1883
+ }
1884
+ },
1885
+ table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 13: 40, 15: [1, 20], 17: 39 }, { 20: 42, 56: 41, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 45, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 48, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 42, 56: 49, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 50, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 51] }, { 72: [1, 35], 86: 52 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 53, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 54, 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 55, 47: [2, 54] }, { 28: 60, 43: 61, 44: [1, 59], 47: [2, 56] }, { 13: 63, 15: [1, 20], 18: [1, 62] }, { 15: [2, 48], 18: [2, 48] }, { 33: [2, 86], 57: 64, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 65, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 66, 47: [1, 67] }, { 30: 68, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 69, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 70, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 71, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 75, 33: [2, 80], 50: 72, 63: 73, 64: 76, 65: [1, 44], 69: 74, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 80] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 51] }, { 20: 75, 53: 81, 54: [2, 84], 63: 82, 64: 76, 65: [1, 44], 69: 83, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 84, 47: [1, 67] }, { 47: [2, 55] }, { 4: 85, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 86, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 87, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 88, 47: [1, 67] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 75, 33: [2, 88], 58: 89, 63: 90, 64: 76, 65: [1, 44], 69: 91, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 92, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 93, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 31: 94, 33: [2, 60], 63: 95, 64: 76, 65: [1, 44], 69: 96, 70: 77, 71: 78, 72: [1, 79], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 66], 36: 97, 63: 98, 64: 76, 65: [1, 44], 69: 99, 70: 77, 71: 78, 72: [1, 79], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 22: 100, 23: [2, 52], 63: 101, 64: 76, 65: [1, 44], 69: 102, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 92], 62: 103, 63: 104, 64: 76, 65: [1, 44], 69: 105, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 106] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 107, 72: [1, 108], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 109], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 110] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 112, 46: 111, 47: [2, 76] }, { 33: [2, 70], 40: 113, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 114] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 75, 63: 116, 64: 76, 65: [1, 44], 67: 115, 68: [2, 96], 69: 117, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 118] }, { 32: 119, 33: [2, 62], 74: 120, 75: [1, 121] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 122, 74: 123, 75: [1, 121] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 124] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 125] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 109] }, { 20: 75, 63: 126, 64: 76, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 75, 33: [2, 72], 41: 127, 63: 128, 64: 76, 65: [1, 44], 69: 129, 70: 77, 71: 78, 72: [1, 79], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 130] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 131] }, { 33: [2, 63] }, { 72: [1, 133], 76: 132 }, { 33: [1, 134] }, { 33: [2, 69] }, { 15: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 135, 74: 136, 75: [1, 121] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 138], 77: [1, 137] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 139] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }],
1886
+ defaultActions: { 4: [2, 1], 55: [2, 55], 57: [2, 20], 61: [2, 57], 74: [2, 81], 83: [2, 85], 87: [2, 18], 91: [2, 89], 102: [2, 53], 105: [2, 93], 111: [2, 19], 112: [2, 77], 117: [2, 97], 120: [2, 63], 123: [2, 69], 124: [2, 12], 136: [2, 75], 137: [2, 32] },
1887
+ parseError: function parseError(str, hash) {
1888
+ throw new Error(str);
1889
+ },
1890
+ parse: function parse(input) {
1891
+ var self = this,
1892
+ stack = [0],
1893
+ vstack = [null],
1894
+ lstack = [],
1895
+ table = this.table,
1896
+ yytext = "",
1897
+ yylineno = 0,
1898
+ yyleng = 0,
1899
+ recovering = 0,
1900
+ TERROR = 2,
1901
+ EOF = 1;
1902
+ this.lexer.setInput(input);
1903
+ this.lexer.yy = this.yy;
1904
+ this.yy.lexer = this.lexer;
1905
+ this.yy.parser = this;
1906
+ if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {};
1907
+ var yyloc = this.lexer.yylloc;
1908
+ lstack.push(yyloc);
1909
+ var ranges = this.lexer.options && this.lexer.options.ranges;
1910
+ if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError;
1911
+ function popStack(n) {
1912
+ stack.length = stack.length - 2 * n;
1913
+ vstack.length = vstack.length - n;
1914
+ lstack.length = lstack.length - n;
1915
+ }
1916
+ function lex() {
1917
+ var token;
1918
+ token = self.lexer.lex() || 1;
1919
+ if (typeof token !== "number") {
1920
+ token = self.symbols_[token] || token;
1921
+ }
1922
+ return token;
1923
+ }
1924
+ var symbol,
1925
+ preErrorSymbol,
1926
+ state,
1927
+ action,
1928
+ a,
1929
+ r,
1930
+ yyval = {},
1931
+ p,
1932
+ len,
1933
+ newState,
1934
+ expected;
1935
+ while (true) {
1936
+ state = stack[stack.length - 1];
1937
+ if (this.defaultActions[state]) {
1938
+ action = this.defaultActions[state];
1939
+ } else {
1940
+ if (symbol === null || typeof symbol == "undefined") {
1941
+ symbol = lex();
1942
+ }
1943
+ action = table[state] && table[state][symbol];
1944
+ }
1945
+ if (typeof action === "undefined" || !action.length || !action[0]) {
1946
+ var errStr = "";
1947
+ if (!recovering) {
1948
+ expected = [];
1949
+ for (p in table[state]) if (this.terminals_[p] && p > 2) {
1950
+ expected.push("'" + this.terminals_[p] + "'");
1951
+ }
1952
+ if (this.lexer.showPosition) {
1953
+ errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
1954
+ } else {
1955
+ errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'");
1956
+ }
1957
+ this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected });
1958
+ }
1959
+ }
1960
+ if (action[0] instanceof Array && action.length > 1) {
1961
+ throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
1962
+ }
1963
+ switch (action[0]) {
1964
+ case 1:
1965
+ stack.push(symbol);
1966
+ vstack.push(this.lexer.yytext);
1967
+ lstack.push(this.lexer.yylloc);
1968
+ stack.push(action[1]);
1969
+ symbol = null;
1970
+ if (!preErrorSymbol) {
1971
+ yyleng = this.lexer.yyleng;
1972
+ yytext = this.lexer.yytext;
1973
+ yylineno = this.lexer.yylineno;
1974
+ yyloc = this.lexer.yylloc;
1975
+ if (recovering > 0) recovering--;
1976
+ } else {
1977
+ symbol = preErrorSymbol;
1978
+ preErrorSymbol = null;
1979
+ }
1980
+ break;
1981
+ case 2:
1982
+ len = this.productions_[action[1]][1];
1983
+ yyval.$ = vstack[vstack.length - len];
1984
+ yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column };
1985
+ if (ranges) {
1986
+ yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
1987
+ }
1988
+ r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
1989
+ if (typeof r !== "undefined") {
1990
+ return r;
1991
+ }
1992
+ if (len) {
1993
+ stack = stack.slice(0, -1 * len * 2);
1994
+ vstack = vstack.slice(0, -1 * len);
1995
+ lstack = lstack.slice(0, -1 * len);
1996
+ }
1997
+ stack.push(this.productions_[action[1]][0]);
1998
+ vstack.push(yyval.$);
1999
+ lstack.push(yyval._$);
2000
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
2001
+ stack.push(newState);
2002
+ break;
2003
+ case 3:
2004
+ return true;
2005
+ }
2006
+ }
2007
+ return true;
2008
+ }
2009
+ };
2010
+ /* Jison generated lexer */
2011
+ var lexer = (function () {
2012
+ var lexer = { EOF: 1,
2013
+ parseError: function parseError(str, hash) {
2014
+ if (this.yy.parser) {
2015
+ this.yy.parser.parseError(str, hash);
2016
+ } else {
2017
+ throw new Error(str);
2018
+ }
2019
+ },
2020
+ setInput: function setInput(input) {
2021
+ this._input = input;
2022
+ this._more = this._less = this.done = false;
2023
+ this.yylineno = this.yyleng = 0;
2024
+ this.yytext = this.matched = this.match = '';
2025
+ this.conditionStack = ['INITIAL'];
2026
+ this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 };
2027
+ if (this.options.ranges) this.yylloc.range = [0, 0];
2028
+ this.offset = 0;
2029
+ return this;
2030
+ },
2031
+ input: function input() {
2032
+ var ch = this._input[0];
2033
+ this.yytext += ch;
2034
+ this.yyleng++;
2035
+ this.offset++;
2036
+ this.match += ch;
2037
+ this.matched += ch;
2038
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
2039
+ if (lines) {
2040
+ this.yylineno++;
2041
+ this.yylloc.last_line++;
2042
+ } else {
2043
+ this.yylloc.last_column++;
2044
+ }
2045
+ if (this.options.ranges) this.yylloc.range[1]++;
2046
+
2047
+ this._input = this._input.slice(1);
2048
+ return ch;
2049
+ },
2050
+ unput: function unput(ch) {
2051
+ var len = ch.length;
2052
+ var lines = ch.split(/(?:\r\n?|\n)/g);
2053
+
2054
+ this._input = ch + this._input;
2055
+ this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);
2056
+ //this.yyleng -= len;
2057
+ this.offset -= len;
2058
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
2059
+ this.match = this.match.substr(0, this.match.length - 1);
2060
+ this.matched = this.matched.substr(0, this.matched.length - 1);
2061
+
2062
+ if (lines.length - 1) this.yylineno -= lines.length - 1;
2063
+ var r = this.yylloc.range;
2064
+
2065
+ this.yylloc = { first_line: this.yylloc.first_line,
2066
+ last_line: this.yylineno + 1,
2067
+ first_column: this.yylloc.first_column,
2068
+ last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len
2069
+ };
2070
+
2071
+ if (this.options.ranges) {
2072
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
2073
+ }
2074
+ return this;
2075
+ },
2076
+ more: function more() {
2077
+ this._more = true;
2078
+ return this;
2079
+ },
2080
+ less: function less(n) {
2081
+ this.unput(this.match.slice(n));
2082
+ },
2083
+ pastInput: function pastInput() {
2084
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
2085
+ return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, "");
2086
+ },
2087
+ upcomingInput: function upcomingInput() {
2088
+ var next = this.match;
2089
+ if (next.length < 20) {
2090
+ next += this._input.substr(0, 20 - next.length);
2091
+ }
2092
+ return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
2093
+ },
2094
+ showPosition: function showPosition() {
2095
+ var pre = this.pastInput();
2096
+ var c = new Array(pre.length + 1).join("-");
2097
+ return pre + this.upcomingInput() + "\n" + c + "^";
2098
+ },
2099
+ next: function next() {
2100
+ if (this.done) {
2101
+ return this.EOF;
2102
+ }
2103
+ if (!this._input) this.done = true;
2104
+
2105
+ var token, match, tempMatch, index, col, lines;
2106
+ if (!this._more) {
2107
+ this.yytext = '';
2108
+ this.match = '';
2109
+ }
2110
+ var rules = this._currentRules();
2111
+ for (var i = 0; i < rules.length; i++) {
2112
+ tempMatch = this._input.match(this.rules[rules[i]]);
2113
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
2114
+ match = tempMatch;
2115
+ index = i;
2116
+ if (!this.options.flex) break;
2117
+ }
2118
+ }
2119
+ if (match) {
2120
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
2121
+ if (lines) this.yylineno += lines.length;
2122
+ this.yylloc = { first_line: this.yylloc.last_line,
2123
+ last_line: this.yylineno + 1,
2124
+ first_column: this.yylloc.last_column,
2125
+ last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length };
2126
+ this.yytext += match[0];
2127
+ this.match += match[0];
2128
+ this.matches = match;
2129
+ this.yyleng = this.yytext.length;
2130
+ if (this.options.ranges) {
2131
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
2132
+ }
2133
+ this._more = false;
2134
+ this._input = this._input.slice(match[0].length);
2135
+ this.matched += match[0];
2136
+ token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);
2137
+ if (this.done && this._input) this.done = false;
2138
+ if (token) return token;else return;
2139
+ }
2140
+ if (this._input === "") {
2141
+ return this.EOF;
2142
+ } else {
2143
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno });
2144
+ }
2145
+ },
2146
+ lex: function lex() {
2147
+ var r = this.next();
2148
+ if (typeof r !== 'undefined') {
2149
+ return r;
2150
+ } else {
2151
+ return this.lex();
2152
+ }
2153
+ },
2154
+ begin: function begin(condition) {
2155
+ this.conditionStack.push(condition);
2156
+ },
2157
+ popState: function popState() {
2158
+ return this.conditionStack.pop();
2159
+ },
2160
+ _currentRules: function _currentRules() {
2161
+ return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
2162
+ },
2163
+ topState: function topState() {
2164
+ return this.conditionStack[this.conditionStack.length - 2];
2165
+ },
2166
+ pushState: function begin(condition) {
2167
+ this.begin(condition);
2168
+ } };
2169
+ lexer.options = {};
2170
+ lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START
2171
+ /**/) {
2172
+
2173
+ function strip(start, end) {
2174
+ return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end);
2175
+ }
2176
+
2177
+ var YYSTATE = YY_START;
2178
+ switch ($avoiding_name_collisions) {
2179
+ case 0:
2180
+ if (yy_.yytext.slice(-2) === "\\\\") {
2181
+ strip(0, 1);
2182
+ this.begin("mu");
2183
+ } else if (yy_.yytext.slice(-1) === "\\") {
2184
+ strip(0, 1);
2185
+ this.begin("emu");
2186
+ } else {
2187
+ this.begin("mu");
2188
+ }
2189
+ if (yy_.yytext) return 15;
2190
+
2191
+ break;
2192
+ case 1:
2193
+ return 15;
2194
+ break;
2195
+ case 2:
2196
+ this.popState();
2197
+ return 15;
2198
+
2199
+ break;
2200
+ case 3:
2201
+ this.begin('raw');return 15;
2202
+ break;
2203
+ case 4:
2204
+ this.popState();
2205
+ // Should be using `this.topState()` below, but it currently
2206
+ // returns the second top instead of the first top. Opened an
2207
+ // issue about it at https://github.com/zaach/jison/issues/291
2208
+ if (this.conditionStack[this.conditionStack.length - 1] === 'raw') {
2209
+ return 15;
2210
+ } else {
2211
+ yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9);
2212
+ return 'END_RAW_BLOCK';
2213
+ }
2214
+
2215
+ break;
2216
+ case 5:
2217
+ return 15;
2218
+ break;
2219
+ case 6:
2220
+ this.popState();
2221
+ return 14;
2222
+
2223
+ break;
2224
+ case 7:
2225
+ return 65;
2226
+ break;
2227
+ case 8:
2228
+ return 68;
2229
+ break;
2230
+ case 9:
2231
+ return 19;
2232
+ break;
2233
+ case 10:
2234
+ this.popState();
2235
+ this.begin('raw');
2236
+ return 23;
2237
+
2238
+ break;
2239
+ case 11:
2240
+ return 55;
2241
+ break;
2242
+ case 12:
2243
+ return 60;
2244
+ break;
2245
+ case 13:
2246
+ return 29;
2247
+ break;
2248
+ case 14:
2249
+ return 47;
2250
+ break;
2251
+ case 15:
2252
+ this.popState();return 44;
2253
+ break;
2254
+ case 16:
2255
+ this.popState();return 44;
2256
+ break;
2257
+ case 17:
2258
+ return 34;
2259
+ break;
2260
+ case 18:
2261
+ return 39;
2262
+ break;
2263
+ case 19:
2264
+ return 51;
2265
+ break;
2266
+ case 20:
2267
+ return 48;
2268
+ break;
2269
+ case 21:
2270
+ this.unput(yy_.yytext);
2271
+ this.popState();
2272
+ this.begin('com');
2273
+
2274
+ break;
2275
+ case 22:
2276
+ this.popState();
2277
+ return 14;
2278
+
2279
+ break;
2280
+ case 23:
2281
+ return 48;
2282
+ break;
2283
+ case 24:
2284
+ return 73;
2285
+ break;
2286
+ case 25:
2287
+ return 72;
2288
+ break;
2289
+ case 26:
2290
+ return 72;
2291
+ break;
2292
+ case 27:
2293
+ return 87;
2294
+ break;
2295
+ case 28:
2296
+ // ignore whitespace
2297
+ break;
2298
+ case 29:
2299
+ this.popState();return 54;
2300
+ break;
2301
+ case 30:
2302
+ this.popState();return 33;
2303
+ break;
2304
+ case 31:
2305
+ yy_.yytext = strip(1, 2).replace(/\\"/g, '"');return 80;
2306
+ break;
2307
+ case 32:
2308
+ yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 80;
2309
+ break;
2310
+ case 33:
2311
+ return 85;
2312
+ break;
2313
+ case 34:
2314
+ return 82;
2315
+ break;
2316
+ case 35:
2317
+ return 82;
2318
+ break;
2319
+ case 36:
2320
+ return 83;
2321
+ break;
2322
+ case 37:
2323
+ return 84;
2324
+ break;
2325
+ case 38:
2326
+ return 81;
2327
+ break;
2328
+ case 39:
2329
+ return 75;
2330
+ break;
2331
+ case 40:
2332
+ return 77;
2333
+ break;
2334
+ case 41:
2335
+ return 72;
2336
+ break;
2337
+ case 42:
2338
+ yy_.yytext = yy_.yytext.replace(/\\([\\\]])/g, '$1');return 72;
2339
+ break;
2340
+ case 43:
2341
+ return 'INVALID';
2342
+ break;
2343
+ case 44:
2344
+ return 5;
2345
+ break;
2346
+ }
2347
+ };
2348
+ lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{(?=[^\/]))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#>)/, /^(?:\{\{(~)?#\*?)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?\*?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[(\\\]|[^\]])*\])/, /^(?:.)/, /^(?:$)/];
2349
+ lexer.conditions = { "mu": { "rules": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "inclusive": false }, "emu": { "rules": [2], "inclusive": false }, "com": { "rules": [6], "inclusive": false }, "raw": { "rules": [3, 4, 5], "inclusive": false }, "INITIAL": { "rules": [0, 1, 44], "inclusive": true } };
2350
+ return lexer;
2351
+ })();
2352
+ parser.lexer = lexer;
2353
+ function Parser() {
2354
+ this.yy = {};
2355
+ }Parser.prototype = parser;parser.Parser = Parser;
2356
+ return new Parser();
2357
+ })();exports["default"] = handlebars;
2358
+ module.exports = exports["default"];
2359
+
2360
+ /***/ }),
2361
+ /* 38 */
2362
+ /***/ (function(module, exports, __webpack_require__) {
2363
+
2364
+ 'use strict';
2365
+
2366
+ var _interopRequireDefault = __webpack_require__(1)['default'];
2367
+
2368
+ exports.__esModule = true;
2369
+
2370
+ var _visitor = __webpack_require__(39);
2371
+
2372
+ var _visitor2 = _interopRequireDefault(_visitor);
2373
+
2374
+ function WhitespaceControl() {
2375
+ var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
2376
+
2377
+ this.options = options;
2378
+ }
2379
+ WhitespaceControl.prototype = new _visitor2['default']();
2380
+
2381
+ WhitespaceControl.prototype.Program = function (program) {
2382
+ var doStandalone = !this.options.ignoreStandalone;
2383
+
2384
+ var isRoot = !this.isRootSeen;
2385
+ this.isRootSeen = true;
2386
+
2387
+ var body = program.body;
2388
+ for (var i = 0, l = body.length; i < l; i++) {
2389
+ var current = body[i],
2390
+ strip = this.accept(current);
2391
+
2392
+ if (!strip) {
2393
+ continue;
2394
+ }
2395
+
2396
+ var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),
2397
+ _isNextWhitespace = isNextWhitespace(body, i, isRoot),
2398
+ openStandalone = strip.openStandalone && _isPrevWhitespace,
2399
+ closeStandalone = strip.closeStandalone && _isNextWhitespace,
2400
+ inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;
2401
+
2402
+ if (strip.close) {
2403
+ omitRight(body, i, true);
2404
+ }
2405
+ if (strip.open) {
2406
+ omitLeft(body, i, true);
2407
+ }
2408
+
2409
+ if (doStandalone && inlineStandalone) {
2410
+ omitRight(body, i);
2411
+
2412
+ if (omitLeft(body, i)) {
2413
+ // If we are on a standalone node, save the indent info for partials
2414
+ if (current.type === 'PartialStatement') {
2415
+ // Pull out the whitespace from the final line
2416
+ current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1];
2417
+ }
2418
+ }
2419
+ }
2420
+ if (doStandalone && openStandalone) {
2421
+ omitRight((current.program || current.inverse).body);
2422
+
2423
+ // Strip out the previous content node if it's whitespace only
2424
+ omitLeft(body, i);
2425
+ }
2426
+ if (doStandalone && closeStandalone) {
2427
+ // Always strip the next node
2428
+ omitRight(body, i);
2429
+
2430
+ omitLeft((current.inverse || current.program).body);
2431
+ }
2432
+ }
2433
+
2434
+ return program;
2435
+ };
2436
+
2437
+ WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) {
2438
+ this.accept(block.program);
2439
+ this.accept(block.inverse);
2440
+
2441
+ // Find the inverse program that is involed with whitespace stripping.
2442
+ var program = block.program || block.inverse,
2443
+ inverse = block.program && block.inverse,
2444
+ firstInverse = inverse,
2445
+ lastInverse = inverse;
2446
+
2447
+ if (inverse && inverse.chained) {
2448
+ firstInverse = inverse.body[0].program;
2449
+
2450
+ // Walk the inverse chain to find the last inverse that is actually in the chain.
2451
+ while (lastInverse.chained) {
2452
+ lastInverse = lastInverse.body[lastInverse.body.length - 1].program;
2453
+ }
2454
+ }
2455
+
2456
+ var strip = {
2457
+ open: block.openStrip.open,
2458
+ close: block.closeStrip.close,
2459
+
2460
+ // Determine the standalone candiacy. Basically flag our content as being possibly standalone
2461
+ // so our parent can determine if we actually are standalone
2462
+ openStandalone: isNextWhitespace(program.body),
2463
+ closeStandalone: isPrevWhitespace((firstInverse || program).body)
2464
+ };
2465
+
2466
+ if (block.openStrip.close) {
2467
+ omitRight(program.body, null, true);
2468
+ }
2469
+
2470
+ if (inverse) {
2471
+ var inverseStrip = block.inverseStrip;
2472
+
2473
+ if (inverseStrip.open) {
2474
+ omitLeft(program.body, null, true);
2475
+ }
2476
+
2477
+ if (inverseStrip.close) {
2478
+ omitRight(firstInverse.body, null, true);
2479
+ }
2480
+ if (block.closeStrip.open) {
2481
+ omitLeft(lastInverse.body, null, true);
2482
+ }
2483
+
2484
+ // Find standalone else statments
2485
+ if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {
2486
+ omitLeft(program.body);
2487
+ omitRight(firstInverse.body);
2488
+ }
2489
+ } else if (block.closeStrip.open) {
2490
+ omitLeft(program.body, null, true);
2491
+ }
2492
+
2493
+ return strip;
2494
+ };
2495
+
2496
+ WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) {
2497
+ return mustache.strip;
2498
+ };
2499
+
2500
+ WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {
2501
+ /* istanbul ignore next */
2502
+ var strip = node.strip || {};
2503
+ return {
2504
+ inlineStandalone: true,
2505
+ open: strip.open,
2506
+ close: strip.close
2507
+ };
2508
+ };
2509
+
2510
+ function isPrevWhitespace(body, i, isRoot) {
2511
+ if (i === undefined) {
2512
+ i = body.length;
2513
+ }
2514
+
2515
+ // Nodes that end with newlines are considered whitespace (but are special
2516
+ // cased for strip operations)
2517
+ var prev = body[i - 1],
2518
+ sibling = body[i - 2];
2519
+ if (!prev) {
2520
+ return isRoot;
2521
+ }
2522
+
2523
+ if (prev.type === 'ContentStatement') {
2524
+ return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original);
2525
+ }
2526
+ }
2527
+ function isNextWhitespace(body, i, isRoot) {
2528
+ if (i === undefined) {
2529
+ i = -1;
2530
+ }
2531
+
2532
+ var next = body[i + 1],
2533
+ sibling = body[i + 2];
2534
+ if (!next) {
2535
+ return isRoot;
2536
+ }
2537
+
2538
+ if (next.type === 'ContentStatement') {
2539
+ return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original);
2540
+ }
2541
+ }
2542
+
2543
+ // Marks the node to the right of the position as omitted.
2544
+ // I.e. {{foo}}' ' will mark the ' ' node as omitted.
2545
+ //
2546
+ // If i is undefined, then the first child will be marked as such.
2547
+ //
2548
+ // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
2549
+ // content is met.
2550
+ function omitRight(body, i, multiple) {
2551
+ var current = body[i == null ? 0 : i + 1];
2552
+ if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {
2553
+ return;
2554
+ }
2555
+
2556
+ var original = current.value;
2557
+ current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, '');
2558
+ current.rightStripped = current.value !== original;
2559
+ }
2560
+
2561
+ // Marks the node to the left of the position as omitted.
2562
+ // I.e. ' '{{foo}} will mark the ' ' node as omitted.
2563
+ //
2564
+ // If i is undefined then the last child will be marked as such.
2565
+ //
2566
+ // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
2567
+ // content is met.
2568
+ function omitLeft(body, i, multiple) {
2569
+ var current = body[i == null ? body.length - 1 : i - 1];
2570
+ if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {
2571
+ return;
2572
+ }
2573
+
2574
+ // We omit the last node if it's whitespace only and not preceeded by a non-content node.
2575
+ var original = current.value;
2576
+ current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, '');
2577
+ current.leftStripped = current.value !== original;
2578
+ return current.leftStripped;
2579
+ }
2580
+
2581
+ exports['default'] = WhitespaceControl;
2582
+ module.exports = exports['default'];
2583
+
2584
+ /***/ }),
2585
+ /* 39 */
2586
+ /***/ (function(module, exports, __webpack_require__) {
2587
+
2588
+ 'use strict';
2589
+
2590
+ var _interopRequireDefault = __webpack_require__(1)['default'];
2591
+
2592
+ exports.__esModule = true;
2593
+
2594
+ var _exception = __webpack_require__(6);
2595
+
2596
+ var _exception2 = _interopRequireDefault(_exception);
2597
+
2598
+ function Visitor() {
2599
+ this.parents = [];
2600
+ }
2601
+
2602
+ Visitor.prototype = {
2603
+ constructor: Visitor,
2604
+ mutating: false,
2605
+
2606
+ // Visits a given value. If mutating, will replace the value if necessary.
2607
+ acceptKey: function acceptKey(node, name) {
2608
+ var value = this.accept(node[name]);
2609
+ if (this.mutating) {
2610
+ // Hacky sanity check: This may have a few false positives for type for the helper
2611
+ // methods but will generally do the right thing without a lot of overhead.
2612
+ if (value && !Visitor.prototype[value.type]) {
2613
+ throw new _exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type);
2614
+ }
2615
+ node[name] = value;
2616
+ }
2617
+ },
2618
+
2619
+ // Performs an accept operation with added sanity check to ensure
2620
+ // required keys are not removed.
2621
+ acceptRequired: function acceptRequired(node, name) {
2622
+ this.acceptKey(node, name);
2623
+
2624
+ if (!node[name]) {
2625
+ throw new _exception2['default'](node.type + ' requires ' + name);
2626
+ }
2627
+ },
2628
+
2629
+ // Traverses a given array. If mutating, empty respnses will be removed
2630
+ // for child elements.
2631
+ acceptArray: function acceptArray(array) {
2632
+ for (var i = 0, l = array.length; i < l; i++) {
2633
+ this.acceptKey(array, i);
2634
+
2635
+ if (!array[i]) {
2636
+ array.splice(i, 1);
2637
+ i--;
2638
+ l--;
2639
+ }
2640
+ }
2641
+ },
2642
+
2643
+ accept: function accept(object) {
2644
+ if (!object) {
2645
+ return;
2646
+ }
2647
+
2648
+ /* istanbul ignore next: Sanity code */
2649
+ if (!this[object.type]) {
2650
+ throw new _exception2['default']('Unknown type: ' + object.type, object);
2651
+ }
2652
+
2653
+ if (this.current) {
2654
+ this.parents.unshift(this.current);
2655
+ }
2656
+ this.current = object;
2657
+
2658
+ var ret = this[object.type](object);
2659
+
2660
+ this.current = this.parents.shift();
2661
+
2662
+ if (!this.mutating || ret) {
2663
+ return ret;
2664
+ } else if (ret !== false) {
2665
+ return object;
2666
+ }
2667
+ },
2668
+
2669
+ Program: function Program(program) {
2670
+ this.acceptArray(program.body);
2671
+ },
2672
+
2673
+ MustacheStatement: visitSubExpression,
2674
+ Decorator: visitSubExpression,
2675
+
2676
+ BlockStatement: visitBlock,
2677
+ DecoratorBlock: visitBlock,
2678
+
2679
+ PartialStatement: visitPartial,
2680
+ PartialBlockStatement: function PartialBlockStatement(partial) {
2681
+ visitPartial.call(this, partial);
2682
+
2683
+ this.acceptKey(partial, 'program');
2684
+ },
2685
+
2686
+ ContentStatement: function ContentStatement() /* content */{},
2687
+ CommentStatement: function CommentStatement() /* comment */{},
2688
+
2689
+ SubExpression: visitSubExpression,
2690
+
2691
+ PathExpression: function PathExpression() /* path */{},
2692
+
2693
+ StringLiteral: function StringLiteral() /* string */{},
2694
+ NumberLiteral: function NumberLiteral() /* number */{},
2695
+ BooleanLiteral: function BooleanLiteral() /* bool */{},
2696
+ UndefinedLiteral: function UndefinedLiteral() /* literal */{},
2697
+ NullLiteral: function NullLiteral() /* literal */{},
2698
+
2699
+ Hash: function Hash(hash) {
2700
+ this.acceptArray(hash.pairs);
2701
+ },
2702
+ HashPair: function HashPair(pair) {
2703
+ this.acceptRequired(pair, 'value');
2704
+ }
2705
+ };
2706
+
2707
+ function visitSubExpression(mustache) {
2708
+ this.acceptRequired(mustache, 'path');
2709
+ this.acceptArray(mustache.params);
2710
+ this.acceptKey(mustache, 'hash');
2711
+ }
2712
+ function visitBlock(block) {
2713
+ visitSubExpression.call(this, block);
2714
+
2715
+ this.acceptKey(block, 'program');
2716
+ this.acceptKey(block, 'inverse');
2717
+ }
2718
+ function visitPartial(partial) {
2719
+ this.acceptRequired(partial, 'name');
2720
+ this.acceptArray(partial.params);
2721
+ this.acceptKey(partial, 'hash');
2722
+ }
2723
+
2724
+ exports['default'] = Visitor;
2725
+ module.exports = exports['default'];
2726
+
2727
+ /***/ }),
2728
+ /* 40 */
2729
+ /***/ (function(module, exports, __webpack_require__) {
2730
+
2731
+ 'use strict';
2732
+
2733
+ var _interopRequireDefault = __webpack_require__(1)['default'];
2734
+
2735
+ exports.__esModule = true;
2736
+ exports.SourceLocation = SourceLocation;
2737
+ exports.id = id;
2738
+ exports.stripFlags = stripFlags;
2739
+ exports.stripComment = stripComment;
2740
+ exports.preparePath = preparePath;
2741
+ exports.prepareMustache = prepareMustache;
2742
+ exports.prepareRawBlock = prepareRawBlock;
2743
+ exports.prepareBlock = prepareBlock;
2744
+ exports.prepareProgram = prepareProgram;
2745
+ exports.preparePartialBlock = preparePartialBlock;
2746
+
2747
+ var _exception = __webpack_require__(6);
2748
+
2749
+ var _exception2 = _interopRequireDefault(_exception);
2750
+
2751
+ function validateClose(open, close) {
2752
+ close = close.path ? close.path.original : close;
2753
+
2754
+ if (open.path.original !== close) {
2755
+ var errorNode = { loc: open.path.loc };
2756
+
2757
+ throw new _exception2['default'](open.path.original + " doesn't match " + close, errorNode);
2758
+ }
2759
+ }
2760
+
2761
+ function SourceLocation(source, locInfo) {
2762
+ this.source = source;
2763
+ this.start = {
2764
+ line: locInfo.first_line,
2765
+ column: locInfo.first_column
2766
+ };
2767
+ this.end = {
2768
+ line: locInfo.last_line,
2769
+ column: locInfo.last_column
2770
+ };
2771
+ }
2772
+
2773
+ function id(token) {
2774
+ if (/^\[.*\]$/.test(token)) {
2775
+ return token.substr(1, token.length - 2);
2776
+ } else {
2777
+ return token;
2778
+ }
2779
+ }
2780
+
2781
+ function stripFlags(open, close) {
2782
+ return {
2783
+ open: open.charAt(2) === '~',
2784
+ close: close.charAt(close.length - 3) === '~'
2785
+ };
2786
+ }
2787
+
2788
+ function stripComment(comment) {
2789
+ return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, '');
2790
+ }
2791
+
2792
+ function preparePath(data, parts, loc) {
2793
+ loc = this.locInfo(loc);
2794
+
2795
+ var original = data ? '@' : '',
2796
+ dig = [],
2797
+ depth = 0,
2798
+ depthString = '';
2799
+
2800
+ for (var i = 0, l = parts.length; i < l; i++) {
2801
+ var part = parts[i].part,
2802
+
2803
+ // If we have [] syntax then we do not treat path references as operators,
2804
+ // i.e. foo.[this] resolves to approximately context.foo['this']
2805
+ isLiteral = parts[i].original !== part;
2806
+ original += (parts[i].separator || '') + part;
2807
+
2808
+ if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {
2809
+ if (dig.length > 0) {
2810
+ throw new _exception2['default']('Invalid path: ' + original, { loc: loc });
2811
+ } else if (part === '..') {
2812
+ depth++;
2813
+ depthString += '../';
2814
+ }
2815
+ } else {
2816
+ dig.push(part);
2817
+ }
2818
+ }
2819
+
2820
+ return {
2821
+ type: 'PathExpression',
2822
+ data: data,
2823
+ depth: depth,
2824
+ parts: dig,
2825
+ original: original,
2826
+ loc: loc
2827
+ };
2828
+ }
2829
+
2830
+ function prepareMustache(path, params, hash, open, strip, locInfo) {
2831
+ // Must use charAt to support IE pre-10
2832
+ var escapeFlag = open.charAt(3) || open.charAt(2),
2833
+ escaped = escapeFlag !== '{' && escapeFlag !== '&';
2834
+
2835
+ var decorator = /\*/.test(open);
2836
+ return {
2837
+ type: decorator ? 'Decorator' : 'MustacheStatement',
2838
+ path: path,
2839
+ params: params,
2840
+ hash: hash,
2841
+ escaped: escaped,
2842
+ strip: strip,
2843
+ loc: this.locInfo(locInfo)
2844
+ };
2845
+ }
2846
+
2847
+ function prepareRawBlock(openRawBlock, contents, close, locInfo) {
2848
+ validateClose(openRawBlock, close);
2849
+
2850
+ locInfo = this.locInfo(locInfo);
2851
+ var program = {
2852
+ type: 'Program',
2853
+ body: contents,
2854
+ strip: {},
2855
+ loc: locInfo
2856
+ };
2857
+
2858
+ return {
2859
+ type: 'BlockStatement',
2860
+ path: openRawBlock.path,
2861
+ params: openRawBlock.params,
2862
+ hash: openRawBlock.hash,
2863
+ program: program,
2864
+ openStrip: {},
2865
+ inverseStrip: {},
2866
+ closeStrip: {},
2867
+ loc: locInfo
2868
+ };
2869
+ }
2870
+
2871
+ function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {
2872
+ if (close && close.path) {
2873
+ validateClose(openBlock, close);
2874
+ }
2875
+
2876
+ var decorator = /\*/.test(openBlock.open);
2877
+
2878
+ program.blockParams = openBlock.blockParams;
2879
+
2880
+ var inverse = undefined,
2881
+ inverseStrip = undefined;
2882
+
2883
+ if (inverseAndProgram) {
2884
+ if (decorator) {
2885
+ throw new _exception2['default']('Unexpected inverse block on decorator', inverseAndProgram);
2886
+ }
2887
+
2888
+ if (inverseAndProgram.chain) {
2889
+ inverseAndProgram.program.body[0].closeStrip = close.strip;
2890
+ }
2891
+
2892
+ inverseStrip = inverseAndProgram.strip;
2893
+ inverse = inverseAndProgram.program;
2894
+ }
2895
+
2896
+ if (inverted) {
2897
+ inverted = inverse;
2898
+ inverse = program;
2899
+ program = inverted;
2900
+ }
2901
+
2902
+ return {
2903
+ type: decorator ? 'DecoratorBlock' : 'BlockStatement',
2904
+ path: openBlock.path,
2905
+ params: openBlock.params,
2906
+ hash: openBlock.hash,
2907
+ program: program,
2908
+ inverse: inverse,
2909
+ openStrip: openBlock.strip,
2910
+ inverseStrip: inverseStrip,
2911
+ closeStrip: close && close.strip,
2912
+ loc: this.locInfo(locInfo)
2913
+ };
2914
+ }
2915
+
2916
+ function prepareProgram(statements, loc) {
2917
+ if (!loc && statements.length) {
2918
+ var firstLoc = statements[0].loc,
2919
+ lastLoc = statements[statements.length - 1].loc;
2920
+
2921
+ /* istanbul ignore else */
2922
+ if (firstLoc && lastLoc) {
2923
+ loc = {
2924
+ source: firstLoc.source,
2925
+ start: {
2926
+ line: firstLoc.start.line,
2927
+ column: firstLoc.start.column
2928
+ },
2929
+ end: {
2930
+ line: lastLoc.end.line,
2931
+ column: lastLoc.end.column
2932
+ }
2933
+ };
2934
+ }
2935
+ }
2936
+
2937
+ return {
2938
+ type: 'Program',
2939
+ body: statements,
2940
+ strip: {},
2941
+ loc: loc
2942
+ };
2943
+ }
2944
+
2945
+ function preparePartialBlock(open, program, close, locInfo) {
2946
+ validateClose(open, close);
2947
+
2948
+ return {
2949
+ type: 'PartialBlockStatement',
2950
+ name: open.path,
2951
+ params: open.params,
2952
+ hash: open.hash,
2953
+ program: program,
2954
+ openStrip: open.strip,
2955
+ closeStrip: close && close.strip,
2956
+ loc: this.locInfo(locInfo)
2957
+ };
2958
+ }
2959
+
2960
+ /***/ }),
2961
+ /* 41 */
2962
+ /***/ (function(module, exports, __webpack_require__) {
2963
+
2964
+ /* eslint-disable new-cap */
2965
+
2966
+ 'use strict';
2967
+
2968
+ var _interopRequireDefault = __webpack_require__(1)['default'];
2969
+
2970
+ exports.__esModule = true;
2971
+ exports.Compiler = Compiler;
2972
+ exports.precompile = precompile;
2973
+ exports.compile = compile;
2974
+
2975
+ var _exception = __webpack_require__(6);
2976
+
2977
+ var _exception2 = _interopRequireDefault(_exception);
2978
+
2979
+ var _utils = __webpack_require__(5);
2980
+
2981
+ var _ast = __webpack_require__(35);
2982
+
2983
+ var _ast2 = _interopRequireDefault(_ast);
2984
+
2985
+ var slice = [].slice;
2986
+
2987
+ function Compiler() {}
2988
+
2989
+ // the foundHelper register will disambiguate helper lookup from finding a
2990
+ // function in a context. This is necessary for mustache compatibility, which
2991
+ // requires that context functions in blocks are evaluated by blockHelperMissing,
2992
+ // and then proceed as if the resulting value was provided to blockHelperMissing.
2993
+
2994
+ Compiler.prototype = {
2995
+ compiler: Compiler,
2996
+
2997
+ equals: function equals(other) {
2998
+ var len = this.opcodes.length;
2999
+ if (other.opcodes.length !== len) {
3000
+ return false;
3001
+ }
3002
+
3003
+ for (var i = 0; i < len; i++) {
3004
+ var opcode = this.opcodes[i],
3005
+ otherOpcode = other.opcodes[i];
3006
+ if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) {
3007
+ return false;
3008
+ }
3009
+ }
3010
+
3011
+ // We know that length is the same between the two arrays because they are directly tied
3012
+ // to the opcode behavior above.
3013
+ len = this.children.length;
3014
+ for (var i = 0; i < len; i++) {
3015
+ if (!this.children[i].equals(other.children[i])) {
3016
+ return false;
3017
+ }
3018
+ }
3019
+
3020
+ return true;
3021
+ },
3022
+
3023
+ guid: 0,
3024
+
3025
+ compile: function compile(program, options) {
3026
+ this.sourceNode = [];
3027
+ this.opcodes = [];
3028
+ this.children = [];
3029
+ this.options = options;
3030
+ this.stringParams = options.stringParams;
3031
+ this.trackIds = options.trackIds;
3032
+
3033
+ options.blockParams = options.blockParams || [];
3034
+
3035
+ // These changes will propagate to the other compiler components
3036
+ var knownHelpers = options.knownHelpers;
3037
+ options.knownHelpers = {
3038
+ 'helperMissing': true,
3039
+ 'blockHelperMissing': true,
3040
+ 'each': true,
3041
+ 'if': true,
3042
+ 'unless': true,
3043
+ 'with': true,
3044
+ 'log': true,
3045
+ 'lookup': true
3046
+ };
3047
+ if (knownHelpers) {
3048
+ for (var _name in knownHelpers) {
3049
+ /* istanbul ignore else */
3050
+ if (_name in knownHelpers) {
3051
+ this.options.knownHelpers[_name] = knownHelpers[_name];
3052
+ }
3053
+ }
3054
+ }
3055
+
3056
+ return this.accept(program);
3057
+ },
3058
+
3059
+ compileProgram: function compileProgram(program) {
3060
+ var childCompiler = new this.compiler(),
3061
+ // eslint-disable-line new-cap
3062
+ result = childCompiler.compile(program, this.options),
3063
+ guid = this.guid++;
3064
+
3065
+ this.usePartial = this.usePartial || result.usePartial;
3066
+
3067
+ this.children[guid] = result;
3068
+ this.useDepths = this.useDepths || result.useDepths;
3069
+
3070
+ return guid;
3071
+ },
3072
+
3073
+ accept: function accept(node) {
3074
+ /* istanbul ignore next: Sanity code */
3075
+ if (!this[node.type]) {
3076
+ throw new _exception2['default']('Unknown type: ' + node.type, node);
3077
+ }
3078
+
3079
+ this.sourceNode.unshift(node);
3080
+ var ret = this[node.type](node);
3081
+ this.sourceNode.shift();
3082
+ return ret;
3083
+ },
3084
+
3085
+ Program: function Program(program) {
3086
+ this.options.blockParams.unshift(program.blockParams);
3087
+
3088
+ var body = program.body,
3089
+ bodyLength = body.length;
3090
+ for (var i = 0; i < bodyLength; i++) {
3091
+ this.accept(body[i]);
3092
+ }
3093
+
3094
+ this.options.blockParams.shift();
3095
+
3096
+ this.isSimple = bodyLength === 1;
3097
+ this.blockParams = program.blockParams ? program.blockParams.length : 0;
3098
+
3099
+ return this;
3100
+ },
3101
+
3102
+ BlockStatement: function BlockStatement(block) {
3103
+ transformLiteralToPath(block);
3104
+
3105
+ var program = block.program,
3106
+ inverse = block.inverse;
3107
+
3108
+ program = program && this.compileProgram(program);
3109
+ inverse = inverse && this.compileProgram(inverse);
3110
+
3111
+ var type = this.classifySexpr(block);
3112
+
3113
+ if (type === 'helper') {
3114
+ this.helperSexpr(block, program, inverse);
3115
+ } else if (type === 'simple') {
3116
+ this.simpleSexpr(block);
3117
+
3118
+ // now that the simple mustache is resolved, we need to
3119
+ // evaluate it by executing `blockHelperMissing`
3120
+ this.opcode('pushProgram', program);
3121
+ this.opcode('pushProgram', inverse);
3122
+ this.opcode('emptyHash');
3123
+ this.opcode('blockValue', block.path.original);
3124
+ } else {
3125
+ this.ambiguousSexpr(block, program, inverse);
3126
+
3127
+ // now that the simple mustache is resolved, we need to
3128
+ // evaluate it by executing `blockHelperMissing`
3129
+ this.opcode('pushProgram', program);
3130
+ this.opcode('pushProgram', inverse);
3131
+ this.opcode('emptyHash');
3132
+ this.opcode('ambiguousBlockValue');
3133
+ }
3134
+
3135
+ this.opcode('append');
3136
+ },
3137
+
3138
+ DecoratorBlock: function DecoratorBlock(decorator) {
3139
+ var program = decorator.program && this.compileProgram(decorator.program);
3140
+ var params = this.setupFullMustacheParams(decorator, program, undefined),
3141
+ path = decorator.path;
3142
+
3143
+ this.useDecorators = true;
3144
+ this.opcode('registerDecorator', params.length, path.original);
3145
+ },
3146
+
3147
+ PartialStatement: function PartialStatement(partial) {
3148
+ this.usePartial = true;
3149
+
3150
+ var program = partial.program;
3151
+ if (program) {
3152
+ program = this.compileProgram(partial.program);
3153
+ }
3154
+
3155
+ var params = partial.params;
3156
+ if (params.length > 1) {
3157
+ throw new _exception2['default']('Unsupported number of partial arguments: ' + params.length, partial);
3158
+ } else if (!params.length) {
3159
+ if (this.options.explicitPartialContext) {
3160
+ this.opcode('pushLiteral', 'undefined');
3161
+ } else {
3162
+ params.push({ type: 'PathExpression', parts: [], depth: 0 });
3163
+ }
3164
+ }
3165
+
3166
+ var partialName = partial.name.original,
3167
+ isDynamic = partial.name.type === 'SubExpression';
3168
+ if (isDynamic) {
3169
+ this.accept(partial.name);
3170
+ }
3171
+
3172
+ this.setupFullMustacheParams(partial, program, undefined, true);
3173
+
3174
+ var indent = partial.indent || '';
3175
+ if (this.options.preventIndent && indent) {
3176
+ this.opcode('appendContent', indent);
3177
+ indent = '';
3178
+ }
3179
+
3180
+ this.opcode('invokePartial', isDynamic, partialName, indent);
3181
+ this.opcode('append');
3182
+ },
3183
+ PartialBlockStatement: function PartialBlockStatement(partialBlock) {
3184
+ this.PartialStatement(partialBlock);
3185
+ },
3186
+
3187
+ MustacheStatement: function MustacheStatement(mustache) {
3188
+ this.SubExpression(mustache);
3189
+
3190
+ if (mustache.escaped && !this.options.noEscape) {
3191
+ this.opcode('appendEscaped');
3192
+ } else {
3193
+ this.opcode('append');
3194
+ }
3195
+ },
3196
+ Decorator: function Decorator(decorator) {
3197
+ this.DecoratorBlock(decorator);
3198
+ },
3199
+
3200
+ ContentStatement: function ContentStatement(content) {
3201
+ if (content.value) {
3202
+ this.opcode('appendContent', content.value);
3203
+ }
3204
+ },
3205
+
3206
+ CommentStatement: function CommentStatement() {},
3207
+
3208
+ SubExpression: function SubExpression(sexpr) {
3209
+ transformLiteralToPath(sexpr);
3210
+ var type = this.classifySexpr(sexpr);
3211
+
3212
+ if (type === 'simple') {
3213
+ this.simpleSexpr(sexpr);
3214
+ } else if (type === 'helper') {
3215
+ this.helperSexpr(sexpr);
3216
+ } else {
3217
+ this.ambiguousSexpr(sexpr);
3218
+ }
3219
+ },
3220
+ ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) {
3221
+ var path = sexpr.path,
3222
+ name = path.parts[0],
3223
+ isBlock = program != null || inverse != null;
3224
+
3225
+ this.opcode('getContext', path.depth);
3226
+
3227
+ this.opcode('pushProgram', program);
3228
+ this.opcode('pushProgram', inverse);
3229
+
3230
+ path.strict = true;
3231
+ this.accept(path);
3232
+
3233
+ this.opcode('invokeAmbiguous', name, isBlock);
3234
+ },
3235
+
3236
+ simpleSexpr: function simpleSexpr(sexpr) {
3237
+ var path = sexpr.path;
3238
+ path.strict = true;
3239
+ this.accept(path);
3240
+ this.opcode('resolvePossibleLambda');
3241
+ },
3242
+
3243
+ helperSexpr: function helperSexpr(sexpr, program, inverse) {
3244
+ var params = this.setupFullMustacheParams(sexpr, program, inverse),
3245
+ path = sexpr.path,
3246
+ name = path.parts[0];
3247
+
3248
+ if (this.options.knownHelpers[name]) {
3249
+ this.opcode('invokeKnownHelper', params.length, name);
3250
+ } else if (this.options.knownHelpersOnly) {
3251
+ throw new _exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr);
3252
+ } else {
3253
+ path.strict = true;
3254
+ path.falsy = true;
3255
+
3256
+ this.accept(path);
3257
+ this.opcode('invokeHelper', params.length, path.original, _ast2['default'].helpers.simpleId(path));
3258
+ }
3259
+ },
3260
+
3261
+ PathExpression: function PathExpression(path) {
3262
+ this.addDepth(path.depth);
3263
+ this.opcode('getContext', path.depth);
3264
+
3265
+ var name = path.parts[0],
3266
+ scoped = _ast2['default'].helpers.scopedId(path),
3267
+ blockParamId = !path.depth && !scoped && this.blockParamIndex(name);
3268
+
3269
+ if (blockParamId) {
3270
+ this.opcode('lookupBlockParam', blockParamId, path.parts);
3271
+ } else if (!name) {
3272
+ // Context reference, i.e. `{{foo .}}` or `{{foo ..}}`
3273
+ this.opcode('pushContext');
3274
+ } else if (path.data) {
3275
+ this.options.data = true;
3276
+ this.opcode('lookupData', path.depth, path.parts, path.strict);
3277
+ } else {
3278
+ this.opcode('lookupOnContext', path.parts, path.falsy, path.strict, scoped);
3279
+ }
3280
+ },
3281
+
3282
+ StringLiteral: function StringLiteral(string) {
3283
+ this.opcode('pushString', string.value);
3284
+ },
3285
+
3286
+ NumberLiteral: function NumberLiteral(number) {
3287
+ this.opcode('pushLiteral', number.value);
3288
+ },
3289
+
3290
+ BooleanLiteral: function BooleanLiteral(bool) {
3291
+ this.opcode('pushLiteral', bool.value);
3292
+ },
3293
+
3294
+ UndefinedLiteral: function UndefinedLiteral() {
3295
+ this.opcode('pushLiteral', 'undefined');
3296
+ },
3297
+
3298
+ NullLiteral: function NullLiteral() {
3299
+ this.opcode('pushLiteral', 'null');
3300
+ },
3301
+
3302
+ Hash: function Hash(hash) {
3303
+ var pairs = hash.pairs,
3304
+ i = 0,
3305
+ l = pairs.length;
3306
+
3307
+ this.opcode('pushHash');
3308
+
3309
+ for (; i < l; i++) {
3310
+ this.pushParam(pairs[i].value);
3311
+ }
3312
+ while (i--) {
3313
+ this.opcode('assignToHash', pairs[i].key);
3314
+ }
3315
+ this.opcode('popHash');
3316
+ },
3317
+
3318
+ // HELPERS
3319
+ opcode: function opcode(name) {
3320
+ this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc });
3321
+ },
3322
+
3323
+ addDepth: function addDepth(depth) {
3324
+ if (!depth) {
3325
+ return;
3326
+ }
3327
+
3328
+ this.useDepths = true;
3329
+ },
3330
+
3331
+ classifySexpr: function classifySexpr(sexpr) {
3332
+ var isSimple = _ast2['default'].helpers.simpleId(sexpr.path);
3333
+
3334
+ var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]);
3335
+
3336
+ // a mustache is an eligible helper if:
3337
+ // * its id is simple (a single part, not `this` or `..`)
3338
+ var isHelper = !isBlockParam && _ast2['default'].helpers.helperExpression(sexpr);
3339
+
3340
+ // if a mustache is an eligible helper but not a definite
3341
+ // helper, it is ambiguous, and will be resolved in a later
3342
+ // pass or at runtime.
3343
+ var isEligible = !isBlockParam && (isHelper || isSimple);
3344
+
3345
+ // if ambiguous, we can possibly resolve the ambiguity now
3346
+ // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc.
3347
+ if (isEligible && !isHelper) {
3348
+ var _name2 = sexpr.path.parts[0],
3349
+ options = this.options;
3350
+
3351
+ if (options.knownHelpers[_name2]) {
3352
+ isHelper = true;
3353
+ } else if (options.knownHelpersOnly) {
3354
+ isEligible = false;
3355
+ }
3356
+ }
3357
+
3358
+ if (isHelper) {
3359
+ return 'helper';
3360
+ } else if (isEligible) {
3361
+ return 'ambiguous';
3362
+ } else {
3363
+ return 'simple';
3364
+ }
3365
+ },
3366
+
3367
+ pushParams: function pushParams(params) {
3368
+ for (var i = 0, l = params.length; i < l; i++) {
3369
+ this.pushParam(params[i]);
3370
+ }
3371
+ },
3372
+
3373
+ pushParam: function pushParam(val) {
3374
+ var value = val.value != null ? val.value : val.original || '';
3375
+
3376
+ if (this.stringParams) {
3377
+ if (value.replace) {
3378
+ value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.');
3379
+ }
3380
+
3381
+ if (val.depth) {
3382
+ this.addDepth(val.depth);
3383
+ }
3384
+ this.opcode('getContext', val.depth || 0);
3385
+ this.opcode('pushStringParam', value, val.type);
3386
+
3387
+ if (val.type === 'SubExpression') {
3388
+ // SubExpressions get evaluated and passed in
3389
+ // in string params mode.
3390
+ this.accept(val);
3391
+ }
3392
+ } else {
3393
+ if (this.trackIds) {
3394
+ var blockParamIndex = undefined;
3395
+ if (val.parts && !_ast2['default'].helpers.scopedId(val) && !val.depth) {
3396
+ blockParamIndex = this.blockParamIndex(val.parts[0]);
3397
+ }
3398
+ if (blockParamIndex) {
3399
+ var blockParamChild = val.parts.slice(1).join('.');
3400
+ this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild);
3401
+ } else {
3402
+ value = val.original || value;
3403
+ if (value.replace) {
3404
+ value = value.replace(/^this(?:\.|$)/, '').replace(/^\.\//, '').replace(/^\.$/, '');
3405
+ }
3406
+
3407
+ this.opcode('pushId', val.type, value);
3408
+ }
3409
+ }
3410
+ this.accept(val);
3411
+ }
3412
+ },
3413
+
3414
+ setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) {
3415
+ var params = sexpr.params;
3416
+ this.pushParams(params);
3417
+
3418
+ this.opcode('pushProgram', program);
3419
+ this.opcode('pushProgram', inverse);
3420
+
3421
+ if (sexpr.hash) {
3422
+ this.accept(sexpr.hash);
3423
+ } else {
3424
+ this.opcode('emptyHash', omitEmpty);
3425
+ }
3426
+
3427
+ return params;
3428
+ },
3429
+
3430
+ blockParamIndex: function blockParamIndex(name) {
3431
+ for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) {
3432
+ var blockParams = this.options.blockParams[depth],
3433
+ param = blockParams && _utils.indexOf(blockParams, name);
3434
+ if (blockParams && param >= 0) {
3435
+ return [depth, param];
3436
+ }
3437
+ }
3438
+ }
3439
+ };
3440
+
3441
+ function precompile(input, options, env) {
3442
+ if (input == null || typeof input !== 'string' && input.type !== 'Program') {
3443
+ throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input);
3444
+ }
3445
+
3446
+ options = options || {};
3447
+ if (!('data' in options)) {
3448
+ options.data = true;
3449
+ }
3450
+ if (options.compat) {
3451
+ options.useDepths = true;
3452
+ }
3453
+
3454
+ var ast = env.parse(input, options),
3455
+ environment = new env.Compiler().compile(ast, options);
3456
+ return new env.JavaScriptCompiler().compile(environment, options);
3457
+ }
3458
+
3459
+ function compile(input, options, env) {
3460
+ if (options === undefined) options = {};
3461
+
3462
+ if (input == null || typeof input !== 'string' && input.type !== 'Program') {
3463
+ throw new _exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);
3464
+ }
3465
+
3466
+ options = _utils.extend({}, options);
3467
+ if (!('data' in options)) {
3468
+ options.data = true;
3469
+ }
3470
+ if (options.compat) {
3471
+ options.useDepths = true;
3472
+ }
3473
+
3474
+ var compiled = undefined;
3475
+
3476
+ function compileInput() {
3477
+ var ast = env.parse(input, options),
3478
+ environment = new env.Compiler().compile(ast, options),
3479
+ templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);
3480
+ return env.template(templateSpec);
3481
+ }
3482
+
3483
+ // Template is only compiled on first use and cached after that point.
3484
+ function ret(context, execOptions) {
3485
+ if (!compiled) {
3486
+ compiled = compileInput();
3487
+ }
3488
+ return compiled.call(this, context, execOptions);
3489
+ }
3490
+ ret._setup = function (setupOptions) {
3491
+ if (!compiled) {
3492
+ compiled = compileInput();
3493
+ }
3494
+ return compiled._setup(setupOptions);
3495
+ };
3496
+ ret._child = function (i, data, blockParams, depths) {
3497
+ if (!compiled) {
3498
+ compiled = compileInput();
3499
+ }
3500
+ return compiled._child(i, data, blockParams, depths);
3501
+ };
3502
+ return ret;
3503
+ }
3504
+
3505
+ function argEquals(a, b) {
3506
+ if (a === b) {
3507
+ return true;
3508
+ }
3509
+
3510
+ if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) {
3511
+ for (var i = 0; i < a.length; i++) {
3512
+ if (!argEquals(a[i], b[i])) {
3513
+ return false;
3514
+ }
3515
+ }
3516
+ return true;
3517
+ }
3518
+ }
3519
+
3520
+ function transformLiteralToPath(sexpr) {
3521
+ if (!sexpr.path.parts) {
3522
+ var literal = sexpr.path;
3523
+ // Casting to string here to make false and 0 literal values play nicely with the rest
3524
+ // of the system.
3525
+ sexpr.path = {
3526
+ type: 'PathExpression',
3527
+ data: false,
3528
+ depth: 0,
3529
+ parts: [literal.original + ''],
3530
+ original: literal.original + '',
3531
+ loc: literal.loc
3532
+ };
3533
+ }
3534
+ }
3535
+
3536
+ /***/ }),
3537
+ /* 42 */
3538
+ /***/ (function(module, exports, __webpack_require__) {
3539
+
3540
+ 'use strict';
3541
+
3542
+ var _interopRequireDefault = __webpack_require__(1)['default'];
3543
+
3544
+ exports.__esModule = true;
3545
+
3546
+ var _base = __webpack_require__(4);
3547
+
3548
+ var _exception = __webpack_require__(6);
3549
+
3550
+ var _exception2 = _interopRequireDefault(_exception);
3551
+
3552
+ var _utils = __webpack_require__(5);
3553
+
3554
+ var _codeGen = __webpack_require__(43);
3555
+
3556
+ var _codeGen2 = _interopRequireDefault(_codeGen);
3557
+
3558
+ function Literal(value) {
3559
+ this.value = value;
3560
+ }
3561
+
3562
+ function JavaScriptCompiler() {}
3563
+
3564
+ JavaScriptCompiler.prototype = {
3565
+ // PUBLIC API: You can override these methods in a subclass to provide
3566
+ // alternative compiled forms for name lookup and buffering semantics
3567
+ nameLookup: function nameLookup(parent, name /* , type*/) {
3568
+ if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
3569
+ return [parent, '.', name];
3570
+ } else {
3571
+ return [parent, '[', JSON.stringify(name), ']'];
3572
+ }
3573
+ },
3574
+ depthedLookup: function depthedLookup(name) {
3575
+ return [this.aliasable('container.lookup'), '(depths, "', name, '")'];
3576
+ },
3577
+
3578
+ compilerInfo: function compilerInfo() {
3579
+ var revision = _base.COMPILER_REVISION,
3580
+ versions = _base.REVISION_CHANGES[revision];
3581
+ return [revision, versions];
3582
+ },
3583
+
3584
+ appendToBuffer: function appendToBuffer(source, location, explicit) {
3585
+ // Force a source as this simplifies the merge logic.
3586
+ if (!_utils.isArray(source)) {
3587
+ source = [source];
3588
+ }
3589
+ source = this.source.wrap(source, location);
3590
+
3591
+ if (this.environment.isSimple) {
3592
+ return ['return ', source, ';'];
3593
+ } else if (explicit) {
3594
+ // This is a case where the buffer operation occurs as a child of another
3595
+ // construct, generally braces. We have to explicitly output these buffer
3596
+ // operations to ensure that the emitted code goes in the correct location.
3597
+ return ['buffer += ', source, ';'];
3598
+ } else {
3599
+ source.appendToBuffer = true;
3600
+ return source;
3601
+ }
3602
+ },
3603
+
3604
+ initializeBuffer: function initializeBuffer() {
3605
+ return this.quotedString('');
3606
+ },
3607
+ // END PUBLIC API
3608
+
3609
+ compile: function compile(environment, options, context, asObject) {
3610
+ this.environment = environment;
3611
+ this.options = options;
3612
+ this.stringParams = this.options.stringParams;
3613
+ this.trackIds = this.options.trackIds;
3614
+ this.precompile = !asObject;
3615
+
3616
+ this.name = this.environment.name;
3617
+ this.isChild = !!context;
3618
+ this.context = context || {
3619
+ decorators: [],
3620
+ programs: [],
3621
+ environments: []
3622
+ };
3623
+
3624
+ this.preamble();
3625
+
3626
+ this.stackSlot = 0;
3627
+ this.stackVars = [];
3628
+ this.aliases = {};
3629
+ this.registers = { list: [] };
3630
+ this.hashes = [];
3631
+ this.compileStack = [];
3632
+ this.inlineStack = [];
3633
+ this.blockParams = [];
3634
+
3635
+ this.compileChildren(environment, options);
3636
+
3637
+ this.useDepths = this.useDepths || environment.useDepths || environment.useDecorators || this.options.compat;
3638
+ this.useBlockParams = this.useBlockParams || environment.useBlockParams;
3639
+
3640
+ var opcodes = environment.opcodes,
3641
+ opcode = undefined,
3642
+ firstLoc = undefined,
3643
+ i = undefined,
3644
+ l = undefined;
3645
+
3646
+ for (i = 0, l = opcodes.length; i < l; i++) {
3647
+ opcode = opcodes[i];
3648
+
3649
+ this.source.currentLocation = opcode.loc;
3650
+ firstLoc = firstLoc || opcode.loc;
3651
+ this[opcode.opcode].apply(this, opcode.args);
3652
+ }
3653
+
3654
+ // Flush any trailing content that might be pending.
3655
+ this.source.currentLocation = firstLoc;
3656
+ this.pushSource('');
3657
+
3658
+ /* istanbul ignore next */
3659
+ if (this.stackSlot || this.inlineStack.length || this.compileStack.length) {
3660
+ throw new _exception2['default']('Compile completed with content left on stack');
3661
+ }
3662
+
3663
+ if (!this.decorators.isEmpty()) {
3664
+ this.useDecorators = true;
3665
+
3666
+ this.decorators.prepend('var decorators = container.decorators;\n');
3667
+ this.decorators.push('return fn;');
3668
+
3669
+ if (asObject) {
3670
+ this.decorators = Function.apply(this, ['fn', 'props', 'container', 'depth0', 'data', 'blockParams', 'depths', this.decorators.merge()]);
3671
+ } else {
3672
+ this.decorators.prepend('function(fn, props, container, depth0, data, blockParams, depths) {\n');
3673
+ this.decorators.push('}\n');
3674
+ this.decorators = this.decorators.merge();
3675
+ }
3676
+ } else {
3677
+ this.decorators = undefined;
3678
+ }
3679
+
3680
+ var fn = this.createFunctionContext(asObject);
3681
+ if (!this.isChild) {
3682
+ var ret = {
3683
+ compiler: this.compilerInfo(),
3684
+ main: fn
3685
+ };
3686
+
3687
+ if (this.decorators) {
3688
+ ret.main_d = this.decorators; // eslint-disable-line camelcase
3689
+ ret.useDecorators = true;
3690
+ }
3691
+
3692
+ var _context = this.context;
3693
+ var programs = _context.programs;
3694
+ var decorators = _context.decorators;
3695
+
3696
+ for (i = 0, l = programs.length; i < l; i++) {
3697
+ if (programs[i]) {
3698
+ ret[i] = programs[i];
3699
+ if (decorators[i]) {
3700
+ ret[i + '_d'] = decorators[i];
3701
+ ret.useDecorators = true;
3702
+ }
3703
+ }
3704
+ }
3705
+
3706
+ if (this.environment.usePartial) {
3707
+ ret.usePartial = true;
3708
+ }
3709
+ if (this.options.data) {
3710
+ ret.useData = true;
3711
+ }
3712
+ if (this.useDepths) {
3713
+ ret.useDepths = true;
3714
+ }
3715
+ if (this.useBlockParams) {
3716
+ ret.useBlockParams = true;
3717
+ }
3718
+ if (this.options.compat) {
3719
+ ret.compat = true;
3720
+ }
3721
+
3722
+ if (!asObject) {
3723
+ ret.compiler = JSON.stringify(ret.compiler);
3724
+
3725
+ this.source.currentLocation = { start: { line: 1, column: 0 } };
3726
+ ret = this.objectLiteral(ret);
3727
+
3728
+ if (options.srcName) {
3729
+ ret = ret.toStringWithSourceMap({ file: options.destName });
3730
+ ret.map = ret.map && ret.map.toString();
3731
+ } else {
3732
+ ret = ret.toString();
3733
+ }
3734
+ } else {
3735
+ ret.compilerOptions = this.options;
3736
+ }
3737
+
3738
+ return ret;
3739
+ } else {
3740
+ return fn;
3741
+ }
3742
+ },
3743
+
3744
+ preamble: function preamble() {
3745
+ // track the last context pushed into place to allow skipping the
3746
+ // getContext opcode when it would be a noop
3747
+ this.lastContext = 0;
3748
+ this.source = new _codeGen2['default'](this.options.srcName);
3749
+ this.decorators = new _codeGen2['default'](this.options.srcName);
3750
+ },
3751
+
3752
+ createFunctionContext: function createFunctionContext(asObject) {
3753
+ var varDeclarations = '';
3754
+
3755
+ var locals = this.stackVars.concat(this.registers.list);
3756
+ if (locals.length > 0) {
3757
+ varDeclarations += ', ' + locals.join(', ');
3758
+ }
3759
+
3760
+ // Generate minimizer alias mappings
3761
+ //
3762
+ // When using true SourceNodes, this will update all references to the given alias
3763
+ // as the source nodes are reused in situ. For the non-source node compilation mode,
3764
+ // aliases will not be used, but this case is already being run on the client and
3765
+ // we aren't concern about minimizing the template size.
3766
+ var aliasCount = 0;
3767
+ for (var alias in this.aliases) {
3768
+ // eslint-disable-line guard-for-in
3769
+ var node = this.aliases[alias];
3770
+
3771
+ if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) {
3772
+ varDeclarations += ', alias' + ++aliasCount + '=' + alias;
3773
+ node.children[0] = 'alias' + aliasCount;
3774
+ }
3775
+ }
3776
+
3777
+ var params = ['container', 'depth0', 'helpers', 'partials', 'data'];
3778
+
3779
+ if (this.useBlockParams || this.useDepths) {
3780
+ params.push('blockParams');
3781
+ }
3782
+ if (this.useDepths) {
3783
+ params.push('depths');
3784
+ }
3785
+
3786
+ // Perform a second pass over the output to merge content when possible
3787
+ var source = this.mergeSource(varDeclarations);
3788
+
3789
+ if (asObject) {
3790
+ params.push(source);
3791
+
3792
+ return Function.apply(this, params);
3793
+ } else {
3794
+ return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']);
3795
+ }
3796
+ },
3797
+ mergeSource: function mergeSource(varDeclarations) {
3798
+ var isSimple = this.environment.isSimple,
3799
+ appendOnly = !this.forceBuffer,
3800
+ appendFirst = undefined,
3801
+ sourceSeen = undefined,
3802
+ bufferStart = undefined,
3803
+ bufferEnd = undefined;
3804
+ this.source.each(function (line) {
3805
+ if (line.appendToBuffer) {
3806
+ if (bufferStart) {
3807
+ line.prepend(' + ');
3808
+ } else {
3809
+ bufferStart = line;
3810
+ }
3811
+ bufferEnd = line;
3812
+ } else {
3813
+ if (bufferStart) {
3814
+ if (!sourceSeen) {
3815
+ appendFirst = true;
3816
+ } else {
3817
+ bufferStart.prepend('buffer += ');
3818
+ }
3819
+ bufferEnd.add(';');
3820
+ bufferStart = bufferEnd = undefined;
3821
+ }
3822
+
3823
+ sourceSeen = true;
3824
+ if (!isSimple) {
3825
+ appendOnly = false;
3826
+ }
3827
+ }
3828
+ });
3829
+
3830
+ if (appendOnly) {
3831
+ if (bufferStart) {
3832
+ bufferStart.prepend('return ');
3833
+ bufferEnd.add(';');
3834
+ } else if (!sourceSeen) {
3835
+ this.source.push('return "";');
3836
+ }
3837
+ } else {
3838
+ varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer());
3839
+
3840
+ if (bufferStart) {
3841
+ bufferStart.prepend('return buffer + ');
3842
+ bufferEnd.add(';');
3843
+ } else {
3844
+ this.source.push('return buffer;');
3845
+ }
3846
+ }
3847
+
3848
+ if (varDeclarations) {
3849
+ this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n'));
3850
+ }
3851
+
3852
+ return this.source.merge();
3853
+ },
3854
+
3855
+ // [blockValue]
3856
+ //
3857
+ // On stack, before: hash, inverse, program, value
3858
+ // On stack, after: return value of blockHelperMissing
3859
+ //
3860
+ // The purpose of this opcode is to take a block of the form
3861
+ // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and
3862
+ // replace it on the stack with the result of properly
3863
+ // invoking blockHelperMissing.
3864
+ blockValue: function blockValue(name) {
3865
+ var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'),
3866
+ params = [this.contextName(0)];
3867
+ this.setupHelperArgs(name, 0, params);
3868
+
3869
+ var blockName = this.popStack();
3870
+ params.splice(1, 0, blockName);
3871
+
3872
+ this.push(this.source.functionCall(blockHelperMissing, 'call', params));
3873
+ },
3874
+
3875
+ // [ambiguousBlockValue]
3876
+ //
3877
+ // On stack, before: hash, inverse, program, value
3878
+ // Compiler value, before: lastHelper=value of last found helper, if any
3879
+ // On stack, after, if no lastHelper: same as [blockValue]
3880
+ // On stack, after, if lastHelper: value
3881
+ ambiguousBlockValue: function ambiguousBlockValue() {
3882
+ // We're being a bit cheeky and reusing the options value from the prior exec
3883
+ var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'),
3884
+ params = [this.contextName(0)];
3885
+ this.setupHelperArgs('', 0, params, true);
3886
+
3887
+ this.flushInline();
3888
+
3889
+ var current = this.topStack();
3890
+ params.splice(1, 0, current);
3891
+
3892
+ this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']);
3893
+ },
3894
+
3895
+ // [appendContent]
3896
+ //
3897
+ // On stack, before: ...
3898
+ // On stack, after: ...
3899
+ //
3900
+ // Appends the string value of `content` to the current buffer
3901
+ appendContent: function appendContent(content) {
3902
+ if (this.pendingContent) {
3903
+ content = this.pendingContent + content;
3904
+ } else {
3905
+ this.pendingLocation = this.source.currentLocation;
3906
+ }
3907
+
3908
+ this.pendingContent = content;
3909
+ },
3910
+
3911
+ // [append]
3912
+ //
3913
+ // On stack, before: value, ...
3914
+ // On stack, after: ...
3915
+ //
3916
+ // Coerces `value` to a String and appends it to the current buffer.
3917
+ //
3918
+ // If `value` is truthy, or 0, it is coerced into a string and appended
3919
+ // Otherwise, the empty string is appended
3920
+ append: function append() {
3921
+ if (this.isInline()) {
3922
+ this.replaceStack(function (current) {
3923
+ return [' != null ? ', current, ' : ""'];
3924
+ });
3925
+
3926
+ this.pushSource(this.appendToBuffer(this.popStack()));
3927
+ } else {
3928
+ var local = this.popStack();
3929
+ this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']);
3930
+ if (this.environment.isSimple) {
3931
+ this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']);
3932
+ }
3933
+ }
3934
+ },
3935
+
3936
+ // [appendEscaped]
3937
+ //
3938
+ // On stack, before: value, ...
3939
+ // On stack, after: ...
3940
+ //
3941
+ // Escape `value` and append it to the buffer
3942
+ appendEscaped: function appendEscaped() {
3943
+ this.pushSource(this.appendToBuffer([this.aliasable('container.escapeExpression'), '(', this.popStack(), ')']));
3944
+ },
3945
+
3946
+ // [getContext]
3947
+ //
3948
+ // On stack, before: ...
3949
+ // On stack, after: ...
3950
+ // Compiler value, after: lastContext=depth
3951
+ //
3952
+ // Set the value of the `lastContext` compiler value to the depth
3953
+ getContext: function getContext(depth) {
3954
+ this.lastContext = depth;
3955
+ },
3956
+
3957
+ // [pushContext]
3958
+ //
3959
+ // On stack, before: ...
3960
+ // On stack, after: currentContext, ...
3961
+ //
3962
+ // Pushes the value of the current context onto the stack.
3963
+ pushContext: function pushContext() {
3964
+ this.pushStackLiteral(this.contextName(this.lastContext));
3965
+ },
3966
+
3967
+ // [lookupOnContext]
3968
+ //
3969
+ // On stack, before: ...
3970
+ // On stack, after: currentContext[name], ...
3971
+ //
3972
+ // Looks up the value of `name` on the current context and pushes
3973
+ // it onto the stack.
3974
+ lookupOnContext: function lookupOnContext(parts, falsy, strict, scoped) {
3975
+ var i = 0;
3976
+
3977
+ if (!scoped && this.options.compat && !this.lastContext) {
3978
+ // The depthed query is expected to handle the undefined logic for the root level that
3979
+ // is implemented below, so we evaluate that directly in compat mode
3980
+ this.push(this.depthedLookup(parts[i++]));
3981
+ } else {
3982
+ this.pushContext();
3983
+ }
3984
+
3985
+ this.resolvePath('context', parts, i, falsy, strict);
3986
+ },
3987
+
3988
+ // [lookupBlockParam]
3989
+ //
3990
+ // On stack, before: ...
3991
+ // On stack, after: blockParam[name], ...
3992
+ //
3993
+ // Looks up the value of `parts` on the given block param and pushes
3994
+ // it onto the stack.
3995
+ lookupBlockParam: function lookupBlockParam(blockParamId, parts) {
3996
+ this.useBlockParams = true;
3997
+
3998
+ this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']);
3999
+ this.resolvePath('context', parts, 1);
4000
+ },
4001
+
4002
+ // [lookupData]
4003
+ //
4004
+ // On stack, before: ...
4005
+ // On stack, after: data, ...
4006
+ //
4007
+ // Push the data lookup operator
4008
+ lookupData: function lookupData(depth, parts, strict) {
4009
+ if (!depth) {
4010
+ this.pushStackLiteral('data');
4011
+ } else {
4012
+ this.pushStackLiteral('container.data(data, ' + depth + ')');
4013
+ }
4014
+
4015
+ this.resolvePath('data', parts, 0, true, strict);
4016
+ },
4017
+
4018
+ resolvePath: function resolvePath(type, parts, i, falsy, strict) {
4019
+ // istanbul ignore next
4020
+
4021
+ var _this = this;
4022
+
4023
+ if (this.options.strict || this.options.assumeObjects) {
4024
+ this.push(strictLookup(this.options.strict && strict, this, parts, type));
4025
+ return;
4026
+ }
4027
+
4028
+ var len = parts.length;
4029
+ for (; i < len; i++) {
4030
+ /* eslint-disable no-loop-func */
4031
+ this.replaceStack(function (current) {
4032
+ var lookup = _this.nameLookup(current, parts[i], type);
4033
+ // We want to ensure that zero and false are handled properly if the context (falsy flag)
4034
+ // needs to have the special handling for these values.
4035
+ if (!falsy) {
4036
+ return [' != null ? ', lookup, ' : ', current];
4037
+ } else {
4038
+ // Otherwise we can use generic falsy handling
4039
+ return [' && ', lookup];
4040
+ }
4041
+ });
4042
+ /* eslint-enable no-loop-func */
4043
+ }
4044
+ },
4045
+
4046
+ // [resolvePossibleLambda]
4047
+ //
4048
+ // On stack, before: value, ...
4049
+ // On stack, after: resolved value, ...
4050
+ //
4051
+ // If the `value` is a lambda, replace it on the stack by
4052
+ // the return value of the lambda
4053
+ resolvePossibleLambda: function resolvePossibleLambda() {
4054
+ this.push([this.aliasable('container.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']);
4055
+ },
4056
+
4057
+ // [pushStringParam]
4058
+ //
4059
+ // On stack, before: ...
4060
+ // On stack, after: string, currentContext, ...
4061
+ //
4062
+ // This opcode is designed for use in string mode, which
4063
+ // provides the string value of a parameter along with its
4064
+ // depth rather than resolving it immediately.
4065
+ pushStringParam: function pushStringParam(string, type) {
4066
+ this.pushContext();
4067
+ this.pushString(type);
4068
+
4069
+ // If it's a subexpression, the string result
4070
+ // will be pushed after this opcode.
4071
+ if (type !== 'SubExpression') {
4072
+ if (typeof string === 'string') {
4073
+ this.pushString(string);
4074
+ } else {
4075
+ this.pushStackLiteral(string);
4076
+ }
4077
+ }
4078
+ },
4079
+
4080
+ emptyHash: function emptyHash(omitEmpty) {
4081
+ if (this.trackIds) {
4082
+ this.push('{}'); // hashIds
4083
+ }
4084
+ if (this.stringParams) {
4085
+ this.push('{}'); // hashContexts
4086
+ this.push('{}'); // hashTypes
4087
+ }
4088
+ this.pushStackLiteral(omitEmpty ? 'undefined' : '{}');
4089
+ },
4090
+ pushHash: function pushHash() {
4091
+ if (this.hash) {
4092
+ this.hashes.push(this.hash);
4093
+ }
4094
+ this.hash = { values: [], types: [], contexts: [], ids: [] };
4095
+ },
4096
+ popHash: function popHash() {
4097
+ var hash = this.hash;
4098
+ this.hash = this.hashes.pop();
4099
+
4100
+ if (this.trackIds) {
4101
+ this.push(this.objectLiteral(hash.ids));
4102
+ }
4103
+ if (this.stringParams) {
4104
+ this.push(this.objectLiteral(hash.contexts));
4105
+ this.push(this.objectLiteral(hash.types));
4106
+ }
4107
+
4108
+ this.push(this.objectLiteral(hash.values));
4109
+ },
4110
+
4111
+ // [pushString]
4112
+ //
4113
+ // On stack, before: ...
4114
+ // On stack, after: quotedString(string), ...
4115
+ //
4116
+ // Push a quoted version of `string` onto the stack
4117
+ pushString: function pushString(string) {
4118
+ this.pushStackLiteral(this.quotedString(string));
4119
+ },
4120
+
4121
+ // [pushLiteral]
4122
+ //
4123
+ // On stack, before: ...
4124
+ // On stack, after: value, ...
4125
+ //
4126
+ // Pushes a value onto the stack. This operation prevents
4127
+ // the compiler from creating a temporary variable to hold
4128
+ // it.
4129
+ pushLiteral: function pushLiteral(value) {
4130
+ this.pushStackLiteral(value);
4131
+ },
4132
+
4133
+ // [pushProgram]
4134
+ //
4135
+ // On stack, before: ...
4136
+ // On stack, after: program(guid), ...
4137
+ //
4138
+ // Push a program expression onto the stack. This takes
4139
+ // a compile-time guid and converts it into a runtime-accessible
4140
+ // expression.
4141
+ pushProgram: function pushProgram(guid) {
4142
+ if (guid != null) {
4143
+ this.pushStackLiteral(this.programExpression(guid));
4144
+ } else {
4145
+ this.pushStackLiteral(null);
4146
+ }
4147
+ },
4148
+
4149
+ // [registerDecorator]
4150
+ //
4151
+ // On stack, before: hash, program, params..., ...
4152
+ // On stack, after: ...
4153
+ //
4154
+ // Pops off the decorator's parameters, invokes the decorator,
4155
+ // and inserts the decorator into the decorators list.
4156
+ registerDecorator: function registerDecorator(paramSize, name) {
4157
+ var foundDecorator = this.nameLookup('decorators', name, 'decorator'),
4158
+ options = this.setupHelperArgs(name, paramSize);
4159
+
4160
+ this.decorators.push(['fn = ', this.decorators.functionCall(foundDecorator, '', ['fn', 'props', 'container', options]), ' || fn;']);
4161
+ },
4162
+
4163
+ // [invokeHelper]
4164
+ //
4165
+ // On stack, before: hash, inverse, program, params..., ...
4166
+ // On stack, after: result of helper invocation
4167
+ //
4168
+ // Pops off the helper's parameters, invokes the helper,
4169
+ // and pushes the helper's return value onto the stack.
4170
+ //
4171
+ // If the helper is not found, `helperMissing` is called.
4172
+ invokeHelper: function invokeHelper(paramSize, name, isSimple) {
4173
+ var nonHelper = this.popStack(),
4174
+ helper = this.setupHelper(paramSize, name),
4175
+ simple = isSimple ? [helper.name, ' || '] : '';
4176
+
4177
+ var lookup = ['('].concat(simple, nonHelper);
4178
+ if (!this.options.strict) {
4179
+ lookup.push(' || ', this.aliasable('helpers.helperMissing'));
4180
+ }
4181
+ lookup.push(')');
4182
+
4183
+ this.push(this.source.functionCall(lookup, 'call', helper.callParams));
4184
+ },
4185
+
4186
+ // [invokeKnownHelper]
4187
+ //
4188
+ // On stack, before: hash, inverse, program, params..., ...
4189
+ // On stack, after: result of helper invocation
4190
+ //
4191
+ // This operation is used when the helper is known to exist,
4192
+ // so a `helperMissing` fallback is not required.
4193
+ invokeKnownHelper: function invokeKnownHelper(paramSize, name) {
4194
+ var helper = this.setupHelper(paramSize, name);
4195
+ this.push(this.source.functionCall(helper.name, 'call', helper.callParams));
4196
+ },
4197
+
4198
+ // [invokeAmbiguous]
4199
+ //
4200
+ // On stack, before: hash, inverse, program, params..., ...
4201
+ // On stack, after: result of disambiguation
4202
+ //
4203
+ // This operation is used when an expression like `{{foo}}`
4204
+ // is provided, but we don't know at compile-time whether it
4205
+ // is a helper or a path.
4206
+ //
4207
+ // This operation emits more code than the other options,
4208
+ // and can be avoided by passing the `knownHelpers` and
4209
+ // `knownHelpersOnly` flags at compile-time.
4210
+ invokeAmbiguous: function invokeAmbiguous(name, helperCall) {
4211
+ this.useRegister('helper');
4212
+
4213
+ var nonHelper = this.popStack();
4214
+
4215
+ this.emptyHash();
4216
+ var helper = this.setupHelper(0, name, helperCall);
4217
+
4218
+ var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
4219
+
4220
+ var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')'];
4221
+ if (!this.options.strict) {
4222
+ lookup[0] = '(helper = ';
4223
+ lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing'));
4224
+ }
4225
+
4226
+ this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']);
4227
+ },
4228
+
4229
+ // [invokePartial]
4230
+ //
4231
+ // On stack, before: context, ...
4232
+ // On stack after: result of partial invocation
4233
+ //
4234
+ // This operation pops off a context, invokes a partial with that context,
4235
+ // and pushes the result of the invocation back.
4236
+ invokePartial: function invokePartial(isDynamic, name, indent) {
4237
+ var params = [],
4238
+ options = this.setupParams(name, 1, params);
4239
+
4240
+ if (isDynamic) {
4241
+ name = this.popStack();
4242
+ delete options.name;
4243
+ }
4244
+
4245
+ if (indent) {
4246
+ options.indent = JSON.stringify(indent);
4247
+ }
4248
+ options.helpers = 'helpers';
4249
+ options.partials = 'partials';
4250
+ options.decorators = 'container.decorators';
4251
+
4252
+ if (!isDynamic) {
4253
+ params.unshift(this.nameLookup('partials', name, 'partial'));
4254
+ } else {
4255
+ params.unshift(name);
4256
+ }
4257
+
4258
+ if (this.options.compat) {
4259
+ options.depths = 'depths';
4260
+ }
4261
+ options = this.objectLiteral(options);
4262
+ params.push(options);
4263
+
4264
+ this.push(this.source.functionCall('container.invokePartial', '', params));
4265
+ },
4266
+
4267
+ // [assignToHash]
4268
+ //
4269
+ // On stack, before: value, ..., hash, ...
4270
+ // On stack, after: ..., hash, ...
4271
+ //
4272
+ // Pops a value off the stack and assigns it to the current hash
4273
+ assignToHash: function assignToHash(key) {
4274
+ var value = this.popStack(),
4275
+ context = undefined,
4276
+ type = undefined,
4277
+ id = undefined;
4278
+
4279
+ if (this.trackIds) {
4280
+ id = this.popStack();
4281
+ }
4282
+ if (this.stringParams) {
4283
+ type = this.popStack();
4284
+ context = this.popStack();
4285
+ }
4286
+
4287
+ var hash = this.hash;
4288
+ if (context) {
4289
+ hash.contexts[key] = context;
4290
+ }
4291
+ if (type) {
4292
+ hash.types[key] = type;
4293
+ }
4294
+ if (id) {
4295
+ hash.ids[key] = id;
4296
+ }
4297
+ hash.values[key] = value;
4298
+ },
4299
+
4300
+ pushId: function pushId(type, name, child) {
4301
+ if (type === 'BlockParam') {
4302
+ this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : ''));
4303
+ } else if (type === 'PathExpression') {
4304
+ this.pushString(name);
4305
+ } else if (type === 'SubExpression') {
4306
+ this.pushStackLiteral('true');
4307
+ } else {
4308
+ this.pushStackLiteral('null');
4309
+ }
4310
+ },
4311
+
4312
+ // HELPERS
4313
+
4314
+ compiler: JavaScriptCompiler,
4315
+
4316
+ compileChildren: function compileChildren(environment, options) {
4317
+ var children = environment.children,
4318
+ child = undefined,
4319
+ compiler = undefined;
4320
+
4321
+ for (var i = 0, l = children.length; i < l; i++) {
4322
+ child = children[i];
4323
+ compiler = new this.compiler(); // eslint-disable-line new-cap
4324
+
4325
+ var existing = this.matchExistingProgram(child);
4326
+
4327
+ if (existing == null) {
4328
+ this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children
4329
+ var index = this.context.programs.length;
4330
+ child.index = index;
4331
+ child.name = 'program' + index;
4332
+ this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile);
4333
+ this.context.decorators[index] = compiler.decorators;
4334
+ this.context.environments[index] = child;
4335
+
4336
+ this.useDepths = this.useDepths || compiler.useDepths;
4337
+ this.useBlockParams = this.useBlockParams || compiler.useBlockParams;
4338
+ child.useDepths = this.useDepths;
4339
+ child.useBlockParams = this.useBlockParams;
4340
+ } else {
4341
+ child.index = existing.index;
4342
+ child.name = 'program' + existing.index;
4343
+
4344
+ this.useDepths = this.useDepths || existing.useDepths;
4345
+ this.useBlockParams = this.useBlockParams || existing.useBlockParams;
4346
+ }
4347
+ }
4348
+ },
4349
+ matchExistingProgram: function matchExistingProgram(child) {
4350
+ for (var i = 0, len = this.context.environments.length; i < len; i++) {
4351
+ var environment = this.context.environments[i];
4352
+ if (environment && environment.equals(child)) {
4353
+ return environment;
4354
+ }
4355
+ }
4356
+ },
4357
+
4358
+ programExpression: function programExpression(guid) {
4359
+ var child = this.environment.children[guid],
4360
+ programParams = [child.index, 'data', child.blockParams];
4361
+
4362
+ if (this.useBlockParams || this.useDepths) {
4363
+ programParams.push('blockParams');
4364
+ }
4365
+ if (this.useDepths) {
4366
+ programParams.push('depths');
4367
+ }
4368
+
4369
+ return 'container.program(' + programParams.join(', ') + ')';
4370
+ },
4371
+
4372
+ useRegister: function useRegister(name) {
4373
+ if (!this.registers[name]) {
4374
+ this.registers[name] = true;
4375
+ this.registers.list.push(name);
4376
+ }
4377
+ },
4378
+
4379
+ push: function push(expr) {
4380
+ if (!(expr instanceof Literal)) {
4381
+ expr = this.source.wrap(expr);
4382
+ }
4383
+
4384
+ this.inlineStack.push(expr);
4385
+ return expr;
4386
+ },
4387
+
4388
+ pushStackLiteral: function pushStackLiteral(item) {
4389
+ this.push(new Literal(item));
4390
+ },
4391
+
4392
+ pushSource: function pushSource(source) {
4393
+ if (this.pendingContent) {
4394
+ this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
4395
+ this.pendingContent = undefined;
4396
+ }
4397
+
4398
+ if (source) {
4399
+ this.source.push(source);
4400
+ }
4401
+ },
4402
+
4403
+ replaceStack: function replaceStack(callback) {
4404
+ var prefix = ['('],
4405
+ stack = undefined,
4406
+ createdStack = undefined,
4407
+ usedLiteral = undefined;
4408
+
4409
+ /* istanbul ignore next */
4410
+ if (!this.isInline()) {
4411
+ throw new _exception2['default']('replaceStack on non-inline');
4412
+ }
4413
+
4414
+ // We want to merge the inline statement into the replacement statement via ','
4415
+ var top = this.popStack(true);
4416
+
4417
+ if (top instanceof Literal) {
4418
+ // Literals do not need to be inlined
4419
+ stack = [top.value];
4420
+ prefix = ['(', stack];
4421
+ usedLiteral = true;
4422
+ } else {
4423
+ // Get or create the current stack name for use by the inline
4424
+ createdStack = true;
4425
+ var _name = this.incrStack();
4426
+
4427
+ prefix = ['((', this.push(_name), ' = ', top, ')'];
4428
+ stack = this.topStack();
4429
+ }
4430
+
4431
+ var item = callback.call(this, stack);
4432
+
4433
+ if (!usedLiteral) {
4434
+ this.popStack();
4435
+ }
4436
+ if (createdStack) {
4437
+ this.stackSlot--;
4438
+ }
4439
+ this.push(prefix.concat(item, ')'));
4440
+ },
4441
+
4442
+ incrStack: function incrStack() {
4443
+ this.stackSlot++;
4444
+ if (this.stackSlot > this.stackVars.length) {
4445
+ this.stackVars.push('stack' + this.stackSlot);
4446
+ }
4447
+ return this.topStackName();
4448
+ },
4449
+ topStackName: function topStackName() {
4450
+ return 'stack' + this.stackSlot;
4451
+ },
4452
+ flushInline: function flushInline() {
4453
+ var inlineStack = this.inlineStack;
4454
+ this.inlineStack = [];
4455
+ for (var i = 0, len = inlineStack.length; i < len; i++) {
4456
+ var entry = inlineStack[i];
4457
+ /* istanbul ignore if */
4458
+ if (entry instanceof Literal) {
4459
+ this.compileStack.push(entry);
4460
+ } else {
4461
+ var stack = this.incrStack();
4462
+ this.pushSource([stack, ' = ', entry, ';']);
4463
+ this.compileStack.push(stack);
4464
+ }
4465
+ }
4466
+ },
4467
+ isInline: function isInline() {
4468
+ return this.inlineStack.length;
4469
+ },
4470
+
4471
+ popStack: function popStack(wrapped) {
4472
+ var inline = this.isInline(),
4473
+ item = (inline ? this.inlineStack : this.compileStack).pop();
4474
+
4475
+ if (!wrapped && item instanceof Literal) {
4476
+ return item.value;
4477
+ } else {
4478
+ if (!inline) {
4479
+ /* istanbul ignore next */
4480
+ if (!this.stackSlot) {
4481
+ throw new _exception2['default']('Invalid stack pop');
4482
+ }
4483
+ this.stackSlot--;
4484
+ }
4485
+ return item;
4486
+ }
4487
+ },
4488
+
4489
+ topStack: function topStack() {
4490
+ var stack = this.isInline() ? this.inlineStack : this.compileStack,
4491
+ item = stack[stack.length - 1];
4492
+
4493
+ /* istanbul ignore if */
4494
+ if (item instanceof Literal) {
4495
+ return item.value;
4496
+ } else {
4497
+ return item;
4498
+ }
4499
+ },
4500
+
4501
+ contextName: function contextName(context) {
4502
+ if (this.useDepths && context) {
4503
+ return 'depths[' + context + ']';
4504
+ } else {
4505
+ return 'depth' + context;
4506
+ }
4507
+ },
4508
+
4509
+ quotedString: function quotedString(str) {
4510
+ return this.source.quotedString(str);
4511
+ },
4512
+
4513
+ objectLiteral: function objectLiteral(obj) {
4514
+ return this.source.objectLiteral(obj);
4515
+ },
4516
+
4517
+ aliasable: function aliasable(name) {
4518
+ var ret = this.aliases[name];
4519
+ if (ret) {
4520
+ ret.referenceCount++;
4521
+ return ret;
4522
+ }
4523
+
4524
+ ret = this.aliases[name] = this.source.wrap(name);
4525
+ ret.aliasable = true;
4526
+ ret.referenceCount = 1;
4527
+
4528
+ return ret;
4529
+ },
4530
+
4531
+ setupHelper: function setupHelper(paramSize, name, blockHelper) {
4532
+ var params = [],
4533
+ paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper);
4534
+ var foundHelper = this.nameLookup('helpers', name, 'helper'),
4535
+ callContext = this.aliasable(this.contextName(0) + ' != null ? ' + this.contextName(0) + ' : (container.nullContext || {})');
4536
+
4537
+ return {
4538
+ params: params,
4539
+ paramsInit: paramsInit,
4540
+ name: foundHelper,
4541
+ callParams: [callContext].concat(params)
4542
+ };
4543
+ },
4544
+
4545
+ setupParams: function setupParams(helper, paramSize, params) {
4546
+ var options = {},
4547
+ contexts = [],
4548
+ types = [],
4549
+ ids = [],
4550
+ objectArgs = !params,
4551
+ param = undefined;
4552
+
4553
+ if (objectArgs) {
4554
+ params = [];
4555
+ }
4556
+
4557
+ options.name = this.quotedString(helper);
4558
+ options.hash = this.popStack();
4559
+
4560
+ if (this.trackIds) {
4561
+ options.hashIds = this.popStack();
4562
+ }
4563
+ if (this.stringParams) {
4564
+ options.hashTypes = this.popStack();
4565
+ options.hashContexts = this.popStack();
4566
+ }
4567
+
4568
+ var inverse = this.popStack(),
4569
+ program = this.popStack();
4570
+
4571
+ // Avoid setting fn and inverse if neither are set. This allows
4572
+ // helpers to do a check for `if (options.fn)`
4573
+ if (program || inverse) {
4574
+ options.fn = program || 'container.noop';
4575
+ options.inverse = inverse || 'container.noop';
4576
+ }
4577
+
4578
+ // The parameters go on to the stack in order (making sure that they are evaluated in order)
4579
+ // so we need to pop them off the stack in reverse order
4580
+ var i = paramSize;
4581
+ while (i--) {
4582
+ param = this.popStack();
4583
+ params[i] = param;
4584
+
4585
+ if (this.trackIds) {
4586
+ ids[i] = this.popStack();
4587
+ }
4588
+ if (this.stringParams) {
4589
+ types[i] = this.popStack();
4590
+ contexts[i] = this.popStack();
4591
+ }
4592
+ }
4593
+
4594
+ if (objectArgs) {
4595
+ options.args = this.source.generateArray(params);
4596
+ }
4597
+
4598
+ if (this.trackIds) {
4599
+ options.ids = this.source.generateArray(ids);
4600
+ }
4601
+ if (this.stringParams) {
4602
+ options.types = this.source.generateArray(types);
4603
+ options.contexts = this.source.generateArray(contexts);
4604
+ }
4605
+
4606
+ if (this.options.data) {
4607
+ options.data = 'data';
4608
+ }
4609
+ if (this.useBlockParams) {
4610
+ options.blockParams = 'blockParams';
4611
+ }
4612
+ return options;
4613
+ },
4614
+
4615
+ setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) {
4616
+ var options = this.setupParams(helper, paramSize, params);
4617
+ options = this.objectLiteral(options);
4618
+ if (useRegister) {
4619
+ this.useRegister('options');
4620
+ params.push('options');
4621
+ return ['options=', options];
4622
+ } else if (params) {
4623
+ params.push(options);
4624
+ return '';
4625
+ } else {
4626
+ return options;
4627
+ }
4628
+ }
4629
+ };
4630
+
4631
+ (function () {
4632
+ var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' ');
4633
+
4634
+ var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
4635
+
4636
+ for (var i = 0, l = reservedWords.length; i < l; i++) {
4637
+ compilerWords[reservedWords[i]] = true;
4638
+ }
4639
+ })();
4640
+
4641
+ JavaScriptCompiler.isValidJavaScriptVariableName = function (name) {
4642
+ return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);
4643
+ };
4644
+
4645
+ function strictLookup(requireTerminal, compiler, parts, type) {
4646
+ var stack = compiler.popStack(),
4647
+ i = 0,
4648
+ len = parts.length;
4649
+ if (requireTerminal) {
4650
+ len--;
4651
+ }
4652
+
4653
+ for (; i < len; i++) {
4654
+ stack = compiler.nameLookup(stack, parts[i], type);
4655
+ }
4656
+
4657
+ if (requireTerminal) {
4658
+ return [compiler.aliasable('container.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')'];
4659
+ } else {
4660
+ return stack;
4661
+ }
4662
+ }
4663
+
4664
+ exports['default'] = JavaScriptCompiler;
4665
+ module.exports = exports['default'];
4666
+
4667
+ /***/ }),
4668
+ /* 43 */
4669
+ /***/ (function(module, exports, __webpack_require__) {
4670
+
4671
+ /* global define */
4672
+ 'use strict';
4673
+
4674
+ exports.__esModule = true;
4675
+
4676
+ var _utils = __webpack_require__(5);
4677
+
4678
+ var SourceNode = undefined;
4679
+
4680
+ try {
4681
+ /* istanbul ignore next */
4682
+ if (false) {
4683
+ // We don't support this in AMD environments. For these environments, we asusme that
4684
+ // they are running on the browser and thus have no need for the source-map library.
4685
+ var SourceMap = require('source-map');
4686
+ SourceNode = SourceMap.SourceNode;
4687
+ }
4688
+ } catch (err) {}
4689
+ /* NOP */
4690
+
4691
+ /* istanbul ignore if: tested but not covered in istanbul due to dist build */
4692
+ if (!SourceNode) {
4693
+ SourceNode = function (line, column, srcFile, chunks) {
4694
+ this.src = '';
4695
+ if (chunks) {
4696
+ this.add(chunks);
4697
+ }
4698
+ };
4699
+ /* istanbul ignore next */
4700
+ SourceNode.prototype = {
4701
+ add: function add(chunks) {
4702
+ if (_utils.isArray(chunks)) {
4703
+ chunks = chunks.join('');
4704
+ }
4705
+ this.src += chunks;
4706
+ },
4707
+ prepend: function prepend(chunks) {
4708
+ if (_utils.isArray(chunks)) {
4709
+ chunks = chunks.join('');
4710
+ }
4711
+ this.src = chunks + this.src;
4712
+ },
4713
+ toStringWithSourceMap: function toStringWithSourceMap() {
4714
+ return { code: this.toString() };
4715
+ },
4716
+ toString: function toString() {
4717
+ return this.src;
4718
+ }
4719
+ };
4720
+ }
4721
+
4722
+ function castChunk(chunk, codeGen, loc) {
4723
+ if (_utils.isArray(chunk)) {
4724
+ var ret = [];
4725
+
4726
+ for (var i = 0, len = chunk.length; i < len; i++) {
4727
+ ret.push(codeGen.wrap(chunk[i], loc));
4728
+ }
4729
+ return ret;
4730
+ } else if (typeof chunk === 'boolean' || typeof chunk === 'number') {
4731
+ // Handle primitives that the SourceNode will throw up on
4732
+ return chunk + '';
4733
+ }
4734
+ return chunk;
4735
+ }
4736
+
4737
+ function CodeGen(srcFile) {
4738
+ this.srcFile = srcFile;
4739
+ this.source = [];
4740
+ }
4741
+
4742
+ CodeGen.prototype = {
4743
+ isEmpty: function isEmpty() {
4744
+ return !this.source.length;
4745
+ },
4746
+ prepend: function prepend(source, loc) {
4747
+ this.source.unshift(this.wrap(source, loc));
4748
+ },
4749
+ push: function push(source, loc) {
4750
+ this.source.push(this.wrap(source, loc));
4751
+ },
4752
+
4753
+ merge: function merge() {
4754
+ var source = this.empty();
4755
+ this.each(function (line) {
4756
+ source.add([' ', line, '\n']);
4757
+ });
4758
+ return source;
4759
+ },
4760
+
4761
+ each: function each(iter) {
4762
+ for (var i = 0, len = this.source.length; i < len; i++) {
4763
+ iter(this.source[i]);
4764
+ }
4765
+ },
4766
+
4767
+ empty: function empty() {
4768
+ var loc = this.currentLocation || { start: {} };
4769
+ return new SourceNode(loc.start.line, loc.start.column, this.srcFile);
4770
+ },
4771
+ wrap: function wrap(chunk) {
4772
+ var loc = arguments.length <= 1 || arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1];
4773
+
4774
+ if (chunk instanceof SourceNode) {
4775
+ return chunk;
4776
+ }
4777
+
4778
+ chunk = castChunk(chunk, this, loc);
4779
+
4780
+ return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk);
4781
+ },
4782
+
4783
+ functionCall: function functionCall(fn, type, params) {
4784
+ params = this.generateList(params);
4785
+ return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']);
4786
+ },
4787
+
4788
+ quotedString: function quotedString(str) {
4789
+ return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4
4790
+ .replace(/\u2029/g, '\\u2029') + '"';
4791
+ },
4792
+
4793
+ objectLiteral: function objectLiteral(obj) {
4794
+ var pairs = [];
4795
+
4796
+ for (var key in obj) {
4797
+ if (obj.hasOwnProperty(key)) {
4798
+ var value = castChunk(obj[key], this);
4799
+ if (value !== 'undefined') {
4800
+ pairs.push([this.quotedString(key), ':', value]);
4801
+ }
4802
+ }
4803
+ }
4804
+
4805
+ var ret = this.generateList(pairs);
4806
+ ret.prepend('{');
4807
+ ret.add('}');
4808
+ return ret;
4809
+ },
4810
+
4811
+ generateList: function generateList(entries) {
4812
+ var ret = this.empty();
4813
+
4814
+ for (var i = 0, len = entries.length; i < len; i++) {
4815
+ if (i) {
4816
+ ret.add(',');
4817
+ }
4818
+
4819
+ ret.add(castChunk(entries[i], this));
4820
+ }
4821
+
4822
+ return ret;
4823
+ },
4824
+
4825
+ generateArray: function generateArray(entries) {
4826
+ var ret = this.generateList(entries);
4827
+ ret.prepend('[');
4828
+ ret.add(']');
4829
+
4830
+ return ret;
4831
+ }
4832
+ };
4833
+
4834
+ exports['default'] = CodeGen;
4835
+ module.exports = exports['default'];
4836
+
4837
+ /***/ })
4838
+ /******/ ])
4839
+ });
4840
+ ;
includes/handlebars/handlebars.min.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**!
2
+
3
+ @license
4
+ handlebars v4.0.10
5
+
6
+ Copyright (C) 2011-2016 by Yehuda Katz
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in
16
+ all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ THE SOFTWARE.
25
+
26
+ */
27
+ !function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=r();return a.compile=function(b,c){return k.compile(b,c,a)},a.precompile=function(b,c){return k.precompile(b,c,a)},a.AST=i["default"],a.Compiler=k.Compiler,a.JavaScriptCompiler=m["default"],a.Parser=j.parser,a.parse=j.parse,a}var e=c(1)["default"];b.__esModule=!0;var f=c(2),g=e(f),h=c(35),i=e(h),j=c(36),k=c(41),l=c(42),m=e(l),n=c(39),o=e(n),p=c(34),q=e(p),r=g["default"].create,s=d();s.create=d,q["default"](s),s.Visitor=o["default"],s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(3)["default"],f=c(1)["default"];b.__esModule=!0;var g=c(4),h=e(g),i=c(21),j=f(i),k=c(6),l=f(k),m=c(5),n=e(m),o=c(22),p=e(o),q=c(34),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(1)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(5),g=c(6),h=e(g),i=c(10),j=c(18),k=c(20),l=e(k),m="4.0.10";b.VERSION=m;var n=7;b.COMPILER_REVISION=n;var o={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0;c&&(g=c.start.line,h=c.start.column,a+=" - "+g+":"+h);for(var i=Error.prototype.constructor.call(this,a),j=0;j<f.length;j++)this[f[j]]=i[f[j]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,e?Object.defineProperty(this,"column",{value:h,enumerable:!0}):this.column=h)}catch(k){}}var e=c(7)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","message","name","number","stack"];d.prototype=new Error,b["default"]=d,a.exports=b["default"]},function(a,b,c){a.exports={"default":c(8),__esModule:!0}},function(a,b,c){var d=c(9);a.exports=function(a,b,c){return d.setDesc(a,b,c)}},function(a,b){var c=Object;a.exports={create:c.create,getProto:c.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:c.getOwnPropertyDescriptor,setDesc:c.defineProperty,setDescs:c.defineProperties,getKeys:c.keys,getNames:c.getOwnPropertyNames,getSymbols:c.getOwnPropertySymbols,each:[].forEach}},function(a,b,c){"use strict";function d(a){g["default"](a),i["default"](a),k["default"](a),m["default"](a),o["default"](a),q["default"](a),s["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultHelpers=d;var f=c(11),g=e(f),h=c(12),i=e(h),j=c(13),k=e(j),l=c(14),m=e(l),n=c(15),o=e(n),p=c(16),q=e(p),r=c(17),s=e(r)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("blockHelperMissing",function(b,c){var e=c.inverse,f=c.fn;if(b===!0)return f(this);if(b===!1||null==b)return e(this);if(d.isArray(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;h<l;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(6),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d<arguments.length-1;d++)b.push(arguments[d]);var e=1;null!=c.hash.level?e=c.hash.level:c.data&&null!=c.data.level&&(e=c.data.level),b[0]=e,a.log.apply(a,b)})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("lookup",function(a,b){return a&&a[b]})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("with",function(a,b){d.isFunction(a)&&(a=a.call(this));var c=b.fn;if(d.isEmpty(a))return b.inverse(this);var e=b.data;return b.data&&b.ids&&(e=d.createFrame(b.data),e.contextPath=d.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:e,blockParams:d.blockParams([a],[e&&e.contextPath])})})},a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultDecorators=d;var f=c(19),g=e(f)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerDecorator("inline",function(a,b,c,e){var f=a;return b.partials||(b.partials={},f=function(e,f){var g=c.partials;c.partials=d.extend({},g,b.partials);var h=a(e,f);return c.partials=g,h}),b.partials[e.args[0]]=e.fn,f})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5),e={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(a){if("string"==typeof a){var b=d.indexOf(e.methodMap,a.toLowerCase());a=b>=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f<c;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=s.COMPILER_REVISION;if(b!==c){if(b<c){var d=s.REVISION_CHANGES[c],e=s.REVISION_CHANGES[b];throw new r["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new r["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=p.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;h<i&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new r["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!=f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new r["default"]("No environment passed to template");if(!a||!a.main)throw new r["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new r["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:p.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=p.extend({},b,a)),c},nullContext:l({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new r["default"]("must pass block params");if(a.useDepths&&!g)throw new r["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return!g||b==g[0]||b===a.nullContext&&null===g[0]||(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){var d=c.data&&c.data["partial-block"];c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var e=void 0;if(c.fn&&c.fn!==i&&!function(){c.data=s.createFrame(c.data);var a=c.fn;e=c.data["partial-block"]=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return c.data=s.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=p.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new r["default"]("The partial "+c.name+" could not be found");if(a instanceof Function)return a(b,c)}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?s.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),p.extend(b,g)}return b}var l=c(23)["default"],m=c(3)["default"],n=c(1)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var o=c(5),p=m(o),q=c(6),r=n(q),s=c(4)},function(a,b,c){a.exports={"default":c(24),__esModule:!0}},function(a,b,c){c(25),a.exports=c(30).Object.seal},function(a,b,c){var d=c(26);c(27)("seal",function(a){return function(b){return a&&d(b)?a(b):b}})},function(a,b){a.exports=function(a){return"object"==typeof a?null!==a:"function"==typeof a}},function(a,b,c){var d=c(28),e=c(30),f=c(33);a.exports=function(a,b){var c=(e.Object||{})[a]||Object[a],g={};g[a]=b(c),d(d.S+d.F*f(function(){c(1)}),"Object",g)}},function(a,b,c){var d=c(29),e=c(30),f=c(31),g="prototype",h=function(a,b,c){var i,j,k,l=a&h.F,m=a&h.G,n=a&h.S,o=a&h.P,p=a&h.B,q=a&h.W,r=m?e:e[b]||(e[b]={}),s=m?d:n?d[b]:(d[b]||{})[g];m&&(c=b);for(i in c)j=!l&&s&&i in s,j&&i in r||(k=j?s[i]:c[i],r[i]=m&&"function"!=typeof s[i]?c[i]:p&&j?f(k,d):q&&s[i]==k?function(a){var b=function(b){return this instanceof a?new a(b):a(b)};return b[g]=a[g],b}(k):o&&"function"==typeof k?f(Function.call,k):k,o&&((r[g]||(r[g]={}))[i]=k))};h.F=1,h.G=2,h.S=4,h.P=8,h.B=16,h.W=32,a.exports=h},function(a,b){var c=a.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=c)},function(a,b){var c=a.exports={version:"1.2.6"};"number"==typeof __e&&(__e=c)},function(a,b,c){var d=c(32);a.exports=function(a,b,c){if(d(a),void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)}}return function(){return a.apply(b,arguments)}}},function(a,b){a.exports=function(a){if("function"!=typeof a)throw TypeError(a+" is not a function!");return a}},function(a,b){a.exports=function(a){try{return!!a()}catch(b){return!0}}},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b.__esModule=!0;var c={helpers:{helperExpression:function(a){return"SubExpression"===a.type||("MustacheStatement"===a.type||"BlockStatement"===a.type)&&!!(a.params&&a.params.length||a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;h["default"].yy=n,n.locInfo=function(a){return new n.SourceLocation(b&&b.srcName,a)};var c=new j["default"](b);return c.accept(h["default"].parse(a))}var e=c(1)["default"],f=c(3)["default"];b.__esModule=!0,b.parse=d;var g=c(37),h=e(g),i=c(38),j=e(i),k=c(40),l=f(k),m=c(5);b.parser=h["default"];var n={};m.extend(n,l)},function(a,b){"use strict";b.__esModule=!0;var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition_plus0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",14:"COMMENT",15:"CONTENT",18:"END_RAW_BLOCK",19:"OPEN_RAW_BLOCK",23:"CLOSE_RAW_BLOCK",29:"OPEN_BLOCK",33:"CLOSE",34:"OPEN_INVERSE",39:"OPEN_INVERSE_CHAIN",44:"INVERSE",47:"OPEN_ENDBLOCK",48:"OPEN",51:"OPEN_UNESCAPED",54:"CLOSE_UNESCAPED",55:"OPEN_PARTIAL",60:"OPEN_PARTIAL_BLOCK",65:"OPEN_SEXPR",68:"CLOSE_SEXPR",72:"ID",73:"EQUALS",75:"OPEN_BLOCK_PARAMS",77:"CLOSE_BLOCK_PARAMS",80:"STRING",81:"NUMBER",82:"BOOLEAN",83:"UNDEFINED",84:"NULL",85:"DATA",87:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,1],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return f[h-1];case 2:this.$=d.prepareProgram(f[h]);break;case 3:this.$=f[h];break;case 4:this.$=f[h];break;case 5:this.$=f[h];break;case 6:this.$=f[h];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$={type:"CommentStatement",value:d.stripComment(f[h]),strip:d.stripFlags(f[h],f[h]),loc:d.locInfo(this._$)};break;case 10:this.$={type:"ContentStatement",original:f[h],value:f[h],loc:d.locInfo(this._$)};break;case 11:this.$=d.prepareRawBlock(f[h-2],f[h-1],f[h],this._$);break;case 12:this.$={path:f[h-3],params:f[h-2],hash:f[h-1]};break;case 13:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!1,this._$);break;case 14:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!0,this._$);break;case 15:this.$={open:f[h-5],path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 16:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 17:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 18:this.$={strip:d.stripFlags(f[h-1],f[h-1]),program:f[h]};break;case 19:var i=d.prepareBlock(f[h-2],f[h-1],f[h],f[h],!1,this._$),j=d.prepareProgram([i],f[h-1].loc);j.chained=!0,this.$={strip:f[h-2].strip,program:j,chain:!0};break;case 20:this.$=f[h];break;case 21:this.$={path:f[h-1],strip:d.stripFlags(f[h-2],f[h])};break;case 22:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 23:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 24:this.$={type:"PartialStatement",name:f[h-3],params:f[h-2],hash:f[h-1],indent:"",strip:d.stripFlags(f[h-4],f[h]),loc:d.locInfo(this._$)};break;case 25:this.$=d.preparePartialBlock(f[h-2],f[h-1],f[h],this._$);break;case 26:this.$={path:f[h-3],params:f[h-2],hash:f[h-1],strip:d.stripFlags(f[h-4],f[h])};break;case 27:this.$=f[h];break;case 28:this.$=f[h];break;case 29:this.$={type:"SubExpression",path:f[h-3],params:f[h-2],hash:f[h-1],loc:d.locInfo(this._$)};break;case 30:this.$={type:"Hash",pairs:f[h],loc:d.locInfo(this._$)};break;case 31:this.$={type:"HashPair",key:d.id(f[h-2]),value:f[h],loc:d.locInfo(this._$)};break;case 32:this.$=d.id(f[h-1]);break;case 33:this.$=f[h];break;case 34:this.$=f[h];break;case 35:this.$={type:"StringLiteral",value:f[h],original:f[h],loc:d.locInfo(this._$)};break;case 36:this.$={type:"NumberLiteral",value:Number(f[h]),original:Number(f[h]),loc:d.locInfo(this._$)};break;case 37:this.$={type:"BooleanLiteral",value:"true"===f[h],original:"true"===f[h],loc:d.locInfo(this._$)};break;case 38:this.$={type:"UndefinedLiteral",original:void 0,value:void 0,loc:d.locInfo(this._$)};break;case 39:this.$={type:"NullLiteral",original:null,value:null,loc:d.locInfo(this._$)};break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=d.preparePath(!0,f[h],this._$);break;case 43:this.$=d.preparePath(!1,f[h],this._$);break;case 44:f[h-2].push({part:d.id(f[h]),original:f[h],separator:f[h-1]}),this.$=f[h-2];break;case 45:this.$=[{part:d.id(f[h]),original:f[h]}];break;case 46:this.$=[];break;case 47:f[h-1].push(f[h]);break;case 48:this.$=[f[h]];break;case 49:f[h-1].push(f[h]);break;case 50:this.$=[];break;case 51:f[h-1].push(f[h]);break;case 58:this.$=[];break;case 59:f[h-1].push(f[h]);break;case 64:this.$=[];break;case 65:f[h-1].push(f[h]);break;case 70:this.$=[];break;case 71:f[h-1].push(f[h]);break;case 78:this.$=[];break;case 79:f[h-1].push(f[h]);break;case 82:this.$=[];break;case 83:f[h-1].push(f[h]);break;case 86:this.$=[];break;case 87:f[h-1].push(f[h]);break;case 90:this.$=[];break;case 91:f[h-1].push(f[h]);break;case 94:this.$=[];break;case 95:f[h-1].push(f[h]);break;case 98:this.$=[f[h]];break;case 99:f[h-1].push(f[h]);break;case 100:this.$=[f[h]];break;case 101:f[h-1].push(f[h])}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{13:40,15:[1,20],17:39},{20:42,56:41,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:45,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:48,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:42,56:49,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:50,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,51]},{72:[1,35],86:52},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:53,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:54,38:56,39:[1,58],43:57,44:[1,59],45:55,47:[2,54]},{28:60,43:61,44:[1,59],47:[2,56]},{13:63,15:[1,20],18:[1,62]},{15:[2,48],18:[2,48]},{33:[2,86],57:64,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:65,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:66,47:[1,67]},{30:68,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:69,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:70,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:71,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:75,33:[2,80],50:72,63:73,64:76,65:[1,44],69:74,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,80]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,51]},{20:75,53:81,54:[2,84],63:82,64:76,65:[1,44],69:83,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:84,47:[1,67]},{47:[2,55]},{4:85,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:86,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:87,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:88,47:[1,67]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:75,33:[2,88],58:89,63:90,64:76,65:[1,44],69:91,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:92,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:93,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,31:94,33:[2,60],63:95,64:76,65:[1,44],69:96,70:77,71:78,72:[1,79],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,66],36:97,63:98,64:76,65:[1,44],69:99,70:77,71:78,72:[1,79],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,22:100,23:[2,52],63:101,64:76,65:[1,44],69:102,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,92],62:103,63:104,64:76,65:[1,44],69:105,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,106]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:107,72:[1,108],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,109],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,110]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:56,39:[1,58],43:57,44:[1,59],45:112,46:111,47:[2,76]},{33:[2,70],40:113,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,114]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],
28
+ 85:[2,87]},{33:[2,89]},{20:75,63:116,64:76,65:[1,44],67:115,68:[2,96],69:117,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,118]},{32:119,33:[2,62],74:120,75:[1,121]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:122,74:123,75:[1,121]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,124]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,125]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,109]},{20:75,63:126,64:76,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:75,33:[2,72],41:127,63:128,64:76,65:[1,44],69:129,70:77,71:78,72:[1,79],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,130]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,131]},{33:[2,63]},{72:[1,133],76:132},{33:[1,134]},{33:[2,69]},{15:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:135,74:136,75:[1,121]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,138],77:[1,137]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16],44:[2,16],47:[2,16],48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,139]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],55:[2,55],57:[2,20],61:[2,57],74:[2,81],83:[2,85],87:[2,18],91:[2,89],102:[2,53],105:[2,93],111:[2,19],112:[2,77],117:[2,97],120:[2,63],123:[2,69],124:[2,12],136:[2,75],137:[2,32]},parseError:function(a,b){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:(null!==n&&"undefined"!=typeof n||(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;g<f.length&&(c=this._input.match(this.rules[f[g]]),!c||b&&!(c[0].length>b[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin("raw"),15;case 4:return this.popState(),"raw"===this.conditionStack[this.conditionStack.length-1]?15:(b.yytext=b.yytext.substr(5,b.yyleng-9),"END_RAW_BLOCK");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin("raw"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(b.yytext),this.popState(),this.begin("com");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return b.yytext=e(1,2).replace(/\\"/g,'"'),80;case 32:return b.yytext=e(1,2).replace(/\\'/g,"'"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return b.yytext=b.yytext.replace(/\\([\\\]])/g,"$1"),72;case 43:return"INVALID";case 44:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{(?=[^\/]))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#>)/,/^(?:\{\{(~)?#\*?)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?\*?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[(\\\]|[^\]])*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(1)["default"];b.__esModule=!0;var j=c(39),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.options.ignoreStandalone,c=!this.isRootSeen;this.isRootSeen=!0;for(var d=a.body,i=0,j=d.length;i<j;i++){var k=d[i],l=this.accept(k);if(l){var m=e(d,i,c),n=f(d,i,c),o=l.openStandalone&&m,p=l.closeStandalone&&n,q=l.inlineStandalone&&m&&n;l.close&&g(d,i,!0),l.open&&h(d,i,!0),b&&q&&(g(d,i),h(d,i)&&"PartialStatement"===k.type&&(k.indent=/([ \t]+$)/.exec(d[i-1].original)[1])),b&&o&&(g((k.program||k.inverse).body),h(d,i)),b&&p&&(g(d,i),h((k.inverse||k.program).body))}}return a},d.prototype.BlockStatement=d.prototype.DecoratorBlock=d.prototype.PartialBlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),!this.options.ignoreStandalone&&e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.Decorator=d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}function e(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")}function f(a){e.call(this,a),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")}function g(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")}var h=c(1)["default"];b.__esModule=!0;var i=c(6),j=h(i);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&!d.prototype[c.type])throw new j["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new j["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;b<c;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){if(!this[a.type])throw new j["default"]("Unknown type: "+a.type,a);this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:e,Decorator:e,BlockStatement:f,DecoratorBlock:f,PartialStatement:g,PartialBlockStatement:function(a){g.call(this,a),this.acceptKey(a,"program")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:e,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if(b=b.path?b.path.original:b,a.path.original!==b){var c={loc:a.path.loc};throw new q["default"](a.path.original+" doesn't match "+b,c)}}function e(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function f(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function g(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function h(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function i(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;h<i;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return{type:"PathExpression",data:a,depth:f,parts:e,original:d,loc:c}}function j(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g,i=/\*/.test(d);return{type:i?"Decorator":"MustacheStatement",path:a,params:b,hash:c,escaped:h,strip:e,loc:this.locInfo(f)}}function k(a,b,c,e){d(a,c),e=this.locInfo(e);var f={type:"Program",body:b,strip:{},loc:e};return{type:"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:f,openStrip:{},inverseStrip:{},closeStrip:{},loc:e}}function l(a,b,c,e,f,g){e&&e.path&&d(a,e);var h=/\*/.test(a.open);b.blockParams=a.blockParams;var i=void 0,j=void 0;if(c){if(h)throw new q["default"]("Unexpected inverse block on decorator",c);c.chain&&(c.program.body[0].closeStrip=e.strip),j=c.strip,i=c.program}return f&&(f=i,i=b,b=f),{type:h?"DecoratorBlock":"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:b,inverse:i,openStrip:a.strip,inverseStrip:j,closeStrip:e&&e.strip,loc:this.locInfo(g)}}function m(a,b){if(!b&&a.length){var c=a[0].loc,d=a[a.length-1].loc;c&&d&&(b={source:c.source,start:{line:c.start.line,column:c.start.column},end:{line:d.end.line,column:d.end.column}})}return{type:"Program",body:a,strip:{},loc:b}}function n(a,b,c,e){return d(a,c),{type:"PartialBlockStatement",name:a.path,params:a.params,hash:a.hash,program:b,openStrip:a.strip,closeStrip:c&&c.strip,loc:this.locInfo(e)}}var o=c(1)["default"];b.__esModule=!0,b.SourceLocation=e,b.id=f,b.stripFlags=g,b.stripComment=h,b.preparePath=i,b.prepareMustache=j,b.prepareRawBlock=k,b.prepareBlock=l,b.prepareProgram=m,b.preparePartialBlock=n;var p=c(6),q=o(p)},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var d=c.parse(a,b),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}function e(a,b){return f||(f=d()),f.call(this,a,b)}if(void 0===b&&(b={}),null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=l.extend({},b),"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var f=void 0;return e._setup=function(a){return f||(f=d()),f._setup(a)},e._child=function(a,b,c,e){return f||(f=d()),f._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;c<a.length;c++)if(!g(a[c],b[c]))return!1;return!0}}function h(a){if(!a.path.parts){var b=a.path;a.path={type:"PathExpression",data:!1,depth:0,parts:[b.original+""],original:b.original+"",loc:b.loc}}}var i=c(1)["default"];b.__esModule=!0,b.Compiler=d,b.precompile=e,b.compile=f;var j=c(6),k=i(j),l=c(5),m=c(35),n=i(m),o=[].slice;d.prototype={compiler:d,equals:function(a){var b=this.opcodes.length;if(a.opcodes.length!==b)return!1;for(var c=0;c<b;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;c<b;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(this.options.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){if(!this[a.type])throw new k["default"]("Unknown type: "+a.type,a);this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;d<c;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},DecoratorBlock:function(a){var b=a.program&&this.compileProgram(a.program),c=this.setupFullMustacheParams(a,b,void 0),d=a.path;this.useDecorators=!0,this.opcode("registerDecorator",c.length,d.original)},PartialStatement:function(a){this.usePartial=!0;var b=a.program;b&&(b=this.compileProgram(a.program));var c=a.params;if(c.length>1)throw new k["default"]("Unsupported number of partial arguments: "+c.length,a);c.length||(this.options.explicitPartialContext?this.opcode("pushLiteral","undefined"):c.push({type:"PathExpression",parts:[],depth:0}));var d=a.name.original,e="SubExpression"===a.name.type;e&&this.accept(a.name),this.setupFullMustacheParams(a,b,void 0,!0);var f=a.indent||"";this.options.preventIndent&&f&&(this.opcode("appendContent",f),f=""),this.opcode("invokePartial",e,d,f),this.opcode("append")},PartialBlockStatement:function(a){this.PartialStatement(a)},MustacheStatement:function(a){this.SubExpression(a),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},Decorator:function(a){this.DecoratorBlock(a)},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),d.strict=!0,this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.path;b.strict=!0,this.accept(b),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.strict=!0,e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts,a.strict)):this.opcode("lookupOnContext",a.parts,a.falsy,a.strict,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");c<d;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;b<c;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^this(?:\.|$)/,"").replace(/^\.\//,"").replace(/^\.$/,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;b<c;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;f<g;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("container.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(1)["default"];b.__esModule=!0;var h=c(4),i=c(6),j=g(i),k=c(5),l=c(43),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"[",JSON.stringify(b),"]"]},depthedLookup:function(a){return[this.aliasable("container.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||a.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;h<i;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend("var decorators = container.decorators;\n"),this.decorators.push("return fn;"),d?this.decorators=Function.apply(this,["fn","props","container","depth0","data","blockParams","depths",this.decorators.merge()]):(this.decorators.prepend("function(fn, props, container, depth0, data, blockParams, depths) {\n"),this.decorators.push("}\n"),this.decorators=this.decorators.merge()));var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k};this.decorators&&(l.main_d=this.decorators,l.useDecorators=!0);var m=this.context,n=m.programs,o=m.decorators;for(h=0,i=n.length;h<i;h++)n[h]&&(l[h]=n[h],o[h]&&(l[h+"_d"]=o[h],l.useDecorators=!0));return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName),this.decorators=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("container.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c,d){var e=0;d||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[e++])),this.resolvePath("context",a,e,b,c)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b,c){a?this.pushStackLiteral("container.data(data, "+a+")"):this.pushStackLiteral("data"),this.resolvePath("data",b,0,!0,c)},resolvePath:function(a,b,c,d,e){var g=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict&&e,this,b,a));for(var h=b.length;c<h;c++)this.replaceStack(function(e){
29
+ var f=g.nameLookup(e,b[c],a);return d?[" && ",f]:[" != null ? ",f," : ",e]})},resolvePossibleLambda:function(){this.push([this.aliasable("container.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},registerDecorator:function(a,b){var c=this.nameLookup("decorators",b,"decorator"),d=this.setupHelperArgs(b,a);this.decorators.push(["fn = ",this.decorators.functionCall(c,"",["fn","props","container",d])," || fn;"])},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",e.decorators="container.decorators",a?d.unshift(b):d.unshift(this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("container.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):"SubExpression"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;f<g;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);if(null==h){this.context.programs.push("");var i=this.context.programs.length;d.index=i,d.name="program"+i,this.context.programs[i]=e.compile(d,b,this.context,!this.precompile),this.context.decorators[i]=e.decorators,this.context.environments[i]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams,d.useDepths=this.useDepths,d.useBlockParams=this.useBlockParams}else d.index=h.index,d.name="program"+h.index,this.useDepths=this.useDepths||h.useDepths,this.useBlockParams=this.useBlockParams||h.useBlockParams}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;b<c;b++){var d=this.context.environments[b];if(d&&d.equals(a))return d}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"container.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;b<c;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper"),g=this.aliasable(this.contextName(0)+" != null ? "+this.contextName(0)+" : (container.nullContext || {})");return{params:d,paramsInit:e,name:f,callParams:[g].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=!c,i=void 0;h&&(c=[]),d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var j=this.popStack(),k=this.popStack();(k||j)&&(d.fn=k||"container.noop",d.inverse=j||"container.noop");for(var l=b;l--;)i=this.popStack(),c[l]=i,this.trackIds&&(g[l]=this.popStack()),this.stringParams&&(f[l]=this.popStack(),e[l]=this.popStack());return h&&(d.args=this.source.generateArray(c)),this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):c?(c.push(e),""):e}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;c<d;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;e<g;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(5),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={isEmpty:function(){return!this.source.length},prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;b<c;b++)a(this.source[b])},empty:function(){var a=this.currentLocation||{start:{}};return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a){for(var b=this.empty(),c=0,e=a.length;c<e;c++)c&&b.add(","),b.add(d(a[c],this));return b},generateArray:function(a){var b=this.generateList(a);return b.prepend("["),b.add("]"),b}},b["default"]=e,a.exports=b["default"]}])});
includes/handlebars/handlebars.runtime.js ADDED
@@ -0,0 +1,1468 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**!
2
+
3
+ @license
4
+ handlebars v4.0.10
5
+
6
+ Copyright (C) 2011-2016 by Yehuda Katz
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in
16
+ all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ THE SOFTWARE.
25
+
26
+ */
27
+ (function webpackUniversalModuleDefinition(root, factory) {
28
+ if(typeof exports === 'object' && typeof module === 'object')
29
+ module.exports = factory();
30
+ else if(typeof define === 'function' && define.amd)
31
+ define([], factory);
32
+ else if(typeof exports === 'object')
33
+ exports["Handlebars"] = factory();
34
+ else
35
+ root["Handlebars"] = factory();
36
+ })(this, function() {
37
+ return /******/ (function(modules) { // webpackBootstrap
38
+ /******/ // The module cache
39
+ /******/ var installedModules = {};
40
+
41
+ /******/ // The require function
42
+ /******/ function __webpack_require__(moduleId) {
43
+
44
+ /******/ // Check if module is in cache
45
+ /******/ if(installedModules[moduleId])
46
+ /******/ return installedModules[moduleId].exports;
47
+
48
+ /******/ // Create a new module (and put it into the cache)
49
+ /******/ var module = installedModules[moduleId] = {
50
+ /******/ exports: {},
51
+ /******/ id: moduleId,
52
+ /******/ loaded: false
53
+ /******/ };
54
+
55
+ /******/ // Execute the module function
56
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
57
+
58
+ /******/ // Flag the module as loaded
59
+ /******/ module.loaded = true;
60
+
61
+ /******/ // Return the exports of the module
62
+ /******/ return module.exports;
63
+ /******/ }
64
+
65
+
66
+ /******/ // expose the modules object (__webpack_modules__)
67
+ /******/ __webpack_require__.m = modules;
68
+
69
+ /******/ // expose the module cache
70
+ /******/ __webpack_require__.c = installedModules;
71
+
72
+ /******/ // __webpack_public_path__
73
+ /******/ __webpack_require__.p = "";
74
+
75
+ /******/ // Load entry module and return exports
76
+ /******/ return __webpack_require__(0);
77
+ /******/ })
78
+ /************************************************************************/
79
+ /******/ ([
80
+ /* 0 */
81
+ /***/ (function(module, exports, __webpack_require__) {
82
+
83
+ 'use strict';
84
+
85
+ var _interopRequireWildcard = __webpack_require__(1)['default'];
86
+
87
+ var _interopRequireDefault = __webpack_require__(2)['default'];
88
+
89
+ exports.__esModule = true;
90
+
91
+ var _handlebarsBase = __webpack_require__(3);
92
+
93
+ var base = _interopRequireWildcard(_handlebarsBase);
94
+
95
+ // Each of these augment the Handlebars object. No need to setup here.
96
+ // (This is done to easily share code between commonjs and browse envs)
97
+
98
+ var _handlebarsSafeString = __webpack_require__(20);
99
+
100
+ var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);
101
+
102
+ var _handlebarsException = __webpack_require__(5);
103
+
104
+ var _handlebarsException2 = _interopRequireDefault(_handlebarsException);
105
+
106
+ var _handlebarsUtils = __webpack_require__(4);
107
+
108
+ var Utils = _interopRequireWildcard(_handlebarsUtils);
109
+
110
+ var _handlebarsRuntime = __webpack_require__(21);
111
+
112
+ var runtime = _interopRequireWildcard(_handlebarsRuntime);
113
+
114
+ var _handlebarsNoConflict = __webpack_require__(33);
115
+
116
+ var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
117
+
118
+ // For compatibility and usage outside of module systems, make the Handlebars object a namespace
119
+ function create() {
120
+ var hb = new base.HandlebarsEnvironment();
121
+
122
+ Utils.extend(hb, base);
123
+ hb.SafeString = _handlebarsSafeString2['default'];
124
+ hb.Exception = _handlebarsException2['default'];
125
+ hb.Utils = Utils;
126
+ hb.escapeExpression = Utils.escapeExpression;
127
+
128
+ hb.VM = runtime;
129
+ hb.template = function (spec) {
130
+ return runtime.template(spec, hb);
131
+ };
132
+
133
+ return hb;
134
+ }
135
+
136
+ var inst = create();
137
+ inst.create = create;
138
+
139
+ _handlebarsNoConflict2['default'](inst);
140
+
141
+ inst['default'] = inst;
142
+
143
+ exports['default'] = inst;
144
+ module.exports = exports['default'];
145
+
146
+ /***/ }),
147
+ /* 1 */
148
+ /***/ (function(module, exports) {
149
+
150
+ "use strict";
151
+
152
+ exports["default"] = function (obj) {
153
+ if (obj && obj.__esModule) {
154
+ return obj;
155
+ } else {
156
+ var newObj = {};
157
+
158
+ if (obj != null) {
159
+ for (var key in obj) {
160
+ if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
161
+ }
162
+ }
163
+
164
+ newObj["default"] = obj;
165
+ return newObj;
166
+ }
167
+ };
168
+
169
+ exports.__esModule = true;
170
+
171
+ /***/ }),
172
+ /* 2 */
173
+ /***/ (function(module, exports) {
174
+
175
+ "use strict";
176
+
177
+ exports["default"] = function (obj) {
178
+ return obj && obj.__esModule ? obj : {
179
+ "default": obj
180
+ };
181
+ };
182
+
183
+ exports.__esModule = true;
184
+
185
+ /***/ }),
186
+ /* 3 */
187
+ /***/ (function(module, exports, __webpack_require__) {
188
+
189
+ 'use strict';
190
+
191
+ var _interopRequireDefault = __webpack_require__(2)['default'];
192
+
193
+ exports.__esModule = true;
194
+ exports.HandlebarsEnvironment = HandlebarsEnvironment;
195
+
196
+ var _utils = __webpack_require__(4);
197
+
198
+ var _exception = __webpack_require__(5);
199
+
200
+ var _exception2 = _interopRequireDefault(_exception);
201
+
202
+ var _helpers = __webpack_require__(9);
203
+
204
+ var _decorators = __webpack_require__(17);
205
+
206
+ var _logger = __webpack_require__(19);
207
+
208
+ var _logger2 = _interopRequireDefault(_logger);
209
+
210
+ var VERSION = '4.0.10';
211
+ exports.VERSION = VERSION;
212
+ var COMPILER_REVISION = 7;
213
+
214
+ exports.COMPILER_REVISION = COMPILER_REVISION;
215
+ var REVISION_CHANGES = {
216
+ 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
217
+ 2: '== 1.0.0-rc.3',
218
+ 3: '== 1.0.0-rc.4',
219
+ 4: '== 1.x.x',
220
+ 5: '== 2.0.0-alpha.x',
221
+ 6: '>= 2.0.0-beta.1',
222
+ 7: '>= 4.0.0'
223
+ };
224
+
225
+ exports.REVISION_CHANGES = REVISION_CHANGES;
226
+ var objectType = '[object Object]';
227
+
228
+ function HandlebarsEnvironment(helpers, partials, decorators) {
229
+ this.helpers = helpers || {};
230
+ this.partials = partials || {};
231
+ this.decorators = decorators || {};
232
+
233
+ _helpers.registerDefaultHelpers(this);
234
+ _decorators.registerDefaultDecorators(this);
235
+ }
236
+
237
+ HandlebarsEnvironment.prototype = {
238
+ constructor: HandlebarsEnvironment,
239
+
240
+ logger: _logger2['default'],
241
+ log: _logger2['default'].log,
242
+
243
+ registerHelper: function registerHelper(name, fn) {
244
+ if (_utils.toString.call(name) === objectType) {
245
+ if (fn) {
246
+ throw new _exception2['default']('Arg not supported with multiple helpers');
247
+ }
248
+ _utils.extend(this.helpers, name);
249
+ } else {
250
+ this.helpers[name] = fn;
251
+ }
252
+ },
253
+ unregisterHelper: function unregisterHelper(name) {
254
+ delete this.helpers[name];
255
+ },
256
+
257
+ registerPartial: function registerPartial(name, partial) {
258
+ if (_utils.toString.call(name) === objectType) {
259
+ _utils.extend(this.partials, name);
260
+ } else {
261
+ if (typeof partial === 'undefined') {
262
+ throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined');
263
+ }
264
+ this.partials[name] = partial;
265
+ }
266
+ },
267
+ unregisterPartial: function unregisterPartial(name) {
268
+ delete this.partials[name];
269
+ },
270
+
271
+ registerDecorator: function registerDecorator(name, fn) {
272
+ if (_utils.toString.call(name) === objectType) {
273
+ if (fn) {
274
+ throw new _exception2['default']('Arg not supported with multiple decorators');
275
+ }
276
+ _utils.extend(this.decorators, name);
277
+ } else {
278
+ this.decorators[name] = fn;
279
+ }
280
+ },
281
+ unregisterDecorator: function unregisterDecorator(name) {
282
+ delete this.decorators[name];
283
+ }
284
+ };
285
+
286
+ var log = _logger2['default'].log;
287
+
288
+ exports.log = log;
289
+ exports.createFrame = _utils.createFrame;
290
+ exports.logger = _logger2['default'];
291
+
292
+ /***/ }),
293
+ /* 4 */
294
+ /***/ (function(module, exports) {
295
+
296
+ 'use strict';
297
+
298
+ exports.__esModule = true;
299
+ exports.extend = extend;
300
+ exports.indexOf = indexOf;
301
+ exports.escapeExpression = escapeExpression;
302
+ exports.isEmpty = isEmpty;
303
+ exports.createFrame = createFrame;
304
+ exports.blockParams = blockParams;
305
+ exports.appendContextPath = appendContextPath;
306
+ var escape = {
307
+ '&': '&amp;',
308
+ '<': '&lt;',
309
+ '>': '&gt;',
310
+ '"': '&quot;',
311
+ "'": '&#x27;',
312
+ '`': '&#x60;',
313
+ '=': '&#x3D;'
314
+ };
315
+
316
+ var badChars = /[&<>"'`=]/g,
317
+ possible = /[&<>"'`=]/;
318
+
319
+ function escapeChar(chr) {
320
+ return escape[chr];
321
+ }
322
+
323
+ function extend(obj /* , ...source */) {
324
+ for (var i = 1; i < arguments.length; i++) {
325
+ for (var key in arguments[i]) {
326
+ if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
327
+ obj[key] = arguments[i][key];
328
+ }
329
+ }
330
+ }
331
+
332
+ return obj;
333
+ }
334
+
335
+ var toString = Object.prototype.toString;
336
+
337
+ exports.toString = toString;
338
+ // Sourced from lodash
339
+ // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
340
+ /* eslint-disable func-style */
341
+ var isFunction = function isFunction(value) {
342
+ return typeof value === 'function';
343
+ };
344
+ // fallback for older versions of Chrome and Safari
345
+ /* istanbul ignore next */
346
+ if (isFunction(/x/)) {
347
+ exports.isFunction = isFunction = function (value) {
348
+ return typeof value === 'function' && toString.call(value) === '[object Function]';
349
+ };
350
+ }
351
+ exports.isFunction = isFunction;
352
+
353
+ /* eslint-enable func-style */
354
+
355
+ /* istanbul ignore next */
356
+ var isArray = Array.isArray || function (value) {
357
+ return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;
358
+ };
359
+
360
+ exports.isArray = isArray;
361
+ // Older IE versions do not directly support indexOf so we must implement our own, sadly.
362
+
363
+ function indexOf(array, value) {
364
+ for (var i = 0, len = array.length; i < len; i++) {
365
+ if (array[i] === value) {
366
+ return i;
367
+ }
368
+ }
369
+ return -1;
370
+ }
371
+
372
+ function escapeExpression(string) {
373
+ if (typeof string !== 'string') {
374
+ // don't escape SafeStrings, since they're already safe
375
+ if (string && string.toHTML) {
376
+ return string.toHTML();
377
+ } else if (string == null) {
378
+ return '';
379
+ } else if (!string) {
380
+ return string + '';
381
+ }
382
+
383
+ // Force a string conversion as this will be done by the append regardless and
384
+ // the regex test will do this transparently behind the scenes, causing issues if
385
+ // an object's to string has escaped characters in it.
386
+ string = '' + string;
387
+ }
388
+
389
+ if (!possible.test(string)) {
390
+ return string;
391
+ }
392
+ return string.replace(badChars, escapeChar);
393
+ }
394
+
395
+ function isEmpty(value) {
396
+ if (!value && value !== 0) {
397
+ return true;
398
+ } else if (isArray(value) && value.length === 0) {
399
+ return true;
400
+ } else {
401
+ return false;
402
+ }
403
+ }
404
+
405
+ function createFrame(object) {
406
+ var frame = extend({}, object);
407
+ frame._parent = object;
408
+ return frame;
409
+ }
410
+
411
+ function blockParams(params, ids) {
412
+ params.path = ids;
413
+ return params;
414
+ }
415
+
416
+ function appendContextPath(contextPath, id) {
417
+ return (contextPath ? contextPath + '.' : '') + id;
418
+ }
419
+
420
+ /***/ }),
421
+ /* 5 */
422
+ /***/ (function(module, exports, __webpack_require__) {
423
+
424
+ 'use strict';
425
+
426
+ var _Object$defineProperty = __webpack_require__(6)['default'];
427
+
428
+ exports.__esModule = true;
429
+
430
+ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
431
+
432
+ function Exception(message, node) {
433
+ var loc = node && node.loc,
434
+ line = undefined,
435
+ column = undefined;
436
+ if (loc) {
437
+ line = loc.start.line;
438
+ column = loc.start.column;
439
+
440
+ message += ' - ' + line + ':' + column;
441
+ }
442
+
443
+ var tmp = Error.prototype.constructor.call(this, message);
444
+
445
+ // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
446
+ for (var idx = 0; idx < errorProps.length; idx++) {
447
+ this[errorProps[idx]] = tmp[errorProps[idx]];
448
+ }
449
+
450
+ /* istanbul ignore else */
451
+ if (Error.captureStackTrace) {
452
+ Error.captureStackTrace(this, Exception);
453
+ }
454
+
455
+ try {
456
+ if (loc) {
457
+ this.lineNumber = line;
458
+
459
+ // Work around issue under safari where we can't directly set the column value
460
+ /* istanbul ignore next */
461
+ if (_Object$defineProperty) {
462
+ Object.defineProperty(this, 'column', {
463
+ value: column,
464
+ enumerable: true
465
+ });
466
+ } else {
467
+ this.column = column;
468
+ }
469
+ }
470
+ } catch (nop) {
471
+ /* Ignore if the browser is very particular */
472
+ }
473
+ }
474
+
475
+ Exception.prototype = new Error();
476
+
477
+ exports['default'] = Exception;
478
+ module.exports = exports['default'];
479
+
480
+ /***/ }),
481
+ /* 6 */
482
+ /***/ (function(module, exports, __webpack_require__) {
483
+
484
+ module.exports = { "default": __webpack_require__(7), __esModule: true };
485
+
486
+ /***/ }),
487
+ /* 7 */
488
+ /***/ (function(module, exports, __webpack_require__) {
489
+
490
+ var $ = __webpack_require__(8);
491
+ module.exports = function defineProperty(it, key, desc){
492
+ return $.setDesc(it, key, desc);
493
+ };
494
+
495
+ /***/ }),
496
+ /* 8 */
497
+ /***/ (function(module, exports) {
498
+
499
+ var $Object = Object;
500
+ module.exports = {
501
+ create: $Object.create,
502
+ getProto: $Object.getPrototypeOf,
503
+ isEnum: {}.propertyIsEnumerable,
504
+ getDesc: $Object.getOwnPropertyDescriptor,
505
+ setDesc: $Object.defineProperty,
506
+ setDescs: $Object.defineProperties,
507
+ getKeys: $Object.keys,
508
+ getNames: $Object.getOwnPropertyNames,
509
+ getSymbols: $Object.getOwnPropertySymbols,
510
+ each: [].forEach
511
+ };
512
+
513
+ /***/ }),
514
+ /* 9 */
515
+ /***/ (function(module, exports, __webpack_require__) {
516
+
517
+ 'use strict';
518
+
519
+ var _interopRequireDefault = __webpack_require__(2)['default'];
520
+
521
+ exports.__esModule = true;
522
+ exports.registerDefaultHelpers = registerDefaultHelpers;
523
+
524
+ var _helpersBlockHelperMissing = __webpack_require__(10);
525
+
526
+ var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);
527
+
528
+ var _helpersEach = __webpack_require__(11);
529
+
530
+ var _helpersEach2 = _interopRequireDefault(_helpersEach);
531
+
532
+ var _helpersHelperMissing = __webpack_require__(12);
533
+
534
+ var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);
535
+
536
+ var _helpersIf = __webpack_require__(13);
537
+
538
+ var _helpersIf2 = _interopRequireDefault(_helpersIf);
539
+
540
+ var _helpersLog = __webpack_require__(14);
541
+
542
+ var _helpersLog2 = _interopRequireDefault(_helpersLog);
543
+
544
+ var _helpersLookup = __webpack_require__(15);
545
+
546
+ var _helpersLookup2 = _interopRequireDefault(_helpersLookup);
547
+
548
+ var _helpersWith = __webpack_require__(16);
549
+
550
+ var _helpersWith2 = _interopRequireDefault(_helpersWith);
551
+
552
+ function registerDefaultHelpers(instance) {
553
+ _helpersBlockHelperMissing2['default'](instance);
554
+ _helpersEach2['default'](instance);
555
+ _helpersHelperMissing2['default'](instance);
556
+ _helpersIf2['default'](instance);
557
+ _helpersLog2['default'](instance);
558
+ _helpersLookup2['default'](instance);
559
+ _helpersWith2['default'](instance);
560
+ }
561
+
562
+ /***/ }),
563
+ /* 10 */
564
+ /***/ (function(module, exports, __webpack_require__) {
565
+
566
+ 'use strict';
567
+
568
+ exports.__esModule = true;
569
+
570
+ var _utils = __webpack_require__(4);
571
+
572
+ exports['default'] = function (instance) {
573
+ instance.registerHelper('blockHelperMissing', function (context, options) {
574
+ var inverse = options.inverse,
575
+ fn = options.fn;
576
+
577
+ if (context === true) {
578
+ return fn(this);
579
+ } else if (context === false || context == null) {
580
+ return inverse(this);
581
+ } else if (_utils.isArray(context)) {
582
+ if (context.length > 0) {
583
+ if (options.ids) {
584
+ options.ids = [options.name];
585
+ }
586
+
587
+ return instance.helpers.each(context, options);
588
+ } else {
589
+ return inverse(this);
590
+ }
591
+ } else {
592
+ if (options.data && options.ids) {
593
+ var data = _utils.createFrame(options.data);
594
+ data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);
595
+ options = { data: data };
596
+ }
597
+
598
+ return fn(context, options);
599
+ }
600
+ });
601
+ };
602
+
603
+ module.exports = exports['default'];
604
+
605
+ /***/ }),
606
+ /* 11 */
607
+ /***/ (function(module, exports, __webpack_require__) {
608
+
609
+ 'use strict';
610
+
611
+ var _interopRequireDefault = __webpack_require__(2)['default'];
612
+
613
+ exports.__esModule = true;
614
+
615
+ var _utils = __webpack_require__(4);
616
+
617
+ var _exception = __webpack_require__(5);
618
+
619
+ var _exception2 = _interopRequireDefault(_exception);
620
+
621
+ exports['default'] = function (instance) {
622
+ instance.registerHelper('each', function (context, options) {
623
+ if (!options) {
624
+ throw new _exception2['default']('Must pass iterator to #each');
625
+ }
626
+
627
+ var fn = options.fn,
628
+ inverse = options.inverse,
629
+ i = 0,
630
+ ret = '',
631
+ data = undefined,
632
+ contextPath = undefined;
633
+
634
+ if (options.data && options.ids) {
635
+ contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
636
+ }
637
+
638
+ if (_utils.isFunction(context)) {
639
+ context = context.call(this);
640
+ }
641
+
642
+ if (options.data) {
643
+ data = _utils.createFrame(options.data);
644
+ }
645
+
646
+ function execIteration(field, index, last) {
647
+ if (data) {
648
+ data.key = field;
649
+ data.index = index;
650
+ data.first = index === 0;
651
+ data.last = !!last;
652
+
653
+ if (contextPath) {
654
+ data.contextPath = contextPath + field;
655
+ }
656
+ }
657
+
658
+ ret = ret + fn(context[field], {
659
+ data: data,
660
+ blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])
661
+ });
662
+ }
663
+
664
+ if (context && typeof context === 'object') {
665
+ if (_utils.isArray(context)) {
666
+ for (var j = context.length; i < j; i++) {
667
+ if (i in context) {
668
+ execIteration(i, i, i === context.length - 1);
669
+ }
670
+ }
671
+ } else {
672
+ var priorKey = undefined;
673
+
674
+ for (var key in context) {
675
+ if (context.hasOwnProperty(key)) {
676
+ // We're running the iterations one step out of sync so we can detect
677
+ // the last iteration without have to scan the object twice and create
678
+ // an itermediate keys array.
679
+ if (priorKey !== undefined) {
680
+ execIteration(priorKey, i - 1);
681
+ }
682
+ priorKey = key;
683
+ i++;
684
+ }
685
+ }
686
+ if (priorKey !== undefined) {
687
+ execIteration(priorKey, i - 1, true);
688
+ }
689
+ }
690
+ }
691
+
692
+ if (i === 0) {
693
+ ret = inverse(this);
694
+ }
695
+
696
+ return ret;
697
+ });
698
+ };
699
+
700
+ module.exports = exports['default'];
701
+
702
+ /***/ }),
703
+ /* 12 */
704
+ /***/ (function(module, exports, __webpack_require__) {
705
+
706
+ 'use strict';
707
+
708
+ var _interopRequireDefault = __webpack_require__(2)['default'];
709
+
710
+ exports.__esModule = true;
711
+
712
+ var _exception = __webpack_require__(5);
713
+
714
+ var _exception2 = _interopRequireDefault(_exception);
715
+
716
+ exports['default'] = function (instance) {
717
+ instance.registerHelper('helperMissing', function () /* [args, ]options */{
718
+ if (arguments.length === 1) {
719
+ // A missing field in a {{foo}} construct.
720
+ return undefined;
721
+ } else {
722
+ // Someone is actually trying to call something, blow up.
723
+ throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"');
724
+ }
725
+ });
726
+ };
727
+
728
+ module.exports = exports['default'];
729
+
730
+ /***/ }),
731
+ /* 13 */
732
+ /***/ (function(module, exports, __webpack_require__) {
733
+
734
+ 'use strict';
735
+
736
+ exports.__esModule = true;
737
+
738
+ var _utils = __webpack_require__(4);
739
+
740
+ exports['default'] = function (instance) {
741
+ instance.registerHelper('if', function (conditional, options) {
742
+ if (_utils.isFunction(conditional)) {
743
+ conditional = conditional.call(this);
744
+ }
745
+
746
+ // Default behavior is to render the positive path if the value is truthy and not empty.
747
+ // The `includeZero` option may be set to treat the condtional as purely not empty based on the
748
+ // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
749
+ if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {
750
+ return options.inverse(this);
751
+ } else {
752
+ return options.fn(this);
753
+ }
754
+ });
755
+
756
+ instance.registerHelper('unless', function (conditional, options) {
757
+ return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });
758
+ });
759
+ };
760
+
761
+ module.exports = exports['default'];
762
+
763
+ /***/ }),
764
+ /* 14 */
765
+ /***/ (function(module, exports) {
766
+
767
+ 'use strict';
768
+
769
+ exports.__esModule = true;
770
+
771
+ exports['default'] = function (instance) {
772
+ instance.registerHelper('log', function () /* message, options */{
773
+ var args = [undefined],
774
+ options = arguments[arguments.length - 1];
775
+ for (var i = 0; i < arguments.length - 1; i++) {
776
+ args.push(arguments[i]);
777
+ }
778
+
779
+ var level = 1;
780
+ if (options.hash.level != null) {
781
+ level = options.hash.level;
782
+ } else if (options.data && options.data.level != null) {
783
+ level = options.data.level;
784
+ }
785
+ args[0] = level;
786
+
787
+ instance.log.apply(instance, args);
788
+ });
789
+ };
790
+
791
+ module.exports = exports['default'];
792
+
793
+ /***/ }),
794
+ /* 15 */
795
+ /***/ (function(module, exports) {
796
+
797
+ 'use strict';
798
+
799
+ exports.__esModule = true;
800
+
801
+ exports['default'] = function (instance) {
802
+ instance.registerHelper('lookup', function (obj, field) {
803
+ return obj && obj[field];
804
+ });
805
+ };
806
+
807
+ module.exports = exports['default'];
808
+
809
+ /***/ }),
810
+ /* 16 */
811
+ /***/ (function(module, exports, __webpack_require__) {
812
+
813
+ 'use strict';
814
+
815
+ exports.__esModule = true;
816
+
817
+ var _utils = __webpack_require__(4);
818
+
819
+ exports['default'] = function (instance) {
820
+ instance.registerHelper('with', function (context, options) {
821
+ if (_utils.isFunction(context)) {
822
+ context = context.call(this);
823
+ }
824
+
825
+ var fn = options.fn;
826
+
827
+ if (!_utils.isEmpty(context)) {
828
+ var data = options.data;
829
+ if (options.data && options.ids) {
830
+ data = _utils.createFrame(options.data);
831
+ data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);
832
+ }
833
+
834
+ return fn(context, {
835
+ data: data,
836
+ blockParams: _utils.blockParams([context], [data && data.contextPath])
837
+ });
838
+ } else {
839
+ return options.inverse(this);
840
+ }
841
+ });
842
+ };
843
+
844
+ module.exports = exports['default'];
845
+
846
+ /***/ }),
847
+ /* 17 */
848
+ /***/ (function(module, exports, __webpack_require__) {
849
+
850
+ 'use strict';
851
+
852
+ var _interopRequireDefault = __webpack_require__(2)['default'];
853
+
854
+ exports.__esModule = true;
855
+ exports.registerDefaultDecorators = registerDefaultDecorators;
856
+
857
+ var _decoratorsInline = __webpack_require__(18);
858
+
859
+ var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);
860
+
861
+ function registerDefaultDecorators(instance) {
862
+ _decoratorsInline2['default'](instance);
863
+ }
864
+
865
+ /***/ }),
866
+ /* 18 */
867
+ /***/ (function(module, exports, __webpack_require__) {
868
+
869
+ 'use strict';
870
+
871
+ exports.__esModule = true;
872
+
873
+ var _utils = __webpack_require__(4);
874
+
875
+ exports['default'] = function (instance) {
876
+ instance.registerDecorator('inline', function (fn, props, container, options) {
877
+ var ret = fn;
878
+ if (!props.partials) {
879
+ props.partials = {};
880
+ ret = function (context, options) {
881
+ // Create a new partials stack frame prior to exec.
882
+ var original = container.partials;
883
+ container.partials = _utils.extend({}, original, props.partials);
884
+ var ret = fn(context, options);
885
+ container.partials = original;
886
+ return ret;
887
+ };
888
+ }
889
+
890
+ props.partials[options.args[0]] = options.fn;
891
+
892
+ return ret;
893
+ });
894
+ };
895
+
896
+ module.exports = exports['default'];
897
+
898
+ /***/ }),
899
+ /* 19 */
900
+ /***/ (function(module, exports, __webpack_require__) {
901
+
902
+ 'use strict';
903
+
904
+ exports.__esModule = true;
905
+
906
+ var _utils = __webpack_require__(4);
907
+
908
+ var logger = {
909
+ methodMap: ['debug', 'info', 'warn', 'error'],
910
+ level: 'info',
911
+
912
+ // Maps a given level value to the `methodMap` indexes above.
913
+ lookupLevel: function lookupLevel(level) {
914
+ if (typeof level === 'string') {
915
+ var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());
916
+ if (levelMap >= 0) {
917
+ level = levelMap;
918
+ } else {
919
+ level = parseInt(level, 10);
920
+ }
921
+ }
922
+
923
+ return level;
924
+ },
925
+
926
+ // Can be overridden in the host environment
927
+ log: function log(level) {
928
+ level = logger.lookupLevel(level);
929
+
930
+ if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {
931
+ var method = logger.methodMap[level];
932
+ if (!console[method]) {
933
+ // eslint-disable-line no-console
934
+ method = 'log';
935
+ }
936
+
937
+ for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
938
+ message[_key - 1] = arguments[_key];
939
+ }
940
+
941
+ console[method].apply(console, message); // eslint-disable-line no-console
942
+ }
943
+ }
944
+ };
945
+
946
+ exports['default'] = logger;
947
+ module.exports = exports['default'];
948
+
949
+ /***/ }),
950
+ /* 20 */
951
+ /***/ (function(module, exports) {
952
+
953
+ // Build out our basic SafeString type
954
+ 'use strict';
955
+
956
+ exports.__esModule = true;
957
+ function SafeString(string) {
958
+ this.string = string;
959
+ }
960
+
961
+ SafeString.prototype.toString = SafeString.prototype.toHTML = function () {
962
+ return '' + this.string;
963
+ };
964
+
965
+ exports['default'] = SafeString;
966
+ module.exports = exports['default'];
967
+
968
+ /***/ }),
969
+ /* 21 */
970
+ /***/ (function(module, exports, __webpack_require__) {
971
+
972
+ 'use strict';
973
+
974
+ var _Object$seal = __webpack_require__(22)['default'];
975
+
976
+ var _interopRequireWildcard = __webpack_require__(1)['default'];
977
+
978
+ var _interopRequireDefault = __webpack_require__(2)['default'];
979
+
980
+ exports.__esModule = true;
981
+ exports.checkRevision = checkRevision;
982
+ exports.template = template;
983
+ exports.wrapProgram = wrapProgram;
984
+ exports.resolvePartial = resolvePartial;
985
+ exports.invokePartial = invokePartial;
986
+ exports.noop = noop;
987
+
988
+ var _utils = __webpack_require__(4);
989
+
990
+ var Utils = _interopRequireWildcard(_utils);
991
+
992
+ var _exception = __webpack_require__(5);
993
+
994
+ var _exception2 = _interopRequireDefault(_exception);
995
+
996
+ var _base = __webpack_require__(3);
997
+
998
+ function checkRevision(compilerInfo) {
999
+ var compilerRevision = compilerInfo && compilerInfo[0] || 1,
1000
+ currentRevision = _base.COMPILER_REVISION;
1001
+
1002
+ if (compilerRevision !== currentRevision) {
1003
+ if (compilerRevision < currentRevision) {
1004
+ var runtimeVersions = _base.REVISION_CHANGES[currentRevision],
1005
+ compilerVersions = _base.REVISION_CHANGES[compilerRevision];
1006
+ throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');
1007
+ } else {
1008
+ // Use the embedded version info since the runtime doesn't know about this revision yet
1009
+ throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');
1010
+ }
1011
+ }
1012
+ }
1013
+
1014
+ function template(templateSpec, env) {
1015
+ /* istanbul ignore next */
1016
+ if (!env) {
1017
+ throw new _exception2['default']('No environment passed to template');
1018
+ }
1019
+ if (!templateSpec || !templateSpec.main) {
1020
+ throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);
1021
+ }
1022
+
1023
+ templateSpec.main.decorator = templateSpec.main_d;
1024
+
1025
+ // Note: Using env.VM references rather than local var references throughout this section to allow
1026
+ // for external users to override these as psuedo-supported APIs.
1027
+ env.VM.checkRevision(templateSpec.compiler);
1028
+
1029
+ function invokePartialWrapper(partial, context, options) {
1030
+ if (options.hash) {
1031
+ context = Utils.extend({}, context, options.hash);
1032
+ if (options.ids) {
1033
+ options.ids[0] = true;
1034
+ }
1035
+ }
1036
+
1037
+ partial = env.VM.resolvePartial.call(this, partial, context, options);
1038
+ var result = env.VM.invokePartial.call(this, partial, context, options);
1039
+
1040
+ if (result == null && env.compile) {
1041
+ options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);
1042
+ result = options.partials[options.name](context, options);
1043
+ }
1044
+ if (result != null) {
1045
+ if (options.indent) {
1046
+ var lines = result.split('\n');
1047
+ for (var i = 0, l = lines.length; i < l; i++) {
1048
+ if (!lines[i] && i + 1 === l) {
1049
+ break;
1050
+ }
1051
+
1052
+ lines[i] = options.indent + lines[i];
1053
+ }
1054
+ result = lines.join('\n');
1055
+ }
1056
+ return result;
1057
+ } else {
1058
+ throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');
1059
+ }
1060
+ }
1061
+
1062
+ // Just add water
1063
+ var container = {
1064
+ strict: function strict(obj, name) {
1065
+ if (!(name in obj)) {
1066
+ throw new _exception2['default']('"' + name + '" not defined in ' + obj);
1067
+ }
1068
+ return obj[name];
1069
+ },
1070
+ lookup: function lookup(depths, name) {
1071
+ var len = depths.length;
1072
+ for (var i = 0; i < len; i++) {
1073
+ if (depths[i] && depths[i][name] != null) {
1074
+ return depths[i][name];
1075
+ }
1076
+ }
1077
+ },
1078
+ lambda: function lambda(current, context) {
1079
+ return typeof current === 'function' ? current.call(context) : current;
1080
+ },
1081
+
1082
+ escapeExpression: Utils.escapeExpression,
1083
+ invokePartial: invokePartialWrapper,
1084
+
1085
+ fn: function fn(i) {
1086
+ var ret = templateSpec[i];
1087
+ ret.decorator = templateSpec[i + '_d'];
1088
+ return ret;
1089
+ },
1090
+
1091
+ programs: [],
1092
+ program: function program(i, data, declaredBlockParams, blockParams, depths) {
1093
+ var programWrapper = this.programs[i],
1094
+ fn = this.fn(i);
1095
+ if (data || depths || blockParams || declaredBlockParams) {
1096
+ programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);
1097
+ } else if (!programWrapper) {
1098
+ programWrapper = this.programs[i] = wrapProgram(this, i, fn);
1099
+ }
1100
+ return programWrapper;
1101
+ },
1102
+
1103
+ data: function data(value, depth) {
1104
+ while (value && depth--) {
1105
+ value = value._parent;
1106
+ }
1107
+ return value;
1108
+ },
1109
+ merge: function merge(param, common) {
1110
+ var obj = param || common;
1111
+
1112
+ if (param && common && param !== common) {
1113
+ obj = Utils.extend({}, common, param);
1114
+ }
1115
+
1116
+ return obj;
1117
+ },
1118
+ // An empty object to use as replacement for null-contexts
1119
+ nullContext: _Object$seal({}),
1120
+
1121
+ noop: env.VM.noop,
1122
+ compilerInfo: templateSpec.compiler
1123
+ };
1124
+
1125
+ function ret(context) {
1126
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
1127
+
1128
+ var data = options.data;
1129
+
1130
+ ret._setup(options);
1131
+ if (!options.partial && templateSpec.useData) {
1132
+ data = initData(context, data);
1133
+ }
1134
+ var depths = undefined,
1135
+ blockParams = templateSpec.useBlockParams ? [] : undefined;
1136
+ if (templateSpec.useDepths) {
1137
+ if (options.depths) {
1138
+ depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths;
1139
+ } else {
1140
+ depths = [context];
1141
+ }
1142
+ }
1143
+
1144
+ function main(context /*, options*/) {
1145
+ return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);
1146
+ }
1147
+ main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);
1148
+ return main(context, options);
1149
+ }
1150
+ ret.isTop = true;
1151
+
1152
+ ret._setup = function (options) {
1153
+ if (!options.partial) {
1154
+ container.helpers = container.merge(options.helpers, env.helpers);
1155
+
1156
+ if (templateSpec.usePartial) {
1157
+ container.partials = container.merge(options.partials, env.partials);
1158
+ }
1159
+ if (templateSpec.usePartial || templateSpec.useDecorators) {
1160
+ container.decorators = container.merge(options.decorators, env.decorators);
1161
+ }
1162
+ } else {
1163
+ container.helpers = options.helpers;
1164
+ container.partials = options.partials;
1165
+ container.decorators = options.decorators;
1166
+ }
1167
+ };
1168
+
1169
+ ret._child = function (i, data, blockParams, depths) {
1170
+ if (templateSpec.useBlockParams && !blockParams) {
1171
+ throw new _exception2['default']('must pass block params');
1172
+ }
1173
+ if (templateSpec.useDepths && !depths) {
1174
+ throw new _exception2['default']('must pass parent depths');
1175
+ }
1176
+
1177
+ return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);
1178
+ };
1179
+ return ret;
1180
+ }
1181
+
1182
+ function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {
1183
+ function prog(context) {
1184
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
1185
+
1186
+ var currentDepths = depths;
1187
+ if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) {
1188
+ currentDepths = [context].concat(depths);
1189
+ }
1190
+
1191
+ return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);
1192
+ }
1193
+
1194
+ prog = executeDecorators(fn, prog, container, depths, data, blockParams);
1195
+
1196
+ prog.program = i;
1197
+ prog.depth = depths ? depths.length : 0;
1198
+ prog.blockParams = declaredBlockParams || 0;
1199
+ return prog;
1200
+ }
1201
+
1202
+ function resolvePartial(partial, context, options) {
1203
+ if (!partial) {
1204
+ if (options.name === '@partial-block') {
1205
+ partial = options.data['partial-block'];
1206
+ } else {
1207
+ partial = options.partials[options.name];
1208
+ }
1209
+ } else if (!partial.call && !options.name) {
1210
+ // This is a dynamic partial that returned a string
1211
+ options.name = partial;
1212
+ partial = options.partials[partial];
1213
+ }
1214
+ return partial;
1215
+ }
1216
+
1217
+ function invokePartial(partial, context, options) {
1218
+ // Use the current closure context to save the partial-block if this partial
1219
+ var currentPartialBlock = options.data && options.data['partial-block'];
1220
+ options.partial = true;
1221
+ if (options.ids) {
1222
+ options.data.contextPath = options.ids[0] || options.data.contextPath;
1223
+ }
1224
+
1225
+ var partialBlock = undefined;
1226
+ if (options.fn && options.fn !== noop) {
1227
+ (function () {
1228
+ options.data = _base.createFrame(options.data);
1229
+ // Wrapper function to get access to currentPartialBlock from the closure
1230
+ var fn = options.fn;
1231
+ partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) {
1232
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
1233
+
1234
+ // Restore the partial-block from the closure for the execution of the block
1235
+ // i.e. the part inside the block of the partial call.
1236
+ options.data = _base.createFrame(options.data);
1237
+ options.data['partial-block'] = currentPartialBlock;
1238
+ return fn(context, options);
1239
+ };
1240
+ if (fn.partials) {
1241
+ options.partials = Utils.extend({}, options.partials, fn.partials);
1242
+ }
1243
+ })();
1244
+ }
1245
+
1246
+ if (partial === undefined && partialBlock) {
1247
+ partial = partialBlock;
1248
+ }
1249
+
1250
+ if (partial === undefined) {
1251
+ throw new _exception2['default']('The partial ' + options.name + ' could not be found');
1252
+ } else if (partial instanceof Function) {
1253
+ return partial(context, options);
1254
+ }
1255
+ }
1256
+
1257
+ function noop() {
1258
+ return '';
1259
+ }
1260
+
1261
+ function initData(context, data) {
1262
+ if (!data || !('root' in data)) {
1263
+ data = data ? _base.createFrame(data) : {};
1264
+ data.root = context;
1265
+ }
1266
+ return data;
1267
+ }
1268
+
1269
+ function executeDecorators(fn, prog, container, depths, data, blockParams) {
1270
+ if (fn.decorator) {
1271
+ var props = {};
1272
+ prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);
1273
+ Utils.extend(prog, props);
1274
+ }
1275
+ return prog;
1276
+ }
1277
+
1278
+ /***/ }),
1279
+ /* 22 */
1280
+ /***/ (function(module, exports, __webpack_require__) {
1281
+
1282
+ module.exports = { "default": __webpack_require__(23), __esModule: true };
1283
+
1284
+ /***/ }),
1285
+ /* 23 */
1286
+ /***/ (function(module, exports, __webpack_require__) {
1287
+
1288
+ __webpack_require__(24);
1289
+ module.exports = __webpack_require__(29).Object.seal;
1290
+
1291
+ /***/ }),
1292
+ /* 24 */
1293
+ /***/ (function(module, exports, __webpack_require__) {
1294
+
1295
+ // 19.1.2.17 Object.seal(O)
1296
+ var isObject = __webpack_require__(25);
1297
+
1298
+ __webpack_require__(26)('seal', function($seal){
1299
+ return function seal(it){
1300
+ return $seal && isObject(it) ? $seal(it) : it;
1301
+ };
1302
+ });
1303
+
1304
+ /***/ }),
1305
+ /* 25 */
1306
+ /***/ (function(module, exports) {
1307
+
1308
+ module.exports = function(it){
1309
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
1310
+ };
1311
+
1312
+ /***/ }),
1313
+ /* 26 */
1314
+ /***/ (function(module, exports, __webpack_require__) {
1315
+
1316
+ // most Object methods by ES6 should accept primitives
1317
+ var $export = __webpack_require__(27)
1318
+ , core = __webpack_require__(29)
1319
+ , fails = __webpack_require__(32);
1320
+ module.exports = function(KEY, exec){
1321
+ var fn = (core.Object || {})[KEY] || Object[KEY]
1322
+ , exp = {};
1323
+ exp[KEY] = exec(fn);
1324
+ $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
1325
+ };
1326
+
1327
+ /***/ }),
1328
+ /* 27 */
1329
+ /***/ (function(module, exports, __webpack_require__) {
1330
+
1331
+ var global = __webpack_require__(28)
1332
+ , core = __webpack_require__(29)
1333
+ , ctx = __webpack_require__(30)
1334
+ , PROTOTYPE = 'prototype';
1335
+
1336
+ var $export = function(type, name, source){
1337
+ var IS_FORCED = type & $export.F
1338
+ , IS_GLOBAL = type & $export.G
1339
+ , IS_STATIC = type & $export.S
1340
+ , IS_PROTO = type & $export.P
1341
+ , IS_BIND = type & $export.B
1342
+ , IS_WRAP = type & $export.W
1343
+ , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
1344
+ , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
1345
+ , key, own, out;
1346
+ if(IS_GLOBAL)source = name;
1347
+ for(key in source){
1348
+ // contains in native
1349
+ own = !IS_FORCED && target && key in target;
1350
+ if(own && key in exports)continue;
1351
+ // export native or passed
1352
+ out = own ? target[key] : source[key];
1353
+ // prevent global pollution for namespaces
1354
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
1355
+ // bind timers to global for call from export context
1356
+ : IS_BIND && own ? ctx(out, global)
1357
+ // wrap global constructors for prevent change them in library
1358
+ : IS_WRAP && target[key] == out ? (function(C){
1359
+ var F = function(param){
1360
+ return this instanceof C ? new C(param) : C(param);
1361
+ };
1362
+ F[PROTOTYPE] = C[PROTOTYPE];
1363
+ return F;
1364
+ // make static versions for prototype methods
1365
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
1366
+ if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
1367
+ }
1368
+ };
1369
+ // type bitmap
1370
+ $export.F = 1; // forced
1371
+ $export.G = 2; // global
1372
+ $export.S = 4; // static
1373
+ $export.P = 8; // proto
1374
+ $export.B = 16; // bind
1375
+ $export.W = 32; // wrap
1376
+ module.exports = $export;
1377
+
1378
+ /***/ }),
1379
+ /* 28 */
1380
+ /***/ (function(module, exports) {
1381
+
1382
+ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
1383
+ var global = module.exports = typeof window != 'undefined' && window.Math == Math
1384
+ ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
1385
+ if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
1386
+
1387
+ /***/ }),
1388
+ /* 29 */
1389
+ /***/ (function(module, exports) {
1390
+
1391
+ var core = module.exports = {version: '1.2.6'};
1392
+ if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
1393
+
1394
+ /***/ }),
1395
+ /* 30 */
1396
+ /***/ (function(module, exports, __webpack_require__) {
1397
+
1398
+ // optional / simple context binding
1399
+ var aFunction = __webpack_require__(31);
1400
+ module.exports = function(fn, that, length){
1401
+ aFunction(fn);
1402
+ if(that === undefined)return fn;
1403
+ switch(length){
1404
+ case 1: return function(a){
1405
+ return fn.call(that, a);
1406
+ };
1407
+ case 2: return function(a, b){
1408
+ return fn.call(that, a, b);
1409
+ };
1410
+ case 3: return function(a, b, c){
1411
+ return fn.call(that, a, b, c);
1412
+ };
1413
+ }
1414
+ return function(/* ...args */){
1415
+ return fn.apply(that, arguments);
1416
+ };
1417
+ };
1418
+
1419
+ /***/ }),
1420
+ /* 31 */
1421
+ /***/ (function(module, exports) {
1422
+
1423
+ module.exports = function(it){
1424
+ if(typeof it != 'function')throw TypeError(it + ' is not a function!');
1425
+ return it;
1426
+ };
1427
+
1428
+ /***/ }),
1429
+ /* 32 */
1430
+ /***/ (function(module, exports) {
1431
+
1432
+ module.exports = function(exec){
1433
+ try {
1434
+ return !!exec();
1435
+ } catch(e){
1436
+ return true;
1437
+ }
1438
+ };
1439
+
1440
+ /***/ }),
1441
+ /* 33 */
1442
+ /***/ (function(module, exports) {
1443
+
1444
+ /* WEBPACK VAR INJECTION */(function(global) {/* global window */
1445
+ 'use strict';
1446
+
1447
+ exports.__esModule = true;
1448
+
1449
+ exports['default'] = function (Handlebars) {
1450
+ /* istanbul ignore next */
1451
+ var root = typeof global !== 'undefined' ? global : window,
1452
+ $Handlebars = root.Handlebars;
1453
+ /* istanbul ignore next */
1454
+ Handlebars.noConflict = function () {
1455
+ if (root.Handlebars === Handlebars) {
1456
+ root.Handlebars = $Handlebars;
1457
+ }
1458
+ return Handlebars;
1459
+ };
1460
+ };
1461
+
1462
+ module.exports = exports['default'];
1463
+ /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
1464
+
1465
+ /***/ })
1466
+ /******/ ])
1467
+ });
1468
+ ;
includes/handlebars/handlebars.runtime.min.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**!
2
+
3
+ @license
4
+ handlebars v4.0.10
5
+
6
+ Copyright (C) 2011-2016 by Yehuda Katz
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in
16
+ all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ THE SOFTWARE.
25
+
26
+ */
27
+ !function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(1)["default"],f=c(2)["default"];b.__esModule=!0;var g=c(3),h=e(g),i=c(20),j=f(i),k=c(5),l=f(k),m=c(4),n=e(m),o=c(21),p=e(o),q=c(33),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(2)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(4),g=c(5),h=e(g),i=c(9),j=c(17),k=c(19),l=e(k),m="4.0.10";b.VERSION=m;var n=7;b.COMPILER_REVISION=n;var o={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0;c&&(g=c.start.line,h=c.start.column,a+=" - "+g+":"+h);for(var i=Error.prototype.constructor.call(this,a),j=0;j<f.length;j++)this[f[j]]=i[f[j]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,e?Object.defineProperty(this,"column",{value:h,enumerable:!0}):this.column=h)}catch(k){}}var e=c(6)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","message","name","number","stack"];d.prototype=new Error,b["default"]=d,a.exports=b["default"]},function(a,b,c){a.exports={"default":c(7),__esModule:!0}},function(a,b,c){var d=c(8);a.exports=function(a,b,c){return d.setDesc(a,b,c)}},function(a,b){var c=Object;a.exports={create:c.create,getProto:c.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:c.getOwnPropertyDescriptor,setDesc:c.defineProperty,setDescs:c.defineProperties,getKeys:c.keys,getNames:c.getOwnPropertyNames,getSymbols:c.getOwnPropertySymbols,each:[].forEach}},function(a,b,c){"use strict";function d(a){g["default"](a),i["default"](a),k["default"](a),m["default"](a),o["default"](a),q["default"](a),s["default"](a)}var e=c(2)["default"];b.__esModule=!0,b.registerDefaultHelpers=d;var f=c(10),g=e(f),h=c(11),i=e(h),j=c(12),k=e(j),l=c(13),m=e(l),n=c(14),o=e(n),p=c(15),q=e(p),r=c(16),s=e(r)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("blockHelperMissing",function(b,c){var e=c.inverse,f=c.fn;if(b===!0)return f(this);if(b===!1||null==b)return e(this);if(d.isArray(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(2)["default"];b.__esModule=!0;var e=c(4),f=c(5),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;h<l;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(2)["default"];b.__esModule=!0;var e=c(5),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d<arguments.length-1;d++)b.push(arguments[d]);var e=1;null!=c.hash.level?e=c.hash.level:c.data&&null!=c.data.level&&(e=c.data.level),b[0]=e,a.log.apply(a,b)})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("lookup",function(a,b){return a&&a[b]})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("with",function(a,b){d.isFunction(a)&&(a=a.call(this));var c=b.fn;if(d.isEmpty(a))return b.inverse(this);var e=b.data;return b.data&&b.ids&&(e=d.createFrame(b.data),e.contextPath=d.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:e,blockParams:d.blockParams([a],[e&&e.contextPath])})})},a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a)}var e=c(2)["default"];b.__esModule=!0,b.registerDefaultDecorators=d;var f=c(18),g=e(f)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerDecorator("inline",function(a,b,c,e){var f=a;return b.partials||(b.partials={},f=function(e,f){var g=c.partials;c.partials=d.extend({},g,b.partials);var h=a(e,f);return c.partials=g,h}),b.partials[e.args[0]]=e.fn,f})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4),e={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(a){if("string"==typeof a){var b=d.indexOf(e.methodMap,a.toLowerCase());a=b>=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f<c;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=s.COMPILER_REVISION;if(b!==c){if(b<c){var d=s.REVISION_CHANGES[c],e=s.REVISION_CHANGES[b];throw new r["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new r["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=p.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;h<i&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new r["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!=f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new r["default"]("No environment passed to template");if(!a||!a.main)throw new r["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new r["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:p.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=p.extend({},b,a)),c},nullContext:l({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new r["default"]("must pass block params");if(a.useDepths&&!g)throw new r["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return!g||b==g[0]||b===a.nullContext&&null===g[0]||(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){var d=c.data&&c.data["partial-block"];c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var e=void 0;if(c.fn&&c.fn!==i&&!function(){c.data=s.createFrame(c.data);var a=c.fn;e=c.data["partial-block"]=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return c.data=s.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=p.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new r["default"]("The partial "+c.name+" could not be found");if(a instanceof Function)return a(b,c)}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?s.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),p.extend(b,g)}return b}var l=c(22)["default"],m=c(1)["default"],n=c(2)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var o=c(4),p=m(o),q=c(5),r=n(q),s=c(3)},function(a,b,c){a.exports={"default":c(23),__esModule:!0}},function(a,b,c){c(24),a.exports=c(29).Object.seal},function(a,b,c){var d=c(25);c(26)("seal",function(a){return function(b){return a&&d(b)?a(b):b}})},function(a,b){a.exports=function(a){return"object"==typeof a?null!==a:"function"==typeof a}},function(a,b,c){var d=c(27),e=c(29),f=c(32);a.exports=function(a,b){var c=(e.Object||{})[a]||Object[a],g={};g[a]=b(c),d(d.S+d.F*f(function(){c(1)}),"Object",g)}},function(a,b,c){var d=c(28),e=c(29),f=c(30),g="prototype",h=function(a,b,c){var i,j,k,l=a&h.F,m=a&h.G,n=a&h.S,o=a&h.P,p=a&h.B,q=a&h.W,r=m?e:e[b]||(e[b]={}),s=m?d:n?d[b]:(d[b]||{})[g];m&&(c=b);for(i in c)j=!l&&s&&i in s,j&&i in r||(k=j?s[i]:c[i],r[i]=m&&"function"!=typeof s[i]?c[i]:p&&j?f(k,d):q&&s[i]==k?function(a){var b=function(b){return this instanceof a?new a(b):a(b)};return b[g]=a[g],b}(k):o&&"function"==typeof k?f(Function.call,k):k,o&&((r[g]||(r[g]={}))[i]=k))};h.F=1,h.G=2,h.S=4,h.P=8,h.B=16,h.W=32,a.exports=h},function(a,b){var c=a.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=c)},function(a,b){var c=a.exports={version:"1.2.6"};"number"==typeof __e&&(__e=c)},function(a,b,c){var d=c(31);a.exports=function(a,b,c){if(d(a),void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)}}return function(){return a.apply(b,arguments)}}},function(a,b){a.exports=function(a){if("function"!=typeof a)throw TypeError(a+" is not a function!");return a}},function(a,b){a.exports=function(a){try{return!!a()}catch(b){return!0}}},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())}])});
includes/jquery-ui.custom.css CHANGED
@@ -9,6 +9,7 @@
9
  .ui-helper-hidden {
10
  display: none;
11
  }
 
12
  .ui-helper-hidden-accessible {
13
  border: 0;
14
  clip: rect(0 0 0 0);
@@ -19,6 +20,7 @@
19
  position: absolute;
20
  width: 1px;
21
  }
 
22
  .ui-helper-reset {
23
  margin: 0;
24
  padding: 0;
@@ -29,18 +31,22 @@
29
  font-size: 100%;
30
  list-style: none;
31
  }
 
32
  .ui-helper-clearfix:before,
33
  .ui-helper-clearfix:after {
34
  content: "";
35
  display: table;
36
  border-collapse: collapse;
37
  }
 
38
  .ui-helper-clearfix:after {
39
  clear: both;
40
  }
 
41
  .ui-helper-clearfix {
42
  min-height: 0; /* support: IE7 */
43
  }
 
44
  .ui-helper-zfix {
45
  width: 100%;
46
  height: 100%;
@@ -48,21 +54,19 @@
48
  left: 0;
49
  position: absolute;
50
  opacity: 0;
51
- filter:Alpha(Opacity=0); /* support: IE8 */
52
  }
53
 
54
  .ui-front {
55
  z-index: 100;
56
  }
57
 
58
-
59
  /* Interaction Cues
60
  ----------------------------------*/
61
  .ui-state-disabled {
62
  cursor: default !important;
63
  }
64
 
65
-
66
  /* Icons
67
  ----------------------------------*/
68
 
@@ -74,7 +78,6 @@
74
  background-repeat: no-repeat;
75
  }
76
 
77
-
78
  /* Misc visuals
79
  ----------------------------------*/
80
 
@@ -86,13 +89,16 @@
86
  width: 100%;
87
  height: 100%;
88
  }
 
89
  .ui-draggable-handle {
90
  -ms-touch-action: none;
91
  touch-action: none;
92
  }
 
93
  .ui-resizable {
94
  position: relative;
95
  }
 
96
  .ui-resizable-handle {
97
  position: absolute;
98
  font-size: 0.1px;
@@ -100,10 +106,12 @@
100
  -ms-touch-action: none;
101
  touch-action: none;
102
  }
 
103
  .ui-resizable-disabled .ui-resizable-handle,
104
  .ui-resizable-autohide .ui-resizable-handle {
105
  display: none;
106
  }
 
107
  .ui-resizable-n {
108
  cursor: n-resize;
109
  height: 7px;
@@ -111,6 +119,7 @@
111
  top: -5px;
112
  left: 0;
113
  }
 
114
  .ui-resizable-s {
115
  cursor: s-resize;
116
  height: 7px;
@@ -118,6 +127,7 @@
118
  bottom: -5px;
119
  left: 0;
120
  }
 
121
  .ui-resizable-e {
122
  cursor: e-resize;
123
  width: 7px;
@@ -125,6 +135,7 @@
125
  top: 0;
126
  height: 100%;
127
  }
 
128
  .ui-resizable-w {
129
  cursor: w-resize;
130
  width: 7px;
@@ -132,6 +143,7 @@
132
  top: 0;
133
  height: 100%;
134
  }
 
135
  .ui-resizable-se {
136
  cursor: se-resize;
137
  width: 12px;
@@ -139,6 +151,7 @@
139
  right: 1px;
140
  bottom: 1px;
141
  }
 
142
  .ui-resizable-sw {
143
  cursor: sw-resize;
144
  width: 9px;
@@ -146,6 +159,7 @@
146
  left: -5px;
147
  bottom: -5px;
148
  }
 
149
  .ui-resizable-nw {
150
  cursor: nw-resize;
151
  width: 9px;
@@ -153,6 +167,7 @@
153
  left: -5px;
154
  top: -5px;
155
  }
 
156
  .ui-resizable-ne {
157
  cursor: ne-resize;
158
  width: 9px;
@@ -160,19 +175,23 @@
160
  right: -5px;
161
  top: -5px;
162
  }
 
163
  .ui-selectable {
164
  -ms-touch-action: none;
165
  touch-action: none;
166
  }
 
167
  .ui-selectable-helper {
168
  position: absolute;
169
  z-index: 100;
170
  border: 1px dotted black;
171
  }
 
172
  .ui-sortable-handle {
173
  -ms-touch-action: none;
174
  touch-action: none;
175
  }
 
176
  .ui-accordion .ui-accordion-header {
177
  display: block;
178
  cursor: pointer;
@@ -182,29 +201,35 @@
182
  min-height: 0; /* support: IE7 */
183
  font-size: 100%;
184
  }
 
185
  .ui-accordion .ui-accordion-icons {
186
  padding-left: 2.2em;
187
  }
 
188
  .ui-accordion .ui-accordion-icons .ui-accordion-icons {
189
  padding-left: 2.2em;
190
  }
 
191
  .ui-accordion .ui-accordion-header .ui-accordion-header-icon {
192
  position: absolute;
193
  left: .5em;
194
  top: 50%;
195
  margin-top: -8px;
196
  }
 
197
  .ui-accordion .ui-accordion-content {
198
  padding: 1em 2.2em;
199
  border-top: 0;
200
  overflow: auto;
201
  }
 
202
  .ui-autocomplete {
203
  position: absolute;
204
  top: 0;
205
  left: 0;
206
  cursor: default;
207
  }
 
208
  .ui-button {
209
  display: inline-block;
210
  position: relative;
@@ -216,6 +241,7 @@
216
  text-align: center;
217
  overflow: visible; /* removes extra width in IE */
218
  }
 
219
  .ui-button,
220
  .ui-button:link,
221
  .ui-button:visited,
@@ -223,17 +249,21 @@
223
  .ui-button:active {
224
  text-decoration: none;
225
  }
 
226
  /* to make room for the icon, a width needs to be set here */
227
  .ui-button-icon-only {
228
  width: 2.2em;
229
  }
 
230
  /* button elements seem to need a little more width */
231
  button.ui-button-icon-only {
232
  width: 2.4em;
233
  }
 
234
  .ui-button-icons-only {
235
  width: 3.4em;
236
  }
 
237
  button.ui-button-icons-only {
238
  width: 3.7em;
239
  }
@@ -243,26 +273,32 @@ button.ui-button-icons-only {
243
  display: block;
244
  line-height: normal;
245
  }
 
246
  .ui-button-text-only .ui-button-text {
247
  padding: .4em 1em;
248
  }
 
249
  .ui-button-icon-only .ui-button-text,
250
  .ui-button-icons-only .ui-button-text {
251
  padding: .4em;
252
  text-indent: -9999999px;
253
  }
 
254
  .ui-button-text-icon-primary .ui-button-text,
255
  .ui-button-text-icons .ui-button-text {
256
  padding: .4em 1em .4em 2.1em;
257
  }
 
258
  .ui-button-text-icon-secondary .ui-button-text,
259
  .ui-button-text-icons .ui-button-text {
260
  padding: .4em 2.1em .4em 1em;
261
  }
 
262
  .ui-button-text-icons .ui-button-text {
263
  padding-left: 2.1em;
264
  padding-right: 2.1em;
265
  }
 
266
  /* no icon support for input elements, provide padding by default */
267
  input.ui-button {
268
  padding: .4em 1em;
@@ -278,15 +314,18 @@ input.ui-button {
278
  top: 50%;
279
  margin-top: -8px;
280
  }
 
281
  .ui-button-icon-only .ui-icon {
282
  left: 50%;
283
  margin-left: -8px;
284
  }
 
285
  .ui-button-text-icon-primary .ui-button-icon-primary,
286
  .ui-button-text-icons .ui-button-icon-primary,
287
  .ui-button-icons-only .ui-button-icon-primary {
288
  left: .5em;
289
  }
 
290
  .ui-button-text-icon-secondary .ui-button-icon-secondary,
291
  .ui-button-text-icons .ui-button-icon-secondary,
292
  .ui-button-icons-only .ui-button-icon-secondary {
@@ -297,6 +336,7 @@ input.ui-button {
297
  .ui-buttonset {
298
  margin-right: 7px;
299
  }
 
300
  .ui-buttonset .ui-button {
301
  margin-left: 0;
302
  margin-right: -.3em;
@@ -309,15 +349,18 @@ button.ui-button::-moz-focus-inner {
309
  border: 0;
310
  padding: 0;
311
  }
 
312
  .ui-datepicker {
313
  width: 17em;
314
  padding: .2em .2em 0;
315
  display: none;
316
  }
 
317
  .ui-datepicker .ui-datepicker-header {
318
  position: relative;
319
  padding: .2em 0;
320
  }
 
321
  .ui-datepicker .ui-datepicker-prev,
322
  .ui-datepicker .ui-datepicker-next {
323
  position: absolute;
@@ -325,22 +368,28 @@ button.ui-button::-moz-focus-inner {
325
  width: 1.8em;
326
  height: 1.8em;
327
  }
 
328
  .ui-datepicker .ui-datepicker-prev-hover,
329
  .ui-datepicker .ui-datepicker-next-hover {
330
  top: 1px;
331
  }
 
332
  .ui-datepicker .ui-datepicker-prev {
333
  left: 2px;
334
  }
 
335
  .ui-datepicker .ui-datepicker-next {
336
  right: 2px;
337
  }
 
338
  .ui-datepicker .ui-datepicker-prev-hover {
339
  left: 1px;
340
  }
 
341
  .ui-datepicker .ui-datepicker-next-hover {
342
  right: 1px;
343
  }
 
344
  .ui-datepicker .ui-datepicker-prev span,
345
  .ui-datepicker .ui-datepicker-next span {
346
  display: block;
@@ -350,35 +399,42 @@ button.ui-button::-moz-focus-inner {
350
  top: 50%;
351
  margin-top: -8px;
352
  }
 
353
  .ui-datepicker .ui-datepicker-title {
354
  margin: 0 2.3em;
355
  line-height: 1.8em;
356
  text-align: center;
357
  }
 
358
  .ui-datepicker .ui-datepicker-title select {
359
  font-size: 1em;
360
  margin: 1px 0;
361
  }
 
362
  .ui-datepicker select.ui-datepicker-month,
363
  .ui-datepicker select.ui-datepicker-year {
364
  width: 45%;
365
  }
 
366
  .ui-datepicker table {
367
  width: 100%;
368
  font-size: .9em;
369
  border-collapse: collapse;
370
  margin: 0 0 .4em;
371
  }
 
372
  .ui-datepicker th {
373
  padding: .7em .3em;
374
  text-align: center;
375
  font-weight: bold;
376
  border: 0;
377
  }
 
378
  .ui-datepicker td {
379
  border: 0;
380
  padding: 1px;
381
  }
 
382
  .ui-datepicker td span,
383
  .ui-datepicker td a {
384
  display: block;
@@ -386,6 +442,7 @@ button.ui-button::-moz-focus-inner {
386
  text-align: right;
387
  text-decoration: none;
388
  }
 
389
  .ui-datepicker .ui-datepicker-buttonpane {
390
  background-image: none;
391
  margin: .7em 0 0 0;
@@ -394,6 +451,7 @@ button.ui-button::-moz-focus-inner {
394
  border-right: 0;
395
  border-bottom: 0;
396
  }
 
397
  .ui-datepicker .ui-datepicker-buttonpane button {
398
  float: right;
399
  margin: .5em .2em .4em;
@@ -402,6 +460,7 @@ button.ui-button::-moz-focus-inner {
402
  width: auto;
403
  overflow: visible;
404
  }
 
405
  .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
406
  float: left;
407
  }
@@ -410,29 +469,37 @@ button.ui-button::-moz-focus-inner {
410
  .ui-datepicker.ui-datepicker-multi {
411
  width: auto;
412
  }
 
413
  .ui-datepicker-multi .ui-datepicker-group {
414
  float: left;
415
  }
 
416
  .ui-datepicker-multi .ui-datepicker-group table {
417
  width: 95%;
418
  margin: 0 auto .4em;
419
  }
 
420
  .ui-datepicker-multi-2 .ui-datepicker-group {
421
  width: 50%;
422
  }
 
423
  .ui-datepicker-multi-3 .ui-datepicker-group {
424
  width: 33.3%;
425
  }
 
426
  .ui-datepicker-multi-4 .ui-datepicker-group {
427
  width: 25%;
428
  }
 
429
  .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
430
  .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
431
  border-left-width: 0;
432
  }
 
433
  .ui-datepicker-multi .ui-datepicker-buttonpane {
434
  clear: left;
435
  }
 
436
  .ui-datepicker-row-break {
437
  clear: both;
438
  width: 100%;
@@ -443,37 +510,46 @@ button.ui-button::-moz-focus-inner {
443
  .ui-datepicker-rtl {
444
  direction: rtl;
445
  }
 
446
  .ui-datepicker-rtl .ui-datepicker-prev {
447
  right: 2px;
448
  left: auto;
449
  }
 
450
  .ui-datepicker-rtl .ui-datepicker-next {
451
  left: 2px;
452
  right: auto;
453
  }
 
454
  .ui-datepicker-rtl .ui-datepicker-prev:hover {
455
  right: 1px;
456
  left: auto;
457
  }
 
458
  .ui-datepicker-rtl .ui-datepicker-next:hover {
459
  left: 1px;
460
  right: auto;
461
  }
 
462
  .ui-datepicker-rtl .ui-datepicker-buttonpane {
463
  clear: right;
464
  }
 
465
  .ui-datepicker-rtl .ui-datepicker-buttonpane button {
466
  float: left;
467
  }
 
468
  .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
469
  .ui-datepicker-rtl .ui-datepicker-group {
470
  float: right;
471
  }
 
472
  .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
473
  .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
474
  border-right-width: 0;
475
  border-left-width: 1px;
476
  }
 
477
  .ui-dialog {
478
  overflow: hidden;
479
  position: absolute;
@@ -482,10 +558,12 @@ button.ui-button::-moz-focus-inner {
482
  padding: .2em;
483
  outline: 0;
484
  }
 
485
  .ui-dialog .ui-dialog-titlebar {
486
  padding: .4em 1em;
487
  position: relative;
488
  }
 
489
  .ui-dialog .ui-dialog-title {
490
  float: left;
491
  margin: .1em 0;
@@ -494,6 +572,7 @@ button.ui-button::-moz-focus-inner {
494
  overflow: hidden;
495
  text-overflow: ellipsis;
496
  }
 
497
  .ui-dialog .ui-dialog-titlebar-close {
498
  position: absolute;
499
  right: .3em;
@@ -503,6 +582,7 @@ button.ui-button::-moz-focus-inner {
503
  padding: 1px;
504
  height: 20px;
505
  }
 
506
  .ui-dialog .ui-dialog-content {
507
  position: relative;
508
  border: 0;
@@ -510,6 +590,7 @@ button.ui-button::-moz-focus-inner {
510
  background: none;
511
  overflow: auto;
512
  }
 
513
  .ui-dialog .ui-dialog-buttonpane {
514
  text-align: left;
515
  border-width: 1px 0 0 0;
@@ -517,13 +598,16 @@ button.ui-button::-moz-focus-inner {
517
  margin-top: .5em;
518
  padding: .3em 1em .5em .4em;
519
  }
 
520
  .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
521
  float: right;
522
  }
 
523
  .ui-dialog .ui-dialog-buttonpane button {
524
  margin: .5em .4em .5em 0;
525
  cursor: pointer;
526
  }
 
527
  .ui-dialog .ui-resizable-se {
528
  width: 12px;
529
  height: 12px;
@@ -531,9 +615,11 @@ button.ui-button::-moz-focus-inner {
531
  bottom: -5px;
532
  background-position: 16px 16px;
533
  }
 
534
  .ui-draggable .ui-dialog-titlebar {
535
  cursor: move;
536
  }
 
537
  .ui-menu {
538
  list-style: none;
539
  padding: 0;
@@ -541,9 +627,11 @@ button.ui-button::-moz-focus-inner {
541
  display: block;
542
  outline: none;
543
  }
 
544
  .ui-menu .ui-menu {
545
  position: absolute;
546
  }
 
547
  .ui-menu .ui-menu-item {
548
  position: relative;
549
  margin: 0;
@@ -553,6 +641,7 @@ button.ui-button::-moz-focus-inner {
553
  /* support: IE10, see #8844 */
554
  list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
555
  }
 
556
  .ui-menu .ui-menu-divider {
557
  margin: 5px 0;
558
  height: 0;
@@ -560,6 +649,7 @@ button.ui-button::-moz-focus-inner {
560
  line-height: 0;
561
  border-width: 1px 0 0 0;
562
  }
 
563
  .ui-menu .ui-state-focus,
564
  .ui-menu .ui-state-active {
565
  margin: -1px;
@@ -569,6 +659,7 @@ button.ui-button::-moz-focus-inner {
569
  .ui-menu-icons {
570
  position: relative;
571
  }
 
572
  .ui-menu-icons .ui-menu-item {
573
  padding-left: 2em;
574
  }
@@ -587,24 +678,29 @@ button.ui-button::-moz-focus-inner {
587
  left: auto;
588
  right: 0;
589
  }
 
590
  .ui-progressbar {
591
  height: 2em;
592
  text-align: left;
593
  overflow: hidden;
594
  }
 
595
  .ui-progressbar .ui-progressbar-value {
596
  margin: -1px;
597
  height: 100%;
598
  }
 
599
  .ui-progressbar .ui-progressbar-overlay {
600
  background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
601
  height: 100%;
602
  filter: alpha(opacity=25); /* support: IE8 */
603
  opacity: 0.25;
604
  }
 
605
  .ui-progressbar-indeterminate .ui-progressbar-value {
606
  background-image: none;
607
  }
 
608
  .ui-selectmenu-menu {
609
  padding: 0;
610
  margin: 0;
@@ -613,12 +709,14 @@ button.ui-button::-moz-focus-inner {
613
  left: 0;
614
  display: none;
615
  }
 
616
  .ui-selectmenu-menu .ui-menu {
617
  overflow: auto;
618
  /* Support: IE7 */
619
  overflow-x: hidden;
620
  padding-bottom: 1px;
621
  }
 
622
  .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
623
  font-size: 1em;
624
  font-weight: bold;
@@ -628,9 +726,11 @@ button.ui-button::-moz-focus-inner {
628
  height: auto;
629
  border: 0;
630
  }
 
631
  .ui-selectmenu-open {
632
  display: block;
633
  }
 
634
  .ui-selectmenu-button {
635
  display: inline-block;
636
  overflow: hidden;
@@ -638,6 +738,7 @@ button.ui-button::-moz-focus-inner {
638
  text-decoration: none;
639
  cursor: pointer;
640
  }
 
641
  .ui-selectmenu-button span.ui-icon {
642
  right: 0.5em;
643
  left: auto;
@@ -645,6 +746,7 @@ button.ui-button::-moz-focus-inner {
645
  position: absolute;
646
  top: 50%;
647
  }
 
648
  .ui-selectmenu-button span.ui-selectmenu-text {
649
  text-align: left;
650
  padding: 0.4em 2.1em 0.4em 1em;
@@ -654,10 +756,12 @@ button.ui-button::-moz-focus-inner {
654
  text-overflow: ellipsis;
655
  white-space: nowrap;
656
  }
 
657
  .ui-slider {
658
  position: relative;
659
  text-align: left;
660
  }
 
661
  .ui-slider .ui-slider-handle {
662
  position: absolute;
663
  z-index: 2;
@@ -667,6 +771,7 @@ button.ui-button::-moz-focus-inner {
667
  -ms-touch-action: none;
668
  touch-action: none;
669
  }
 
670
  .ui-slider .ui-slider-range {
671
  position: absolute;
672
  z-index: 1;
@@ -685,17 +790,21 @@ button.ui-button::-moz-focus-inner {
685
  .ui-slider-horizontal {
686
  height: .8em;
687
  }
 
688
  .ui-slider-horizontal .ui-slider-handle {
689
  top: -.3em;
690
  margin-left: -.6em;
691
  }
 
692
  .ui-slider-horizontal .ui-slider-range {
693
  top: 0;
694
  height: 100%;
695
  }
 
696
  .ui-slider-horizontal .ui-slider-range-min {
697
  left: 0;
698
  }
 
699
  .ui-slider-horizontal .ui-slider-range-max {
700
  right: 0;
701
  }
@@ -704,21 +813,26 @@ button.ui-button::-moz-focus-inner {
704
  width: .8em;
705
  height: 100px;
706
  }
 
707
  .ui-slider-vertical .ui-slider-handle {
708
  left: -.3em;
709
  margin-left: 0;
710
  margin-bottom: -.6em;
711
  }
 
712
  .ui-slider-vertical .ui-slider-range {
713
  left: 0;
714
  width: 100%;
715
  }
 
716
  .ui-slider-vertical .ui-slider-range-min {
717
  bottom: 0;
718
  }
 
719
  .ui-slider-vertical .ui-slider-range-max {
720
  top: 0;
721
  }
 
722
  .ui-spinner {
723
  position: relative;
724
  display: inline-block;
@@ -726,6 +840,7 @@ button.ui-button::-moz-focus-inner {
726
  padding: 0;
727
  vertical-align: middle;
728
  }
 
729
  .ui-spinner-input {
730
  border: none;
731
  background: none;
@@ -736,6 +851,7 @@ button.ui-button::-moz-focus-inner {
736
  margin-left: .4em;
737
  margin-right: 22px;
738
  }
 
739
  .ui-spinner-button {
740
  width: 16px;
741
  height: 50%;
@@ -749,12 +865,14 @@ button.ui-button::-moz-focus-inner {
749
  overflow: hidden;
750
  right: 0;
751
  }
 
752
  /* more specificity required here to override default borders */
753
  .ui-spinner a.ui-spinner-button {
754
  border-top: none;
755
  border-bottom: none;
756
  border-right: none;
757
  }
 
758
  /* vertically center icon */
759
  .ui-spinner .ui-icon {
760
  position: absolute;
@@ -762,9 +880,11 @@ button.ui-button::-moz-focus-inner {
762
  top: 50%;
763
  left: 0;
764
  }
 
765
  .ui-spinner-up {
766
  top: 0;
767
  }
 
768
  .ui-spinner-down {
769
  bottom: 0;
770
  }
@@ -774,14 +894,17 @@ button.ui-button::-moz-focus-inner {
774
  /* need to fix icons sprite */
775
  background-position: -65px -16px;
776
  }
 
777
  .ui-tabs {
778
  position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
779
  padding: .2em;
780
  }
 
781
  .ui-tabs .ui-tabs-nav {
782
  margin: 0;
783
  padding: .2em .2em 0;
784
  }
 
785
  .ui-tabs .ui-tabs-nav li {
786
  list-style: none;
787
  float: left;
@@ -792,37 +915,44 @@ button.ui-button::-moz-focus-inner {
792
  padding: 0;
793
  white-space: nowrap;
794
  }
 
795
  .ui-tabs .ui-tabs-nav .ui-tabs-anchor {
796
  float: left;
797
  padding: .5em 1em;
798
  text-decoration: none;
799
  }
 
800
  .ui-tabs .ui-tabs-nav li.ui-tabs-active {
801
  margin-bottom: -1px;
802
  padding-bottom: 1px;
803
  }
 
804
  .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
805
  .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
806
  .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
807
  cursor: text;
808
  }
 
809
  .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
810
  cursor: pointer;
811
  }
 
812
  .ui-tabs .ui-tabs-panel {
813
  display: block;
814
  border-width: 0;
815
  padding: 1em 1.4em;
816
  background: none;
817
  }
 
818
  .ui-tooltip {
819
  padding: 8px;
820
  position: absolute;
821
  z-index: 9999;
822
  max-width: 300px;
823
- -webkit-box-shadow: 0 0 5px #aaa;
824
- box-shadow: 0 0 5px #aaa;
825
  }
 
826
  body .ui-tooltip {
827
  border-width: 2px;
828
  }
@@ -830,35 +960,41 @@ body .ui-tooltip {
830
  /* Component containers
831
  ----------------------------------*/
832
  .ui-widget {
833
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
834
  font-size: 1.1em;
835
  }
 
836
  .ui-widget .ui-widget {
837
  font-size: 1em;
838
  }
 
839
  .ui-widget input,
840
  .ui-widget select,
841
  .ui-widget textarea,
842
  .ui-widget button {
843
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
844
  font-size: 1em;
845
  }
 
846
  .ui-widget-content {
847
- border: 1px solid #dddddd;
848
- background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
849
- color: #333333;
850
  }
 
851
  .ui-widget-content a {
852
- color: #333333;
853
  }
 
854
  .ui-widget-header {
855
- border: 1px solid #e78f08;
856
- background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
857
- color: #ffffff;
858
  font-weight: bold;
859
  }
 
860
  .ui-widget-header a {
861
- color: #ffffff;
862
  }
863
 
864
  /* Interaction states
@@ -866,28 +1002,31 @@ body .ui-tooltip {
866
  .ui-state-default,
867
  .ui-widget-content .ui-state-default,
868
  .ui-widget-header .ui-state-default {
869
- border: 1px solid #cccccc;
870
- background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
871
  font-weight: bold;
872
- color: #1c94c4;
873
  }
 
874
  .ui-state-default a,
875
  .ui-state-default a:link,
876
  .ui-state-default a:visited {
877
- color: #1c94c4;
878
  text-decoration: none;
879
  }
 
880
  .ui-state-hover,
881
  .ui-widget-content .ui-state-hover,
882
  .ui-widget-header .ui-state-hover,
883
  .ui-state-focus,
884
  .ui-widget-content .ui-state-focus,
885
  .ui-widget-header .ui-state-focus {
886
- border: 1px solid #fbcb09;
887
- background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
888
  font-weight: bold;
889
- color: #c77405;
890
  }
 
891
  .ui-state-hover a,
892
  .ui-state-hover a:hover,
893
  .ui-state-hover a:link,
@@ -896,21 +1035,23 @@ body .ui-tooltip {
896
  .ui-state-focus a:hover,
897
  .ui-state-focus a:link,
898
  .ui-state-focus a:visited {
899
- color: #c77405;
900
  text-decoration: none;
901
  }
 
902
  .ui-state-active,
903
  .ui-widget-content .ui-state-active,
904
  .ui-widget-header .ui-state-active {
905
- border: 1px solid #fbd850;
906
- background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
907
  font-weight: bold;
908
- color: #eb8f00;
909
  }
 
910
  .ui-state-active a,
911
  .ui-state-active a:link,
912
  .ui-state-active a:visited {
913
- color: #eb8f00;
914
  text-decoration: none;
915
  }
916
 
@@ -919,53 +1060,61 @@ body .ui-tooltip {
919
  .ui-state-highlight,
920
  .ui-widget-content .ui-state-highlight,
921
  .ui-widget-header .ui-state-highlight {
922
- border: 1px solid #fed22f;
923
- background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
924
  color: #363636;
925
  }
 
926
  .ui-state-highlight a,
927
  .ui-widget-content .ui-state-highlight a,
928
  .ui-widget-header .ui-state-highlight a {
929
  color: #363636;
930
  }
 
931
  .ui-state-error,
932
  .ui-widget-content .ui-state-error,
933
  .ui-widget-header .ui-state-error {
934
- border: 1px solid #cd0a0a;
935
- background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
936
- color: #ffffff;
937
  }
 
938
  .ui-state-error a,
939
  .ui-widget-content .ui-state-error a,
940
  .ui-widget-header .ui-state-error a {
941
- color: #ffffff;
942
  }
 
943
  .ui-state-error-text,
944
  .ui-widget-content .ui-state-error-text,
945
  .ui-widget-header .ui-state-error-text {
946
- color: #ffffff;
947
  }
 
948
  .ui-priority-primary,
949
  .ui-widget-content .ui-priority-primary,
950
  .ui-widget-header .ui-priority-primary {
951
  font-weight: bold;
952
  }
 
953
  .ui-priority-secondary,
954
  .ui-widget-content .ui-priority-secondary,
955
  .ui-widget-header .ui-priority-secondary {
956
- opacity: .7;
957
- filter:Alpha(Opacity=70); /* support: IE8 */
958
  font-weight: normal;
959
  }
 
960
  .ui-state-disabled,
961
  .ui-widget-content .ui-state-disabled,
962
  .ui-widget-header .ui-state-disabled {
963
- opacity: .35;
964
- filter:Alpha(Opacity=35); /* support: IE8 */
965
  background-image: none;
966
  }
 
967
  .ui-state-disabled .ui-icon {
968
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
969
  }
970
 
971
  /* Icons
@@ -976,250 +1125,784 @@ body .ui-tooltip {
976
  width: 16px;
977
  height: 16px;
978
  }
 
979
  .ui-icon,
980
  .ui-widget-content .ui-icon {
981
  background-image: url("images/ui-icons_222222_256x240.png");
982
  }
 
983
  .ui-widget-header .ui-icon {
984
  background-image: url("images/ui-icons_ffffff_256x240.png");
985
  }
 
986
  .ui-state-default .ui-icon {
987
  background-image: url("images/ui-icons_ef8c08_256x240.png");
988
  }
 
989
  .ui-state-hover .ui-icon,
990
  .ui-state-focus .ui-icon {
991
  background-image: url("images/ui-icons_ef8c08_256x240.png");
992
  }
 
993
  .ui-state-active .ui-icon {
994
  background-image: url("images/ui-icons_ef8c08_256x240.png");
995
  }
 
996
  .ui-state-highlight .ui-icon {
997
  background-image: url("images/ui-icons_228ef1_256x240.png");
998
  }
 
999
  .ui-state-error .ui-icon,
1000
  .ui-state-error-text .ui-icon {
1001
  background-image: url("images/ui-icons_ffd27a_256x240.png");
1002
  }
1003
 
1004
  /* positioning */
1005
- .ui-icon-blank { background-position: 16px 16px; }
1006
- .ui-icon-carat-1-n { background-position: 0 0; }
1007
- .ui-icon-carat-1-ne { background-position: -16px 0; }
1008
- .ui-icon-carat-1-e { background-position: -32px 0; }
1009
- .ui-icon-carat-1-se { background-position: -48px 0; }
1010
- .ui-icon-carat-1-s { background-position: -64px 0; }
1011
- .ui-icon-carat-1-sw { background-position: -80px 0; }
1012
- .ui-icon-carat-1-w { background-position: -96px 0; }
1013
- .ui-icon-carat-1-nw { background-position: -112px 0; }
1014
- .ui-icon-carat-2-n-s { background-position: -128px 0; }
1015
- .ui-icon-carat-2-e-w { background-position: -144px 0; }
1016
- .ui-icon-triangle-1-n { background-position: 0 -16px; }
1017
- .ui-icon-triangle-1-ne { background-position: -16px -16px; }
1018
- .ui-icon-triangle-1-e { background-position: -32px -16px; }
1019
- .ui-icon-triangle-1-se { background-position: -48px -16px; }
1020
- .ui-icon-triangle-1-s { background-position: -64px -16px; }
1021
- .ui-icon-triangle-1-sw { background-position: -80px -16px; }
1022
- .ui-icon-triangle-1-w { background-position: -96px -16px; }
1023
- .ui-icon-triangle-1-nw { background-position: -112px -16px; }
1024
- .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
1025
- .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
1026
- .ui-icon-arrow-1-n { background-position: 0 -32px; }
1027
- .ui-icon-arrow-1-ne { background-position: -16px -32px; }
1028
- .ui-icon-arrow-1-e { background-position: -32px -32px; }
1029
- .ui-icon-arrow-1-se { background-position: -48px -32px; }
1030
- .ui-icon-arrow-1-s { background-position: -64px -32px; }
1031
- .ui-icon-arrow-1-sw { background-position: -80px -32px; }
1032
- .ui-icon-arrow-1-w { background-position: -96px -32px; }
1033
- .ui-icon-arrow-1-nw { background-position: -112px -32px; }
1034
- .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
1035
- .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
1036
- .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
1037
- .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
1038
- .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
1039
- .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
1040
- .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
1041
- .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
1042
- .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
1043
- .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
1044
- .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
1045
- .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
1046
- .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
1047
- .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
1048
- .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
1049
- .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
1050
- .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
1051
- .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
1052
- .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
1053
- .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
1054
- .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
1055
- .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
1056
- .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
1057
- .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
1058
- .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
1059
- .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
1060
- .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
1061
- .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
1062
- .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
1063
- .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
1064
- .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
1065
- .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
1066
- .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
1067
- .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
1068
- .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
1069
- .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
1070
- .ui-icon-arrow-4 { background-position: 0 -80px; }
1071
- .ui-icon-arrow-4-diag { background-position: -16px -80px; }
1072
- .ui-icon-extlink { background-position: -32px -80px; }
1073
- .ui-icon-newwin { background-position: -48px -80px; }
1074
- .ui-icon-refresh { background-position: -64px -80px; }
1075
- .ui-icon-shuffle { background-position: -80px -80px; }
1076
- .ui-icon-transfer-e-w { background-position: -96px -80px; }
1077
- .ui-icon-transferthick-e-w { background-position: -112px -80px; }
1078
- .ui-icon-folder-collapsed { background-position: 0 -96px; }
1079
- .ui-icon-folder-open { background-position: -16px -96px; }
1080
- .ui-icon-document { background-position: -32px -96px; }
1081
- .ui-icon-document-b { background-position: -48px -96px; }
1082
- .ui-icon-note { background-position: -64px -96px; }
1083
- .ui-icon-mail-closed { background-position: -80px -96px; }
1084
- .ui-icon-mail-open { background-position: -96px -96px; }
1085
- .ui-icon-suitcase { background-position: -112px -96px; }
1086
- .ui-icon-comment { background-position: -128px -96px; }
1087
- .ui-icon-person { background-position: -144px -96px; }
1088
- .ui-icon-print { background-position: -160px -96px; }
1089
- .ui-icon-trash { background-position: -176px -96px; }
1090
- .ui-icon-locked { background-position: -192px -96px; }
1091
- .ui-icon-unlocked { background-position: -208px -96px; }
1092
- .ui-icon-bookmark { background-position: -224px -96px; }
1093
- .ui-icon-tag { background-position: -240px -96px; }
1094
- .ui-icon-home { background-position: 0 -112px; }
1095
- .ui-icon-flag { background-position: -16px -112px; }
1096
- .ui-icon-calendar { background-position: -32px -112px; }
1097
- .ui-icon-cart { background-position: -48px -112px; }
1098
- .ui-icon-pencil { background-position: -64px -112px; }
1099
- .ui-icon-clock { background-position: -80px -112px; }
1100
- .ui-icon-disk { background-position: -96px -112px; }
1101
- .ui-icon-calculator { background-position: -112px -112px; }
1102
- .ui-icon-zoomin { background-position: -128px -112px; }
1103
- .ui-icon-zoomout { background-position: -144px -112px; }
1104
- .ui-icon-search { background-position: -160px -112px; }
1105
- .ui-icon-wrench { background-position: -176px -112px; }
1106
- .ui-icon-gear { background-position: -192px -112px; }
1107
- .ui-icon-heart { background-position: -208px -112px; }
1108
- .ui-icon-star { background-position: -224px -112px; }
1109
- .ui-icon-link { background-position: -240px -112px; }
1110
- .ui-icon-cancel { background-position: 0 -128px; }
1111
- .ui-icon-plus { background-position: -16px -128px; }
1112
- .ui-icon-plusthick { background-position: -32px -128px; }
1113
- .ui-icon-minus { background-position: -48px -128px; }
1114
- .ui-icon-minusthick { background-position: -64px -128px; }
1115
- .ui-icon-close { background-position: -80px -128px; }
1116
- .ui-icon-closethick { background-position: -96px -128px; }
1117
- .ui-icon-key { background-position: -112px -128px; }
1118
- .ui-icon-lightbulb { background-position: -128px -128px; }
1119
- .ui-icon-scissors { background-position: -144px -128px; }
1120
- .ui-icon-clipboard { background-position: -160px -128px; }
1121
- .ui-icon-copy { background-position: -176px -128px; }
1122
- .ui-icon-contact { background-position: -192px -128px; }
1123
- .ui-icon-image { background-position: -208px -128px; }
1124
- .ui-icon-video { background-position: -224px -128px; }
1125
- .ui-icon-script { background-position: -240px -128px; }
1126
- .ui-icon-alert { background-position: 0 -144px; }
1127
- .ui-icon-info { background-position: -16px -144px; }
1128
- .ui-icon-notice { background-position: -32px -144px; }
1129
- .ui-icon-help { background-position: -48px -144px; }
1130
- .ui-icon-check { background-position: -64px -144px; }
1131
- .ui-icon-bullet { background-position: -80px -144px; }
1132
- .ui-icon-radio-on { background-position: -96px -144px; }
1133
- .ui-icon-radio-off { background-position: -112px -144px; }
1134
- .ui-icon-pin-w { background-position: -128px -144px; }
1135
- .ui-icon-pin-s { background-position: -144px -144px; }
1136
- .ui-icon-play { background-position: 0 -160px; }
1137
- .ui-icon-pause { background-position: -16px -160px; }
1138
- .ui-icon-seek-next { background-position: -32px -160px; }
1139
- .ui-icon-seek-prev { background-position: -48px -160px; }
1140
- .ui-icon-seek-end { background-position: -64px -160px; }
1141
- .ui-icon-seek-start { background-position: -80px -160px; }
1142
- /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
1143
- .ui-icon-seek-first { background-position: -80px -160px; }
1144
- .ui-icon-stop { background-position: -96px -160px; }
1145
- .ui-icon-eject { background-position: -112px -160px; }
1146
- .ui-icon-volume-off { background-position: -128px -160px; }
1147
- .ui-icon-volume-on { background-position: -144px -160px; }
1148
- .ui-icon-power { background-position: 0 -176px; }
1149
- .ui-icon-signal-diag { background-position: -16px -176px; }
1150
- .ui-icon-signal { background-position: -32px -176px; }
1151
- .ui-icon-battery-0 { background-position: -48px -176px; }
1152
- .ui-icon-battery-1 { background-position: -64px -176px; }
1153
- .ui-icon-battery-2 { background-position: -80px -176px; }
1154
- .ui-icon-battery-3 { background-position: -96px -176px; }
1155
- .ui-icon-circle-plus { background-position: 0 -192px; }
1156
- .ui-icon-circle-minus { background-position: -16px -192px; }
1157
- .ui-icon-circle-close { background-position: -32px -192px; }
1158
- .ui-icon-circle-triangle-e { background-position: -48px -192px; }
1159
- .ui-icon-circle-triangle-s { background-position: -64px -192px; }
1160
- .ui-icon-circle-triangle-w { background-position: -80px -192px; }
1161
- .ui-icon-circle-triangle-n { background-position: -96px -192px; }
1162
- .ui-icon-circle-arrow-e { background-position: -112px -192px; }
1163
- .ui-icon-circle-arrow-s { background-position: -128px -192px; }
1164
- .ui-icon-circle-arrow-w { background-position: -144px -192px; }
1165
- .ui-icon-circle-arrow-n { background-position: -160px -192px; }
1166
- .ui-icon-circle-zoomin { background-position: -176px -192px; }
1167
- .ui-icon-circle-zoomout { background-position: -192px -192px; }
1168
- .ui-icon-circle-check { background-position: -208px -192px; }
1169
- .ui-icon-circlesmall-plus { background-position: 0 -208px; }
1170
- .ui-icon-circlesmall-minus { background-position: -16px -208px; }
1171
- .ui-icon-circlesmall-close { background-position: -32px -208px; }
1172
- .ui-icon-squaresmall-plus { background-position: -48px -208px; }
1173
- .ui-icon-squaresmall-minus { background-position: -64px -208px; }
1174
- .ui-icon-squaresmall-close { background-position: -80px -208px; }
1175
- .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
1176
- .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
1177
- .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
1178
- .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
1179
- .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
1180
- .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
1181
 
 
 
 
1182
 
1183
- /* Misc visuals
1184
- ----------------------------------*/
 
1185
 
1186
- /* Corner radius */
1187
- .ui-corner-all,
1188
- .ui-corner-top,
1189
- .ui-corner-left,
1190
- .ui-corner-tl {
1191
- border-top-left-radius: 4px;
1192
  }
1193
- .ui-corner-all,
1194
- .ui-corner-top,
1195
- .ui-corner-right,
1196
- .ui-corner-tr {
1197
- border-top-right-radius: 4px;
1198
  }
1199
- .ui-corner-all,
1200
- .ui-corner-bottom,
1201
- .ui-corner-left,
1202
- .ui-corner-bl {
1203
- border-bottom-left-radius: 4px;
1204
  }
1205
- .ui-corner-all,
1206
- .ui-corner-bottom,
1207
- .ui-corner-right,
1208
- .ui-corner-br {
1209
- border-bottom-right-radius: 4px;
1210
  }
1211
 
1212
- /* Overlays */
1213
- .ui-widget-overlay {
1214
- background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
1215
- opacity: .5;
1216
- filter: Alpha(Opacity=50); /* support: IE8 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1217
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1218
  .ui-widget-shadow {
1219
  margin: -5px 0 0 -5px;
1220
  padding: 5px;
1221
- background: #000000;
1222
- opacity: .2;
1223
- filter: Alpha(Opacity=20); /* support: IE8 */
1224
  border-radius: 5px;
1225
  }
9
  .ui-helper-hidden {
10
  display: none;
11
  }
12
+
13
  .ui-helper-hidden-accessible {
14
  border: 0;
15
  clip: rect(0 0 0 0);
20
  position: absolute;
21
  width: 1px;
22
  }
23
+
24
  .ui-helper-reset {
25
  margin: 0;
26
  padding: 0;
31
  font-size: 100%;
32
  list-style: none;
33
  }
34
+
35
  .ui-helper-clearfix:before,
36
  .ui-helper-clearfix:after {
37
  content: "";
38
  display: table;
39
  border-collapse: collapse;
40
  }
41
+
42
  .ui-helper-clearfix:after {
43
  clear: both;
44
  }
45
+
46
  .ui-helper-clearfix {
47
  min-height: 0; /* support: IE7 */
48
  }
49
+
50
  .ui-helper-zfix {
51
  width: 100%;
52
  height: 100%;
54
  left: 0;
55
  position: absolute;
56
  opacity: 0;
57
+ filter: alpha(opacity=0); /* support: IE8 */
58
  }
59
 
60
  .ui-front {
61
  z-index: 100;
62
  }
63
 
 
64
  /* Interaction Cues
65
  ----------------------------------*/
66
  .ui-state-disabled {
67
  cursor: default !important;
68
  }
69
 
 
70
  /* Icons
71
  ----------------------------------*/
72
 
78
  background-repeat: no-repeat;
79
  }
80
 
 
81
  /* Misc visuals
82
  ----------------------------------*/
83
 
89
  width: 100%;
90
  height: 100%;
91
  }
92
+
93
  .ui-draggable-handle {
94
  -ms-touch-action: none;
95
  touch-action: none;
96
  }
97
+
98
  .ui-resizable {
99
  position: relative;
100
  }
101
+
102
  .ui-resizable-handle {
103
  position: absolute;
104
  font-size: 0.1px;
106
  -ms-touch-action: none;
107
  touch-action: none;
108
  }
109
+
110
  .ui-resizable-disabled .ui-resizable-handle,
111
  .ui-resizable-autohide .ui-resizable-handle {
112
  display: none;
113
  }
114
+
115
  .ui-resizable-n {
116
  cursor: n-resize;
117
  height: 7px;
119
  top: -5px;
120
  left: 0;
121
  }
122
+
123
  .ui-resizable-s {
124
  cursor: s-resize;
125
  height: 7px;
127
  bottom: -5px;
128
  left: 0;
129
  }
130
+
131
  .ui-resizable-e {
132
  cursor: e-resize;
133
  width: 7px;
135
  top: 0;
136
  height: 100%;
137
  }
138
+
139
  .ui-resizable-w {
140
  cursor: w-resize;
141
  width: 7px;
143
  top: 0;
144
  height: 100%;
145
  }
146
+
147
  .ui-resizable-se {
148
  cursor: se-resize;
149
  width: 12px;
151
  right: 1px;
152
  bottom: 1px;
153
  }
154
+
155
  .ui-resizable-sw {
156
  cursor: sw-resize;
157
  width: 9px;
159
  left: -5px;
160
  bottom: -5px;
161
  }
162
+
163
  .ui-resizable-nw {
164
  cursor: nw-resize;
165
  width: 9px;
167
  left: -5px;
168
  top: -5px;
169
  }
170
+
171
  .ui-resizable-ne {
172
  cursor: ne-resize;
173
  width: 9px;
175
  right: -5px;
176
  top: -5px;
177
  }
178
+
179
  .ui-selectable {
180
  -ms-touch-action: none;
181
  touch-action: none;
182
  }
183
+
184
  .ui-selectable-helper {
185
  position: absolute;
186
  z-index: 100;
187
  border: 1px dotted black;
188
  }
189
+
190
  .ui-sortable-handle {
191
  -ms-touch-action: none;
192
  touch-action: none;
193
  }
194
+
195
  .ui-accordion .ui-accordion-header {
196
  display: block;
197
  cursor: pointer;
201
  min-height: 0; /* support: IE7 */
202
  font-size: 100%;
203
  }
204
+
205
  .ui-accordion .ui-accordion-icons {
206
  padding-left: 2.2em;
207
  }
208
+
209
  .ui-accordion .ui-accordion-icons .ui-accordion-icons {
210
  padding-left: 2.2em;
211
  }
212
+
213
  .ui-accordion .ui-accordion-header .ui-accordion-header-icon {
214
  position: absolute;
215
  left: .5em;
216
  top: 50%;
217
  margin-top: -8px;
218
  }
219
+
220
  .ui-accordion .ui-accordion-content {
221
  padding: 1em 2.2em;
222
  border-top: 0;
223
  overflow: auto;
224
  }
225
+
226
  .ui-autocomplete {
227
  position: absolute;
228
  top: 0;
229
  left: 0;
230
  cursor: default;
231
  }
232
+
233
  .ui-button {
234
  display: inline-block;
235
  position: relative;
241
  text-align: center;
242
  overflow: visible; /* removes extra width in IE */
243
  }
244
+
245
  .ui-button,
246
  .ui-button:link,
247
  .ui-button:visited,
249
  .ui-button:active {
250
  text-decoration: none;
251
  }
252
+
253
  /* to make room for the icon, a width needs to be set here */
254
  .ui-button-icon-only {
255
  width: 2.2em;
256
  }
257
+
258
  /* button elements seem to need a little more width */
259
  button.ui-button-icon-only {
260
  width: 2.4em;
261
  }
262
+
263
  .ui-button-icons-only {
264
  width: 3.4em;
265
  }
266
+
267
  button.ui-button-icons-only {
268
  width: 3.7em;
269
  }
273
  display: block;
274
  line-height: normal;
275
  }
276
+
277
  .ui-button-text-only .ui-button-text {
278
  padding: .4em 1em;
279
  }
280
+
281
  .ui-button-icon-only .ui-button-text,
282
  .ui-button-icons-only .ui-button-text {
283
  padding: .4em;
284
  text-indent: -9999999px;
285
  }
286
+
287
  .ui-button-text-icon-primary .ui-button-text,
288
  .ui-button-text-icons .ui-button-text {
289
  padding: .4em 1em .4em 2.1em;
290
  }
291
+
292
  .ui-button-text-icon-secondary .ui-button-text,
293
  .ui-button-text-icons .ui-button-text {
294
  padding: .4em 2.1em .4em 1em;
295
  }
296
+
297
  .ui-button-text-icons .ui-button-text {
298
  padding-left: 2.1em;
299
  padding-right: 2.1em;
300
  }
301
+
302
  /* no icon support for input elements, provide padding by default */
303
  input.ui-button {
304
  padding: .4em 1em;
314
  top: 50%;
315
  margin-top: -8px;
316
  }
317
+
318
  .ui-button-icon-only .ui-icon {
319
  left: 50%;
320
  margin-left: -8px;
321
  }
322
+
323
  .ui-button-text-icon-primary .ui-button-icon-primary,
324
  .ui-button-text-icons .ui-button-icon-primary,
325
  .ui-button-icons-only .ui-button-icon-primary {
326
  left: .5em;
327
  }
328
+
329
  .ui-button-text-icon-secondary .ui-button-icon-secondary,
330
  .ui-button-text-icons .ui-button-icon-secondary,
331
  .ui-button-icons-only .ui-button-icon-secondary {
336
  .ui-buttonset {
337
  margin-right: 7px;
338
  }
339
+
340
  .ui-buttonset .ui-button {
341
  margin-left: 0;
342
  margin-right: -.3em;
349
  border: 0;
350
  padding: 0;
351
  }
352
+
353
  .ui-datepicker {
354
  width: 17em;
355
  padding: .2em .2em 0;
356
  display: none;
357
  }
358
+
359
  .ui-datepicker .ui-datepicker-header {
360
  position: relative;
361
  padding: .2em 0;
362
  }
363
+
364
  .ui-datepicker .ui-datepicker-prev,
365
  .ui-datepicker .ui-datepicker-next {
366
  position: absolute;
368
  width: 1.8em;
369
  height: 1.8em;
370
  }
371
+
372
  .ui-datepicker .ui-datepicker-prev-hover,
373
  .ui-datepicker .ui-datepicker-next-hover {
374
  top: 1px;
375
  }
376
+
377
  .ui-datepicker .ui-datepicker-prev {
378
  left: 2px;
379
  }
380
+
381
  .ui-datepicker .ui-datepicker-next {
382
  right: 2px;
383
  }
384
+
385
  .ui-datepicker .ui-datepicker-prev-hover {
386
  left: 1px;
387
  }
388
+
389
  .ui-datepicker .ui-datepicker-next-hover {
390
  right: 1px;
391
  }
392
+
393
  .ui-datepicker .ui-datepicker-prev span,
394
  .ui-datepicker .ui-datepicker-next span {
395
  display: block;
399
  top: 50%;
400
  margin-top: -8px;
401
  }
402
+
403
  .ui-datepicker .ui-datepicker-title {
404
  margin: 0 2.3em;
405
  line-height: 1.8em;
406
  text-align: center;
407
  }
408
+
409
  .ui-datepicker .ui-datepicker-title select {
410
  font-size: 1em;
411
  margin: 1px 0;
412
  }
413
+
414
  .ui-datepicker select.ui-datepicker-month,
415
  .ui-datepicker select.ui-datepicker-year {
416
  width: 45%;
417
  }
418
+
419
  .ui-datepicker table {
420
  width: 100%;
421
  font-size: .9em;
422
  border-collapse: collapse;
423
  margin: 0 0 .4em;
424
  }
425
+
426
  .ui-datepicker th {
427
  padding: .7em .3em;
428
  text-align: center;
429
  font-weight: bold;
430
  border: 0;
431
  }
432
+
433
  .ui-datepicker td {
434
  border: 0;
435
  padding: 1px;
436
  }
437
+
438
  .ui-datepicker td span,
439
  .ui-datepicker td a {
440
  display: block;
442
  text-align: right;
443
  text-decoration: none;
444
  }
445
+
446
  .ui-datepicker .ui-datepicker-buttonpane {
447
  background-image: none;
448
  margin: .7em 0 0 0;
451
  border-right: 0;
452
  border-bottom: 0;
453
  }
454
+
455
  .ui-datepicker .ui-datepicker-buttonpane button {
456
  float: right;
457
  margin: .5em .2em .4em;
460
  width: auto;
461
  overflow: visible;
462
  }
463
+
464
  .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
465
  float: left;
466
  }
469
  .ui-datepicker.ui-datepicker-multi {
470
  width: auto;
471
  }
472
+
473
  .ui-datepicker-multi .ui-datepicker-group {
474
  float: left;
475
  }
476
+
477
  .ui-datepicker-multi .ui-datepicker-group table {
478
  width: 95%;
479
  margin: 0 auto .4em;
480
  }
481
+
482
  .ui-datepicker-multi-2 .ui-datepicker-group {
483
  width: 50%;
484
  }
485
+
486
  .ui-datepicker-multi-3 .ui-datepicker-group {
487
  width: 33.3%;
488
  }
489
+
490
  .ui-datepicker-multi-4 .ui-datepicker-group {
491
  width: 25%;
492
  }
493
+
494
  .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
495
  .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
496
  border-left-width: 0;
497
  }
498
+
499
  .ui-datepicker-multi .ui-datepicker-buttonpane {
500
  clear: left;
501
  }
502
+
503
  .ui-datepicker-row-break {
504
  clear: both;
505
  width: 100%;
510
  .ui-datepicker-rtl {
511
  direction: rtl;
512
  }
513
+
514
  .ui-datepicker-rtl .ui-datepicker-prev {
515
  right: 2px;
516
  left: auto;
517
  }
518
+
519
  .ui-datepicker-rtl .ui-datepicker-next {
520
  left: 2px;
521
  right: auto;
522
  }
523
+
524
  .ui-datepicker-rtl .ui-datepicker-prev:hover {
525
  right: 1px;
526
  left: auto;
527
  }
528
+
529
  .ui-datepicker-rtl .ui-datepicker-next:hover {
530
  left: 1px;
531
  right: auto;
532
  }
533
+
534
  .ui-datepicker-rtl .ui-datepicker-buttonpane {
535
  clear: right;
536
  }
537
+
538
  .ui-datepicker-rtl .ui-datepicker-buttonpane button {
539
  float: left;
540
  }
541
+
542
  .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
543
  .ui-datepicker-rtl .ui-datepicker-group {
544
  float: right;
545
  }
546
+
547
  .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
548
  .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
549
  border-right-width: 0;
550
  border-left-width: 1px;
551
  }
552
+
553
  .ui-dialog {
554
  overflow: hidden;
555
  position: absolute;
558
  padding: .2em;
559
  outline: 0;
560
  }
561
+
562
  .ui-dialog .ui-dialog-titlebar {
563
  padding: .4em 1em;
564
  position: relative;
565
  }
566
+
567
  .ui-dialog .ui-dialog-title {
568
  float: left;
569
  margin: .1em 0;
572
  overflow: hidden;
573
  text-overflow: ellipsis;
574
  }
575
+
576
  .ui-dialog .ui-dialog-titlebar-close {
577
  position: absolute;
578
  right: .3em;
582
  padding: 1px;
583
  height: 20px;
584
  }
585
+
586
  .ui-dialog .ui-dialog-content {
587
  position: relative;
588
  border: 0;
590
  background: none;
591
  overflow: auto;
592
  }
593
+
594
  .ui-dialog .ui-dialog-buttonpane {
595
  text-align: left;
596
  border-width: 1px 0 0 0;
598
  margin-top: .5em;
599
  padding: .3em 1em .5em .4em;
600
  }
601
+
602
  .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
603
  float: right;
604
  }
605
+
606
  .ui-dialog .ui-dialog-buttonpane button {
607
  margin: .5em .4em .5em 0;
608
  cursor: pointer;
609
  }
610
+
611
  .ui-dialog .ui-resizable-se {
612
  width: 12px;
613
  height: 12px;
615
  bottom: -5px;
616
  background-position: 16px 16px;
617
  }
618
+
619
  .ui-draggable .ui-dialog-titlebar {
620
  cursor: move;
621
  }
622
+
623
  .ui-menu {
624
  list-style: none;
625
  padding: 0;
627
  display: block;
628
  outline: none;
629
  }
630
+
631
  .ui-menu .ui-menu {
632
  position: absolute;
633
  }
634
+
635
  .ui-menu .ui-menu-item {
636
  position: relative;
637
  margin: 0;
641
  /* support: IE10, see #8844 */
642
  list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
643
  }
644
+
645
  .ui-menu .ui-menu-divider {
646
  margin: 5px 0;
647
  height: 0;
649
  line-height: 0;
650
  border-width: 1px 0 0 0;
651
  }
652
+
653
  .ui-menu .ui-state-focus,
654
  .ui-menu .ui-state-active {
655
  margin: -1px;
659
  .ui-menu-icons {
660
  position: relative;
661
  }
662
+
663
  .ui-menu-icons .ui-menu-item {
664
  padding-left: 2em;
665
  }
678
  left: auto;
679
  right: 0;
680
  }
681
+
682
  .ui-progressbar {
683
  height: 2em;
684
  text-align: left;
685
  overflow: hidden;
686
  }
687
+
688
  .ui-progressbar .ui-progressbar-value {
689
  margin: -1px;
690
  height: 100%;
691
  }
692
+
693
  .ui-progressbar .ui-progressbar-overlay {
694
  background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
695
  height: 100%;
696
  filter: alpha(opacity=25); /* support: IE8 */
697
  opacity: 0.25;
698
  }
699
+
700
  .ui-progressbar-indeterminate .ui-progressbar-value {
701
  background-image: none;
702
  }
703
+
704
  .ui-selectmenu-menu {
705
  padding: 0;
706
  margin: 0;
709
  left: 0;
710
  display: none;
711
  }
712
+
713
  .ui-selectmenu-menu .ui-menu {
714
  overflow: auto;
715
  /* Support: IE7 */
716
  overflow-x: hidden;
717
  padding-bottom: 1px;
718
  }
719
+
720
  .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
721
  font-size: 1em;
722
  font-weight: bold;
726
  height: auto;
727
  border: 0;
728
  }
729
+
730
  .ui-selectmenu-open {
731
  display: block;
732
  }
733
+
734
  .ui-selectmenu-button {
735
  display: inline-block;
736
  overflow: hidden;
738
  text-decoration: none;
739
  cursor: pointer;
740
  }
741
+
742
  .ui-selectmenu-button span.ui-icon {
743
  right: 0.5em;
744
  left: auto;
746
  position: absolute;
747
  top: 50%;
748
  }
749
+
750
  .ui-selectmenu-button span.ui-selectmenu-text {
751
  text-align: left;
752
  padding: 0.4em 2.1em 0.4em 1em;
756
  text-overflow: ellipsis;
757
  white-space: nowrap;
758
  }
759
+
760
  .ui-slider {
761
  position: relative;
762
  text-align: left;
763
  }
764
+
765
  .ui-slider .ui-slider-handle {
766
  position: absolute;
767
  z-index: 2;
771
  -ms-touch-action: none;
772
  touch-action: none;
773
  }
774
+
775
  .ui-slider .ui-slider-range {
776
  position: absolute;
777
  z-index: 1;
790
  .ui-slider-horizontal {
791
  height: .8em;
792
  }
793
+
794
  .ui-slider-horizontal .ui-slider-handle {
795
  top: -.3em;
796
  margin-left: -.6em;
797
  }
798
+
799
  .ui-slider-horizontal .ui-slider-range {
800
  top: 0;
801
  height: 100%;
802
  }
803
+
804
  .ui-slider-horizontal .ui-slider-range-min {
805
  left: 0;
806
  }
807
+
808
  .ui-slider-horizontal .ui-slider-range-max {
809
  right: 0;
810
  }
813
  width: .8em;
814
  height: 100px;
815
  }
816
+
817
  .ui-slider-vertical .ui-slider-handle {
818
  left: -.3em;
819
  margin-left: 0;
820
  margin-bottom: -.6em;
821
  }
822
+
823
  .ui-slider-vertical .ui-slider-range {
824
  left: 0;
825
  width: 100%;
826
  }
827
+
828
  .ui-slider-vertical .ui-slider-range-min {
829
  bottom: 0;
830
  }
831
+
832
  .ui-slider-vertical .ui-slider-range-max {
833
  top: 0;
834
  }
835
+
836
  .ui-spinner {
837
  position: relative;
838
  display: inline-block;
840
  padding: 0;
841
  vertical-align: middle;
842
  }
843
+
844
  .ui-spinner-input {
845
  border: none;
846
  background: none;
851
  margin-left: .4em;
852
  margin-right: 22px;
853
  }
854
+
855
  .ui-spinner-button {
856
  width: 16px;
857
  height: 50%;
865
  overflow: hidden;
866
  right: 0;
867
  }
868
+
869
  /* more specificity required here to override default borders */
870
  .ui-spinner a.ui-spinner-button {
871
  border-top: none;
872
  border-bottom: none;
873
  border-right: none;
874
  }
875
+
876
  /* vertically center icon */
877
  .ui-spinner .ui-icon {
878
  position: absolute;
880
  top: 50%;
881
  left: 0;
882
  }
883
+
884
  .ui-spinner-up {
885
  top: 0;
886
  }
887
+
888
  .ui-spinner-down {
889
  bottom: 0;
890
  }
894
  /* need to fix icons sprite */
895
  background-position: -65px -16px;
896
  }
897
+
898
  .ui-tabs {
899
  position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
900
  padding: .2em;
901
  }
902
+
903
  .ui-tabs .ui-tabs-nav {
904
  margin: 0;
905
  padding: .2em .2em 0;
906
  }
907
+
908
  .ui-tabs .ui-tabs-nav li {
909
  list-style: none;
910
  float: left;
915
  padding: 0;
916
  white-space: nowrap;
917
  }
918
+
919
  .ui-tabs .ui-tabs-nav .ui-tabs-anchor {
920
  float: left;
921
  padding: .5em 1em;
922
  text-decoration: none;
923
  }
924
+
925
  .ui-tabs .ui-tabs-nav li.ui-tabs-active {
926
  margin-bottom: -1px;
927
  padding-bottom: 1px;
928
  }
929
+
930
  .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
931
  .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
932
  .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
933
  cursor: text;
934
  }
935
+
936
  .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
937
  cursor: pointer;
938
  }
939
+
940
  .ui-tabs .ui-tabs-panel {
941
  display: block;
942
  border-width: 0;
943
  padding: 1em 1.4em;
944
  background: none;
945
  }
946
+
947
  .ui-tooltip {
948
  padding: 8px;
949
  position: absolute;
950
  z-index: 9999;
951
  max-width: 300px;
952
+ -webkit-box-shadow: 0 0 5px #AAA;
953
+ box-shadow: 0 0 5px #AAA;
954
  }
955
+
956
  body .ui-tooltip {
957
  border-width: 2px;
958
  }
960
  /* Component containers
961
  ----------------------------------*/
962
  .ui-widget {
963
+ font-family: trebuchet ms,tahoma,verdana,arial,sans-serif;
964
  font-size: 1.1em;
965
  }
966
+
967
  .ui-widget .ui-widget {
968
  font-size: 1em;
969
  }
970
+
971
  .ui-widget input,
972
  .ui-widget select,
973
  .ui-widget textarea,
974
  .ui-widget button {
975
+ font-family: trebuchet ms,tahoma,verdana,arial,sans-serif;
976
  font-size: 1em;
977
  }
978
+
979
  .ui-widget-content {
980
+ border: 1px solid #DDD;
981
+ background: #EEE url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
982
+ color: #333;
983
  }
984
+
985
  .ui-widget-content a {
986
+ color: #333;
987
  }
988
+
989
  .ui-widget-header {
990
+ border: 1px solid #E78F08;
991
+ background: #F6A828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
992
+ color: #FFF;
993
  font-weight: bold;
994
  }
995
+
996
  .ui-widget-header a {
997
+ color: #FFF;
998
  }
999
 
1000
  /* Interaction states
1002
  .ui-state-default,
1003
  .ui-widget-content .ui-state-default,
1004
  .ui-widget-header .ui-state-default {
1005
+ border: 1px solid #CCC;
1006
+ background: #F6F6F6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
1007
  font-weight: bold;
1008
+ color: #1C94C4;
1009
  }
1010
+
1011
  .ui-state-default a,
1012
  .ui-state-default a:link,
1013
  .ui-state-default a:visited {
1014
+ color: #1C94C4;
1015
  text-decoration: none;
1016
  }
1017
+
1018
  .ui-state-hover,
1019
  .ui-widget-content .ui-state-hover,
1020
  .ui-widget-header .ui-state-hover,
1021
  .ui-state-focus,
1022
  .ui-widget-content .ui-state-focus,
1023
  .ui-widget-header .ui-state-focus {
1024
+ border: 1px solid #FBCB09;
1025
+ background: #FDF5CE url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
1026
  font-weight: bold;
1027
+ color: #C77405;
1028
  }
1029
+
1030
  .ui-state-hover a,
1031
  .ui-state-hover a:hover,
1032
  .ui-state-hover a:link,
1035
  .ui-state-focus a:hover,
1036
  .ui-state-focus a:link,
1037
  .ui-state-focus a:visited {
1038
+ color: #C77405;
1039
  text-decoration: none;
1040
  }
1041
+
1042
  .ui-state-active,
1043
  .ui-widget-content .ui-state-active,
1044
  .ui-widget-header .ui-state-active {
1045
+ border: 1px solid #FBD850;
1046
+ background: #FFF url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
1047
  font-weight: bold;
1048
+ color: #EB8F00;
1049
  }
1050
+
1051
  .ui-state-active a,
1052
  .ui-state-active a:link,
1053
  .ui-state-active a:visited {
1054
+ color: #EB8F00;
1055
  text-decoration: none;
1056
  }
1057
 
1060
  .ui-state-highlight,
1061
  .ui-widget-content .ui-state-highlight,
1062
  .ui-widget-header .ui-state-highlight {
1063
+ border: 1px solid #FED22F;
1064
+ background: #FFE45C url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
1065
  color: #363636;
1066
  }
1067
+
1068
  .ui-state-highlight a,
1069
  .ui-widget-content .ui-state-highlight a,
1070
  .ui-widget-header .ui-state-highlight a {
1071
  color: #363636;
1072
  }
1073
+
1074
  .ui-state-error,
1075
  .ui-widget-content .ui-state-error,
1076
  .ui-widget-header .ui-state-error {
1077
+ border: 1px solid #CD0A0A;
1078
+ background: #B81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
1079
+ color: #FFF;
1080
  }
1081
+
1082
  .ui-state-error a,
1083
  .ui-widget-content .ui-state-error a,
1084
  .ui-widget-header .ui-state-error a {
1085
+ color: #FFF;
1086
  }
1087
+
1088
  .ui-state-error-text,
1089
  .ui-widget-content .ui-state-error-text,
1090
  .ui-widget-header .ui-state-error-text {
1091
+ color: #FFF;
1092
  }
1093
+
1094
  .ui-priority-primary,
1095
  .ui-widget-content .ui-priority-primary,
1096
  .ui-widget-header .ui-priority-primary {
1097
  font-weight: bold;
1098
  }
1099
+
1100
  .ui-priority-secondary,
1101
  .ui-widget-content .ui-priority-secondary,
1102
  .ui-widget-header .ui-priority-secondary {
1103
+ opacity: 0.7;
1104
+ filter: alpha(opacity=70); /* support: IE8 */
1105
  font-weight: normal;
1106
  }
1107
+
1108
  .ui-state-disabled,
1109
  .ui-widget-content .ui-state-disabled,
1110
  .ui-widget-header .ui-state-disabled {
1111
+ opacity: 0.35;
1112
+ filter: alpha(opacity=35); /* support: IE8 */
1113
  background-image: none;
1114
  }
1115
+
1116
  .ui-state-disabled .ui-icon {
1117
+ filter: alpha(opacity=35); /* support: IE8 - See #6059 */
1118
  }
1119
 
1120
  /* Icons
1125
  width: 16px;
1126
  height: 16px;
1127
  }
1128
+
1129
  .ui-icon,
1130
  .ui-widget-content .ui-icon {
1131
  background-image: url("images/ui-icons_222222_256x240.png");
1132
  }
1133
+
1134
  .ui-widget-header .ui-icon {
1135
  background-image: url("images/ui-icons_ffffff_256x240.png");
1136
  }
1137
+
1138
  .ui-state-default .ui-icon {
1139
  background-image: url("images/ui-icons_ef8c08_256x240.png");
1140
  }
1141
+
1142
  .ui-state-hover .ui-icon,
1143
  .ui-state-focus .ui-icon {
1144
  background-image: url("images/ui-icons_ef8c08_256x240.png");
1145
  }
1146
+
1147
  .ui-state-active .ui-icon {
1148
  background-image: url("images/ui-icons_ef8c08_256x240.png");
1149
  }
1150
+
1151
  .ui-state-highlight .ui-icon {
1152
  background-image: url("images/ui-icons_228ef1_256x240.png");
1153
  }
1154
+
1155
  .ui-state-error .ui-icon,
1156
  .ui-state-error-text .ui-icon {
1157
  background-image: url("images/ui-icons_ffd27a_256x240.png");
1158
  }
1159
 
1160
  /* positioning */
1161
+ .ui-icon-blank {
1162
+ background-position: 16px 16px;
1163
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1164
 
1165
+ .ui-icon-carat-1-n {
1166
+ background-position: 0 0;
1167
+ }
1168
 
1169
+ .ui-icon-carat-1-ne {
1170
+ background-position: -16px 0;
1171
+ }
1172
 
1173
+ .ui-icon-carat-1-e {
1174
+ background-position: -32px 0;
 
 
 
 
1175
  }
1176
+
1177
+ .ui-icon-carat-1-se {
1178
+ background-position: -48px 0;
 
 
1179
  }
1180
+
1181
+ .ui-icon-carat-1-s {
1182
+ background-position: -64px 0;
 
 
1183
  }
1184
+
1185
+ .ui-icon-carat-1-sw {
1186
+ background-position: -80px 0;
 
 
1187
  }
1188
 
1189
+ .ui-icon-carat-1-w {
1190
+ background-position: -96px 0;
1191
+ }
1192
+
1193
+ .ui-icon-carat-1-nw {
1194
+ background-position: -112px 0;
1195
+ }
1196
+
1197
+ .ui-icon-carat-2-n-s {
1198
+ background-position: -128px 0;
1199
+ }
1200
+
1201
+ .ui-icon-carat-2-e-w {
1202
+ background-position: -144px 0;
1203
+ }
1204
+
1205
+ .ui-icon-triangle-1-n {
1206
+ background-position: 0 -16px;
1207
+ }
1208
+
1209
+ .ui-icon-triangle-1-ne {
1210
+ background-position: -16px -16px;
1211
+ }
1212
+
1213
+ .ui-icon-triangle-1-e {
1214
+ background-position: -32px -16px;
1215
+ }
1216
+
1217
+ .ui-icon-triangle-1-se {
1218
+ background-position: -48px -16px;
1219
+ }
1220
+
1221
+ .ui-icon-triangle-1-s {
1222
+ background-position: -64px -16px;
1223
+ }
1224
+
1225
+ .ui-icon-triangle-1-sw {
1226
+ background-position: -80px -16px;
1227
+ }
1228
+
1229
+ .ui-icon-triangle-1-w {
1230
+ background-position: -96px -16px;
1231
+ }
1232
+
1233
+ .ui-icon-triangle-1-nw {
1234
+ background-position: -112px -16px;
1235
+ }
1236
+
1237
+ .ui-icon-triangle-2-n-s {
1238
+ background-position: -128px -16px;
1239
+ }
1240
+
1241
+ .ui-icon-triangle-2-e-w {
1242
+ background-position: -144px -16px;
1243
+ }
1244
+
1245
+ .ui-icon-arrow-1-n {
1246
+ background-position: 0 -32px;
1247
+ }
1248
+
1249
+ .ui-icon-arrow-1-ne {
1250
+ background-position: -16px -32px;
1251
+ }
1252
+
1253
+ .ui-icon-arrow-1-e {
1254
+ background-position: -32px -32px;
1255
+ }
1256
+
1257
+ .ui-icon-arrow-1-se {
1258
+ background-position: -48px -32px;
1259
+ }
1260
+
1261
+ .ui-icon-arrow-1-s {
1262
+ background-position: -64px -32px;
1263
+ }
1264
+
1265
+ .ui-icon-arrow-1-sw {
1266
+ background-position: -80px -32px;
1267
+ }
1268
+
1269
+ .ui-icon-arrow-1-w {
1270
+ background-position: -96px -32px;
1271
+ }
1272
+
1273
+ .ui-icon-arrow-1-nw {
1274
+ background-position: -112px -32px;
1275
+ }
1276
+
1277
+ .ui-icon-arrow-2-n-s {
1278
+ background-position: -128px -32px;
1279
+ }
1280
+
1281
+ .ui-icon-arrow-2-ne-sw {
1282
+ background-position: -144px -32px;
1283
+ }
1284
+
1285
+ .ui-icon-arrow-2-e-w {
1286
+ background-position: -160px -32px;
1287
+ }
1288
+
1289
+ .ui-icon-arrow-2-se-nw {
1290
+ background-position: -176px -32px;
1291
+ }
1292
+
1293
+ .ui-icon-arrowstop-1-n {
1294
+ background-position: -192px -32px;
1295
+ }
1296
+
1297
+ .ui-icon-arrowstop-1-e {
1298
+ background-position: -208px -32px;
1299
+ }
1300
+
1301
+ .ui-icon-arrowstop-1-s {
1302
+ background-position: -224px -32px;
1303
+ }
1304
+
1305
+ .ui-icon-arrowstop-1-w {
1306
+ background-position: -240px -32px;
1307
+ }
1308
+
1309
+ .ui-icon-arrowthick-1-n {
1310
+ background-position: 0 -48px;
1311
  }
1312
+
1313
+ .ui-icon-arrowthick-1-ne {
1314
+ background-position: -16px -48px;
1315
+ }
1316
+
1317
+ .ui-icon-arrowthick-1-e {
1318
+ background-position: -32px -48px;
1319
+ }
1320
+
1321
+ .ui-icon-arrowthick-1-se {
1322
+ background-position: -48px -48px;
1323
+ }
1324
+
1325
+ .ui-icon-arrowthick-1-s {
1326
+ background-position: -64px -48px;
1327
+ }
1328
+
1329
+ .ui-icon-arrowthick-1-sw {
1330
+ background-position: -80px -48px;
1331
+ }
1332
+
1333
+ .ui-icon-arrowthick-1-w {
1334
+ background-position: -96px -48px;
1335
+ }
1336
+
1337
+ .ui-icon-arrowthick-1-nw {
1338
+ background-position: -112px -48px;
1339
+ }
1340
+
1341
+ .ui-icon-arrowthick-2-n-s {
1342
+ background-position: -128px -48px;
1343
+ }
1344
+
1345
+ .ui-icon-arrowthick-2-ne-sw {
1346
+ background-position: -144px -48px;
1347
+ }
1348
+
1349
+ .ui-icon-arrowthick-2-e-w {
1350
+ background-position: -160px -48px;
1351
+ }
1352
+
1353
+ .ui-icon-arrowthick-2-se-nw {
1354
+ background-position: -176px -48px;
1355
+ }
1356
+
1357
+ .ui-icon-arrowthickstop-1-n {
1358
+ background-position: -192px -48px;
1359
+ }
1360
+
1361
+ .ui-icon-arrowthickstop-1-e {
1362
+ background-position: -208px -48px;
1363
+ }
1364
+
1365
+ .ui-icon-arrowthickstop-1-s {
1366
+ background-position: -224px -48px;
1367
+ }
1368
+
1369
+ .ui-icon-arrowthickstop-1-w {
1370
+ background-position: -240px -48px;
1371
+ }
1372
+
1373
+ .ui-icon-arrowreturnthick-1-w {
1374
+ background-position: 0 -64px;
1375
+ }
1376
+
1377
+ .ui-icon-arrowreturnthick-1-n {
1378
+ background-position: -16px -64px;
1379
+ }
1380
+
1381
+ .ui-icon-arrowreturnthick-1-e {
1382
+ background-position: -32px -64px;
1383
+ }
1384
+
1385
+ .ui-icon-arrowreturnthick-1-s {
1386
+ background-position: -48px -64px;
1387
+ }
1388
+
1389
+ .ui-icon-arrowreturn-1-w {
1390
+ background-position: -64px -64px;
1391
+ }
1392
+
1393
+ .ui-icon-arrowreturn-1-n {
1394
+ background-position: -80px -64px;
1395
+ }
1396
+
1397
+ .ui-icon-arrowreturn-1-e {
1398
+ background-position: -96px -64px;
1399
+ }
1400
+
1401
+ .ui-icon-arrowreturn-1-s {
1402
+ background-position: -112px -64px;
1403
+ }
1404
+
1405
+ .ui-icon-arrowrefresh-1-w {
1406
+ background-position: -128px -64px;
1407
+ }
1408
+
1409
+ .ui-icon-arrowrefresh-1-n {
1410
+ background-position: -144px -64px;
1411
+ }
1412
+
1413
+ .ui-icon-arrowrefresh-1-e {
1414
+ background-position: -160px -64px;
1415
+ }
1416
+
1417
+ .ui-icon-arrowrefresh-1-s {
1418
+ background-position: -176px -64px;
1419
+ }
1420
+
1421
+ .ui-icon-arrow-4 {
1422
+ background-position: 0 -80px;
1423
+ }
1424
+
1425
+ .ui-icon-arrow-4-diag {
1426
+ background-position: -16px -80px;
1427
+ }
1428
+
1429
+ .ui-icon-extlink {
1430
+ background-position: -32px -80px;
1431
+ }
1432
+
1433
+ .ui-icon-newwin {
1434
+ background-position: -48px -80px;
1435
+ }
1436
+
1437
+ .ui-icon-refresh {
1438
+ background-position: -64px -80px;
1439
+ }
1440
+
1441
+ .ui-icon-shuffle {
1442
+ background-position: -80px -80px;
1443
+ }
1444
+
1445
+ .ui-icon-transfer-e-w {
1446
+ background-position: -96px -80px;
1447
+ }
1448
+
1449
+ .ui-icon-transferthick-e-w {
1450
+ background-position: -112px -80px;
1451
+ }
1452
+
1453
+ .ui-icon-folder-collapsed {
1454
+ background-position: 0 -96px;
1455
+ }
1456
+
1457
+ .ui-icon-folder-open {
1458
+ background-position: -16px -96px;
1459
+ }
1460
+
1461
+ .ui-icon-document {
1462
+ background-position: -32px -96px;
1463
+ }
1464
+
1465
+ .ui-icon-document-b {
1466
+ background-position: -48px -96px;
1467
+ }
1468
+
1469
+ .ui-icon-note {
1470
+ background-position: -64px -96px;
1471
+ }
1472
+
1473
+ .ui-icon-mail-closed {
1474
+ background-position: -80px -96px;
1475
+ }
1476
+
1477
+ .ui-icon-mail-open {
1478
+ background-position: -96px -96px;
1479
+ }
1480
+
1481
+ .ui-icon-suitcase {
1482
+ background-position: -112px -96px;
1483
+ }
1484
+
1485
+ .ui-icon-comment {
1486
+ background-position: -128px -96px;
1487
+ }
1488
+
1489
+ .ui-icon-person {
1490
+ background-position: -144px -96px;
1491
+ }
1492
+
1493
+ .ui-icon-print {
1494
+ background-position: -160px -96px;
1495
+ }
1496
+
1497
+ .ui-icon-trash {
1498
+ background-position: -176px -96px;
1499
+ }
1500
+
1501
+ .ui-icon-locked {
1502
+ background-position: -192px -96px;
1503
+ }
1504
+
1505
+ .ui-icon-unlocked {
1506
+ background-position: -208px -96px;
1507
+ }
1508
+
1509
+ .ui-icon-bookmark {
1510
+ background-position: -224px -96px;
1511
+ }
1512
+
1513
+ .ui-icon-tag {
1514
+ background-position: -240px -96px;
1515
+ }
1516
+
1517
+ .ui-icon-home {
1518
+ background-position: 0 -112px;
1519
+ }
1520
+
1521
+ .ui-icon-flag {
1522
+ background-position: -16px -112px;
1523
+ }
1524
+
1525
+ .ui-icon-calendar {
1526
+ background-position: -32px -112px;
1527
+ }
1528
+
1529
+ .ui-icon-cart {
1530
+ background-position: -48px -112px;
1531
+ }
1532
+
1533
+ .ui-icon-pencil {
1534
+ background-position: -64px -112px;
1535
+ }
1536
+
1537
+ .ui-icon-clock {
1538
+ background-position: -80px -112px;
1539
+ }
1540
+
1541
+ .ui-icon-disk {
1542
+ background-position: -96px -112px;
1543
+ }
1544
+
1545
+ .ui-icon-calculator {
1546
+ background-position: -112px -112px;
1547
+ }
1548
+
1549
+ .ui-icon-zoomin {
1550
+ background-position: -128px -112px;
1551
+ }
1552
+
1553
+ .ui-icon-zoomout {
1554
+ background-position: -144px -112px;
1555
+ }
1556
+
1557
+ .ui-icon-search {
1558
+ background-position: -160px -112px;
1559
+ }
1560
+
1561
+ .ui-icon-wrench {
1562
+ background-position: -176px -112px;
1563
+ }
1564
+
1565
+ .ui-icon-gear {
1566
+ background-position: -192px -112px;
1567
+ }
1568
+
1569
+ .ui-icon-heart {
1570
+ background-position: -208px -112px;
1571
+ }
1572
+
1573
+ .ui-icon-star {
1574
+ background-position: -224px -112px;
1575
+ }
1576
+
1577
+ .ui-icon-link {
1578
+ background-position: -240px -112px;
1579
+ }
1580
+
1581
+ .ui-icon-cancel {
1582
+ background-position: 0 -128px;
1583
+ }
1584
+
1585
+ .ui-icon-plus {
1586
+ background-position: -16px -128px;
1587
+ }
1588
+
1589
+ .ui-icon-plusthick {
1590
+ background-position: -32px -128px;
1591
+ }
1592
+
1593
+ .ui-icon-minus {
1594
+ background-position: -48px -128px;
1595
+ }
1596
+
1597
+ .ui-icon-minusthick {
1598
+ background-position: -64px -128px;
1599
+ }
1600
+
1601
+ .ui-icon-close {
1602
+ background-position: -80px -128px;
1603
+ }
1604
+
1605
+ .ui-icon-closethick {
1606
+ background-position: -96px -128px;
1607
+ }
1608
+
1609
+ .ui-icon-key {
1610
+ background-position: -112px -128px;
1611
+ }
1612
+
1613
+ .ui-icon-lightbulb {
1614
+ background-position: -128px -128px;
1615
+ }
1616
+
1617
+ .ui-icon-scissors {
1618
+ background-position: -144px -128px;
1619
+ }
1620
+
1621
+ .ui-icon-clipboard {
1622
+ background-position: -160px -128px;
1623
+ }
1624
+
1625
+ .ui-icon-copy {
1626
+ background-position: -176px -128px;
1627
+ }
1628
+
1629
+ .ui-icon-contact {
1630
+ background-position: -192px -128px;
1631
+ }
1632
+
1633
+ .ui-icon-image {
1634
+ background-position: -208px -128px;
1635
+ }
1636
+
1637
+ .ui-icon-video {
1638
+ background-position: -224px -128px;
1639
+ }
1640
+
1641
+ .ui-icon-script {
1642
+ background-position: -240px -128px;
1643
+ }
1644
+
1645
+ .ui-icon-alert {
1646
+ background-position: 0 -144px;
1647
+ }
1648
+
1649
+ .ui-icon-info {
1650
+ background-position: -16px -144px;
1651
+ }
1652
+
1653
+ .ui-icon-notice {
1654
+ background-position: -32px -144px;
1655
+ }
1656
+
1657
+ .ui-icon-help {
1658
+ background-position: -48px -144px;
1659
+ }
1660
+
1661
+ .ui-icon-check {
1662
+ background-position: -64px -144px;
1663
+ }
1664
+
1665
+ .ui-icon-bullet {
1666
+ background-position: -80px -144px;
1667
+ }
1668
+
1669
+ .ui-icon-radio-on {
1670
+ background-position: -96px -144px;
1671
+ }
1672
+
1673
+ .ui-icon-radio-off {
1674
+ background-position: -112px -144px;
1675
+ }
1676
+
1677
+ .ui-icon-pin-w {
1678
+ background-position: -128px -144px;
1679
+ }
1680
+
1681
+ .ui-icon-pin-s {
1682
+ background-position: -144px -144px;
1683
+ }
1684
+
1685
+ .ui-icon-play {
1686
+ background-position: 0 -160px;
1687
+ }
1688
+
1689
+ .ui-icon-pause {
1690
+ background-position: -16px -160px;
1691
+ }
1692
+
1693
+ .ui-icon-seek-next {
1694
+ background-position: -32px -160px;
1695
+ }
1696
+
1697
+ .ui-icon-seek-prev {
1698
+ background-position: -48px -160px;
1699
+ }
1700
+
1701
+ .ui-icon-seek-end {
1702
+ background-position: -64px -160px;
1703
+ }
1704
+
1705
+ .ui-icon-seek-start {
1706
+ background-position: -80px -160px;
1707
+ }
1708
+
1709
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
1710
+ .ui-icon-seek-first {
1711
+ background-position: -80px -160px;
1712
+ }
1713
+
1714
+ .ui-icon-stop {
1715
+ background-position: -96px -160px;
1716
+ }
1717
+
1718
+ .ui-icon-eject {
1719
+ background-position: -112px -160px;
1720
+ }
1721
+
1722
+ .ui-icon-volume-off {
1723
+ background-position: -128px -160px;
1724
+ }
1725
+
1726
+ .ui-icon-volume-on {
1727
+ background-position: -144px -160px;
1728
+ }
1729
+
1730
+ .ui-icon-power {
1731
+ background-position: 0 -176px;
1732
+ }
1733
+
1734
+ .ui-icon-signal-diag {
1735
+ background-position: -16px -176px;
1736
+ }
1737
+
1738
+ .ui-icon-signal {
1739
+ background-position: -32px -176px;
1740
+ }
1741
+
1742
+ .ui-icon-battery-0 {
1743
+ background-position: -48px -176px;
1744
+ }
1745
+
1746
+ .ui-icon-battery-1 {
1747
+ background-position: -64px -176px;
1748
+ }
1749
+
1750
+ .ui-icon-battery-2 {
1751
+ background-position: -80px -176px;
1752
+ }
1753
+
1754
+ .ui-icon-battery-3 {
1755
+ background-position: -96px -176px;
1756
+ }
1757
+
1758
+ .ui-icon-circle-plus {
1759
+ background-position: 0 -192px;
1760
+ }
1761
+
1762
+ .ui-icon-circle-minus {
1763
+ background-position: -16px -192px;
1764
+ }
1765
+
1766
+ .ui-icon-circle-close {
1767
+ background-position: -32px -192px;
1768
+ }
1769
+
1770
+ .ui-icon-circle-triangle-e {
1771
+ background-position: -48px -192px;
1772
+ }
1773
+
1774
+ .ui-icon-circle-triangle-s {
1775
+ background-position: -64px -192px;
1776
+ }
1777
+
1778
+ .ui-icon-circle-triangle-w {
1779
+ background-position: -80px -192px;
1780
+ }
1781
+
1782
+ .ui-icon-circle-triangle-n {
1783
+ background-position: -96px -192px;
1784
+ }
1785
+
1786
+ .ui-icon-circle-arrow-e {
1787
+ background-position: -112px -192px;
1788
+ }
1789
+
1790
+ .ui-icon-circle-arrow-s {
1791
+ background-position: -128px -192px;
1792
+ }
1793
+
1794
+ .ui-icon-circle-arrow-w {
1795
+ background-position: -144px -192px;
1796
+ }
1797
+
1798
+ .ui-icon-circle-arrow-n {
1799
+ background-position: -160px -192px;
1800
+ }
1801
+
1802
+ .ui-icon-circle-zoomin {
1803
+ background-position: -176px -192px;
1804
+ }
1805
+
1806
+ .ui-icon-circle-zoomout {
1807
+ background-position: -192px -192px;
1808
+ }
1809
+
1810
+ .ui-icon-circle-check {
1811
+ background-position: -208px -192px;
1812
+ }
1813
+
1814
+ .ui-icon-circlesmall-plus {
1815
+ background-position: 0 -208px;
1816
+ }
1817
+
1818
+ .ui-icon-circlesmall-minus {
1819
+ background-position: -16px -208px;
1820
+ }
1821
+
1822
+ .ui-icon-circlesmall-close {
1823
+ background-position: -32px -208px;
1824
+ }
1825
+
1826
+ .ui-icon-squaresmall-plus {
1827
+ background-position: -48px -208px;
1828
+ }
1829
+
1830
+ .ui-icon-squaresmall-minus {
1831
+ background-position: -64px -208px;
1832
+ }
1833
+
1834
+ .ui-icon-squaresmall-close {
1835
+ background-position: -80px -208px;
1836
+ }
1837
+
1838
+ .ui-icon-grip-dotted-vertical {
1839
+ background-position: 0 -224px;
1840
+ }
1841
+
1842
+ .ui-icon-grip-dotted-horizontal {
1843
+ background-position: -16px -224px;
1844
+ }
1845
+
1846
+ .ui-icon-grip-solid-vertical {
1847
+ background-position: -32px -224px;
1848
+ }
1849
+
1850
+ .ui-icon-grip-solid-horizontal {
1851
+ background-position: -48px -224px;
1852
+ }
1853
+
1854
+ .ui-icon-gripsmall-diagonal-se {
1855
+ background-position: -64px -224px;
1856
+ }
1857
+
1858
+ .ui-icon-grip-diagonal-se {
1859
+ background-position: -80px -224px;
1860
+ }
1861
+
1862
+ /* Misc visuals
1863
+ ----------------------------------*/
1864
+
1865
+ /* Corner radius */
1866
+ .ui-corner-all,
1867
+ .ui-corner-top,
1868
+ .ui-corner-left,
1869
+ .ui-corner-tl {
1870
+ border-top-left-radius: 4px;
1871
+ }
1872
+
1873
+ .ui-corner-all,
1874
+ .ui-corner-top,
1875
+ .ui-corner-right,
1876
+ .ui-corner-tr {
1877
+ border-top-right-radius: 4px;
1878
+ }
1879
+
1880
+ .ui-corner-all,
1881
+ .ui-corner-bottom,
1882
+ .ui-corner-left,
1883
+ .ui-corner-bl {
1884
+ border-bottom-left-radius: 4px;
1885
+ }
1886
+
1887
+ .ui-corner-all,
1888
+ .ui-corner-bottom,
1889
+ .ui-corner-right,
1890
+ .ui-corner-br {
1891
+ border-bottom-right-radius: 4px;
1892
+ }
1893
+
1894
+ /* Overlays */
1895
+ .ui-widget-overlay {
1896
+ background: #666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
1897
+ opacity: 0.5;
1898
+ filter: alpha(opacity=50); /* support: IE8 */
1899
+ }
1900
+
1901
  .ui-widget-shadow {
1902
  margin: -5px 0 0 -5px;
1903
  padding: 5px;
1904
+ background: #000;
1905
+ opacity: 0.2;
1906
+ filter: alpha(opacity=20); /* support: IE8 */
1907
  border-radius: 5px;
1908
  }
includes/jquery-ui.custom.min.css CHANGED
@@ -1,2 +1,2 @@
1
- /* jQuery UI - v1.11.4 - 2015-12-05* http://jqueryui.com* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px* Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:.4em 2.1em .4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px}
2
  /*# sourceMappingURL=jquery-ui.custom.min.css.map */
1
+ /* jQuery UI - v1.11.4 - 2015-12-05* http://jqueryui.com* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px* Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:alpha(opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:.4em 2.1em .4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;box-shadow:0 0 5px #AAA}body .ui-tooltip{border-width:2px}.ui-widget{font-family:trebuchet ms,tahoma,verdana,arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:trebuchet ms,tahoma,verdana,arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #DDD;background:#EEE url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#FFF;font-weight:bold}.ui-widget-header a{color:#FFF}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #CCC;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#FFF url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#FFF}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#FFF}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#FFF}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:alpha(opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:alpha(opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:alpha(opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:alpha(opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000;opacity:.2;filter:alpha(opacity=20);border-radius:5px}
2
  /*# sourceMappingURL=jquery-ui.custom.min.css.map */
includes/jquery-ui.custom.min.css.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["includes/jquery-ui.custom.css"],"names":[],"mappings":"AAAA;;;;qEAIqE;;AAErE;oCACoC;AACpC;CACC,cAAc;CACd;AACD;CACC,UAAU;CACV,oBAAoB;CACpB,YAAY;CACZ,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,mBAAmB;CACnB,WAAW;CACX;AACD;CACC,UAAU;CACV,WAAW;CACX,UAAU;CACV,WAAW;CACX,iBAAiB;CACjB,sBAAsB;CACtB,gBAAgB;CAChB,iBAAiB;CACjB;AACD;;CAEC,YAAY;CACZ,eAAe;CACf,0BAA0B;CAC1B;AACD;CACC,YAAY;CACZ;AACD;CACC,cAAc,CAAC,kBAAkB;CACjC;AACD;CACC,YAAY;CACZ,aAAa;CACb,OAAO;CACP,QAAQ;CACR,mBAAmB;CACnB,WAAW;CACX,wBAAwB,CAAC,kBAAkB;CAC3C;;AAED;CACC,aAAa;CACb;;;AAGD;oCACoC;AACpC;CACC,2BAA2B;CAC3B;;;AAGD;oCACoC;;AAEpC,uBAAuB;AACvB;CACC,eAAe;CACf,sBAAsB;CACtB,iBAAiB;CACjB,6BAA6B;CAC7B;;;AAGD;oCACoC;;AAEpC,cAAc;AACd;CACC,gBAAgB;CAChB,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,aAAa;CACb;AACD;CACC,uBAAuB;CACvB,mBAAmB;CACnB;AACD;CACC,mBAAmB;CACnB;AACD;CACC,mBAAmB;CACnB,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,mBAAmB;CACnB;AACD;;CAEC,cAAc;CACd;AACD;CACC,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,UAAU;CACV,QAAQ;CACR;AACD;CACC,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,QAAQ;CACR;AACD;CACC,iBAAiB;CACjB,WAAW;CACX,YAAY;CACZ,OAAO;CACP,aAAa;CACb;AACD;CACC,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,OAAO;CACP,aAAa;CACb;AACD;CACC,kBAAkB;CAClB,YAAY;CACZ,aAAa;CACb,WAAW;CACX,YAAY;CACZ;AACD;CACC,kBAAkB;CAClB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,aAAa;CACb;AACD;CACC,kBAAkB;CAClB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,UAAU;CACV;AACD;CACC,kBAAkB;CAClB,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,UAAU;CACV;AACD;CACC,uBAAuB;CACvB,mBAAmB;CACnB;AACD;CACC,mBAAmB;CACnB,aAAa;CACb,yBAAyB;CACzB;AACD;CACC,uBAAuB;CACvB,mBAAmB;CACnB;AACD;CACC,eAAe;CACf,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,6BAA6B;CAC7B,cAAc,CAAC,kBAAkB;CACjC,gBAAgB;CAChB;AACD;CACC,oBAAoB;CACpB;AACD;CACC,oBAAoB;CACpB;AACD;CACC,mBAAmB;CACnB,WAAW;CACX,SAAS;CACT,iBAAiB;CACjB;AACD;CACC,mBAAmB;CACnB,cAAc;CACd,eAAe;CACf;AACD;CACC,mBAAmB;CACnB,OAAO;CACP,QAAQ;CACR,gBAAgB;CAChB;AACD;CACC,sBAAsB;CACtB,mBAAmB;CACnB,WAAW;CACX,oBAAoB;CACpB,mBAAmB;CACnB,gBAAgB;CAChB,uBAAuB;CACvB,mBAAmB;CACnB,kBAAkB,CAAC,+BAA+B;CAClD;AACD;;;;;CAKC,sBAAsB;CACtB;AACD,6DAA6D;AAC7D;CACC,aAAa;CACb;AACD,sDAAsD;AACtD;CACC,aAAa;CACb;AACD;CACC,aAAa;CACb;AACD;CACC,aAAa;CACb;;AAED,yBAAyB;AACzB;CACC,eAAe;CACf,oBAAoB;CACpB;AACD;CACC,kBAAkB;CAClB;AACD;;CAEC,cAAc;CACd,wBAAwB;CACxB;AACD;;CAEC,6BAA6B;CAC7B;AACD;;CAEC,6BAA6B;CAC7B;AACD;CACC,oBAAoB;CACpB,qBAAqB;CACrB;AACD,oEAAoE;AACpE;CACC,kBAAkB;CAClB;;AAED,4BAA4B;AAC5B;;;;;CAKC,mBAAmB;CACnB,SAAS;CACT,iBAAiB;CACjB;AACD;CACC,UAAU;CACV,kBAAkB;CAClB;AACD;;;CAGC,WAAW;CACX;AACD;;;CAGC,YAAY;CACZ;;AAED,iBAAiB;AACjB;CACC,kBAAkB;CAClB;AACD;CACC,eAAe;CACf,oBAAoB;CACpB;;AAED,iBAAiB;AACjB,oDAAoD;AACpD;;CAEC,UAAU;CACV,WAAW;CACX;AACD;CACC,YAAY;CACZ,qBAAqB;CACrB,cAAc;CACd;AACD;CACC,mBAAmB;CACnB,gBAAgB;CAChB;AACD;;CAEC,mBAAmB;CACnB,SAAS;CACT,aAAa;CACb,cAAc;CACd;AACD;;CAEC,SAAS;CACT;AACD;CACC,UAAU;CACV;AACD;CACC,WAAW;CACX;AACD;CACC,UAAU;CACV;AACD;CACC,WAAW;CACX;AACD;;CAEC,eAAe;CACf,mBAAmB;CACnB,UAAU;CACV,kBAAkB;CAClB,SAAS;CACT,iBAAiB;CACjB;AACD;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB;AACD;CACC,eAAe;CACf,cAAc;CACd;AACD;;CAEC,WAAW;CACX;AACD;CACC,YAAY;CACZ,gBAAgB;CAChB,0BAA0B;CAC1B,iBAAiB;CACjB;AACD;CACC,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,UAAU;CACV;AACD;CACC,UAAU;CACV,aAAa;CACb;AACD;;CAEC,eAAe;CACf,cAAc;CACd,kBAAkB;CAClB,sBAAsB;CACtB;AACD;CACC,uBAAuB;CACvB,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;CACf,gBAAgB;CAChB,iBAAiB;CACjB;AACD;CACC,aAAa;CACb,uBAAuB;CACvB,gBAAgB;CAChB,6BAA6B;CAC7B,YAAY;CACZ,kBAAkB;CAClB;AACD;CACC,YAAY;CACZ;;AAED,6BAA6B;AAC7B;CACC,YAAY;CACZ;AACD;CACC,YAAY;CACZ;AACD;CACC,WAAW;CACX,oBAAoB;CACpB;AACD;CACC,WAAW;CACX;AACD;CACC,aAAa;CACb;AACD;CACC,WAAW;CACX;AACD;;CAEC,qBAAqB;CACrB;AACD;CACC,YAAY;CACZ;AACD;CACC,YAAY;CACZ,YAAY;CACZ,aAAa;CACb;;AAED,iBAAiB;AACjB;CACC,eAAe;CACf;AACD;CACC,WAAW;CACX,WAAW;CACX;AACD;CACC,UAAU;CACV,YAAY;CACZ;AACD;CACC,WAAW;CACX,WAAW;CACX;AACD;CACC,UAAU;CACV,YAAY;CACZ;AACD;CACC,aAAa;CACb;AACD;CACC,YAAY;CACZ;AACD;;CAEC,aAAa;CACb;AACD;;CAEC,sBAAsB;CACtB,uBAAuB;CACvB;AACD;CACC,iBAAiB;CACjB,mBAAmB;CACnB,OAAO;CACP,QAAQ;CACR,cAAc;CACd,WAAW;CACX;AACD;CACC,kBAAkB;CAClB,mBAAmB;CACnB;AACD;CACC,YAAY;CACZ,eAAe;CACf,oBAAoB;CACpB,WAAW;CACX,iBAAiB;CACjB,wBAAwB;CACxB;AACD;CACC,mBAAmB;CACnB,YAAY;CACZ,SAAS;CACT,YAAY;CACZ,oBAAoB;CACpB,aAAa;CACb,aAAa;CACb;AACD;CACC,mBAAmB;CACnB,UAAU;CACV,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf;AACD;CACC,iBAAiB;CACjB,wBAAwB;CACxB,uBAAuB;CACvB,iBAAiB;CACjB,4BAA4B;CAC5B;AACD;CACC,aAAa;CACb;AACD;CACC,yBAAyB;CACzB,gBAAgB;CAChB;AACD;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,aAAa;CACb,+BAA+B;CAC/B;AACD;CACC,aAAa;CACb;AACD;CACC,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,eAAe;CACf,cAAc;CACd;AACD;CACC,mBAAmB;CACnB;AACD;CACC,mBAAmB;CACnB,UAAU;CACV,0BAA0B;CAC1B,gBAAgB;CAChB,cAAc,CAAC,kBAAkB;CACjC,8BAA8B;CAC9B,wGAAwG;CACxG;AACD;CACC,cAAc;CACd,UAAU;CACV,aAAa;CACb,eAAe;CACf,wBAAwB;CACxB;AACD;;CAEC,aAAa;CACb;;AAED,kBAAkB;AAClB;CACC,mBAAmB;CACnB;AACD;CACC,kBAAkB;CAClB;;AAED,kBAAkB;AAClB;CACC,mBAAmB;CACnB,OAAO;CACP,UAAU;CACV,WAAW;CACX,eAAe;CACf;;AAED,mBAAmB;AACnB;CACC,WAAW;CACX,SAAS;CACT;AACD;CACC,YAAY;CACZ,iBAAiB;CACjB,iBAAiB;CACjB;AACD;CACC,aAAa;CACb,aAAa;CACb;AACD;CACC,0zEAA0zE;CAC1zE,aAAa;CACb,0BAA0B,CAAC,kBAAkB;CAC7C,cAAc;CACd;AACD;CACC,uBAAuB;CACvB;AACD;CACC,WAAW;CACX,UAAU;CACV,mBAAmB;CACnB,OAAO;CACP,QAAQ;CACR,cAAc;CACd;AACD;CACC,eAAe;CACf,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB;AACD;CACC,eAAe;CACf,kBAAkB;CAClB,iBAAiB;CACjB,mBAAmB;CACnB,oBAAoB;CACpB,aAAa;CACb,UAAU;CACV;AACD;CACC,eAAe;CACf;AACD;CACC,sBAAsB;CACtB,iBAAiB;CACjB,mBAAmB;CACnB,sBAAsB;CACtB,gBAAgB;CAChB;AACD;CACC,aAAa;CACb,WAAW;CACX,iBAAiB;CACjB,mBAAmB;CACnB,SAAS;CACT;AACD;CACC,iBAAiB;CACjB,+BAA+B;CAC/B,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,wBAAwB;CACxB,oBAAoB;CACpB;AACD;CACC,mBAAmB;CACnB,iBAAiB;CACjB;AACD;CACC,mBAAmB;CACnB,WAAW;CACX,aAAa;CACb,cAAc;CACd,gBAAgB;CAChB,uBAAuB;CACvB,mBAAmB;CACnB;AACD;CACC,mBAAmB;CACnB,WAAW;CACX,gBAAgB;CAChB,eAAe;CACf,UAAU;CACV,yBAAyB;CACzB;;AAED,8BAA8B;AAC9B;;CAEC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;AACD;CACC,WAAW;CACX,mBAAmB;CACnB;AACD;CACC,OAAO;CACP,aAAa;CACb;AACD;CACC,QAAQ;CACR;AACD;CACC,SAAS;CACT;;AAED;CACC,YAAY;CACZ,cAAc;CACd;AACD;CACC,YAAY;CACZ,eAAe;CACf,qBAAqB;CACrB;AACD;CACC,QAAQ;CACR,YAAY;CACZ;AACD;CACC,UAAU;CACV;AACD;CACC,OAAO;CACP;AACD;CACC,mBAAmB;CACnB,sBAAsB;CACtB,iBAAiB;CACjB,WAAW;CACX,uBAAuB;CACvB;AACD;CACC,aAAa;CACb,iBAAiB;CACjB,eAAe;CACf,WAAW;CACX,eAAe;CACf,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB;AACD;CACC,YAAY;CACZ,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,UAAU;CACV,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;CACf,iBAAiB;CACjB,SAAS;CACT;AACD,gEAAgE;AAChE;CACC,iBAAiB;CACjB,oBAAoB;CACpB,mBAAmB;CACnB;AACD,4BAA4B;AAC5B;CACC,mBAAmB;CACnB,iBAAiB;CACjB,SAAS;CACT,QAAQ;CACR;AACD;CACC,OAAO;CACP;AACD;CACC,UAAU;CACV;;AAED,kBAAkB;AAClB;CACC,8BAA8B;CAC9B,iCAAiC;CACjC;AACD;CACC,mBAAmB,wIAAwI;CAC3J,cAAc;CACd;AACD;CACC,UAAU;CACV,qBAAqB;CACrB;AACD;CACC,iBAAiB;CACjB,YAAY;CACZ,mBAAmB;CACnB,OAAO;CACP,qBAAqB;CACrB,uBAAuB;CACvB,WAAW;CACX,oBAAoB;CACpB;AACD;CACC,YAAY;CACZ,kBAAkB;CAClB,sBAAsB;CACtB;AACD;CACC,oBAAoB;CACpB,oBAAoB;CACpB;AACD;;;CAGC,aAAa;CACb;AACD;CACC,gBAAgB;CAChB;AACD;CACC,eAAe;CACf,gBAAgB;CAChB,mBAAmB;CACnB,iBAAiB;CACjB;AACD;CACC,aAAa;CACb,mBAAmB;CACnB,cAAc;CACd,iBAAiB;CAEjB,yBAAyB;CACzB;AACD;CACC,kBAAkB;CAClB;;AAED;oCACoC;AACpC;CACC,0DAA0D;CAC1D,iBAAiB;CACjB;AACD;CACC,eAAe;CACf;AACD;;;;CAIC,0DAA0D;CAC1D,eAAe;CACf;AACD;CACC,0BAA0B;CAC1B,6FAA6F;CAC7F,eAAe;CACf;AACD;CACC,eAAe;CACf;AACD;CACC,0BAA0B;CAC1B,0FAA0F;CAC1F,eAAe;CACf,kBAAkB;CAClB;AACD;CACC,eAAe;CACf;;AAED;oCACoC;AACpC;;;CAGC,0BAA0B;CAC1B,oFAAoF;CACpF,kBAAkB;CAClB,eAAe;CACf;AACD;;;CAGC,eAAe;CACf,sBAAsB;CACtB;AACD;;;;;;CAMC,0BAA0B;CAC1B,oFAAoF;CACpF,kBAAkB;CAClB,eAAe;CACf;AACD;;;;;;;;CAQC,eAAe;CACf,sBAAsB;CACtB;AACD;;;CAGC,0BAA0B;CAC1B,mFAAmF;CACnF,kBAAkB;CAClB,eAAe;CACf;AACD;;;CAGC,eAAe;CACf,sBAAsB;CACtB;;AAED;oCACoC;AACpC;;;CAGC,0BAA0B;CAC1B,4FAA4F;CAC5F,eAAe;CACf;AACD;;;CAGC,eAAe;CACf;AACD;;;CAGC,0BAA0B;CAC1B,2FAA2F;CAC3F,eAAe;CACf;AACD;;;CAGC,eAAe;CACf;AACD;;;CAGC,eAAe;CACf;AACD;;;CAGC,kBAAkB;CAClB;AACD;;;CAGC,YAAY;CACZ,yBAAyB,CAAC,kBAAkB;CAC5C,oBAAoB;CACpB;AACD;;;CAGC,aAAa;CACb,yBAAyB,CAAC,kBAAkB;CAC5C,uBAAuB;CACvB;AACD;CACC,yBAAyB,CAAC,8BAA8B;CACxD;;AAED;oCACoC;;AAEpC,uBAAuB;AACvB;CACC,YAAY;CACZ,aAAa;CACb;AACD;;CAEC,4DAA4D;CAC5D;AACD;CACC,4DAA4D;CAC5D;AACD;CACC,4DAA4D;CAC5D;AACD;;CAEC,4DAA4D;CAC5D;AACD;CACC,4DAA4D;CAC5D;AACD;CACC,4DAA4D;CAC5D;AACD;;CAEC,4DAA4D;CAC5D;;AAED,iBAAiB;AACjB,iBAAiB,+BAA+B,EAAE;AAClD,qBAAqB,yBAAyB,EAAE;AAChD,sBAAsB,6BAA6B,EAAE;AACrD,qBAAqB,6BAA6B,EAAE;AACpD,sBAAsB,6BAA6B,EAAE;AACrD,qBAAqB,6BAA6B,EAAE;AACpD,sBAAsB,6BAA6B,EAAE;AACrD,qBAAqB,6BAA6B,EAAE;AACpD,sBAAsB,8BAA8B,EAAE;AACtD,uBAAuB,8BAA8B,EAAE;AACvD,uBAAuB,8BAA8B,EAAE;AACvD,wBAAwB,6BAA6B,EAAE;AACvD,yBAAyB,iCAAiC,EAAE;AAC5D,wBAAwB,iCAAiC,EAAE;AAC3D,yBAAyB,iCAAiC,EAAE;AAC5D,wBAAwB,iCAAiC,EAAE;AAC3D,yBAAyB,iCAAiC,EAAE;AAC5D,wBAAwB,iCAAiC,EAAE;AAC3D,yBAAyB,kCAAkC,EAAE;AAC7D,0BAA0B,kCAAkC,EAAE;AAC9D,0BAA0B,kCAAkC,EAAE;AAC9D,qBAAqB,6BAA6B,EAAE;AACpD,sBAAsB,iCAAiC,EAAE;AACzD,qBAAqB,iCAAiC,EAAE;AACxD,sBAAsB,iCAAiC,EAAE;AACzD,qBAAqB,iCAAiC,EAAE;AACxD,sBAAsB,iCAAiC,EAAE;AACzD,qBAAqB,iCAAiC,EAAE;AACxD,sBAAsB,kCAAkC,EAAE;AAC1D,uBAAuB,kCAAkC,EAAE;AAC3D,yBAAyB,kCAAkC,EAAE;AAC7D,uBAAuB,kCAAkC,EAAE;AAC3D,yBAAyB,kCAAkC,EAAE;AAC7D,yBAAyB,kCAAkC,EAAE;AAC7D,yBAAyB,kCAAkC,EAAE;AAC7D,yBAAyB,kCAAkC,EAAE;AAC7D,yBAAyB,kCAAkC,EAAE;AAC7D,0BAA0B,6BAA6B,EAAE;AACzD,2BAA2B,iCAAiC,EAAE;AAC9D,0BAA0B,iCAAiC,EAAE;AAC7D,2BAA2B,iCAAiC,EAAE;AAC9D,0BAA0B,iCAAiC,EAAE;AAC7D,2BAA2B,iCAAiC,EAAE;AAC9D,0BAA0B,iCAAiC,EAAE;AAC7D,2BAA2B,kCAAkC,EAAE;AAC/D,4BAA4B,kCAAkC,EAAE;AAChE,8BAA8B,kCAAkC,EAAE;AAClE,4BAA4B,kCAAkC,EAAE;AAChE,8BAA8B,kCAAkC,EAAE;AAClE,8BAA8B,kCAAkC,EAAE;AAClE,8BAA8B,kCAAkC,EAAE;AAClE,8BAA8B,kCAAkC,EAAE;AAClE,8BAA8B,kCAAkC,EAAE;AAClE,gCAAgC,6BAA6B,EAAE;AAC/D,gCAAgC,iCAAiC,EAAE;AACnE,gCAAgC,iCAAiC,EAAE;AACnE,gCAAgC,iCAAiC,EAAE;AACnE,2BAA2B,iCAAiC,EAAE;AAC9D,2BAA2B,iCAAiC,EAAE;AAC9D,2BAA2B,iCAAiC,EAAE;AAC9D,2BAA2B,kCAAkC,EAAE;AAC/D,4BAA4B,kCAAkC,EAAE;AAChE,4BAA4B,kCAAkC,EAAE;AAChE,4BAA4B,kCAAkC,EAAE;AAChE,4BAA4B,kCAAkC,EAAE;AAChE,mBAAmB,6BAA6B,EAAE;AAClD,wBAAwB,iCAAiC,EAAE;AAC3D,mBAAmB,iCAAiC,EAAE;AACtD,kBAAkB,iCAAiC,EAAE;AACrD,mBAAmB,iCAAiC,EAAE;AACtD,mBAAmB,iCAAiC,EAAE;AACtD,wBAAwB,iCAAiC,EAAE;AAC3D,6BAA6B,kCAAkC,EAAE;AACjE,4BAA4B,6BAA6B,EAAE;AAC3D,uBAAuB,iCAAiC,EAAE;AAC1D,oBAAoB,iCAAiC,EAAE;AACvD,sBAAsB,iCAAiC,EAAE;AACzD,gBAAgB,iCAAiC,EAAE;AACnD,uBAAuB,iCAAiC,EAAE;AAC1D,qBAAqB,iCAAiC,EAAE;AACxD,oBAAoB,kCAAkC,EAAE;AACxD,mBAAmB,kCAAkC,EAAE;AACvD,kBAAkB,kCAAkC,EAAE;AACtD,iBAAiB,kCAAkC,EAAE;AACrD,iBAAiB,kCAAkC,EAAE;AACrD,kBAAkB,kCAAkC,EAAE;AACtD,oBAAoB,kCAAkC,EAAE;AACxD,oBAAoB,kCAAkC,EAAE;AACxD,eAAe,kCAAkC,EAAE;AACnD,gBAAgB,8BAA8B,EAAE;AAChD,gBAAgB,kCAAkC,EAAE;AACpD,oBAAoB,kCAAkC,EAAE;AACxD,gBAAgB,kCAAkC,EAAE;AACpD,kBAAkB,kCAAkC,EAAE;AACtD,iBAAiB,kCAAkC,EAAE;AACrD,gBAAgB,kCAAkC,EAAE;AACpD,sBAAsB,mCAAmC,EAAE;AAC3D,kBAAkB,mCAAmC,EAAE;AACvD,mBAAmB,mCAAmC,EAAE;AACxD,kBAAkB,mCAAmC,EAAE;AACvD,kBAAkB,mCAAmC,EAAE;AACvD,gBAAgB,mCAAmC,EAAE;AACrD,iBAAiB,mCAAmC,EAAE;AACtD,gBAAgB,mCAAmC,EAAE;AACrD,gBAAgB,mCAAmC,EAAE;AACrD,kBAAkB,8BAA8B,EAAE;AAClD,gBAAgB,kCAAkC,EAAE;AACpD,qBAAqB,kCAAkC,EAAE;AACzD,iBAAiB,kCAAkC,EAAE;AACrD,sBAAsB,kCAAkC,EAAE;AAC1D,iBAAiB,kCAAkC,EAAE;AACrD,sBAAsB,kCAAkC,EAAE;AAC1D,eAAe,mCAAmC,EAAE;AACpD,qBAAqB,mCAAmC,EAAE;AAC1D,oBAAoB,mCAAmC,EAAE;AACzD,qBAAqB,mCAAmC,EAAE;AAC1D,gBAAgB,mCAAmC,EAAE;AACrD,mBAAmB,mCAAmC,EAAE;AACxD,iBAAiB,mCAAmC,EAAE;AACtD,iBAAiB,mCAAmC,EAAE;AACtD,kBAAkB,mCAAmC,EAAE;AACvD,iBAAiB,8BAA8B,EAAE;AACjD,gBAAgB,kCAAkC,EAAE;AACpD,kBAAkB,kCAAkC,EAAE;AACtD,gBAAgB,kCAAkC,EAAE;AACpD,iBAAiB,kCAAkC,EAAE;AACrD,kBAAkB,kCAAkC,EAAE;AACtD,oBAAoB,kCAAkC,EAAE;AACxD,qBAAqB,mCAAmC,EAAE;AAC1D,iBAAiB,mCAAmC,EAAE;AACtD,iBAAiB,mCAAmC,EAAE;AACtD,gBAAgB,8BAA8B,EAAE;AAChD,iBAAiB,kCAAkC,EAAE;AACrD,qBAAqB,kCAAkC,EAAE;AACzD,qBAAqB,kCAAkC,EAAE;AACzD,oBAAoB,kCAAkC,EAAE;AACxD,sBAAsB,kCAAkC,EAAE;AAC1D,sEAAsE;AACtE,sBAAsB,kCAAkC,EAAE;AAC1D,gBAAgB,kCAAkC,EAAE;AACpD,iBAAiB,mCAAmC,EAAE;AACtD,sBAAsB,mCAAmC,EAAE;AAC3D,qBAAqB,mCAAmC,EAAE;AAC1D,iBAAiB,8BAA8B,EAAE;AACjD,uBAAuB,kCAAkC,EAAE;AAC3D,kBAAkB,kCAAkC,EAAE;AACtD,qBAAqB,kCAAkC,EAAE;AACzD,qBAAqB,kCAAkC,EAAE;AACzD,qBAAqB,kCAAkC,EAAE;AACzD,qBAAqB,kCAAkC,EAAE;AACzD,uBAAuB,8BAA8B,EAAE;AACvD,wBAAwB,kCAAkC,EAAE;AAC5D,wBAAwB,kCAAkC,EAAE;AAC5D,6BAA6B,kCAAkC,EAAE;AACjE,6BAA6B,kCAAkC,EAAE;AACjE,6BAA6B,kCAAkC,EAAE;AACjE,6BAA6B,kCAAkC,EAAE;AACjE,0BAA0B,mCAAmC,EAAE;AAC/D,0BAA0B,mCAAmC,EAAE;AAC/D,0BAA0B,mCAAmC,EAAE;AAC/D,0BAA0B,mCAAmC,EAAE;AAC/D,yBAAyB,mCAAmC,EAAE;AAC9D,0BAA0B,mCAAmC,EAAE;AAC/D,wBAAwB,mCAAmC,EAAE;AAC7D,4BAA4B,8BAA8B,EAAE;AAC5D,6BAA6B,kCAAkC,EAAE;AACjE,6BAA6B,kCAAkC,EAAE;AACjE,4BAA4B,kCAAkC,EAAE;AAChE,6BAA6B,kCAAkC,EAAE;AACjE,6BAA6B,kCAAkC,EAAE;AACjE,gCAAgC,8BAA8B,EAAE;AAChE,kCAAkC,kCAAkC,EAAE;AACtE,+BAA+B,kCAAkC,EAAE;AACnE,iCAAiC,kCAAkC,EAAE;AACrE,iCAAiC,kCAAkC,EAAE;AACrE,4BAA4B,kCAAkC,EAAE;;;AAGhE;oCACoC;;AAEpC,mBAAmB;AACnB;;;;CAIC,4BAA4B;CAC5B;AACD;;;;CAIC,6BAA6B;CAC7B;AACD;;;;CAIC,+BAA+B;CAC/B;AACD;;;;CAIC,gCAAgC;CAChC;;AAED,cAAc;AACd;CACC,2FAA2F;CAC3F,YAAY;CACZ,0BAA0B,CAAC,kBAAkB;CAC7C;AACD;CACC,sBAAsB;CACtB,aAAa;CACb,oBAAoB;CACpB,YAAY;CACZ,0BAA0B,CAAC,kBAAkB;CAC7C,mBAAmB;CACnB","file":"jquery-ui.custom.min.css","sourcesContent":["/*! jQuery UI - v1.11.4 - 2015-12-05\n* http://jqueryui.com\n* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-clearfix {\n\tmin-height: 0; /* support: IE7 */\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n}\n\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n.ui-draggable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n.ui-selectable {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin: 2px 0 0 0;\n\tpadding: .5em .5em .5em .7em;\n\tmin-height: 0; /* support: IE7 */\n\tfont-size: 100%;\n}\n.ui-accordion .ui-accordion-icons {\n\tpadding-left: 2.2em;\n}\n.ui-accordion .ui-accordion-icons .ui-accordion-icons {\n\tpadding-left: 2.2em;\n}\n.ui-accordion .ui-accordion-header .ui-accordion-header-icon {\n\tposition: absolute;\n\tleft: .5em;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n.ui-button {\n\tdisplay: inline-block;\n\tposition: relative;\n\tpadding: 0;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\toverflow: visible; /* removes extra width in IE */\n}\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n/* to make room for the icon, a width needs to be set here */\n.ui-button-icon-only {\n\twidth: 2.2em;\n}\n/* button elements seem to need a little more width */\nbutton.ui-button-icon-only {\n\twidth: 2.4em;\n}\n.ui-button-icons-only {\n\twidth: 3.4em;\n}\nbutton.ui-button-icons-only {\n\twidth: 3.7em;\n}\n\n/* button text element */\n.ui-button .ui-button-text {\n\tdisplay: block;\n\tline-height: normal;\n}\n.ui-button-text-only .ui-button-text {\n\tpadding: .4em 1em;\n}\n.ui-button-icon-only .ui-button-text,\n.ui-button-icons-only .ui-button-text {\n\tpadding: .4em;\n\ttext-indent: -9999999px;\n}\n.ui-button-text-icon-primary .ui-button-text,\n.ui-button-text-icons .ui-button-text {\n\tpadding: .4em 1em .4em 2.1em;\n}\n.ui-button-text-icon-secondary .ui-button-text,\n.ui-button-text-icons .ui-button-text {\n\tpadding: .4em 2.1em .4em 1em;\n}\n.ui-button-text-icons .ui-button-text {\n\tpadding-left: 2.1em;\n\tpadding-right: 2.1em;\n}\n/* no icon support for input elements, provide padding by default */\ninput.ui-button {\n\tpadding: .4em 1em;\n}\n\n/* button icon element(s) */\n.ui-button-icon-only .ui-icon,\n.ui-button-text-icon-primary .ui-icon,\n.ui-button-text-icon-secondary .ui-icon,\n.ui-button-text-icons .ui-icon,\n.ui-button-icons-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-button-icon-only .ui-icon {\n\tleft: 50%;\n\tmargin-left: -8px;\n}\n.ui-button-text-icon-primary .ui-button-icon-primary,\n.ui-button-text-icons .ui-button-icon-primary,\n.ui-button-icons-only .ui-button-icon-primary {\n\tleft: .5em;\n}\n.ui-button-text-icon-secondary .ui-button-icon-secondary,\n.ui-button-text-icons .ui-button-icon-secondary,\n.ui-button-icons-only .ui-button-icon-secondary {\n\tright: .5em;\n}\n\n/* button sets */\n.ui-buttonset {\n\tmargin-right: 7px;\n}\n.ui-buttonset .ui-button {\n\tmargin-left: 0;\n\tmargin-right: -.3em;\n}\n\n/* workarounds */\n/* reset extra padding in Firefox, see h5bp.com/l */\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n.ui-datepicker {\n\twidth: 17em;\n\tpadding: .2em .2em 0;\n\tdisplay: none;\n}\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 45%;\n}\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n/* RTL support */\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n.ui-dialog {\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 20px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n.ui-dialog .ui-resizable-se {\n\twidth: 12px;\n\theight: 12px;\n\tright: -5px;\n\tbottom: -5px;\n\tbackground-position: 16px 16px;\n}\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n.ui-menu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: none;\n}\n.ui-menu .ui-menu {\n\tposition: absolute;\n}\n.ui-menu .ui-menu-item {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 3px 1em 3px .4em;\n\tcursor: pointer;\n\tmin-height: 0; /* support: IE7 */\n\t/* support: IE10, see #8844 */\n\tlist-style-image: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\");\n}\n.ui-menu .ui-menu-divider {\n\tmargin: 5px 0;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n.ui-menu .ui-state-focus,\n.ui-menu .ui-state-active {\n\tmargin: -1px;\n}\n\n/* icon support */\n.ui-menu-icons {\n\tposition: relative;\n}\n.ui-menu-icons .ui-menu-item {\n\tpadding-left: 2em;\n}\n\n/* left-aligned */\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: .2em;\n\tmargin: auto 0;\n}\n\n/* right-aligned */\n.ui-menu .ui-menu-icon {\n\tleft: auto;\n\tright: 0;\n}\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");\n\theight: 100%;\n\tfilter: alpha(opacity=25); /* support: IE8 */\n\topacity: 0.25;\n}\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n.ui-selectmenu-menu {\n\tpadding: 0;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: none;\n}\n.ui-selectmenu-menu .ui-menu {\n\toverflow: auto;\n\t/* Support: IE7 */\n\toverflow-x: hidden;\n\tpadding-bottom: 1px;\n}\n.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tline-height: 1.5;\n\tpadding: 2px 0.4em;\n\tmargin: 0.5em 0 0 0;\n\theight: auto;\n\tborder: 0;\n}\n.ui-selectmenu-open {\n\tdisplay: block;\n}\n.ui-selectmenu-button {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tposition: relative;\n\ttext-decoration: none;\n\tcursor: pointer;\n}\n.ui-selectmenu-button span.ui-icon {\n\tright: 0.5em;\n\tleft: auto;\n\tmargin-top: -8px;\n\tposition: absolute;\n\ttop: 50%;\n}\n.ui-selectmenu-button span.ui-selectmenu-text {\n\ttext-align: left;\n\tpadding: 0.4em 2.1em 0.4em 1em;\n\tdisplay: block;\n\tline-height: 1.4;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n/* support: IE8 - See #6727 */\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 22px;\n}\n.ui-spinner-button {\n\twidth: 16px;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n/* more specificity required here to override default borders */\n.ui-spinner a.ui-spinner-button {\n\tborder-top: none;\n\tborder-bottom: none;\n\tborder-right: none;\n}\n/* vertically center icon */\n.ui-spinner .ui-icon {\n\tposition: absolute;\n\tmargin-top: -8px;\n\ttop: 50%;\n\tleft: 0;\n}\n.ui-spinner-up {\n\ttop: 0;\n}\n.ui-spinner-down {\n\tbottom: 0;\n}\n\n/* TR overrides */\n.ui-spinner .ui-icon-triangle-1-s {\n\t/* need to fix icons sprite */\n\tbackground-position: -65px -16px;\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom-width: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n\tcursor: text;\n}\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n\tcursor: pointer;\n}\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n\t-webkit-box-shadow: 0 0 5px #aaa;\n\tbox-shadow: 0 0 5px #aaa;\n}\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;\n\tfont-size: 1.1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget-content {\n\tborder: 1px solid #dddddd;\n\tbackground: #eeeeee url(\"images/ui-bg_highlight-soft_100_eeeeee_1x100.png\") 50% top repeat-x;\n\tcolor: #333333;\n}\n.ui-widget-content a {\n\tcolor: #333333;\n}\n.ui-widget-header {\n\tborder: 1px solid #e78f08;\n\tbackground: #f6a828 url(\"images/ui-bg_gloss-wave_35_f6a828_500x100.png\") 50% 50% repeat-x;\n\tcolor: #ffffff;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #ffffff;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default {\n\tborder: 1px solid #cccccc;\n\tbackground: #f6f6f6 url(\"images/ui-bg_glass_100_f6f6f6_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: bold;\n\tcolor: #1c94c4;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited {\n\tcolor: #1c94c4;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus {\n\tborder: 1px solid #fbcb09;\n\tbackground: #fdf5ce url(\"images/ui-bg_glass_100_fdf5ce_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: bold;\n\tcolor: #c77405;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited {\n\tcolor: #c77405;\n\ttext-decoration: none;\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active {\n\tborder: 1px solid #fbd850;\n\tbackground: #ffffff url(\"images/ui-bg_glass_65_ffffff_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: bold;\n\tcolor: #eb8f00;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #eb8f00;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #fed22f;\n\tbackground: #ffe45c url(\"images/ui-bg_highlight-soft_75_ffe45c_1x100.png\") 50% top repeat-x;\n\tcolor: #363636;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #363636;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #cd0a0a;\n\tbackground: #b81900 url(\"images/ui-bg_diagonals-thick_18_b81900_40x40.png\") 50% 50% repeat;\n\tcolor: #ffffff;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #ffffff;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #ffffff;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_222222_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ffffff_256x240.png\");\n}\n.ui-state-default .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ef8c08_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ef8c08_256x240.png\");\n}\n.ui-state-active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ef8c08_256x240.png\");\n}\n.ui-state-highlight .ui-icon {\n\tbackground-image: url(\"images/ui-icons_228ef1_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ffd27a_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-carat-1-n { background-position: 0 0; }\n.ui-icon-carat-1-ne { background-position: -16px 0; }\n.ui-icon-carat-1-e { background-position: -32px 0; }\n.ui-icon-carat-1-se { background-position: -48px 0; }\n.ui-icon-carat-1-s { background-position: -64px 0; }\n.ui-icon-carat-1-sw { background-position: -80px 0; }\n.ui-icon-carat-1-w { background-position: -96px 0; }\n.ui-icon-carat-1-nw { background-position: -112px 0; }\n.ui-icon-carat-2-n-s { background-position: -128px 0; }\n.ui-icon-carat-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -64px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -64px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 0 -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 4px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 4px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 4px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 4px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #666666 url(\"images/ui-bg_diagonals-thick_20_666666_40x40.png\") 50% 50% repeat;\n\topacity: .5;\n\tfilter: Alpha(Opacity=50); /* support: IE8 */\n}\n.ui-widget-shadow {\n\tmargin: -5px 0 0 -5px;\n\tpadding: 5px;\n\tbackground: #000000;\n\topacity: .2;\n\tfilter: Alpha(Opacity=20); /* support: IE8 */\n\tborder-radius: 5px;\n}\n"]}
1
+ {"version":3,"sources":["includes/jquery-ui.custom.css"],"names":[],"mappings":"AAAA;;;;qEAIqE;;AAErE;oCACoC;AACpC;CACC,cAAc;CACd;;AAED;CACC,UAAU;CACV,oBAAoB;CACpB,YAAY;CACZ,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,UAAU;CACV,WAAW;CACX,UAAU;CACV,WAAW;CACX,iBAAiB;CACjB,sBAAsB;CACtB,gBAAgB;CAChB,iBAAiB;CACjB;;AAED;;CAEC,YAAY;CACZ,eAAe;CACf,0BAA0B;CAC1B;;AAED;CACC,YAAY;CACZ;;AAED;CACC,cAAc,CAAC,kBAAkB;CACjC;;AAED;CACC,YAAY;CACZ,aAAa;CACb,OAAO;CACP,QAAQ;CACR,mBAAmB;CACnB,WAAW;CACX,yBAAyB,CAAC,kBAAkB;CAC5C;;AAED;CACC,aAAa;CACb;;AAED;oCACoC;AACpC;CACC,2BAA2B;CAC3B;;AAED;oCACoC;;AAEpC,uBAAuB;AACvB;CACC,eAAe;CACf,sBAAsB;CACtB,iBAAiB;CACjB,6BAA6B;CAC7B;;AAED;oCACoC;;AAEpC,cAAc;AACd;CACC,gBAAgB;CAChB,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,aAAa;CACb;;AAED;CACC,uBAAuB;CACvB,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,iBAAiB;CACjB,eAAe;CACf,uBAAuB;CACvB,mBAAmB;CACnB;;AAED;;CAEC,cAAc;CACd;;AAED;CACC,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,UAAU;CACV,QAAQ;CACR;;AAED;CACC,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,QAAQ;CACR;;AAED;CACC,iBAAiB;CACjB,WAAW;CACX,YAAY;CACZ,OAAO;CACP,aAAa;CACb;;AAED;CACC,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,OAAO;CACP,aAAa;CACb;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,aAAa;CACb,WAAW;CACX,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,aAAa;CACb;;AAED;CACC,kBAAkB;CAClB,WAAW;CACX,YAAY;CACZ,WAAW;CACX,UAAU;CACV;;AAED;CACC,kBAAkB;CAClB,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,UAAU;CACV;;AAED;CACC,uBAAuB;CACvB,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,aAAa;CACb,yBAAyB;CACzB;;AAED;CACC,uBAAuB;CACvB,mBAAmB;CACnB;;AAED;CACC,eAAe;CACf,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,6BAA6B;CAC7B,cAAc,CAAC,kBAAkB;CACjC,gBAAgB;CAChB;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,mBAAmB;CACnB,WAAW;CACX,SAAS;CACT,iBAAiB;CACjB;;AAED;CACC,mBAAmB;CACnB,cAAc;CACd,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,OAAO;CACP,QAAQ;CACR,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,WAAW;CACX,oBAAoB;CACpB,mBAAmB;CACnB,gBAAgB;CAChB,uBAAuB;CACvB,mBAAmB;CACnB,kBAAkB,CAAC,+BAA+B;CAClD;;AAED;;;;;CAKC,sBAAsB;CACtB;;AAED,6DAA6D;AAC7D;CACC,aAAa;CACb;;AAED,sDAAsD;AACtD;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED,yBAAyB;AACzB;CACC,eAAe;CACf,oBAAoB;CACpB;;AAED;CACC,kBAAkB;CAClB;;AAED;;CAEC,cAAc;CACd,wBAAwB;CACxB;;AAED;;CAEC,6BAA6B;CAC7B;;AAED;;CAEC,6BAA6B;CAC7B;;AAED;CACC,oBAAoB;CACpB,qBAAqB;CACrB;;AAED,oEAAoE;AACpE;CACC,kBAAkB;CAClB;;AAED,4BAA4B;AAC5B;;;;;CAKC,mBAAmB;CACnB,SAAS;CACT,iBAAiB;CACjB;;AAED;CACC,UAAU;CACV,kBAAkB;CAClB;;AAED;;;CAGC,WAAW;CACX;;AAED;;;CAGC,YAAY;CACZ;;AAED,iBAAiB;AACjB;CACC,kBAAkB;CAClB;;AAED;CACC,eAAe;CACf,oBAAoB;CACpB;;AAED,iBAAiB;AACjB,oDAAoD;AACpD;;CAEC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,qBAAqB;CACrB,cAAc;CACd;;AAED;CACC,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;;CAEC,mBAAmB;CACnB,SAAS;CACT,aAAa;CACb,cAAc;CACd;;AAED;;CAEC,SAAS;CACT;;AAED;CACC,UAAU;CACV;;AAED;CACC,WAAW;CACX;;AAED;CACC,UAAU;CACV;;AAED;CACC,WAAW;CACX;;AAED;;CAEC,eAAe;CACf,mBAAmB;CACnB,UAAU;CACV,kBAAkB;CAClB,SAAS;CACT,iBAAiB;CACjB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,eAAe;CACf,cAAc;CACd;;AAED;;CAEC,WAAW;CACX;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,0BAA0B;CAC1B,iBAAiB;CACjB;;AAED;CACC,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,UAAU;CACV;;AAED;CACC,UAAU;CACV,aAAa;CACb;;AAED;;CAEC,eAAe;CACf,cAAc;CACd,kBAAkB;CAClB,sBAAsB;CACtB;;AAED;CACC,uBAAuB;CACvB,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;CACf,gBAAgB;CAChB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,uBAAuB;CACvB,gBAAgB;CAChB,6BAA6B;CAC7B,YAAY;CACZ,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ;;AAED,6BAA6B;AAC7B;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ;;AAED;CACC,WAAW;CACX,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED;;CAEC,qBAAqB;CACrB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,YAAY;CACZ,aAAa;CACb;;AAED,iBAAiB;AACjB;CACC,eAAe;CACf;;AAED;CACC,WAAW;CACX,WAAW;CACX;;AAED;CACC,UAAU;CACV,YAAY;CACZ;;AAED;CACC,WAAW;CACX,WAAW;CACX;;AAED;CACC,UAAU;CACV,YAAY;CACZ;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;;CAEC,aAAa;CACb;;AAED;;CAEC,sBAAsB;CACtB,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB,mBAAmB;CACnB,OAAO;CACP,QAAQ;CACR,cAAc;CACd,WAAW;CACX;;AAED;CACC,kBAAkB;CAClB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,eAAe;CACf,oBAAoB;CACpB,WAAW;CACX,iBAAiB;CACjB,wBAAwB;CACxB;;AAED;CACC,mBAAmB;CACnB,YAAY;CACZ,SAAS;CACT,YAAY;CACZ,oBAAoB;CACpB,aAAa;CACb,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,UAAU;CACV,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB,wBAAwB;CACxB,uBAAuB;CACvB,iBAAiB;CACjB,4BAA4B;CAC5B;;AAED;CACC,aAAa;CACb;;AAED;CACC,yBAAyB;CACzB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,aAAa;CACb,+BAA+B;CAC/B;;AAED;CACC,aAAa;CACb;;AAED;CACC,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,eAAe;CACf,cAAc;CACd;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,UAAU;CACV,0BAA0B;CAC1B,gBAAgB;CAChB,cAAc,CAAC,kBAAkB;CACjC,8BAA8B;CAC9B,wGAAwG;CACxG;;AAED;CACC,cAAc;CACd,UAAU;CACV,aAAa;CACb,eAAe;CACf,wBAAwB;CACxB;;AAED;;CAEC,aAAa;CACb;;AAED,kBAAkB;AAClB;CACC,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB;;AAED,kBAAkB;AAClB;CACC,mBAAmB;CACnB,OAAO;CACP,UAAU;CACV,WAAW;CACX,eAAe;CACf;;AAED,mBAAmB;AACnB;CACC,WAAW;CACX,SAAS;CACT;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,0zEAA0zE;CAC1zE,aAAa;CACb,0BAA0B,CAAC,kBAAkB;CAC7C,cAAc;CACd;;AAED;CACC,uBAAuB;CACvB;;AAED;CACC,WAAW;CACX,UAAU;CACV,mBAAmB;CACnB,OAAO;CACP,QAAQ;CACR,cAAc;CACd;;AAED;CACC,eAAe;CACf,kBAAkB;CAClB,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,eAAe;CACf,kBAAkB;CAClB,iBAAiB;CACjB,mBAAmB;CACnB,oBAAoB;CACpB,aAAa;CACb,UAAU;CACV;;AAED;CACC,eAAe;CACf;;AAED;CACC,sBAAsB;CACtB,iBAAiB;CACjB,mBAAmB;CACnB,sBAAsB;CACtB,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,WAAW;CACX,iBAAiB;CACjB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,iBAAiB;CACjB,+BAA+B;CAC/B,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,wBAAwB;CACxB,oBAAoB;CACpB;;AAED;CACC,mBAAmB;CACnB,iBAAiB;CACjB;;AAED;CACC,mBAAmB;CACnB,WAAW;CACX,aAAa;CACb,cAAc;CACd,gBAAgB;CAChB,uBAAuB;CACvB,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,WAAW;CACX,gBAAgB;CAChB,eAAe;CACf,UAAU;CACV,yBAAyB;CACzB;;AAED,8BAA8B;AAC9B;;CAEC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,OAAO;CACP,aAAa;CACb;;AAED;CACC,QAAQ;CACR;;AAED;CACC,SAAS;CACT;;AAED;CACC,YAAY;CACZ,cAAc;CACd;;AAED;CACC,YAAY;CACZ,eAAe;CACf,qBAAqB;CACrB;;AAED;CACC,QAAQ;CACR,YAAY;CACZ;;AAED;CACC,UAAU;CACV;;AAED;CACC,OAAO;CACP;;AAED;CACC,mBAAmB;CACnB,sBAAsB;CACtB,iBAAiB;CACjB,WAAW;CACX,uBAAuB;CACvB;;AAED;CACC,aAAa;CACb,iBAAiB;CACjB,eAAe;CACf,WAAW;CACX,eAAe;CACf,uBAAuB;CACvB,kBAAkB;CAClB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,UAAU;CACV,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;CACf,iBAAiB;CACjB,SAAS;CACT;;AAED,gEAAgE;AAChE;CACC,iBAAiB;CACjB,oBAAoB;CACpB,mBAAmB;CACnB;;AAED,4BAA4B;AAC5B;CACC,mBAAmB;CACnB,iBAAiB;CACjB,SAAS;CACT,QAAQ;CACR;;AAED;CACC,OAAO;CACP;;AAED;CACC,UAAU;CACV;;AAED,kBAAkB;AAClB;CACC,8BAA8B;CAC9B,iCAAiC;CACjC;;AAED;CACC,mBAAmB,wIAAwI;CAC3J,cAAc;CACd;;AAED;CACC,UAAU;CACV,qBAAqB;CACrB;;AAED;CACC,iBAAiB;CACjB,YAAY;CACZ,mBAAmB;CACnB,OAAO;CACP,qBAAqB;CACrB,uBAAuB;CACvB,WAAW;CACX,oBAAoB;CACpB;;AAED;CACC,YAAY;CACZ,kBAAkB;CAClB,sBAAsB;CACtB;;AAED;CACC,oBAAoB;CACpB,oBAAoB;CACpB;;AAED;;;CAGC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf,gBAAgB;CAChB,mBAAmB;CACnB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,mBAAmB;CACnB,cAAc;CACd,iBAAiB;CAEjB,yBAAyB;CACzB;;AAED;CACC,kBAAkB;CAClB;;AAED;oCACoC;AACpC;CACC,0DAA0D;CAC1D,iBAAiB;CACjB;;AAED;CACC,eAAe;CACf;;AAED;;;;CAIC,0DAA0D;CAC1D,eAAe;CACf;;AAED;CACC,uBAAuB;CACvB,0FAA0F;CAC1F,YAAY;CACZ;;AAED;CACC,YAAY;CACZ;;AAED;CACC,0BAA0B;CAC1B,0FAA0F;CAC1F,YAAY;CACZ,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ;;AAED;oCACoC;AACpC;;;CAGC,uBAAuB;CACvB,oFAAoF;CACpF,kBAAkB;CAClB,eAAe;CACf;;AAED;;;CAGC,eAAe;CACf,sBAAsB;CACtB;;AAED;;;;;;CAMC,0BAA0B;CAC1B,oFAAoF;CACpF,kBAAkB;CAClB,eAAe;CACf;;AAED;;;;;;;;CAQC,eAAe;CACf,sBAAsB;CACtB;;AAED;;;CAGC,0BAA0B;CAC1B,gFAAgF;CAChF,kBAAkB;CAClB,eAAe;CACf;;AAED;;;CAGC,eAAe;CACf,sBAAsB;CACtB;;AAED;oCACoC;AACpC;;;CAGC,0BAA0B;CAC1B,4FAA4F;CAC5F,eAAe;CACf;;AAED;;;CAGC,eAAe;CACf;;AAED;;;CAGC,0BAA0B;CAC1B,2FAA2F;CAC3F,YAAY;CACZ;;AAED;;;CAGC,YAAY;CACZ;;AAED;;;CAGC,YAAY;CACZ;;AAED;;;CAGC,kBAAkB;CAClB;;AAED;;;CAGC,aAAa;CACb,0BAA0B,CAAC,kBAAkB;CAC7C,oBAAoB;CACpB;;AAED;;;CAGC,cAAc;CACd,0BAA0B,CAAC,kBAAkB;CAC7C,uBAAuB;CACvB;;AAED;CACC,0BAA0B,CAAC,8BAA8B;CACzD;;AAED;oCACoC;;AAEpC,uBAAuB;AACvB;CACC,YAAY;CACZ,aAAa;CACb;;AAED;;CAEC,4DAA4D;CAC5D;;AAED;CACC,4DAA4D;CAC5D;;AAED;CACC,4DAA4D;CAC5D;;AAED;;CAEC,4DAA4D;CAC5D;;AAED;CACC,4DAA4D;CAC5D;;AAED;CACC,4DAA4D;CAC5D;;AAED;;CAEC,4DAA4D;CAC5D;;AAED,iBAAiB;AACjB;CACC,+BAA+B;CAC/B;;AAED;CACC,yBAAyB;CACzB;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,6BAA6B;CAC7B;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,iCAAiC;CACjC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED,sEAAsE;AACtE;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,mCAAmC;CACnC;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,8BAA8B;CAC9B;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;CACC,kCAAkC;CAClC;;AAED;oCACoC;;AAEpC,mBAAmB;AACnB;;;;CAIC,4BAA4B;CAC5B;;AAED;;;;CAIC,6BAA6B;CAC7B;;AAED;;;;CAIC,+BAA+B;CAC/B;;AAED;;;;CAIC,gCAAgC;CAChC;;AAED,cAAc;AACd;CACC,wFAAwF;CACxF,aAAa;CACb,0BAA0B,CAAC,kBAAkB;CAC7C;;AAED;CACC,sBAAsB;CACtB,aAAa;CACb,iBAAiB;CACjB,aAAa;CACb,0BAA0B,CAAC,kBAAkB;CAC7C,mBAAmB;CACnB","file":"jquery-ui.custom.min.css","sourcesContent":["/*! jQuery UI - v1.11.4 - 2015-12-05\n* http://jqueryui.com\n* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n\n.ui-helper-clearfix {\n\tmin-height: 0; /* support: IE7 */\n}\n\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter: alpha(opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.ui-draggable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n.ui-resizable {\n\tposition: relative;\n}\n\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n\n.ui-selectable {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin: 2px 0 0 0;\n\tpadding: .5em .5em .5em .7em;\n\tmin-height: 0; /* support: IE7 */\n\tfont-size: 100%;\n}\n\n.ui-accordion .ui-accordion-icons {\n\tpadding-left: 2.2em;\n}\n\n.ui-accordion .ui-accordion-icons .ui-accordion-icons {\n\tpadding-left: 2.2em;\n}\n\n.ui-accordion .ui-accordion-header .ui-accordion-header-icon {\n\tposition: absolute;\n\tleft: .5em;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n\n.ui-button {\n\tdisplay: inline-block;\n\tposition: relative;\n\tpadding: 0;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\toverflow: visible; /* removes extra width in IE */\n}\n\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n\n/* to make room for the icon, a width needs to be set here */\n.ui-button-icon-only {\n\twidth: 2.2em;\n}\n\n/* button elements seem to need a little more width */\nbutton.ui-button-icon-only {\n\twidth: 2.4em;\n}\n\n.ui-button-icons-only {\n\twidth: 3.4em;\n}\n\nbutton.ui-button-icons-only {\n\twidth: 3.7em;\n}\n\n/* button text element */\n.ui-button .ui-button-text {\n\tdisplay: block;\n\tline-height: normal;\n}\n\n.ui-button-text-only .ui-button-text {\n\tpadding: .4em 1em;\n}\n\n.ui-button-icon-only .ui-button-text,\n.ui-button-icons-only .ui-button-text {\n\tpadding: .4em;\n\ttext-indent: -9999999px;\n}\n\n.ui-button-text-icon-primary .ui-button-text,\n.ui-button-text-icons .ui-button-text {\n\tpadding: .4em 1em .4em 2.1em;\n}\n\n.ui-button-text-icon-secondary .ui-button-text,\n.ui-button-text-icons .ui-button-text {\n\tpadding: .4em 2.1em .4em 1em;\n}\n\n.ui-button-text-icons .ui-button-text {\n\tpadding-left: 2.1em;\n\tpadding-right: 2.1em;\n}\n\n/* no icon support for input elements, provide padding by default */\ninput.ui-button {\n\tpadding: .4em 1em;\n}\n\n/* button icon element(s) */\n.ui-button-icon-only .ui-icon,\n.ui-button-text-icon-primary .ui-icon,\n.ui-button-text-icon-secondary .ui-icon,\n.ui-button-text-icons .ui-icon,\n.ui-button-icons-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n\n.ui-button-icon-only .ui-icon {\n\tleft: 50%;\n\tmargin-left: -8px;\n}\n\n.ui-button-text-icon-primary .ui-button-icon-primary,\n.ui-button-text-icons .ui-button-icon-primary,\n.ui-button-icons-only .ui-button-icon-primary {\n\tleft: .5em;\n}\n\n.ui-button-text-icon-secondary .ui-button-icon-secondary,\n.ui-button-text-icons .ui-button-icon-secondary,\n.ui-button-icons-only .ui-button-icon-secondary {\n\tright: .5em;\n}\n\n/* button sets */\n.ui-buttonset {\n\tmargin-right: 7px;\n}\n\n.ui-buttonset .ui-button {\n\tmargin-left: 0;\n\tmargin-right: -.3em;\n}\n\n/* workarounds */\n/* reset extra padding in Firefox, see h5bp.com/l */\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\n.ui-datepicker {\n\twidth: 17em;\n\tpadding: .2em .2em 0;\n\tdisplay: none;\n}\n\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 45%;\n}\n\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n/* RTL support */\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n\n.ui-dialog {\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 20px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n\n.ui-dialog .ui-resizable-se {\n\twidth: 12px;\n\theight: 12px;\n\tright: -5px;\n\tbottom: -5px;\n\tbackground-position: 16px 16px;\n}\n\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n\n.ui-menu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: none;\n}\n\n.ui-menu .ui-menu {\n\tposition: absolute;\n}\n\n.ui-menu .ui-menu-item {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 3px 1em 3px .4em;\n\tcursor: pointer;\n\tmin-height: 0; /* support: IE7 */\n\t/* support: IE10, see #8844 */\n\tlist-style-image: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\");\n}\n\n.ui-menu .ui-menu-divider {\n\tmargin: 5px 0;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n\n.ui-menu .ui-state-focus,\n.ui-menu .ui-state-active {\n\tmargin: -1px;\n}\n\n/* icon support */\n.ui-menu-icons {\n\tposition: relative;\n}\n\n.ui-menu-icons .ui-menu-item {\n\tpadding-left: 2em;\n}\n\n/* left-aligned */\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: .2em;\n\tmargin: auto 0;\n}\n\n/* right-aligned */\n.ui-menu .ui-menu-icon {\n\tleft: auto;\n\tright: 0;\n}\n\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");\n\theight: 100%;\n\tfilter: alpha(opacity=25); /* support: IE8 */\n\topacity: 0.25;\n}\n\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n\n.ui-selectmenu-menu {\n\tpadding: 0;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: none;\n}\n\n.ui-selectmenu-menu .ui-menu {\n\toverflow: auto;\n\t/* Support: IE7 */\n\toverflow-x: hidden;\n\tpadding-bottom: 1px;\n}\n\n.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tline-height: 1.5;\n\tpadding: 2px 0.4em;\n\tmargin: 0.5em 0 0 0;\n\theight: auto;\n\tborder: 0;\n}\n\n.ui-selectmenu-open {\n\tdisplay: block;\n}\n\n.ui-selectmenu-button {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tposition: relative;\n\ttext-decoration: none;\n\tcursor: pointer;\n}\n\n.ui-selectmenu-button span.ui-icon {\n\tright: 0.5em;\n\tleft: auto;\n\tmargin-top: -8px;\n\tposition: absolute;\n\ttop: 50%;\n}\n\n.ui-selectmenu-button span.ui-selectmenu-text {\n\ttext-align: left;\n\tpadding: 0.4em 2.1em 0.4em 1em;\n\tdisplay: block;\n\tline-height: 1.4;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n/* support: IE8 - See #6727 */\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 22px;\n}\n\n.ui-spinner-button {\n\twidth: 16px;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n\n/* more specificity required here to override default borders */\n.ui-spinner a.ui-spinner-button {\n\tborder-top: none;\n\tborder-bottom: none;\n\tborder-right: none;\n}\n\n/* vertically center icon */\n.ui-spinner .ui-icon {\n\tposition: absolute;\n\tmargin-top: -8px;\n\ttop: 50%;\n\tleft: 0;\n}\n\n.ui-spinner-up {\n\ttop: 0;\n}\n\n.ui-spinner-down {\n\tbottom: 0;\n}\n\n/* TR overrides */\n.ui-spinner .ui-icon-triangle-1-s {\n\t/* need to fix icons sprite */\n\tbackground-position: -65px -16px;\n}\n\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom-width: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n\n.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n\n.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n\tcursor: text;\n}\n\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n\tcursor: pointer;\n}\n\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n\t-webkit-box-shadow: 0 0 5px #AAA;\n\tbox-shadow: 0 0 5px #AAA;\n}\n\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: trebuchet ms,tahoma,verdana,arial,sans-serif;\n\tfont-size: 1.1em;\n}\n\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: trebuchet ms,tahoma,verdana,arial,sans-serif;\n\tfont-size: 1em;\n}\n\n.ui-widget-content {\n\tborder: 1px solid #DDD;\n\tbackground: #EEE url(\"images/ui-bg_highlight-soft_100_eeeeee_1x100.png\") 50% top repeat-x;\n\tcolor: #333;\n}\n\n.ui-widget-content a {\n\tcolor: #333;\n}\n\n.ui-widget-header {\n\tborder: 1px solid #E78F08;\n\tbackground: #F6A828 url(\"images/ui-bg_gloss-wave_35_f6a828_500x100.png\") 50% 50% repeat-x;\n\tcolor: #FFF;\n\tfont-weight: bold;\n}\n\n.ui-widget-header a {\n\tcolor: #FFF;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default {\n\tborder: 1px solid #CCC;\n\tbackground: #F6F6F6 url(\"images/ui-bg_glass_100_f6f6f6_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: bold;\n\tcolor: #1C94C4;\n}\n\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited {\n\tcolor: #1C94C4;\n\ttext-decoration: none;\n}\n\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus {\n\tborder: 1px solid #FBCB09;\n\tbackground: #FDF5CE url(\"images/ui-bg_glass_100_fdf5ce_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: bold;\n\tcolor: #C77405;\n}\n\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited {\n\tcolor: #C77405;\n\ttext-decoration: none;\n}\n\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active {\n\tborder: 1px solid #FBD850;\n\tbackground: #FFF url(\"images/ui-bg_glass_65_ffffff_1x400.png\") 50% 50% repeat-x;\n\tfont-weight: bold;\n\tcolor: #EB8F00;\n}\n\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #EB8F00;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #FED22F;\n\tbackground: #FFE45C url(\"images/ui-bg_highlight-soft_75_ffe45c_1x100.png\") 50% top repeat-x;\n\tcolor: #363636;\n}\n\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #363636;\n}\n\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #CD0A0A;\n\tbackground: #B81900 url(\"images/ui-bg_diagonals-thick_18_b81900_40x40.png\") 50% 50% repeat;\n\tcolor: #FFF;\n}\n\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #FFF;\n}\n\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #FFF;\n}\n\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: 0.7;\n\tfilter: alpha(opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: 0.35;\n\tfilter: alpha(opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n\n.ui-state-disabled .ui-icon {\n\tfilter: alpha(opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"images/ui-icons_222222_256x240.png\");\n}\n\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ffffff_256x240.png\");\n}\n\n.ui-state-default .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ef8c08_256x240.png\");\n}\n\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ef8c08_256x240.png\");\n}\n\n.ui-state-active .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ef8c08_256x240.png\");\n}\n\n.ui-state-highlight .ui-icon {\n\tbackground-image: url(\"images/ui-icons_228ef1_256x240.png\");\n}\n\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"images/ui-icons_ffd27a_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank {\n\tbackground-position: 16px 16px;\n}\n\n.ui-icon-carat-1-n {\n\tbackground-position: 0 0;\n}\n\n.ui-icon-carat-1-ne {\n\tbackground-position: -16px 0;\n}\n\n.ui-icon-carat-1-e {\n\tbackground-position: -32px 0;\n}\n\n.ui-icon-carat-1-se {\n\tbackground-position: -48px 0;\n}\n\n.ui-icon-carat-1-s {\n\tbackground-position: -64px 0;\n}\n\n.ui-icon-carat-1-sw {\n\tbackground-position: -80px 0;\n}\n\n.ui-icon-carat-1-w {\n\tbackground-position: -96px 0;\n}\n\n.ui-icon-carat-1-nw {\n\tbackground-position: -112px 0;\n}\n\n.ui-icon-carat-2-n-s {\n\tbackground-position: -128px 0;\n}\n\n.ui-icon-carat-2-e-w {\n\tbackground-position: -144px 0;\n}\n\n.ui-icon-triangle-1-n {\n\tbackground-position: 0 -16px;\n}\n\n.ui-icon-triangle-1-ne {\n\tbackground-position: -16px -16px;\n}\n\n.ui-icon-triangle-1-e {\n\tbackground-position: -32px -16px;\n}\n\n.ui-icon-triangle-1-se {\n\tbackground-position: -48px -16px;\n}\n\n.ui-icon-triangle-1-s {\n\tbackground-position: -64px -16px;\n}\n\n.ui-icon-triangle-1-sw {\n\tbackground-position: -80px -16px;\n}\n\n.ui-icon-triangle-1-w {\n\tbackground-position: -96px -16px;\n}\n\n.ui-icon-triangle-1-nw {\n\tbackground-position: -112px -16px;\n}\n\n.ui-icon-triangle-2-n-s {\n\tbackground-position: -128px -16px;\n}\n\n.ui-icon-triangle-2-e-w {\n\tbackground-position: -144px -16px;\n}\n\n.ui-icon-arrow-1-n {\n\tbackground-position: 0 -32px;\n}\n\n.ui-icon-arrow-1-ne {\n\tbackground-position: -16px -32px;\n}\n\n.ui-icon-arrow-1-e {\n\tbackground-position: -32px -32px;\n}\n\n.ui-icon-arrow-1-se {\n\tbackground-position: -48px -32px;\n}\n\n.ui-icon-arrow-1-s {\n\tbackground-position: -64px -32px;\n}\n\n.ui-icon-arrow-1-sw {\n\tbackground-position: -80px -32px;\n}\n\n.ui-icon-arrow-1-w {\n\tbackground-position: -96px -32px;\n}\n\n.ui-icon-arrow-1-nw {\n\tbackground-position: -112px -32px;\n}\n\n.ui-icon-arrow-2-n-s {\n\tbackground-position: -128px -32px;\n}\n\n.ui-icon-arrow-2-ne-sw {\n\tbackground-position: -144px -32px;\n}\n\n.ui-icon-arrow-2-e-w {\n\tbackground-position: -160px -32px;\n}\n\n.ui-icon-arrow-2-se-nw {\n\tbackground-position: -176px -32px;\n}\n\n.ui-icon-arrowstop-1-n {\n\tbackground-position: -192px -32px;\n}\n\n.ui-icon-arrowstop-1-e {\n\tbackground-position: -208px -32px;\n}\n\n.ui-icon-arrowstop-1-s {\n\tbackground-position: -224px -32px;\n}\n\n.ui-icon-arrowstop-1-w {\n\tbackground-position: -240px -32px;\n}\n\n.ui-icon-arrowthick-1-n {\n\tbackground-position: 0 -48px;\n}\n\n.ui-icon-arrowthick-1-ne {\n\tbackground-position: -16px -48px;\n}\n\n.ui-icon-arrowthick-1-e {\n\tbackground-position: -32px -48px;\n}\n\n.ui-icon-arrowthick-1-se {\n\tbackground-position: -48px -48px;\n}\n\n.ui-icon-arrowthick-1-s {\n\tbackground-position: -64px -48px;\n}\n\n.ui-icon-arrowthick-1-sw {\n\tbackground-position: -80px -48px;\n}\n\n.ui-icon-arrowthick-1-w {\n\tbackground-position: -96px -48px;\n}\n\n.ui-icon-arrowthick-1-nw {\n\tbackground-position: -112px -48px;\n}\n\n.ui-icon-arrowthick-2-n-s {\n\tbackground-position: -128px -48px;\n}\n\n.ui-icon-arrowthick-2-ne-sw {\n\tbackground-position: -144px -48px;\n}\n\n.ui-icon-arrowthick-2-e-w {\n\tbackground-position: -160px -48px;\n}\n\n.ui-icon-arrowthick-2-se-nw {\n\tbackground-position: -176px -48px;\n}\n\n.ui-icon-arrowthickstop-1-n {\n\tbackground-position: -192px -48px;\n}\n\n.ui-icon-arrowthickstop-1-e {\n\tbackground-position: -208px -48px;\n}\n\n.ui-icon-arrowthickstop-1-s {\n\tbackground-position: -224px -48px;\n}\n\n.ui-icon-arrowthickstop-1-w {\n\tbackground-position: -240px -48px;\n}\n\n.ui-icon-arrowreturnthick-1-w {\n\tbackground-position: 0 -64px;\n}\n\n.ui-icon-arrowreturnthick-1-n {\n\tbackground-position: -16px -64px;\n}\n\n.ui-icon-arrowreturnthick-1-e {\n\tbackground-position: -32px -64px;\n}\n\n.ui-icon-arrowreturnthick-1-s {\n\tbackground-position: -48px -64px;\n}\n\n.ui-icon-arrowreturn-1-w {\n\tbackground-position: -64px -64px;\n}\n\n.ui-icon-arrowreturn-1-n {\n\tbackground-position: -80px -64px;\n}\n\n.ui-icon-arrowreturn-1-e {\n\tbackground-position: -96px -64px;\n}\n\n.ui-icon-arrowreturn-1-s {\n\tbackground-position: -112px -64px;\n}\n\n.ui-icon-arrowrefresh-1-w {\n\tbackground-position: -128px -64px;\n}\n\n.ui-icon-arrowrefresh-1-n {\n\tbackground-position: -144px -64px;\n}\n\n.ui-icon-arrowrefresh-1-e {\n\tbackground-position: -160px -64px;\n}\n\n.ui-icon-arrowrefresh-1-s {\n\tbackground-position: -176px -64px;\n}\n\n.ui-icon-arrow-4 {\n\tbackground-position: 0 -80px;\n}\n\n.ui-icon-arrow-4-diag {\n\tbackground-position: -16px -80px;\n}\n\n.ui-icon-extlink {\n\tbackground-position: -32px -80px;\n}\n\n.ui-icon-newwin {\n\tbackground-position: -48px -80px;\n}\n\n.ui-icon-refresh {\n\tbackground-position: -64px -80px;\n}\n\n.ui-icon-shuffle {\n\tbackground-position: -80px -80px;\n}\n\n.ui-icon-transfer-e-w {\n\tbackground-position: -96px -80px;\n}\n\n.ui-icon-transferthick-e-w {\n\tbackground-position: -112px -80px;\n}\n\n.ui-icon-folder-collapsed {\n\tbackground-position: 0 -96px;\n}\n\n.ui-icon-folder-open {\n\tbackground-position: -16px -96px;\n}\n\n.ui-icon-document {\n\tbackground-position: -32px -96px;\n}\n\n.ui-icon-document-b {\n\tbackground-position: -48px -96px;\n}\n\n.ui-icon-note {\n\tbackground-position: -64px -96px;\n}\n\n.ui-icon-mail-closed {\n\tbackground-position: -80px -96px;\n}\n\n.ui-icon-mail-open {\n\tbackground-position: -96px -96px;\n}\n\n.ui-icon-suitcase {\n\tbackground-position: -112px -96px;\n}\n\n.ui-icon-comment {\n\tbackground-position: -128px -96px;\n}\n\n.ui-icon-person {\n\tbackground-position: -144px -96px;\n}\n\n.ui-icon-print {\n\tbackground-position: -160px -96px;\n}\n\n.ui-icon-trash {\n\tbackground-position: -176px -96px;\n}\n\n.ui-icon-locked {\n\tbackground-position: -192px -96px;\n}\n\n.ui-icon-unlocked {\n\tbackground-position: -208px -96px;\n}\n\n.ui-icon-bookmark {\n\tbackground-position: -224px -96px;\n}\n\n.ui-icon-tag {\n\tbackground-position: -240px -96px;\n}\n\n.ui-icon-home {\n\tbackground-position: 0 -112px;\n}\n\n.ui-icon-flag {\n\tbackground-position: -16px -112px;\n}\n\n.ui-icon-calendar {\n\tbackground-position: -32px -112px;\n}\n\n.ui-icon-cart {\n\tbackground-position: -48px -112px;\n}\n\n.ui-icon-pencil {\n\tbackground-position: -64px -112px;\n}\n\n.ui-icon-clock {\n\tbackground-position: -80px -112px;\n}\n\n.ui-icon-disk {\n\tbackground-position: -96px -112px;\n}\n\n.ui-icon-calculator {\n\tbackground-position: -112px -112px;\n}\n\n.ui-icon-zoomin {\n\tbackground-position: -128px -112px;\n}\n\n.ui-icon-zoomout {\n\tbackground-position: -144px -112px;\n}\n\n.ui-icon-search {\n\tbackground-position: -160px -112px;\n}\n\n.ui-icon-wrench {\n\tbackground-position: -176px -112px;\n}\n\n.ui-icon-gear {\n\tbackground-position: -192px -112px;\n}\n\n.ui-icon-heart {\n\tbackground-position: -208px -112px;\n}\n\n.ui-icon-star {\n\tbackground-position: -224px -112px;\n}\n\n.ui-icon-link {\n\tbackground-position: -240px -112px;\n}\n\n.ui-icon-cancel {\n\tbackground-position: 0 -128px;\n}\n\n.ui-icon-plus {\n\tbackground-position: -16px -128px;\n}\n\n.ui-icon-plusthick {\n\tbackground-position: -32px -128px;\n}\n\n.ui-icon-minus {\n\tbackground-position: -48px -128px;\n}\n\n.ui-icon-minusthick {\n\tbackground-position: -64px -128px;\n}\n\n.ui-icon-close {\n\tbackground-position: -80px -128px;\n}\n\n.ui-icon-closethick {\n\tbackground-position: -96px -128px;\n}\n\n.ui-icon-key {\n\tbackground-position: -112px -128px;\n}\n\n.ui-icon-lightbulb {\n\tbackground-position: -128px -128px;\n}\n\n.ui-icon-scissors {\n\tbackground-position: -144px -128px;\n}\n\n.ui-icon-clipboard {\n\tbackground-position: -160px -128px;\n}\n\n.ui-icon-copy {\n\tbackground-position: -176px -128px;\n}\n\n.ui-icon-contact {\n\tbackground-position: -192px -128px;\n}\n\n.ui-icon-image {\n\tbackground-position: -208px -128px;\n}\n\n.ui-icon-video {\n\tbackground-position: -224px -128px;\n}\n\n.ui-icon-script {\n\tbackground-position: -240px -128px;\n}\n\n.ui-icon-alert {\n\tbackground-position: 0 -144px;\n}\n\n.ui-icon-info {\n\tbackground-position: -16px -144px;\n}\n\n.ui-icon-notice {\n\tbackground-position: -32px -144px;\n}\n\n.ui-icon-help {\n\tbackground-position: -48px -144px;\n}\n\n.ui-icon-check {\n\tbackground-position: -64px -144px;\n}\n\n.ui-icon-bullet {\n\tbackground-position: -80px -144px;\n}\n\n.ui-icon-radio-on {\n\tbackground-position: -96px -144px;\n}\n\n.ui-icon-radio-off {\n\tbackground-position: -112px -144px;\n}\n\n.ui-icon-pin-w {\n\tbackground-position: -128px -144px;\n}\n\n.ui-icon-pin-s {\n\tbackground-position: -144px -144px;\n}\n\n.ui-icon-play {\n\tbackground-position: 0 -160px;\n}\n\n.ui-icon-pause {\n\tbackground-position: -16px -160px;\n}\n\n.ui-icon-seek-next {\n\tbackground-position: -32px -160px;\n}\n\n.ui-icon-seek-prev {\n\tbackground-position: -48px -160px;\n}\n\n.ui-icon-seek-end {\n\tbackground-position: -64px -160px;\n}\n\n.ui-icon-seek-start {\n\tbackground-position: -80px -160px;\n}\n\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first {\n\tbackground-position: -80px -160px;\n}\n\n.ui-icon-stop {\n\tbackground-position: -96px -160px;\n}\n\n.ui-icon-eject {\n\tbackground-position: -112px -160px;\n}\n\n.ui-icon-volume-off {\n\tbackground-position: -128px -160px;\n}\n\n.ui-icon-volume-on {\n\tbackground-position: -144px -160px;\n}\n\n.ui-icon-power {\n\tbackground-position: 0 -176px;\n}\n\n.ui-icon-signal-diag {\n\tbackground-position: -16px -176px;\n}\n\n.ui-icon-signal {\n\tbackground-position: -32px -176px;\n}\n\n.ui-icon-battery-0 {\n\tbackground-position: -48px -176px;\n}\n\n.ui-icon-battery-1 {\n\tbackground-position: -64px -176px;\n}\n\n.ui-icon-battery-2 {\n\tbackground-position: -80px -176px;\n}\n\n.ui-icon-battery-3 {\n\tbackground-position: -96px -176px;\n}\n\n.ui-icon-circle-plus {\n\tbackground-position: 0 -192px;\n}\n\n.ui-icon-circle-minus {\n\tbackground-position: -16px -192px;\n}\n\n.ui-icon-circle-close {\n\tbackground-position: -32px -192px;\n}\n\n.ui-icon-circle-triangle-e {\n\tbackground-position: -48px -192px;\n}\n\n.ui-icon-circle-triangle-s {\n\tbackground-position: -64px -192px;\n}\n\n.ui-icon-circle-triangle-w {\n\tbackground-position: -80px -192px;\n}\n\n.ui-icon-circle-triangle-n {\n\tbackground-position: -96px -192px;\n}\n\n.ui-icon-circle-arrow-e {\n\tbackground-position: -112px -192px;\n}\n\n.ui-icon-circle-arrow-s {\n\tbackground-position: -128px -192px;\n}\n\n.ui-icon-circle-arrow-w {\n\tbackground-position: -144px -192px;\n}\n\n.ui-icon-circle-arrow-n {\n\tbackground-position: -160px -192px;\n}\n\n.ui-icon-circle-zoomin {\n\tbackground-position: -176px -192px;\n}\n\n.ui-icon-circle-zoomout {\n\tbackground-position: -192px -192px;\n}\n\n.ui-icon-circle-check {\n\tbackground-position: -208px -192px;\n}\n\n.ui-icon-circlesmall-plus {\n\tbackground-position: 0 -208px;\n}\n\n.ui-icon-circlesmall-minus {\n\tbackground-position: -16px -208px;\n}\n\n.ui-icon-circlesmall-close {\n\tbackground-position: -32px -208px;\n}\n\n.ui-icon-squaresmall-plus {\n\tbackground-position: -48px -208px;\n}\n\n.ui-icon-squaresmall-minus {\n\tbackground-position: -64px -208px;\n}\n\n.ui-icon-squaresmall-close {\n\tbackground-position: -80px -208px;\n}\n\n.ui-icon-grip-dotted-vertical {\n\tbackground-position: 0 -224px;\n}\n\n.ui-icon-grip-dotted-horizontal {\n\tbackground-position: -16px -224px;\n}\n\n.ui-icon-grip-solid-vertical {\n\tbackground-position: -32px -224px;\n}\n\n.ui-icon-grip-solid-horizontal {\n\tbackground-position: -48px -224px;\n}\n\n.ui-icon-gripsmall-diagonal-se {\n\tbackground-position: -64px -224px;\n}\n\n.ui-icon-grip-diagonal-se {\n\tbackground-position: -80px -224px;\n}\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 4px;\n}\n\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 4px;\n}\n\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 4px;\n}\n\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 4px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #666 url(\"images/ui-bg_diagonals-thick_20_666666_40x40.png\") 50% 50% repeat;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50); /* support: IE8 */\n}\n\n.ui-widget-shadow {\n\tmargin: -5px 0 0 -5px;\n\tpadding: 5px;\n\tbackground: #000;\n\topacity: 0.2;\n\tfilter: alpha(opacity=20); /* support: IE8 */\n\tborder-radius: 5px;\n}\n"]}
includes/jquery.blockUI.js CHANGED
@@ -11,6 +11,7 @@
11
  *
12
  * Thanks to Amir-Hossein Sobhi for some excellent contributions!
13
  */
 
14
  ;(function() {
15
  /*jshint eqeqeq:false curly:false latedef:false */
16
  "use strict";
@@ -616,4 +617,4 @@
616
  setup(jQuery);
617
  }
618
 
619
- })();
11
  *
12
  * Thanks to Amir-Hossein Sobhi for some excellent contributions!
13
  */
14
+
15
  ;(function() {
16
  /*jshint eqeqeq:false curly:false latedef:false */
17
  "use strict";
617
  setup(jQuery);
618
  }
619
 
620
+ })();
includes/updraft-admin.js CHANGED
@@ -1,20 +1,20 @@
1
  /**
2
- * Send an action over AJAX. A wrapper around jQuery.ajax. In future, all consumers can be reviewed to simplify some of the options, where there is historical cruft.
3
- * N.B. updraft_iframe_modal() below uses the Ajax URL for the iframe's src attribute
4
- *
5
- * @param {string} action - the action to send
6
- * @param * data - data to send
7
- * @param Callback callback - will be called with the results
8
- * @param {object} [options={}] - further options. Relevant properties include:
9
- * - [json_parse=true] - whether to JSON parse the results
10
- * - [alert_on_error=true] - whether to show an alert box if there was a problem (otherwise, suppress it)
11
- * - [action='updraft_ajax'] - what to send as the action parameter on the AJAX request (N.B. action parameter to this function goes as the 'subaction' parameter on the AJAX request)
12
- * - [nonce=updraft_credentialtest_nonce] - the nonce value to send.
13
- * - [nonce_key='nonce'] - the key value for the nonce field
14
- * - [timeout=null] - set a timeout after this number of seconds (or if null, none is set)
15
- * - [async=true] - control whether the request is asynchronous (almost always wanted) or blocking (would need to have a specific reason)
16
- * - [type='POST'] - GET or POST
17
- */
18
  function updraft_send_command(action, data, callback, options) {
19
 
20
  default_options = {
@@ -55,7 +55,7 @@ function updraft_send_command(action, data, callback, options) {
55
  success: function(response, status) {
56
  if (options.json_parse) {
57
  try {
58
- var resp = JSON.parse(response);
59
  } catch (e) {
60
  console.log(e);
61
  console.log(response);
@@ -87,7 +87,7 @@ function updraft_send_command(action, data, callback, options) {
87
 
88
  /**
89
  * Opens the dialog box for confirmation of whether to delete a backup, plus options if relevant
90
- *
91
  * @param {string} key - The UNIX timestamp of the backup
92
  * @param {string} nonce - The backup job ID
93
  * @param {boolean} showremote - Whether or not to show the "also delete from remote storage?" checkbox
@@ -138,12 +138,12 @@ function updraft_remote_storage_tabs_setup() {
138
  jQuery(set).each(function(ind, obj) {
139
  var ser = jQuery(obj).val();
140
 
141
- if(jQuery(obj).attr('id') != 'updraft_servicecheckbox_none') {
142
  anychecked++;
143
  }
144
 
145
  jQuery('.remote-tab-'+ser).show();
146
- if(ind == jQuery(set).length-1){
147
  updraft_remote_storage_tab_activation(ser);
148
  }
149
  });
@@ -152,12 +152,12 @@ function updraft_remote_storage_tabs_setup() {
152
  jQuery('.updraftplusmethod.none').hide();
153
  }
154
 
155
- /*To allow labelauty remote storage buttons to be used with keyboard*/
156
  jQuery(document).keyup(function(event) {
157
- if(event.keyCode === 32 || event.keyCode === 13) {
158
- if(jQuery(document.activeElement).is("input.labelauty + label")) {
159
  var for_box = jQuery(document.activeElement).attr("for");
160
- if(for_box) {
161
  jQuery("#"+for_box).change();
162
  }
163
  }
@@ -176,8 +176,8 @@ function updraft_remote_storage_tabs_setup() {
176
  } else {
177
  anychecked--;
178
  jQuery('.remote-tab-'+serv).hide();
179
- //Check if this was the active tab, if yes, switch to another
180
- if(jQuery('.remote-tab-'+serv).data('active') == true){
181
  updraft_remote_storage_tab_activation(jQuery('.remote-tab:visible').last().attr('name'));
182
  }
183
  }
@@ -191,8 +191,8 @@ function updraft_remote_storage_tabs_setup() {
191
  }
192
  });
193
 
194
- //Add stuff for free version
195
- jQuery('.updraft_servicecheckbox:not(.multi)').change(function(){
196
  var svalue = jQuery(this).attr('value');
197
  if (jQuery(this).is(':not(:checked)')) {
198
  jQuery('.updraftplusmethod.'+svalue).hide();
@@ -209,7 +209,7 @@ function updraft_remote_storage_tabs_setup() {
209
 
210
  /**
211
  * Carries out a remote storage test
212
- *
213
  * @param {string} method - The identifier for the remote storage
214
  * @param {callback} result_callback - A callback function to be called with the result
215
  * @param {string} [instance_id] - The particular instance (if any) of the remote storage to be tested (for methods supporting multiple instances)
@@ -235,7 +235,6 @@ function updraft_remote_storage_test(method, result_callback, instance_id) {
235
  method: method
236
  };
237
 
238
-
239
  // Add the other items to the data object. The expert mode settings are for the generic SSL options.
240
  jQuery('#updraft-navtab-settings-content '+settings_selector+' input[data-updraft_settings_test], #updraft-navtab-settings-content .expertmode input[data-updraft_settings_test]').each(function(index, item) {
241
  var item_key = jQuery(item).data('updraft_settings_test');
@@ -269,8 +268,11 @@ function updraft_remote_storage_test(method, result_callback, instance_id) {
269
  if ('undefined' !== typeof result_callback && false != result_callback) {
270
  result_callback = result_callback.call(this, response, status, data);
271
  }
272
- if ('undefined' !== typeof result_callback && false === result_callback) {
273
  alert(updraftlion.settings_test_result.replace('%s', method_label)+' '+response.output);
 
 
 
274
  }
275
  });
276
  }
@@ -284,12 +286,13 @@ function backupnow_whichfiles_checked(onlythesefileentities){
284
  if (onlythesefileentities != '') { onlythesefileentities += ','; }
285
  onlythesefileentities += entity;
286
  });
287
- // console.log(onlythesefileentities);
288
  return onlythesefileentities;
289
  }
290
 
291
  /**
292
- * a method to get all the selected table values from the backup now modal
 
293
  * @param {[String]} onlythesetableentities an empty string to append values to
294
  * @return {[String]} a string that contains the values of all selected table entities and the database the belong to
295
  */
@@ -330,7 +333,7 @@ function updraft_deleteallselected() {
330
  }
331
 
332
  function updraft_openrestorepanel(toggly) {
333
- //jQuery('.download-backups').slideDown(); updraft_historytimertoggle(1); jQuery('html,body').animate({scrollTop: jQuery('#updraft_lastlogcontainer').offset().top},'slow');
334
  updraft_console_focussed_tab = 2;
335
  updraft_historytimertoggle(toggly);
336
  jQuery('#updraft-navtab-status-content').hide();
@@ -356,7 +359,7 @@ function updraft_initiate_restore(whichset) {
356
 
357
  function updraft_restore_setoptions(entities) {
358
  var howmany = 0;
359
- jQuery('input[name="updraft_restore[]"]').each(function(x,y){
360
  var entity = jQuery(y).val();
361
  var epat = entity+'=([0-9,]+)';
362
  var eregex = new RegExp(epat);
@@ -391,13 +394,13 @@ function updraft_restore_setoptions(entities) {
391
 
392
  function updraft_backup_dialog_open() {
393
  jQuery('#backupnow_includefiles_moreoptions').hide();
394
- if (updraft_settings_form_changed){
395
- if (window.confirm(updraftlion.unsavedsettingsbackup)){
396
- jQuery('#backupnow_label').val('');
397
  jQuery('#updraft-backupnow-modal').dialog('open');
398
  }
399
  } else {
400
- jQuery('#backupnow_label').val('');
401
  jQuery('#updraft-backupnow-modal').dialog('open');
402
  }
403
  }
@@ -412,7 +415,8 @@ if ('' == onlythesefileentities) {
412
  function updraft_migrate_dialog_open() {
413
  jQuery('#updraft_migrate_modal_alt').hide();
414
  updraft_migrate_modal_default_buttons = {};
415
- updraft_migrate_modal_default_buttons[updraftlion.close] = function() { jQuery(this).dialog("close"); };
 
416
  jQuery("#updraft-migrate-modal").dialog("option", "buttons", updraft_migrate_modal_default_buttons);
417
  jQuery('#updraft-migrate-modal').dialog('open');
418
  jQuery('#updraft_migrate_modal_main').show();
@@ -433,7 +437,11 @@ window.onbeforeunload = function(e) {
433
  if (updraft_settings_form_changed) return updraftlion.unsavedsettings;
434
  }
435
 
436
- // N.B. This function works on both the UD settings page and elsewhere
 
 
 
 
437
  function updraft_check_page_visibility(firstload) {
438
  if ('hidden' == document["visibilityState"]) {
439
  updraft_page_is_visible = 0;
@@ -445,7 +453,8 @@ function updraft_check_page_visibility(firstload) {
445
 
446
  // See http://caniuse.com/#feat=pagevisibility for compatibility (we don't bother with prefixes)
447
  if (typeof document.hidden !== "undefined") {
448
- document.addEventListener('visibilitychange', function() {updraft_check_page_visibility(0);}, false);
 
449
  }
450
 
451
  updraft_check_page_visibility(1);
@@ -461,11 +470,25 @@ var updraft_backupnow_nonce = '';
461
  var updraft_activejobslist_backupnownonce_only = 0;
462
  var updraft_inpage_hasbegun = 0;
463
 
464
- function updraft_backupnow_inpage_go(success_callback, onlythisfileentity, extradata, backupnow_nodb, backupnow_nofiles, backupnow_nocloud) {
 
 
 
 
 
 
 
 
 
 
 
 
 
465
 
466
  backupnow_nodb = ('undefined' === typeof backupnow_nodb) ? 0 : backupnow_nodb;
467
  backupnow_nofiles = ('undefined' === typeof backupnow_nofiles) ? 0 : backupnow_nofiles;
468
  backupnow_nocloud = ('undefined' === typeof backupnow_nocloud) ? 0 : backupnow_nocloud;
 
469
 
470
  // N.B. This function should never be called on the UpdraftPlus settings page - it is assumed we are elsewhere. So, it is safe to fake the console-focussing parameter.
471
  updraft_console_focussed_tab = 1;
@@ -482,7 +505,7 @@ function updraft_backupnow_inpage_go(success_callback, onlythisfileentity, extra
482
  jQuery('#updraft_inpage_backup').show();
483
  updraft_activejobslist_backupnownonce_only = 1;
484
  updraft_inpage_hasbegun = 0;
485
- updraft_backupnow_go(backupnow_nodb, backupnow_nofiles, backupnow_nocloud, onlythisfileentity, extradata, updraftlion.automaticbackupbeforeupdate, '');
486
  }
487
 
488
  function updraft_activejobs_update(force) {
@@ -490,7 +513,7 @@ function updraft_activejobs_update(force) {
490
  if (false == force && timenow < updraft_activejobs_nextupdate) { return; }
491
  updraft_activejobs_nextupdate = timenow + 5500;
492
  var downloaders = '';
493
- jQuery('.ud_downloadstatus .updraftplus_downloader, #ud_downloadstatus2 .updraftplus_downloader').each(function(x,y){
494
  var dat = jQuery(y).data('downloaderfor');
495
  if (typeof dat == 'object') {
496
  if (downloaders != '') { downloaders = downloaders + ':'; }
@@ -519,9 +542,9 @@ function updraft_activejobs_update(force) {
519
  updraft_send_command('activejobs_list', gdata, function(response) {
520
 
521
  try {
522
- resp = JSON.parse(response);
523
 
524
- //if (repeat) { setTimeout(function(){updraft_activejobs_update(true);}, nexttimer);}
525
  if (resp.hasOwnProperty('l')) {
526
  if (resp.l) {
527
  jQuery('#updraft_lastlogmessagerow').show();
@@ -544,7 +567,7 @@ function updraft_activejobs_update(force) {
544
  if (lastactivity == -1 || new_lastactivity < lastactivity) { lastactivity = new_lastactivity; }
545
  var nextresumptionafter = $el.data('nextresumptionafter');
546
  var nextresumption = $el.data('nextresumption');
547
- // console.log("Job ID: "+jobid+", Next resumption: "+nextresumption+", Next resumption after: "+nextresumptionafter+", Last activity: "+new_lastactivity);
548
  // Milliseconds
549
  timenow = (new Date).getTime();
550
  if (new_lastactivity > 50 && nextresumption >0 && nextresumptionafter < -30 && timenow > updraft_last_forced_when+100000 && (updraft_last_forced_jobid != jobid || nextresumption != updraft_last_forced_resumption)) {
@@ -599,11 +622,11 @@ function updraft_activejobs_update(force) {
599
  // This block used to be a straightforward 'if'... switching to 'else if' ensures that it cannot fire on the same run. (If the backup hasn't started, it may be detected as finished before to it began, on an overloaded server if there's a race).
600
  // Don't reset to 0 - this will cause the 'began' event to be detected again
601
  updraft_inpage_hasbegun = 2;
602
- // var updraft_inpage_modal_buttons = {};
603
- // updraft_inpage_modal_buttons[updraftlion.close] = function() {
604
- // jQuery(this).dialog("close");
605
- // };
606
- // jQuery('#
1
  /**
2
+ * Send an action over AJAX. A wrapper around jQuery.ajax. In future, all consumers can be reviewed to simplify some of the options, where there is historical cruft.
3
+ * N.B. updraft_iframe_modal() below uses the Ajax URL for the iframe's src attribute
4
+ *
5
+ * @param {string} action - the action to send
6
+ * @param * data - data to send
7
+ * @param Callback callback - will be called with the results
8
+ * @param {object} [options={}] - further options. Relevant properties include:
9
+ * - [json_parse=true] - whether to JSON parse the results
10
+ * - [alert_on_error=true] - whether to show an alert box if there was a problem (otherwise, suppress it)
11
+ * - [action='updraft_ajax'] - what to send as the action parameter on the AJAX request (N.B. action parameter to this function goes as the 'subaction' parameter on the AJAX request)
12
+ * - [nonce=updraft_credentialtest_nonce] - the nonce value to send.
13
+ * - [nonce_key='nonce'] - the key value for the nonce field
14
+ * - [timeout=null] - set a timeout after this number of seconds (or if null, none is set)
15
+ * - [async=true] - control whether the request is asynchronous (almost always wanted) or blocking (would need to have a specific reason)
16
+ * - [type='POST'] - GET or POST
17
+ */
18
  function updraft_send_command(action, data, callback, options) {
19
 
20
  default_options = {
55
  success: function(response, status) {
56
  if (options.json_parse) {
57
  try {
58
+ var resp = ud_parse_json(response);
59
  } catch (e) {
60
  console.log(e);
61
  console.log(response);
87
 
88
  /**
89
  * Opens the dialog box for confirmation of whether to delete a backup, plus options if relevant
90
+ *
91
  * @param {string} key - The UNIX timestamp of the backup
92
  * @param {string} nonce - The backup job ID
93
  * @param {boolean} showremote - Whether or not to show the "also delete from remote storage?" checkbox
138
  jQuery(set).each(function(ind, obj) {
139
  var ser = jQuery(obj).val();
140
 
141
+ if (jQuery(obj).attr('id') != 'updraft_servicecheckbox_none') {
142
  anychecked++;
143
  }
144
 
145
  jQuery('.remote-tab-'+ser).show();
146
+ if (ind == jQuery(set).length-1) {
147
  updraft_remote_storage_tab_activation(ser);
148
  }
149
  });
152
  jQuery('.updraftplusmethod.none').hide();
153
  }
154
 
155
+ // To allow labelauty remote storage buttons to be used with keyboard
156
  jQuery(document).keyup(function(event) {
157
+ if (event.keyCode === 32 || event.keyCode === 13) {
158
+ if (jQuery(document.activeElement).is("input.labelauty + label")) {
159
  var for_box = jQuery(document.activeElement).attr("for");
160
+ if (for_box) {
161
  jQuery("#"+for_box).change();
162
  }
163
  }
176
  } else {
177
  anychecked--;
178
  jQuery('.remote-tab-'+serv).hide();
179
+ // Check if this was the active tab, if yes, switch to another
180
+ if (jQuery('.remote-tab-'+serv).data('active') == true) {
181
  updraft_remote_storage_tab_activation(jQuery('.remote-tab:visible').last().attr('name'));
182
  }
183
  }
191
  }
192
  });
193
 
194
+ // Add stuff for free version
195
+ jQuery('.updraft_servicecheckbox:not(.multi)').change(function() {
196
  var svalue = jQuery(this).attr('value');
197
  if (jQuery(this).is(':not(:checked)')) {
198
  jQuery('.updraftplusmethod.'+svalue).hide();
209
 
210
  /**
211
  * Carries out a remote storage test
212
+ *
213
  * @param {string} method - The identifier for the remote storage
214
  * @param {callback} result_callback - A callback function to be called with the result
215
  * @param {string} [instance_id] - The particular instance (if any) of the remote storage to be tested (for methods supporting multiple instances)
235
  method: method
236
  };
237
 
 
238
  // Add the other items to the data object. The expert mode settings are for the generic SSL options.
239
  jQuery('#updraft-navtab-settings-content '+settings_selector+' input[data-updraft_settings_test], #updraft-navtab-settings-content .expertmode input[data-updraft_settings_test]').each(function(index, item) {
240
  var item_key = jQuery(item).data('updraft_settings_test');
268
  if ('undefined' !== typeof result_callback && false != result_callback) {
269
  result_callback = result_callback.call(this, response, status, data);
270
  }
271
+ if ('undefined' !== typeof result_callback && false === result_callback) {
272
  alert(updraftlion.settings_test_result.replace('%s', method_label)+' '+response.output);
273
+ if (response.hasOwnProperty('data')) {
274
+ console.log(response.data);
275
+ }
276
  }
277
  });
278
  }
286
  if (onlythesefileentities != '') { onlythesefileentities += ','; }
287
  onlythesefileentities += entity;
288
  });
289
+ // console.log(onlythesefileentities);
290
  return onlythesefileentities;
291
  }
292
 
293
  /**
294
+ * A method to get all the selected table values from the backup now modal
295
+ *
296
  * @param {[String]} onlythesetableentities an empty string to append values to
297
  * @return {[String]} a string that contains the values of all selected table entities and the database the belong to
298
  */
333
  }
334
 
335
  function updraft_openrestorepanel(toggly) {
336
+ // jQuery('.download-backups').slideDown(); updraft_historytimertoggle(1); jQuery('html,body').animate({scrollTop: jQuery('#updraft_lastlogcontainer').offset().top},'slow');
337
  updraft_console_focussed_tab = 2;
338
  updraft_historytimertoggle(toggly);
339
  jQuery('#updraft-navtab-status-content').hide();
359
 
360
  function updraft_restore_setoptions(entities) {
361
  var howmany = 0;
362
+ jQuery('input[name="updraft_restore[]"]').each(function(x,y) {
363
  var entity = jQuery(y).val();
364
  var epat = entity+'=([0-9,]+)';
365
  var eregex = new RegExp(epat);
394
 
395
  function updraft_backup_dialog_open() {
396
  jQuery('#backupnow_includefiles_moreoptions').hide();
397
+ if (updraft_settings_form_changed) {
398
+ if (window.confirm(updraftlion.unsavedsettingsbackup)) {
399
+ jQuery('#backupnow_label').val('');
400
  jQuery('#updraft-backupnow-modal').dialog('open');
401
  }
402
  } else {
403
+ jQuery('#backupnow_label').val('');
404
  jQuery('#updraft-backupnow-modal').dialog('open');
405
  }
406
  }
415
  function updraft_migrate_dialog_open() {
416
  jQuery('#updraft_migrate_modal_alt').hide();
417
  updraft_migrate_modal_default_buttons = {};
418
+ updraft_migrate_modal_default_buttons[updraftlion.close] = function() {
419
+ jQuery(this).dialog("close"); };
420
  jQuery("#updraft-migrate-modal").dialog("option", "buttons", updraft_migrate_modal_default_buttons);
421
  jQuery('#updraft-migrate-modal').dialog('open');
422
  jQuery('#updraft_migrate_modal_main').show();
437
  if (updraft_settings_form_changed) return updraftlion.unsavedsettings;
438
  }
439
 
440
+ /**
441
+ * N.B. This function works on both the UD settings page and elsewhere
442
+ *
443
+ * @param {boolean} firstload Check if this is first load
444
+ */
445
  function updraft_check_page_visibility(firstload) {
446
  if ('hidden' == document["visibilityState"]) {
447
  updraft_page_is_visible = 0;
453
 
454
  // See http://caniuse.com/#feat=pagevisibility for compatibility (we don't bother with prefixes)
455
  if (typeof document.hidden !== "undefined") {
456
+ document.addEventListener('visibilitychange', function() {
457
+ updraft_check_page_visibility(0);}, false);
458
  }
459
 
460
  updraft_check_page_visibility(1);
470
  var updraft_activejobslist_backupnownonce_only = 0;
471
  var updraft_inpage_hasbegun = 0;
472
 
473
+ /**
474
+ * Run a backup with show modal with progress.
475
+ *
476
+ * @param {Function} success_callback callback function after backup
477
+ * @param {String} onlythisfileentity csv list of file entities to be backed up
478
+ * @param {Array} extradata any extra data to be added
479
+ * @param {Integer} backupnow_nodb Indicate whether the database should be backed up. Valid values: 0, 1
480
+ * @param {Integer} backupnow_nofiles Indicate whether any files should be backed up. Valid values: 0, 1
481
+ * @param {Integer} backupnow_nocloud Indicate whether the backup should be uploaded to cloud storage. Valid values: 0, 1
482
+ * @param {String} label An optional label to be added to a backup
483
+ *
484
+ * @return {void}
485
+ */
486
+ function updraft_backupnow_inpage_go(success_callback, onlythisfileentity, extradata, backupnow_nodb, backupnow_nofiles, backupnow_nocloud, label) {
487
 
488
  backupnow_nodb = ('undefined' === typeof backupnow_nodb) ? 0 : backupnow_nodb;
489
  backupnow_nofiles = ('undefined' === typeof backupnow_nofiles) ? 0 : backupnow_nofiles;
490
  backupnow_nocloud = ('undefined' === typeof backupnow_nocloud) ? 0 : backupnow_nocloud;
491
+ label = ('undefined' === typeof label) ? updraftlion.automaticbackupbeforeupdate : label;
492
 
493
  // N.B. This function should never be called on the UpdraftPlus settings page - it is assumed we are elsewhere. So, it is safe to fake the console-focussing parameter.
494
  updraft_console_focussed_tab = 1;
505
  jQuery('#updraft_inpage_backup').show();
506
  updraft_activejobslist_backupnownonce_only = 1;
507
  updraft_inpage_hasbegun = 0;
508
+ updraft_backupnow_go(backupnow_nodb, backupnow_nofiles, backupnow_nocloud, onlythisfileentity, extradata, label, '');
509
  }
510
 
511
  function updraft_activejobs_update(force) {
513
  if (false == force && timenow < updraft_activejobs_nextupdate) { return; }
514
  updraft_activejobs_nextupdate = timenow + 5500;
515
  var downloaders = '';
516
+ jQuery('.ud_downloadstatus .updraftplus_downloader, #ud_downloadstatus2 .updraftplus_downloader').each(function(x,y) {
517
  var dat = jQuery(y).data('downloaderfor');
518
  if (typeof dat == 'object') {
519
  if (downloaders != '') { downloaders = downloaders + ':'; }
542
  updraft_send_command('activejobs_list', gdata, function(response) {
543
 
544
  try {
545
+ resp = ud_parse_json(response);
546
 
547
+ // if (repeat) { setTimeout(function(){updraft_activejobs_update(true);}, nexttimer);}
548
  if (resp.hasOwnProperty('l')) {
549
  if (resp.l) {
550
  jQuery('#updraft_lastlogmessagerow').show();
567
  if (lastactivity == -1 || new_lastactivity < lastactivity) { lastactivity = new_lastactivity; }
568
  var nextresumptionafter = $el.data('nextresumptionafter');
569
  var nextresumption = $el.data('nextresumption');
570
+ // console.log("Job ID: "+jobid+", Next resumption: "+nextresumption+", Next resumption after: "+nextresumptionafter+", Last activity: "+new_lastactivity);
571
  // Milliseconds
572
  timenow = (new Date).getTime();
573
  if (new_lastactivity > 50 && nextresumption >0 && nextresumptionafter < -30 && timenow > updraft_last_forced_when+100000 && (updraft_last_forced_jobid != jobid || nextresumption != updraft_last_forced_resumption)) {
622
  // This block used to be a straightforward 'if'... switching to 'else if' ensures that it cannot fire on the same run. (If the backup hasn't started, it may be detected as finished before to it began, on an overloaded server if there's a race).
623
  // Don't reset to 0 - this will cause the 'began' event to be detected again
624
  updraft_inpage_hasbegun = 2;