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
Release Info
Developer | DavidAnderson |
Plugin | 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 +99 -40
- backup.php +126 -99
- central/bootstrap.php +9 -0
- central/classes/class-automatic-upgrader-skin.php +33 -35
- central/listener.php +1 -1
- central/modules/analytics.php +344 -0
- central/modules/comments.php +2 -2
- central/modules/users.php +2 -2
- class-updraftplus.php +1034 -507
- class-zip.php +62 -32
- css/admin.css +1731 -1729
- css/admin.min.css +1 -1
- css/admin.min.css.map +1 -1
- example-decrypt.php +12 -6
- includes/S3.php +0 -1
- includes/S3compat.php +334 -336
- includes/class-commands.php +96 -66
- includes/class-database-utility.php +14 -11
- includes/class-semaphore.php +9 -9
- includes/class-updraftcentral-updraftplus-commands.php +1 -2
- includes/class-wpadmin-commands.php +56 -34
- includes/deprecated-actions.php +2 -2
- includes/ftp.class.php +34 -26
- includes/handlebars/LICENSE +19 -0
- includes/handlebars/handlebars.js +4840 -0
- includes/handlebars/handlebars.min.js +29 -0
- includes/handlebars/handlebars.runtime.js +1468 -0
- includes/handlebars/handlebars.runtime.min.js +27 -0
- includes/jquery-ui.custom.css +930 -247
- includes/jquery-ui.custom.min.css +1 -1
- includes/jquery-ui.custom.min.css.map +1 -1
- includes/jquery.blockUI.js +2 -1
- includes/updraft-admin.js +71 -53
@@ -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(
|
25 |
-
$path = preg_replace(
|
26 |
-
if (
|
27 |
-
$path = ucfirst(
|
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 |
-
|
116 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 (
|
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 |
-
|
1215 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
1311 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
1327 |
}
|
1328 |
|
1329 |
if (count($this->logged) >0) {
|
1330 |
-
|
1331 |
foreach ($this->logged as $err) {
|
1332 |
-
|
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(
|
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(
|
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 (
|
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 (
|
2844 |
-
foreach (
|
2845 |
$wperr->add('mkdir_error', $message);
|
2846 |
}
|
2847 |
return $wperr;
|
@@ -3507,7 +3544,14 @@ ENDHERE;
|
|
3507 |
}
|
3508 |
}
|
3509 |
|
3510 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 (
|
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 (
|
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(
|
3623 |
-
i.e. array (
|
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 |
-
|
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 (
|
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);
|
@@ -412,7 +412,35 @@ class UpdraftPlus_Backup {
|
|
412 |
return array(array('sets' => $backup_history, 'process_order' => 'keep_newest'));
|
413 |
}
|
414 |
|
415 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
$
|
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 |
-
$
|
531 |
$database_backups_found[$key]++;
|
532 |
continue;
|
533 |
}
|
534 |
|
535 |
if ($is_autobackup) {
|
536 |
if ($any_deleted_via_filter_yet) {
|
537 |
-
$
|
538 |
$prune_it = true;
|
539 |
} elseif ($database_backups_found[$key] < $updraft_retain_db) {
|
540 |
-
$
|
541 |
continue;
|
542 |
} else {
|
543 |
-
$
|
544 |
$prune_it = true;
|
545 |
}
|
546 |
} else {
|
@@ -549,7 +573,7 @@ class UpdraftPlus_Backup {
|
|
549 |
|
550 |
if ($remote_sent) {
|
551 |
$prune_it = true;
|
552 |
-
$
|
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 =
|
567 |
-
$
|
568 |
|
569 |
-
$
|
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 |
-
$
|
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 |
-
$
|
663 |
$prune_it = true;
|
664 |
} elseif ($file_entities_backups_found[$entity] < $updraft_retain) {
|
665 |
-
$
|
666 |
continue;
|
667 |
} else {
|
668 |
-
$
|
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 |
-
$
|
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 |
-
|
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 |
-
|
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 |
-
|
1531 |
|
1532 |
-
|
1533 |
-
$bindump_threshold = (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && ($updraftplus->current_resumption - $updraftplus->last_successful_resumption == 2
|
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 (
|
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 |
-
|
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 |
-
|
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
|
1725 |
-
* @param
|
|
|
|
|
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 (
|
1739 |
//$updraftplus->log(__('Error getting table details','wp-db-backup') . ": $table", 'error');
|
1740 |
return false;
|
1741 |
}
|
1742 |
|
1743 |
-
if(
|
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# "
|
1786 |
|
1787 |
}
|
1788 |
|
@@ -1797,14 +1817,14 @@ class UpdraftPlus_Backup {
|
|
1797 |
}
|
1798 |
|
1799 |
// In UpdraftPlus, segment is always 'none'
|
1800 |
-
if('VIEW' != $table_type && (
|
1801 |
$defs = array();
|
1802 |
$integer_fields = array();
|
1803 |
// $table_structure was from "DESCRIBE $table"
|
1804 |
foreach ($table_structure as $struct) {
|
1805 |
-
if (
|
1806 |
(0 === strpos(strtolower($struct->Type), 'mediumint')) || (0 === strpos(strtolower($struct->Type), 'int')) || (0 === strpos(strtolower($struct->Type), 'bigint')) ) {
|
1807 |
-
$defs[strtolower($struct->Field)] = (
|
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 = (
|
1818 |
}
|
1819 |
|
1820 |
-
if(
|
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 '
|
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 = (
|
1849 |
-
$values[] = (
|
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(
|
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')
|
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')
|
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
|
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 = (
|
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(
|
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 (
|
|
|
|
|
|
|
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 (
|
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
|
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 |
-
|
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 |
-
|
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 |
-
|
3123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
3128 |
-
if (
|
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 |
}
|
|
@@ -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()) {
|
@@ -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(
|
29 |
-
if (
|
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(
|
36 |
ob_end_clean();
|
37 |
return $result;
|
38 |
}
|
39 |
|
40 |
/**
|
41 |
-
*
|
42 |
*
|
43 |
-
* @return array
|
44 |
*/
|
45 |
public function get_upgrade_messages() {
|
46 |
return $this->messages;
|
47 |
}
|
48 |
|
49 |
/**
|
50 |
-
*
|
|
|
|
|
51 |
*/
|
52 |
-
public function feedback(
|
53 |
-
if (
|
54 |
$string = $data->get_error_message();
|
55 |
-
} elseif (
|
56 |
return;
|
57 |
} else {
|
58 |
$string = $data;
|
59 |
}
|
60 |
-
if (
|
61 |
-
$string = $this->upgrader->strings[
|
62 |
|
63 |
-
if ( strpos(
|
64 |
$args = func_get_args();
|
65 |
-
$args = array_splice(
|
66 |
-
if (
|
67 |
-
$string = vsprintf(
|
68 |
}
|
69 |
|
70 |
-
$string = trim(
|
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(
|
74 |
'a' => array(
|
75 |
'href' => true
|
76 |
),
|
77 |
'br' => true,
|
78 |
'em' => true,
|
79 |
'strong' => true,
|
80 |
-
)
|
81 |
|
82 |
-
if (
|
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 (
|
101 |
-
$this->feedback(
|
102 |
}
|
103 |
|
104 |
/**
|
@@ -106,9 +107,6 @@ class Automatic_Upgrader_Skin extends WP_Upgrader_Skin {
|
|
106 |
*/
|
107 |
public function bulk_header() {}
|
108 |
|
109 |
-
|
110 |
-
|
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 |
}
|
@@ -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) {
|
@@ -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 |
+
}
|
@@ -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 |
|
@@ -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,
|
460 |
} else {
|
461 |
-
$result = array("error" => true,
|
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
|
@@ -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 |
-
|
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 |
-
|
73 |
add_action('admin_init', array($this, 'admin_menu'), 9);
|
74 |
|
75 |
-
|
76 |
add_action('updraft_backup', array($this, 'backup_files'));
|
77 |
add_action('updraft_backup_database', array($this, 'backup_database'));
|
78 |
|
79 |
-
|
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 |
-
|
85 |
add_action('updraft_backup_all', array($this, 'backup_all'));
|
86 |
|
87 |
-
|
88 |
add_action('updraft_backup_resume', array($this, 'backup_resume'), 10, 3);
|
89 |
|
90 |
-
|
91 |
add_filter('schedule_event', array($this, 'schedule_event'));
|
92 |
|
93 |
add_action('plugins_loaded', array($this, 'plugins_loaded'));
|
94 |
|
95 |
-
|
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 |
-
|
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) {
|
108 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
149 |
public function get_udrpc($indicator_name = 'migrator.updraftplus.com') {
|
150 |
-
if (!class_exists('UpdraftPlus_Remote_Communications'))
|
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 |
-
|
175 |
}
|
176 |
}
|
177 |
}
|
178 |
|
179 |
-
|
|
|
|
|
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 |
-
|
286 |
-
|
|
|
|
|
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 |
-
|
303 |
-
if (preg_match('/RESULT: (\d+) (\d+) (\d+) /', $w, $matches)) {
|
|
|
|
|
304 |
}
|
305 |
$ret = pclose($handle);
|
306 |
-
if (false === $found
|
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 |
-
|
|
|
|
|
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))
|
345 |
|
346 |
-
if (isset($_GET['wpnonce']) && isset($_GET['page']) && isset($_GET['action']) && $_GET['page']
|
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 |
-
|
378 |
-
|
379 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
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(
|
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(
|
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']
|
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 |
-
|
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']
|
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 |
-
|
513 |
add_action('updraftcentral_command_class_wanted', array($this, 'updraftcentral_command_class_wanted'));
|
514 |
-
|
515 |
}
|
516 |
|
517 |
}
|
518 |
|
519 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
526 |
public function updraftcentral_command_class_wanted($command_php_class) {
|
527 |
if ('UpdraftCentral_UpdraftPlus_Commands' == $command_php_class) {
|
528 |
-
|
529 |
}
|
530 |
}
|
531 |
|
532 |
-
|
533 |
-
|
534 |
-
|
535 |
-
|
536 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
537 |
public function clean_temporary_files($match = '', $older_than = 43200, $include_cachelist = false) {
|
538 |
-
|
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 |
-
|
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 |
-
|
571 |
-
|
572 |
-
|
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 |
-
$
|
|
|
577 |
@unlink($updraft_dir.'/'.$entry);
|
|
|
578 |
}
|
579 |
}
|
580 |
}
|
581 |
@closedir($handle);
|
582 |
}
|
583 |
-
|
584 |
-
|
585 |
foreach (array(ABSPATH, ABSPATH.'wp-admin/', $updraft_dir.'/') as $path) {
|
586 |
if ($handle = opendir($path)) {
|
587 |
while (false !== ($entry = readdir($handle))) {
|
588 |
-
|
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 =
|
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 |
-
|
636 |
$read_recent = fread($handle, $bytes_back);
|
637 |
-
|
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 |
-
|
715 |
-
if (
|
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 |
-
|
726 |
-
|
727 |
-
|
728 |
-
|
729 |
-
|
730 |
-
|
731 |
-
|
732 |
-
|
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 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
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 |
-
|
768 |
if ('error' == $level) return;
|
769 |
-
|
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 |
-
|
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 |
-
|
791 |
-
|
792 |
-
|
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 |
-
|
799 |
break;
|
|
|
800 |
default:
|
801 |
-
|
802 |
break;
|
803 |
}
|
804 |
|
805 |
-
if (defined('UPDRAFTPLUS_CONSOLELOG'))
|
806 |
-
if (defined('UPDRAFTPLUS_BROWSERLOG'))
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
849 |
$mp = (is_numeric($mp) && $mp > 0) ? $mp : 1048576;
|
850 |
-
|
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 |
-
|
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 |
-
|
865 |
-
|
866 |
-
|
|
|
|
|
|
|
|
|
867 |
public function log_e() {
|
868 |
$args = func_get_args();
|
869 |
-
|
870 |
$pre_line = array_shift($args);
|
871 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
912 |
-
* @param
|
913 |
-
* @param string
|
914 |
-
* @param string
|
915 |
-
* @param integer
|
916 |
-
* @param integer
|
917 |
-
* @param boolean
|
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 = (
|
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) {
|
|
|
|
|
|
|
1018 |
}
|
1019 |
|
1020 |
$chunk_index++;
|
@@ -1039,7 +1119,7 @@ class UpdraftPlus {
|
|
1039 |
}
|
1040 |
if ($ret) {
|
1041 |
$this->log("$logname upload: success");
|
1042 |
-
|
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
|
1055 |
-
* @param object
|
1056 |
-
* @param integer $remote_size
|
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 *
|
1059 |
-
* @param integer $chunk_size
|
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
|
1082 |
|
1083 |
-
|
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().')'
|
1146 |
return false;
|
1147 |
}
|
1148 |
|
@@ -1153,8 +1233,9 @@ class UpdraftPlus {
|
|
1153 |
|
1154 |
/**
|
1155 |
* This will decrypt an encryped db file
|
1156 |
-
*
|
1157 |
-
* @param string $
|
|
|
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
|
1197 |
$pad = 16 - ($length % 16);
|
1198 |
$file_part = str_pad($file_part, $length + $pad, chr($pad));
|
1199 |
-
//
|
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
|
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 |
-
|
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
|
1308 |
if ($logit) {
|
1309 |
$this->log("Binary mysqldump: error (code: $ret)");
|
1310 |
}
|
1311 |
} else {
|
1312 |
-
//
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
1351 |
-
|
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
|
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 |
-
|
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
|
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'))
|
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']
|
1444 |
-
if ($obj['filename'] && !empty($obj['stored_filename']) && 'binziptest/subdir1/subdir2/test2.html' == $obj['stored_filename'] && $obj['size']
|
1445 |
}
|
1446 |
}
|
1447 |
} else {
|
@@ -1477,7 +1565,11 @@ class UpdraftPlus {
|
|
1477 |
@rmdir($updraft_dir.'/binziptest');
|
1478 |
}
|
1479 |
|
1480 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
1563 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1564 |
|
1565 |
if (empty($history[$entity])) return;
|
1566 |
|
1567 |
if ($smaller) {
|
1568 |
-
$pfiles =
|
1569 |
} else {
|
1570 |
-
$pfiles =
|
1571 |
}
|
1572 |
|
1573 |
$pfiles .= '<ul>';
|
@@ -1608,7 +1711,7 @@ class UpdraftPlus {
|
|
1608 |
}
|
1609 |
}
|
1610 |
|
1611 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
1660 |
public function filter_updraft_backup_history($v) {
|
1661 |
global $wpdb;
|
1662 |
-
$row = $wpdb->get_row(
|
1663 |
-
if (is_object($row
|
1664 |
return false;
|
1665 |
}
|
1666 |
|
1667 |
public function php_error_to_logline($errno, $errstr, $errfile, $errline) {
|
1668 |
switch ($errno) {
|
1669 |
-
case 1:
|
1670 |
-
|
1671 |
-
|
1672 |
-
case
|
1673 |
-
|
1674 |
-
|
1675 |
-
case
|
1676 |
-
|
1677 |
-
|
1678 |
-
case
|
1679 |
-
|
1680 |
-
|
1681 |
-
case
|
1682 |
-
|
1683 |
-
|
1684 |
-
case
|
1685 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
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 |
-
|
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 |
-
|
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 |
-
|
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 |
-
|
1926 |
-
|
1927 |
-
|
1928 |
-
|
1929 |
-
|
1930 |
-
|
1931 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 .=
|
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 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
2239 |
$this->boot_backup(true, false);
|
2240 |
}
|
2241 |
|
2242 |
public function backup_database() {
|
2243 |
-
|
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 |
-
|
2263 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
2292 |
-
|
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 = (
|
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 (
|
2356 |
$service[] = 'remotesend';
|
2357 |
}
|
2358 |
|
@@ -2402,7 +2608,7 @@ class UpdraftPlus {
|
|
2402 |
}
|
2403 |
update_option("updraft_last_scheduled_$semaphore", time());
|
2404 |
|
2405 |
-
|
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 |
-
|
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',
|
2450 |
-
|
2451 |
-
'
|
2452 |
-
'
|
2453 |
-
'
|
2454 |
-
'
|
2455 |
-
'
|
2456 |
-
|
2457 |
-
'
|
2458 |
-
|
2459 |
-
'
|
2460 |
-
|
2461 |
-
'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2462 |
);
|
2463 |
|
2464 |
if ($one_shot) update_site_option('updraft_oneshotnonce', $this->nonce);
|
@@ -2497,12 +2716,16 @@ class UpdraftPlus {
|
|
2497 |
|
2498 |
}
|
2499 |
|
2500 |
-
|
2501 |
-
|
2502 |
-
|
|
|
|
|
|
|
|
|
2503 |
public function rebuild_backup_history($remotescan = false, $only_add_this_file = false) {
|
2504 |
|
2505 |
-
|
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 |
-
//
|
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']
|
2537 |
-
|
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 |
-
|
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 |
-
|
2560 |
unset($backup_history[$btime]);
|
2561 |
$changes = true;
|
2562 |
}
|
@@ -2564,44 +2788,68 @@ class UpdraftPlus {
|
|
2564 |
|
2565 |
$remotefiles = array();
|
2566 |
$remotesizes = array();
|
2567 |
-
|
2568 |
-
|
2569 |
if ($remotescan) {
|
2570 |
add_action('http_request_args', array($this, 'modify_http_options'));
|
2571 |
-
|
2572 |
-
|
2573 |
-
|
2574 |
-
|
2575 |
-
|
|
|
|
|
|
|
|
|
|
|
2576 |
continue;
|
2577 |
}
|
2578 |
-
|
2579 |
-
|
2580 |
-
|
2581 |
-
|
2582 |
-
|
2583 |
-
|
2584 |
-
|
2585 |
-
|
2586 |
-
|
2587 |
-
|
2588 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2589 |
}
|
2590 |
-
|
2591 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 (
|
2618 |
|
2619 |
if ('.' == $entry || '..' == $entry) continue;
|
2620 |
|
2621 |
-
|
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 |
-
|
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 = (
|
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 |
-
|
2663 |
if ($btime > 100 && $btime_exact - $btime > 60 && !empty($backup_history[$btime_exact])) {
|
2664 |
-
|
2665 |
-
|
2666 |
-
|
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 |
-
|
2694 |
-
|
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 |
-
|
2704 |
foreach ($remotefiles[$entry] as $rem) {
|
2705 |
if (!empty($rem['size']) && $rem['size'] > $fs) {
|
2706 |
$fs = $rem['size'];
|
2707 |
$changes = true;
|
2708 |
}
|
2709 |
}
|
2710 |
-
|
2711 |
unset($remotefiles[$entry]);
|
2712 |
} else {
|
2713 |
-
|
2714 |
if (!empty($backup_history[$btime])) {
|
2715 |
-
if (empty($backup_history[$btime]['service']) || ('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 |
-
|
2732 |
-
|
2733 |
if (count($remotefiles) > 0) {
|
2734 |
|
2735 |
-
|
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 = (
|
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 |
-
|
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 |
-
|
2802 |
$this->jobdata_set('jobstatus', 'finished');
|
2803 |
wp_clear_scheduled_hook('updraft_backup_resume', array($cancel_event, $this->nonce));
|
2804 |
-
|
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 |
-
|
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 |
-
|
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 |
-
|
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 |
-
|
2896 |
$this->log($final_message);
|
2897 |
|
2898 |
@fclose($this->logfile_handle);
|
@@ -2903,7 +3151,12 @@ class UpdraftPlus {
|
|
2903 |
|
2904 |
}
|
2905 |
|
2906 |
-
|
|
|
|
|
|
|
|
|
|
|
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'])
|
|
|
|
|
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
|
2935 |
} elseif (is_string($err)) {
|
2936 |
-
echo
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
2978 |
-
|
2979 |
-
//
|
2980 |
-
//
|
|
|
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 |
-
|
2992 |
if ($reschedule) $this->reschedule(60);
|
2993 |
$db_connected = false;
|
2994 |
} else {
|
@@ -3001,7 +3265,13 @@ class UpdraftPlus {
|
|
3001 |
|
3002 |
}
|
3003 |
|
3004 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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) && (
|
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 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
3090 |
-
|
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')), (
|
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 |
-
|
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 |
-
|
3114 |
-
|
3115 |
-
|
3116 |
$how_far_ahead = $new_resume;
|
3117 |
-
|
3118 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
3177 |
-
|
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 |
-
|
3188 |
-
|
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 |
-
|
3195 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
3210 |
public function backquote($a_name) {
|
3211 |
-
if (!empty($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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 (
|
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 |
-
|
3333 |
-
|
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 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3354 |
public function str_lreplace($search, $replace, $subject) {
|
3355 |
$pos = strrpos($subject, $search);
|
3356 |
-
if(
|
3357 |
return $subject;
|
3358 |
}
|
3359 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3360 |
public function str_replace_once($needle, $replace, $haystack) {
|
3361 |
$pos = strpos($haystack, $needle);
|
3362 |
-
return (
|
3363 |
}
|
3364 |
|
3365 |
-
|
3366 |
-
|
3367 |
-
|
3368 |
-
|
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 |
-
//
|
3389 |
-
//}
|
3390 |
|
3391 |
-
$backup_scheduled_for =
|
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 |
-
|
3411 |
-
|
3412 |
-
|
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 |
-
*
|
|
|
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 |
-
|
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 |
-
|
3571 |
-
|
3572 |
-
|
3573 |
-
|
3574 |
-
|
3575 |
-
|
3576 |
-
|
3577 |
-
|
3578 |
-
|
|
|
|
|
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 |
-
|
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 (
|
3641 |
}
|
3642 |
}
|
3643 |
|
3644 |
return $opts;
|
3645 |
}
|
3646 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3647 |
public function ftp_sanitise($ftp) {
|
3648 |
-
if (is_array($ftp)
|
3649 |
-
$ftp['host']
|
|
|
|
|
|
|
|
|
|
|
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 |
-
//
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
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 |
-
|
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 |
-
|
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++) {
|
|
|
|
|
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 |
-
|
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++) {
|
|
|
|
|
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->
|
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
|
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 |
-
|
4022 |
-
if (
|
4023 |
$memory_limit = rtrim($memory_limit);
|
4024 |
$memory_unit = $memory_limit[strlen($memory_limit)-1];
|
4025 |
-
if ((int)$memory_unit
|
4026 |
-
$memory_limit = substr($memory_limit,0,strlen($memory_limit)-1);
|
4027 |
} else {
|
4028 |
$memory_unit = '';
|
4029 |
}
|
4030 |
-
switch($memory_unit) {
|
4031 |
case '':
|
4032 |
-
|
4033 |
-
|
4034 |
case 'K':
|
4035 |
case 'k':
|
4036 |
-
|
4037 |
-
|
4038 |
case 'G':
|
4039 |
-
|
4040 |
-
|
4041 |
case 'M':
|
4042 |
-
|
4043 |
-
|
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'
|
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 ||
|
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'))
|
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();
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
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[] =
|
4138 |
return array($mess, $warn, $err, $info);
|
4139 |
}
|
4140 |
|
4141 |
$info['timestamp'] = $timestamp;
|
4142 |
|
4143 |
-
|
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 (
|
4183 |
if (!$migration_warning) {
|
4184 |
$migration_warning = true;
|
4185 |
-
$powarn = apply_filters('updraftplus_dbscan_urlchange',
|
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 &&
|
4202 |
$migration_warning = true;
|
4203 |
-
$powarn = apply_filters('updraftplus_dbscan_urlchange',
|
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 |
-
|
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 |
-
|
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 |
-
//
|
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 |
-
|
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]
|
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 |
-
|
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 |
-
|
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 |
-
|
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 |
-
|
4413 |
-
|
|
|
|
|
|
|
|
|
4414 |
public function get_settings_keys() {
|
4415 |
-
|
4416 |
-
return array(
|
4417 |
-
|
4418 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
*
|
4424 |
-
*
|
4425 |
-
*
|
|
|
4426 |
*/
|
4427 |
public function get_database_tables($dbsinfo = array('wp' => array())) {
|
4428 |
|
4429 |
global $wpdb;
|
4430 |
|
4431 |
-
if (!class_exists('UpdraftPlus_Database_Utility'))
|
4432 |
|
4433 |
$dbhandle = '';
|
4434 |
$db_tables_array = array();
|
4435 |
|
4436 |
foreach ($dbsinfo as $key => $value) {
|
4437 |
if ('wp' == $key) {
|
4438 |
-
|
4439 |
$table_prefix = $this->get_table_prefix(true);
|
4440 |
-
|
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 |
-
|
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 |
}
|
@@ -1,23 +1,34 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
if (!defined
|
4 |
|
5 |
-
if (class_exists('ZipArchive')):
|
6 |
-
|
|
|
|
|
7 |
class UpdraftPlus_ZipArchive extends ZipArchive {
|
8 |
-
|
|
|
9 |
}
|
10 |
endif;
|
11 |
|
12 |
-
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
32 |
public function ud_include_mtime() {
|
33 |
$this->include_mtime = true;
|
34 |
}
|
35 |
|
36 |
public function __get($name) {
|
37 |
-
if (
|
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 (
|
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
|
61 |
|
62 |
} else {
|
63 |
-
$this->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 |
-
|
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 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
160 |
public function addFile($file, $add_as) {
|
161 |
-
|
162 |
$rdirname = dirname($file);
|
163 |
$adirname = dirname($add_as);
|
164 |
$this->addfiles[$rdirname][$adirname][] = $file;
|
165 |
}
|
166 |
|
167 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
204 |
$this->addfiles[$rdirname][] = $add_as;
|
205 |
}
|
206 |
|
207 |
}
|
208 |
|
209 |
-
|
210 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
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 |
-
|
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 |
-
|
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 (
|
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 |
}
|
@@ -1,1729 +1,1731 @@
|
|
1 |
-
/*
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
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 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
border
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
/*
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
padding
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
text-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
.button-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
border-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
/* End
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
color:
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
/*
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
|
454 |
-
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
|
490 |
-
|
491 |
-
|
492 |
-
|
493 |
-
|
494 |
-
|
495 |
-
|
496 |
-
|
497 |
-
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
|
502 |
-
|
503 |
-
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
-
|
515 |
-
|
516 |
-
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
|
522 |
-
|
523 |
-
|
524 |
-
|
525 |
-
|
526 |
-
|
527 |
-
|
528 |
-
|
529 |
-
|
530 |
-
|
531 |
-
|
532 |
-
|
533 |
-
|
534 |
-
|
535 |
-
|
536 |
-
|
537 |
-
|
538 |
-
|
539 |
-
|
540 |
-
|
541 |
-
|
542 |
-
|
543 |
-
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
|
552 |
-
|
553 |
-
|
554 |
-
|
555 |
-
|
556 |
-
|
557 |
-
|
558 |
-
|
559 |
-
|
560 |
-
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
-
|
585 |
-
|
586 |
-
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
|
592 |
-
|
593 |
-
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
|
607 |
-
|
608 |
-
|
609 |
-
|
610 |
-
|
611 |
-
|
612 |
-
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
-
|
629 |
-
|
630 |
-
|
631 |
-
|
632 |
-
|
633 |
-
|
634 |
-
|
635 |
-
|
636 |
-
|
637 |
-
|
638 |
-
|
639 |
-
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
-
|
644 |
-
|
645 |
-
|
646 |
-
|
647 |
-
|
648 |
-
|
649 |
-
|
650 |
-
|
651 |
-
|
652 |
-
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
|
657 |
-
|
658 |
-
|
659 |
-
|
660 |
-
}
|
661 |
-
|
662 |
-
|
663 |
-
|
664 |
-
|
665 |
-
|
666 |
-
|
667 |
-
|
668 |
-
|
669 |
-
|
670 |
-
|
671 |
-
|
672 |
-
|
673 |
-
|
674 |
-
|
675 |
-
|
676 |
-
|
677 |
-
|
678 |
-
|
679 |
-
|
680 |
-
|
681 |
-
|
682 |
-
|
683 |
-
|
684 |
-
|
685 |
-
|
686 |
-
border-
|
687 |
-
|
688 |
-
|
689 |
-
|
690 |
-
|
691 |
-
|
692 |
-
|
693 |
-
|
694 |
-
|
695 |
-
|
696 |
-
|
697 |
-
|
698 |
-
border-
|
699 |
-
|
700 |
-
|
701 |
-
|
702 |
-
|
703 |
-
|
704 |
-
|
705 |
-
|
706 |
-
|
707 |
-
|
708 |
-
|
709 |
-
|
710 |
-
|
711 |
-
|
712 |
-
|
713 |
-
|
714 |
-
|
715 |
-
|
716 |
-
|
717 |
-
|
718 |
-
|
719 |
-
|
720 |
-
|
721 |
-
|
722 |
-
|
723 |
-
|
724 |
-
|
725 |
-
|
726 |
-
|
727 |
-
|
728 |
-
|
729 |
-
|
730 |
-
|
731 |
-
|
732 |
-
|
733 |
-
|
734 |
-
|
735 |
-
|
736 |
-
|
737 |
-
|
738 |
-
|
739 |
-
|
740 |
-
|
741 |
-
|
742 |
-
|
743 |
-
|
744 |
-
|
745 |
-
|
746 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
752 |
-
|
753 |
-
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
762 |
-
|
763 |
-
|
764 |
-
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
|
770 |
-
|
771 |
-
|
772 |
-
|
773 |
-
|
774 |
-
|
775 |
-
|
776 |
-
|
777 |
-
|
778 |
-
|
779 |
-
|
780 |
-
|
781 |
-
|
782 |
-
|
783 |
-
|
784 |
-
|
785 |
-
|
786 |
-
|
787 |
-
|
788 |
-
|
789 |
-
|
790 |
-
|
791 |
-
|
792 |
-
|
793 |
-
|
794 |
-
|
795 |
-
|
796 |
-
|
797 |
-
|
798 |
-
|
799 |
-
|
800 |
-
|
801 |
-
|
802 |
-
|
803 |
-
|
804 |
-
|
805 |
-
|
806 |
-
|
807 |
-
|
808 |
-
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
|
815 |
-
|
816 |
-
|
817 |
-
|
818 |
-
|
819 |
-
|
820 |
-
|
821 |
-
|
822 |
-
|
823 |
-
|
824 |
-
|
825 |
-
|
826 |
-
|
827 |
-
|
828 |
-
|
829 |
-
|
830 |
-
|
831 |
-
|
832 |
-
|
833 |
-
|
834 |
-
|
835 |
-
|
836 |
-
|
837 |
-
|
838 |
-
|
839 |
-
|
840 |
-
|
841 |
-
|
842 |
-
|
843 |
-
|
844 |
-
|
845 |
-
|
846 |
-
|
847 |
-
|
848 |
-
|
849 |
-
|
850 |
-
|
851 |
-
|
852 |
-
|
853 |
-
|
854 |
-
|
855 |
-
|
856 |
-
|
857 |
-
|
858 |
-
|
859 |
-
|
860 |
-
|
861 |
-
|
862 |
-
|
863 |
-
|
864 |
-
|
865 |
-
|
866 |
-
|
867 |
-
|
868 |
-
|
869 |
-
|
870 |
-
|
871 |
-
|
872 |
-
|
873 |
-
|
874 |
-
|
875 |
-
|
876 |
-
|
877 |
-
|
878 |
-
|
879 |
-
|
880 |
-
|
881 |
-
|
882 |
-
|
883 |
-
|
884 |
-
|
885 |
-
|
886 |
-
|
887 |
-
|
888 |
-
|
889 |
-
|
890 |
-
|
891 |
-
|
892 |
-
|
893 |
-
|
894 |
-
|
895 |
-
|
896 |
-
|
897 |
-
|
898 |
-
|
899 |
-
|
900 |
-
|
901 |
-
|
902 |
-
|
903 |
-
|
904 |
-
|
905 |
-
|
906 |
-
|
907 |
-
|
908 |
-
|
909 |
-
|
910 |
-
|
911 |
-
|
912 |
-
|
913 |
-
|
914 |
-
|
915 |
-
|
916 |
-
|
917 |
-
|
918 |
-
|
919 |
-
|
920 |
-
|
921 |
-
|
922 |
-
|
923 |
-
|
924 |
-
|
925 |
-
|
926 |
-
|
927 |
-
|
928 |
-
|
929 |
-
|
930 |
-
|
931 |
-
|
932 |
-
|
933 |
-
|
934 |
-
|
935 |
-
|
936 |
-
|
937 |
-
|
938 |
-
|
939 |
-
|
940 |
-
|
941 |
-
|
942 |
-
|
943 |
-
|
944 |
-
|
945 |
-
|
946 |
-
|
947 |
-
|
948 |
-
|
949 |
-
|
950 |
-
|
951 |
-
|
952 |
-
|
953 |
-
|
954 |
-
|
955 |
-
|
956 |
-
|
957 |
-
|
958 |
-
|
959 |
-
|
960 |
-
|
961 |
-
|
962 |
-
|
963 |
-
|
964 |
-
|
965 |
-
|
966 |
-
|
967 |
-
|
968 |
-
|
969 |
-
|
970 |
-
|
971 |
-
|
972 |
-
|
973 |
-
|
974 |
-
|
975 |
-
|
976 |
-
|
977 |
-
|
978 |
-
|
979 |
-
|
980 |
-
|
981 |
-
|
982 |
-
|
983 |
-
|
984 |
-
|
985 |
-
|
986 |
-
|
987 |
-
|
988 |
-
|
989 |
-
|
990 |
-
|
991 |
-
|
992 |
-
|
993 |
-
|
994 |
-
|
995 |
-
|
996 |
-
|
997 |
-
|
998 |
-
|
999 |
-
|
1000 |
-
|
1001 |
-
|
1002 |
-
|
1003 |
-
|
1004 |
-
|
1005 |
-
|
1006 |
-
|
1007 |
-
|
1008 |
-
|
1009 |
-
|
1010 |
-
|
1011 |
-
|
1012 |
-
|
1013 |
-
|
1014 |
-
|
1015 |
-
font-
|
1016 |
-
|
1017 |
-
|
1018 |
-
|
1019 |
-
|
1020 |
-
|
1021 |
-
|
1022 |
-
|
1023 |
-
|
1024 |
-
|
1025 |
-
|
1026 |
-
|
1027 |
-
|
1028 |
-
|
1029 |
-
|
1030 |
-
|
1031 |
-
|
1032 |
-
|
1033 |
-
|
1034 |
-
|
1035 |
-
|
1036 |
-
|
1037 |
-
|
1038 |
-
|
1039 |
-
|
1040 |
-
|
1041 |
-
|
1042 |
-
|
1043 |
-
|
1044 |
-
|
1045 |
-
|
1046 |
-
|
1047 |
-
|
1048 |
-
|
1049 |
-
|
1050 |
-
|
1051 |
-
|
1052 |
-
|
1053 |
-
box-sizing: border-box;
|
1054 |
-
|
1055 |
-
|
1056 |
-
|
1057 |
-
|
1058 |
-
|
1059 |
-
|
1060 |
-
|
1061 |
-
|
1062 |
-
|
1063 |
-
|
1064 |
-
|
1065 |
-
|
1066 |
-
|
1067 |
-
|
1068 |
-
|
1069 |
-
|
1070 |
-
|
1071 |
-
|
1072 |
-
|
1073 |
-
|
1074 |
-
|
1075 |
-
|
1076 |
-
|
1077 |
-
|
1078 |
-
|
1079 |
-
|
1080 |
-
|
1081 |
-
|
1082 |
-
|
1083 |
-
|
1084 |
-
|
1085 |
-
|
1086 |
-
|
1087 |
-
|
1088 |
-
|
1089 |
-
|
1090 |
-
|
1091 |
-
|
1092 |
-
|
1093 |
-
|
1094 |
-
|
1095 |
-
|
1096 |
-
|
1097 |
-
|
1098 |
-
|
1099 |
-
|
1100 |
-
|
1101 |
-
|
1102 |
-
|
1103 |
-
|
1104 |
-
|
1105 |
-
|
1106 |
-
|
1107 |
-
|
1108 |
-
|
1109 |
-
|
1110 |
-
|
1111 |
-
|
1112 |
-
|
1113 |
-
|
1114 |
-
|
1115 |
-
|
1116 |
-
|
1117 |
-
|
1118 |
-
|
1119 |
-
|
1120 |
-
|
1121 |
-
|
1122 |
-
|
1123 |
-
|
1124 |
-
|
1125 |
-
|
1126 |
-
|
1127 |
-
|
1128 |
-
|
1129 |
-
|
1130 |
-
|
1131 |
-
|
1132 |
-
|
1133 |
-
|
1134 |
-
|
1135 |
-
|
1136 |
-
|
1137 |
-
|
1138 |
-
|
1139 |
-
|
1140 |
-
|
1141 |
-
|
1142 |
-
|
1143 |
-
|
1144 |
-
|
1145 |
-
|
1146 |
-
|
1147 |
-
|
1148 |
-
|
1149 |
-
|
1150 |
-
|
1151 |
-
|
1152 |
-
|
1153 |
-
|
1154 |
-
|
1155 |
-
|
1156 |
-
|
1157 |
-
|
1158 |
-
|
1159 |
-
|
1160 |
-
|
1161 |
-
|
1162 |
-
|
1163 |
-
|
1164 |
-
|
1165 |
-
|
1166 |
-
|
1167 |
-
|
1168 |
-
|
1169 |
-
|
1170 |
-
|
1171 |
-
|
1172 |
-
|
1173 |
-
|
1174 |
-
|
1175 |
-
|
1176 |
-
|
1177 |
-
|
1178 |
-
|
1179 |
-
|
1180 |
-
|
1181 |
-
|
1182 |
-
|
1183 |
-
|
1184 |
-
|
1185 |
-
|
1186 |
-
|
1187 |
-
|
1188 |
-
|
1189 |
-
|
1190 |
-
|
1191 |
-
|
1192 |
-
|
1193 |
-
|
1194 |
-
|
1195 |
-
|
1196 |
-
|
1197 |
-
|
1198 |
-
|
1199 |
-
.
|
1200 |
-
|
1201 |
-
|
1202 |
-
|
1203 |
-
|
1204 |
-
|
1205 |
-
|
1206 |
-
|
1207 |
-
|
1208 |
-
|
1209 |
-
|
1210 |
-
|
1211 |
-
|
1212 |
-
|
1213 |
-
|
1214 |
-
|
1215 |
-
|
1216 |
-
|
1217 |
-
|
1218 |
-
|
1219 |
-
|
1220 |
-
|
1221 |
-
|
1222 |
-
|
1223 |
-
|
1224 |
-
|
1225 |
-
|
1226 |
-
|
1227 |
-
|
1228 |
-
|
1229 |
-
|
1230 |
-
|
1231 |
-
|
1232 |
-
|
1233 |
-
|
1234 |
-
|
1235 |
-
|
1236 |
-
|
1237 |
-
|
1238 |
-
|
1239 |
-
|
1240 |
-
|
1241 |
-
|
1242 |
-
|
1243 |
-
|
1244 |
-
|
1245 |
-
|
1246 |
-
|
1247 |
-
|
1248 |
-
|
1249 |
-
|
1250 |
-
|
1251 |
-
|
1252 |
-
|
1253 |
-
|
1254 |
-
|
1255 |
-
|
1256 |
-
|
1257 |
-
|
1258 |
-
|
1259 |
-
|
1260 |
-
|
1261 |
-
|
1262 |
-
|
1263 |
-
|
1264 |
-
|
1265 |
-
|
1266 |
-
|
1267 |
-
|
1268 |
-
|
1269 |
-
|
1270 |
-
|
1271 |
-
|
1272 |
-
/*
|
1273 |
-
|
1274 |
-
|
1275 |
-
|
1276 |
-
|
1277 |
-
|
1278 |
-
|
1279 |
-
|
1280 |
-
|
1281 |
-
|
1282 |
-
|
1283 |
-
|
1284 |
-
|
1285 |
-
|
1286 |
-
|
1287 |
-
|
1288 |
-
|
1289 |
-
|
1290 |
-
|
1291 |
-
|
1292 |
-
|
1293 |
-
|
1294 |
-
|
1295 |
-
|
1296 |
-
|
1297 |
-
|
1298 |
-
|
1299 |
-
|
1300 |
-
|
1301 |
-
|
1302 |
-
|
1303 |
-
|
1304 |
-
|
1305 |
-
|
1306 |
-
|
1307 |
-
|
1308 |
-
|
1309 |
-
|
1310 |
-
|
1311 |
-
|
1312 |
-
|
1313 |
-
|
1314 |
-
|
1315 |
-
|
1316 |
-
|
1317 |
-
|
1318 |
-
|
1319 |
-
|
1320 |
-
|
1321 |
-
|
1322 |
-
|
1323 |
-
|
1324 |
-
|
1325 |
-
|
1326 |
-
|
1327 |
-
|
1328 |
-
|
1329 |
-
|
1330 |
-
|
1331 |
-
|
1332 |
-
|
1333 |
-
|
1334 |
-
|
1335 |
-
|
1336 |
-
|
1337 |
-
|
1338 |
-
|
1339 |
-
|
1340 |
-
|
1341 |
-
|
1342 |
-
|
1343 |
-
|
1344 |
-
|
1345 |
-
|
1346 |
-
|
1347 |
-
|
1348 |
-
|
1349 |
-
|
1350 |
-
|
1351 |
-
|
1352 |
-
|
1353 |
-
|
1354 |
-
|
1355 |
-
|
1356 |
-
/*
|
1357 |
-
|
1358 |
-
|
1359 |
-
|
1360 |
-
|
1361 |
-
margin:
|
1362 |
-
|
1363 |
-
|
1364 |
-
|
1365 |
-
|
1366 |
-
|
1367 |
-
|
1368 |
-
|
1369 |
-
|
1370 |
-
|
1371 |
-
|
1372 |
-
|
1373 |
-
|
1374 |
-
|
1375 |
-
|
1376 |
-
|
1377 |
-
|
1378 |
-
|
1379 |
-
|
1380 |
-
|
1381 |
-
|
1382 |
-
|
1383 |
-
|
1384 |
-
|
1385 |
-
|
1386 |
-
|
1387 |
-
margin
|
1388 |
-
|
1389 |
-
|
1390 |
-
|
1391 |
-
|
1392 |
-
|
1393 |
-
|
1394 |
-
|
1395 |
-
|
1396 |
-
|
1397 |
-
|
1398 |
-
|
1399 |
-
|
1400 |
-
|
1401 |
-
|
1402 |
-
|
1403 |
-
|
1404 |
-
|
1405 |
-
|
1406 |
-
|
1407 |
-
|
1408 |
-
|
1409 |
-
|
1410 |
-
|
1411 |
-
|
1412 |
-
|
1413 |
-
|
1414 |
-
|
1415 |
-
|
1416 |
-
|
1417 |
-
|
1418 |
-
|
1419 |
-
|
1420 |
-
|
1421 |
-
|
1422 |
-
|
1423 |
-
|
1424 |
-
|
1425 |
-
|
1426 |
-
|
1427 |
-
|
1428 |
-
|
1429 |
-
|
1430 |
-
|
1431 |
-
|
1432 |
-
|
1433 |
-
|
1434 |
-
|
1435 |
-
|
1436 |
-
|
1437 |
-
|
1438 |
-
|
1439 |
-
|
1440 |
-
|
1441 |
-
|
1442 |
-
|
1443 |
-
|
1444 |
-
|
1445 |
-
|
1446 |
-
|
1447 |
-
|
1448 |
-
|
1449 |
-
|
1450 |
-
|
1451 |
-
|
1452 |
-
|
1453 |
-
|
1454 |
-
|
1455 |
-
|
1456 |
-
|
1457 |
-
|
1458 |
-
|
1459 |
-
|
1460 |
-
|
1461 |
-
|
1462 |
-
|
1463 |
-
|
1464 |
-
|
1465 |
-
|
1466 |
-
|
1467 |
-
|
1468 |
-
|
1469 |
-
|
1470 |
-
|
1471 |
-
|
1472 |
-
|
1473 |
-
|
1474 |
-
|
1475 |
-
|
1476 |
-
|
1477 |
-
|
1478 |
-
|
1479 |
-
|
1480 |
-
|
1481 |
-
|
1482 |
-
|
1483 |
-
|
1484 |
-
|
1485 |
-
|
1486 |
-
|
1487 |
-
|
1488 |
-
|
1489 |
-
|
1490 |
-
|
1491 |
-
|
1492 |
-
|
1493 |
-
|
1494 |
-
|
1495 |
-
|
1496 |
-
|
1497 |
-
|
1498 |
-
|
1499 |
-
|
1500 |
-
|
1501 |
-
|
1502 |
-
|
1503 |
-
|
1504 |
-
|
1505 |
-
|
1506 |
-
|
1507 |
-
|
1508 |
-
|
1509 |
-
|
1510 |
-
|
1511 |
-
|
1512 |
-
|
1513 |
-
|
1514 |
-
|
1515 |
-
|
1516 |
-
|
1517 |
-
|
1518 |
-
|
1519 |
-
|
1520 |
-
|
1521 |
-
|
1522 |
-
|
1523 |
-
|
1524 |
-
|
1525 |
-
|
1526 |
-
|
1527 |
-
|
1528 |
-
|
1529 |
-
|
1530 |
-
|
1531 |
-
|
1532 |
-
|
1533 |
-
|
1534 |
-
|
1535 |
-
|
1536 |
-
|
1537 |
-
|
1538 |
-
|
1539 |
-
|
1540 |
-
|
1541 |
-
|
1542 |
-
|
1543 |
-
|
1544 |
-
|
1545 |
-
|
1546 |
-
|
1547 |
-
|
1548 |
-
|
1549 |
-
|
1550 |
-
|
1551 |
-
|
1552 |
-
|
1553 |
-
|
1554 |
-
|
1555 |
-
|
1556 |
-
|
1557 |
-
|
1558 |
-
|
1559 |
-
|
1560 |
-
|
1561 |
-
|
1562 |
-
|
1563 |
-
|
1564 |
-
|
1565 |
-
|
1566 |
-
|
1567 |
-
/*
|
1568 |
-
|
1569 |
-
|
1570 |
-
/*
|
1571 |
-
|
1572 |
-
float: left
|
1573 |
-
|
1574 |
-
|
1575 |
-
|
1576 |
-
|
1577 |
-
|
1578 |
-
|
1579 |
-
|
1580 |
-
|
1581 |
-
|
1582 |
-
|
1583 |
-
|
1584 |
-
|
1585 |
-
|
1586 |
-
|
1587 |
-
|
1588 |
-
|
1589 |
-
|
1590 |
-
|
1591 |
-
|
1592 |
-
|
1593 |
-
|
1594 |
-
|
1595 |
-
|
1596 |
-
|
1597 |
-
|
1598 |
-
|
1599 |
-
|
1600 |
-
|
1601 |
-
|
1602 |
-
|
1603 |
-
|
1604 |
-
|
1605 |
-
|
1606 |
-
|
1607 |
-
|
1608 |
-
|
1609 |
-
|
1610 |
-
|
1611 |
-
|
1612 |
-
|
1613 |
-
|
1614 |
-
|
1615 |
-
|
1616 |
-
|
1617 |
-
|
1618 |
-
|
1619 |
-
|
1620 |
-
|
1621 |
-
|
1622 |
-
|
1623 |
-
|
1624 |
-
|
1625 |
-
|
1626 |
-
|
1627 |
-
|
1628 |
-
|
1629 |
-
|
1630 |
-
|
1631 |
-
|
1632 |
-
|
1633 |
-
|
1634 |
-
|
1635 |
-
|
1636 |
-
|
1637 |
-
|
1638 |
-
|
1639 |
-
|
1640 |
-
|
1641 |
-
|
1642 |
-
|
1643 |
-
|
1644 |
-
|
1645 |
-
|
1646 |
-
|
1647 |
-
|
1648 |
-
|
1649 |
-
|
1650 |
-
|
1651 |
-
|
1652 |
-
|
1653 |
-
|
1654 |
-
|
1655 |
-
|
1656 |
-
|
1657 |
-
|
1658 |
-
|
1659 |
-
|
1660 |
-
|
1661 |
-
|
1662 |
-
|
1663 |
-
|
1664 |
-
|
1665 |
-
|
1666 |
-
|
1667 |
-
|
1668 |
-
|
1669 |
-
|
1670 |
-
|
1671 |
-
|
1672 |
-
|
1673 |
-
|
1674 |
-
|
1675 |
-
|
1676 |
-
|
1677 |
-
|
1678 |
-
|
1679 |
-
|
1680 |
-
|
1681 |
-
|
1682 |
-
|
1683 |
-
|
1684 |
-
|
1685 |
-
|
1686 |
-
|
1687 |
-
|
1688 |
-
|
1689 |
-
|
1690 |
-
|
1691 |
-
|
1692 |
-
|
1693 |
-
|
1694 |
-
|
1695 |
-
|
1696 |
-
|
1697 |
-
|
1698 |
-
|
1699 |
-
|
1700 |
-
|
1701 |
-
|
1702 |
-
|
1703 |
-
|
1704 |
-
|
1705 |
-
|
1706 |
-
|
1707 |
-
|
1708 |
-
|
1709 |
-
|
1710 |
-
|
1711 |
-
|
1712 |
-
|
1713 |
-
|
1714 |
-
|
1715 |
-
|
1716 |
-
|
1717 |
-
|
1718 |
-
|
1719 |
-
|
1720 |
-
|
1721 |
-
|
1722 |
-
|
1723 |
-
|
1724 |
-
|
1725 |
-
|
1726 |
-
|
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 |
+
}
|
@@ -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 */
|
@@ -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"]}
|
@@ -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(
|
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(
|
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 |
-
|
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 |
|
@@ -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
|
@@ -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 |
-
|
37 |
use Aws\S3;
|
38 |
|
39 |
/**
|
40 |
-
* Amazon S3 PHP class
|
41 |
-
*
|
42 |
-
*
|
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 |
-
|
55 |
-
|
56 |
private $config = array('scheme' => 'https', 'service' => 's3');
|
57 |
|
58 |
-
private $
|
59 |
-
|
60 |
-
private $
|
|
|
|
|
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 $
|
70 |
-
|
71 |
-
public $
|
|
|
|
|
72 |
|
73 |
-
private $
|
74 |
|
75 |
// SSL CURL SSL options - only needed if you are experiencing problems with your OpenSSL configuration
|
76 |
-
public $
|
77 |
-
|
78 |
-
public $
|
|
|
|
|
79 |
|
80 |
/**
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
{
|
91 |
-
if (
|
92 |
-
$this->setAuth($
|
93 |
-
|
94 |
-
$this->
|
95 |
-
$this->
|
96 |
|
97 |
$opts = array(
|
98 |
-
'key' => $
|
99 |
-
'secret' => $
|
100 |
-
'scheme' => ($
|
101 |
// Using signature v4 requires a region
|
102 |
-
//
|
103 |
-
//
|
104 |
-
//
|
105 |
);
|
106 |
|
107 |
if ($endpoint) {
|
@@ -114,55 +122,56 @@ class UpdraftPlus_S3_Compat
|
|
114 |
$opts['region'] = $this->region;
|
115 |
}
|
116 |
|
117 |
-
if ($
|
118 |
|
119 |
$this->client = Aws\S3\S3Client::factory($opts);
|
120 |
}
|
121 |
|
122 |
/**
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
public function setAuth($
|
130 |
-
|
131 |
-
$this->
|
132 |
-
$this->__secretKey = $secretKey;
|
133 |
}
|
134 |
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
|
|
|
|
|
|
139 |
$this->_serverSideEncryption = $value;
|
140 |
}
|
141 |
|
142 |
/**
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
public function setRegion($region)
|
149 |
-
{
|
150 |
$this->region = $region;
|
151 |
if ('eu-central-1' == $region || 'cn-north-1' == $region) {
|
152 |
-
//
|
153 |
-
//
|
154 |
}
|
155 |
$this->client->setRegion($region);
|
156 |
}
|
157 |
|
158 |
/**
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
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 (
|
177 |
$endpoints = array(
|
178 |
'version' => 2,
|
179 |
'endpoints' => array(
|
@@ -184,91 +193,87 @@ class UpdraftPlus_S3_Compat
|
|
184 |
}
|
185 |
|
186 |
/**
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
public function setSSL($enabled, $validate = true)
|
195 |
-
|
196 |
-
$this->
|
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 |
-
//
|
204 |
-
//
|
205 |
//
|
206 |
-
//
|
207 |
-
//
|
208 |
//
|
209 |
-
//
|
210 |
|
211 |
|
212 |
} else {
|
213 |
$this->config['scheme'] = 'http';
|
214 |
-
//
|
215 |
}
|
216 |
$this->client->setConfig($this->config);
|
217 |
}
|
218 |
|
219 |
-
public function getuseSSL()
|
220 |
-
|
221 |
-
return $this->useSSL;
|
222 |
}
|
223 |
|
224 |
/**
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
public function setSSLAuth($
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
if (!$this->useSSLValidation) {
|
237 |
$this->client->setSslVerification(false);
|
238 |
} else {
|
239 |
-
if (!$
|
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($
|
245 |
}
|
246 |
}
|
247 |
|
248 |
-
//
|
249 |
-
//
|
250 |
-
//
|
251 |
}
|
252 |
|
253 |
/**
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
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 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
public function setExceptions($enabled = true)
|
300 |
-
{
|
301 |
$this->useExceptions = $enabled;
|
302 |
}
|
303 |
|
304 |
-
|
305 |
-
|
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 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
public function getBucket($bucket, $prefix = null, $marker = null, $maxKeys = null, $delimiter = null, $returnCommonPrefixes = false)
|
330 |
-
{
|
331 |
try {
|
332 |
-
if (
|
333 |
|
334 |
$vars = array('Bucket' => $bucket);
|
335 |
-
if (
|
336 |
-
if (
|
337 |
-
if (
|
338 |
-
if (
|
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 |
-
$
|
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 |
-
|
353 |
-
'
|
354 |
-
'
|
355 |
-
|
356 |
-
//
|
357 |
-
// 'hash' => substr((string)$c['ETag'], 1, -1)
|
358 |
);
|
359 |
-
$
|
360 |
}
|
361 |
|
362 |
if (isset($result['IsTruncated']) && empty($result['IsTruncated'])) return $results;
|
363 |
|
364 |
-
if (isset($result['NextMarker'])) $
|
365 |
|
366 |
-
// Loop through truncated results if
|
367 |
-
if (
|
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 |
-
|
378 |
-
'
|
379 |
-
'
|
380 |
-
|
381 |
-
//
|
382 |
-
// 'hash' => substr((string)$c['ETag'], 1, -1)
|
383 |
);
|
384 |
-
$
|
385 |
}
|
386 |
|
387 |
-
//
|
388 |
-
//
|
389 |
-
//
|
390 |
|
391 |
if (isset($response['NextMarker']))
|
392 |
-
$
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
|
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 |
-
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
public function initiateMultipartUpload
|
469 |
-
{
|
470 |
$vars = array(
|
471 |
'ACL' => $acl,
|
472 |
'Bucket' => $bucket,
|
473 |
'Key' => $uri,
|
474 |
-
'Metadata' => $
|
475 |
-
'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 |
-
|
497 |
-
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
|
502 |
-
|
503 |
-
|
504 |
-
|
505 |
-
|
506 |
-
|
507 |
-
public function uploadPart
|
508 |
-
{
|
509 |
$vars = array(
|
510 |
'Bucket' => $bucket,
|
511 |
'Key' => $uri,
|
512 |
-
'PartNumber' => $
|
513 |
-
'UploadId' => $
|
514 |
);
|
515 |
|
516 |
// Where to begin
|
517 |
-
$
|
518 |
|
519 |
// Download the smallest of the remaining bytes and the part size
|
520 |
-
$
|
521 |
-
if ($
|
522 |
|
523 |
-
//
|
524 |
$data = "";
|
525 |
|
526 |
-
if ($handle = fopen($
|
527 |
-
if ($
|
528 |
$bytes_read = 0;
|
529 |
-
while ($
|
530 |
-
$
|
531 |
$bytes_read += strlen($read);
|
532 |
$data .= $read;
|
533 |
}
|
@@ -553,20 +559,19 @@ class UpdraftPlus_S3_Compat
|
|
553 |
}
|
554 |
|
555 |
/**
|
556 |
-
|
557 |
-
|
558 |
-
|
559 |
-
|
560 |
-
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
public function completeMultipartUpload
|
565 |
-
{
|
566 |
$vars = array(
|
567 |
'Bucket' => $bucket,
|
568 |
'Key' => $uri,
|
569 |
-
'UploadId' => $
|
570 |
);
|
571 |
|
572 |
$partno = 1;
|
@@ -592,29 +597,29 @@ class UpdraftPlus_S3_Compat
|
|
592 |
}
|
593 |
|
594 |
/**
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
{
|
607 |
try {
|
608 |
$options = array(
|
609 |
'Bucket' => $bucket,
|
610 |
'Key' => $uri,
|
611 |
'SourceFile' => $file,
|
612 |
-
'StorageClass' => $
|
613 |
'ACL' => $acl
|
614 |
);
|
615 |
-
if ($
|
616 |
if (!empty($this->_serverSideEncryption)) $options['ServerSideEncryption'] = $this->_serverSideEncryption;
|
617 |
-
if (!empty($
|
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 |
-
|
633 |
-
|
634 |
-
|
635 |
-
|
636 |
-
|
637 |
-
|
638 |
-
|
639 |
-
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
-
public function putObjectString($string, $bucket, $uri, $acl = self::ACL_PRIVATE, $
|
644 |
-
{
|
645 |
try {
|
646 |
$result = $this->client->putObject(array(
|
647 |
'Bucket' => $bucket,
|
648 |
'Key' => $uri,
|
649 |
'Body' => $string,
|
650 |
-
'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 |
-
|
666 |
-
|
667 |
-
|
668 |
-
|
669 |
-
|
670 |
-
|
671 |
-
|
672 |
-
|
673 |
-
public function getObject($bucket, $uri, $
|
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($
|
680 |
-
$fp = $
|
681 |
if (!is_bool($resume)) $range_header = $resume;
|
682 |
-
} elseif (file_exists($
|
683 |
-
if ($resume && ($fp = @fopen($
|
684 |
-
$range_header = "bytes=".filesize($
|
685 |
} else {
|
686 |
-
throw new Exception('Unable to open save file for writing: '.$
|
687 |
}
|
688 |
} else {
|
689 |
-
if (($fp = @fopen($
|
690 |
$range_header = false;
|
691 |
} else {
|
692 |
-
throw new Exception('Unable to open save file for writing: '.$
|
693 |
}
|
694 |
}
|
695 |
|
@@ -715,13 +718,12 @@ class UpdraftPlus_S3_Compat
|
|
715 |
|
716 |
|
717 |
/**
|
718 |
-
|
719 |
-
|
720 |
-
|
721 |
-
|
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 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
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 |
}
|
|
@@ -18,14 +18,23 @@ class UpdraftPlus_Commands {
|
|
18 |
|
19 |
private $_uc_helper;
|
20 |
|
21 |
-
|
|
|
|
|
|
|
|
|
22 |
public function __construct($uc_helper) {
|
23 |
$this->_uc_helper = $uc_helper;
|
24 |
}
|
25 |
|
26 |
-
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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"]
|
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 |
-
|
339 |
break;
|
340 |
|
341 |
case 's3_new_api_user_form':
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
break;
|
347 |
|
348 |
case 'cloudfiles_new_api_user_form':
|
349 |
-
|
350 |
-
|
351 |
$error = true;
|
352 |
$output = 'cloudfiles_addon_not_found';
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
break;
|
360 |
|
361 |
case 'backupnow_modal_contents':
|
362 |
-
|
363 |
-
|
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 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
|
370 |
case 'panel_download_and_restore':
|
371 |
-
|
372 |
-
|
373 |
$updraftplus->rebuild_backup_history();
|
374 |
$backup_history = UpdraftPlus_Options::get_updraft_option('updraft_backup_history');
|
375 |
-
|
376 |
-
|
377 |
|
378 |
-
|
379 |
-
|
380 |
|
381 |
case 'disk_usage':
|
382 |
-
|
383 |
-
|
384 |
default:
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
}
|
390 |
|
391 |
if (!$error) {
|
@@ -398,7 +413,12 @@ class UpdraftPlus_Commands {
|
|
398 |
|
399 |
}
|
400 |
|
401 |
-
|
|
|
|
|
|
|
|
|
|
|
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 =
|
410 |
$response_decode = json_decode($response);
|
411 |
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
}
|
421 |
-
|
422 |
-
|
|
|
|
|
|
|
|
|
|
|
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 =
|
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
|
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 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
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(
|
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(
|
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() {
|
@@ -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 ==
|
41 |
if ($a == $our_table_prefix.'site') return -1;
|
42 |
-
if ($b ==
|
43 |
if ($a == $our_table_prefix.'blogs') return -1;
|
44 |
-
if ($b ==
|
45 |
if ($a == $our_table_prefix.'users') return -1;
|
46 |
-
if ($b ==
|
47 |
if ($a == $our_table_prefix.'usermeta') return -1;
|
48 |
-
if ($b ==
|
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 |
-
*
|
|
|
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 |
-
|
80 |
-
if (
|
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 |
+
}
|
@@ -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 |
-
*
|
|
|
|
|
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 (
|
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 (
|
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
|
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 (
|
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
|
@@ -15,7 +15,7 @@ class UpdraftCentral_UpdraftPlus_Commands extends UpdraftCentral_Commands {
|
|
15 |
|
16 |
parent::__construct($rc);
|
17 |
|
18 |
-
if (!class_exists('UpdraftPlus_Commands'))
|
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 |
}
|
@@ -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 |
-
|
|
|
|
|
12 |
class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
|
13 |
|
14 |
private $_uc_helper;
|
|
|
15 |
private $_updraftplus_admin;
|
|
|
16 |
private $_updraftplus;
|
17 |
|
18 |
-
|
|
|
|
|
|
|
|
|
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 |
-
//
|
56 |
-
//
|
57 |
-
//
|
58 |
-
//
|
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();
|
|
|
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)) {
|
160 |
-
|
161 |
-
|
|
|
|
|
|
|
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']
|
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 .= (
|
183 |
}
|
184 |
}
|
185 |
if ('' != $missing) {
|
@@ -217,8 +229,11 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
|
|
217 |
|
218 |
}
|
219 |
|
220 |
-
|
221 |
-
|
|
|
|
|
|
|
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 |
-
|
264 |
-
|
|
|
|
|
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)
|
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']
|
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(
|
|
|
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 |
-
|
432 |
|
433 |
$zip_object = 'UpdraftPlus_ZipArchive';
|
434 |
|
435 |
-
|
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 (
|
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'],
|
|
|
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
|
@@ -1,6 +1,6 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
if (!defined
|
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']
|
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 |
|
@@ -2,19 +2,33 @@
|
|
2 |
|
3 |
if (!defined('UPDRAFTPLUS_DIR')) die('No direct access allowed.');
|
4 |
|
5 |
-
|
|
|
|
|
6 |
class UpdraftPlus_ftp_wrapper {
|
|
|
7 |
private $conn_id;
|
|
|
8 |
private $host;
|
|
|
9 |
private $username;
|
|
|
10 |
private $password;
|
|
|
11 |
private $port;
|
12 |
-
|
13 |
-
public
|
14 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
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;
|
|
|
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 (
|
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 (
|
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,
|
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 (
|
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 (
|
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 |
-
|
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 |
}
|
|
@@ -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.
|
@@ -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 |
+
'&': '&',
|
376 |
+
'<': '<',
|
377 |
+
'>': '>',
|
378 |
+
'"': '"',
|
379 |
+
"'": ''',
|
380 |
+
'`': '`',
|
381 |
+
'=': '='
|
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 |
+
;
|
@@ -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={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},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"]}])});
|
@@ -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 |
+
'&': '&',
|
308 |
+
'<': '<',
|
309 |
+
'>': '>',
|
310 |
+
'"': '"',
|
311 |
+
"'": ''',
|
312 |
+
'`': '`',
|
313 |
+
'=': '='
|
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 |
+
;
|
@@ -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={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},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}())}])});
|
@@ -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:
|
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 #
|
824 |
-
box-shadow: 0 0 5px #
|
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:
|
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:
|
844 |
font-size: 1em;
|
845 |
}
|
|
|
846 |
.ui-widget-content {
|
847 |
-
border: 1px solid #
|
848 |
-
background: #
|
849 |
-
color: #
|
850 |
}
|
|
|
851 |
.ui-widget-content a {
|
852 |
-
color: #
|
853 |
}
|
|
|
854 |
.ui-widget-header {
|
855 |
-
border: 1px solid #
|
856 |
-
background: #
|
857 |
-
color: #
|
858 |
font-weight: bold;
|
859 |
}
|
|
|
860 |
.ui-widget-header a {
|
861 |
-
color: #
|
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 #
|
870 |
-
background: #
|
871 |
font-weight: bold;
|
872 |
-
color: #
|
873 |
}
|
|
|
874 |
.ui-state-default a,
|
875 |
.ui-state-default a:link,
|
876 |
.ui-state-default a:visited {
|
877 |
-
color: #
|
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 #
|
887 |
-
background: #
|
888 |
font-weight: bold;
|
889 |
-
color: #
|
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: #
|
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 #
|
906 |
-
background: #
|
907 |
font-weight: bold;
|
908 |
-
color: #
|
909 |
}
|
|
|
910 |
.ui-state-active a,
|
911 |
.ui-state-active a:link,
|
912 |
.ui-state-active a:visited {
|
913 |
-
color: #
|
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 #
|
923 |
-
background: #
|
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 #
|
935 |
-
background: #
|
936 |
-
color: #
|
937 |
}
|
|
|
938 |
.ui-state-error a,
|
939 |
.ui-widget-content .ui-state-error a,
|
940 |
.ui-widget-header .ui-state-error a {
|
941 |
-
color: #
|
942 |
}
|
|
|
943 |
.ui-state-error-text,
|
944 |
.ui-widget-content .ui-state-error-text,
|
945 |
.ui-widget-header .ui-state-error-text {
|
946 |
-
color: #
|
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:
|
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:
|
965 |
background-image: none;
|
966 |
}
|
|
|
967 |
.ui-state-disabled .ui-icon {
|
968 |
-
filter:
|
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 {
|
1006 |
-
|
1007 |
-
|
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 |
-
|
1184 |
-
|
|
|
1185 |
|
1186 |
-
|
1187 |
-
|
1188 |
-
.ui-corner-top,
|
1189 |
-
.ui-corner-left,
|
1190 |
-
.ui-corner-tl {
|
1191 |
-
border-top-left-radius: 4px;
|
1192 |
}
|
1193 |
-
|
1194 |
-
.ui-
|
1195 |
-
|
1196 |
-
.ui-corner-tr {
|
1197 |
-
border-top-right-radius: 4px;
|
1198 |
}
|
1199 |
-
|
1200 |
-
.ui-
|
1201 |
-
|
1202 |
-
.ui-corner-bl {
|
1203 |
-
border-bottom-left-radius: 4px;
|
1204 |
}
|
1205 |
-
|
1206 |
-
.ui-
|
1207 |
-
|
1208 |
-
.ui-corner-br {
|
1209 |
-
border-bottom-right-radius: 4px;
|
1210 |
}
|
1211 |
|
1212 |
-
|
1213 |
-
|
1214 |
-
|
1215 |
-
|
1216 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1217 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1218 |
.ui-widget-shadow {
|
1219 |
margin: -5px 0 0 -5px;
|
1220 |
padding: 5px;
|
1221 |
-
background: #
|
1222 |
-
opacity: .2;
|
1223 |
-
filter:
|
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 |
}
|
@@ -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 */
|
@@ -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"]}
|
@@ -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 |
+
})();
|
@@ -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 =
|
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 |
-
|
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 |
-
//
|
288 |
return onlythesefileentities;
|
289 |
}
|
290 |
|
291 |
/**
|
292 |
-
*
|
|
|
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() {
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
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() {
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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,
|
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 =
|
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 |
-
//
|
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;
|
|
|
|
|
|
|
|
|
|