403Webshell
Server IP : 146.59.209.152  /  Your IP : 216.73.216.46
Web Server : Apache
System : Linux webm005.cluster131.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
User : infrafs ( 43850)
PHP Version : 8.2.29
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/i/n/f/infrafs/INFRABIKEIT/wp-content/plugins/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/i/n/f/infrafs/INFRABIKEIT/wp-content/plugins/duplicator.tar
classes/package/index.php000064400000000016151336065400011414 0ustar00<?php
//silentclasses/package/class.pack.archive.php000064400000070205151336065400013756 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (!defined('DUPLICATOR_VERSION')) exit;

require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/duparchive/class.pack.archive.duparchive.php');
require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/class.pack.archive.filters.php');
require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/class.pack.archive.zip.php');
require_once (DUPLICATOR_PLUGIN_PATH.'lib/forceutf8/Encoding.php');

/**
 * Class for handling archive setup and build process
 *
 * Standard: PSR-2 (almost)
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DUP
 * @subpackage classes/package
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
class DUP_Archive
{
    //PUBLIC
    public $FilterDirs;
    public $FilterFiles;
    public $FilterExts;
    public $FilterDirsAll     = array();
    public $FilterFilesAll    = array();
    public $FilterExtsAll     = array();
    public $FilterOn;
    public $ExportOnlyDB;
    public $File;
    public $Format;
    public $PackDir;
    public $Size              = 0;
    public $Dirs              = array();
    public $Files             = array();

    /**
     *
     * @var DUP_Archive_Filter_Info
     */
    public $FilterInfo        = null;
    public $RecursiveLinks    = array();
    public $file_count        = -1;
    //PROTECTED
    protected $Package;
    private $tmpFilterDirsAll = array();
    private $wpCorePaths      = array();
    private $wpCoreExactPaths = array();

    /**
	 *  Init this object
	 */
	public function __construct($package)
	{
		$this->Package		 = $package;
		$this->FilterOn		 = false;
		$this->ExportOnlyDB	 = false;
		$this->FilterInfo	 = new DUP_Archive_Filter_Info();

		$homePath = duplicator_get_home_path();

		$this->wpCorePaths[] = DUP_Util::safePath("{$homePath}/wp-admin");
		$this->wpCorePaths[] = DUP_Util::safePath(WP_CONTENT_DIR."/languages");
		$this->wpCorePaths[] = DUP_Util::safePath("{$homePath}/wp-includes");

		$this->wpCoreExactPaths[] = DUP_Util::safePath("{$homePath}");
		$this->wpCoreExactPaths[] = DUP_Util::safePath(WP_CONTENT_DIR);
		$this->wpCoreExactPaths[] = DUP_Util::safePath(WP_CONTENT_DIR."/uploads");
		$this->wpCoreExactPaths[] = DUP_Util::safePath(WP_CONTENT_DIR."/plugins");
		$this->wpCoreExactPaths[] = DUP_Util::safePath(get_theme_root());
	}

	/**
	 * Builds the archive based on the archive type
	 *
	 * @param obj $package The package object that started this process
	 *
	 * @return null
	 */
	public function build($package, $rethrow_exception = false)
	{
		DUP_LOG::trace("b1");
		$this->Package = $package;
		if (!isset($this->PackDir) && !is_dir($this->PackDir)) throw new Exception("The 'PackDir' property must be a valid directory.");
		if (!isset($this->File)) throw new Exception("A 'File' property must be set.");

		DUP_LOG::trace("b2");
		$completed = false;

		switch ($this->Format) {
			case 'TAR': break;
			case 'TAR-GZIP': break;
			case 'DAF':
				$completed = DUP_DupArchive::create($this, $this->Package->BuildProgress, $this->Package);

				$this->Package->Update();
				break;

			default:
				if (class_exists('ZipArchive')) {
					$this->Format	 = 'ZIP';
					DUP_Zip::create($this, $this->Package->BuildProgress);
					$completed		 = true;
				}
				break;
		}

		DUP_LOG::Trace("Completed build or build thread");

		if ($this->Package->BuildProgress === null) {
			// Zip path
			DUP_LOG::Trace("Completed Zip");
			$storePath	 = DUP_Settings::getSsdirTmpPath()."/{$this->File}";
			$this->Size	 = @filesize($storePath);
			$this->Package->setStatus(DUP_PackageStatus::ARCDONE);
		} else if ($completed) {
			// Completed DupArchive path
			DUP_LOG::Trace("Completed DupArchive build");
			if ($this->Package->BuildProgress->failed) {
				DUP_LOG::Trace("Error building DupArchive");
				$this->Package->setStatus(DUP_PackageStatus::ERROR);
			} else {
				$filepath	 = DUP_Settings::getSsdirTmpPath()."/{$this->File}";
				$this->Size	 = @filesize($filepath);
				$this->Package->setStatus(DUP_PackageStatus::ARCDONE);
				DUP_LOG::Trace("Done building archive");
			}
		} else {
			DUP_Log::trace("DupArchive chunk done but package not completed yet");
		}
	}

    /**
     *
     * @return int return  DUP_Archive_Build_Mode
     */
    public function getBuildMode()
    {
        switch ($this->Format) {
            case 'TAR': break;
            case 'TAR-GZIP': break;
            case 'DAF':
                return DUP_Archive_Build_Mode::DupArchive;
            default:
                if (class_exists('ZipArchive')) {
                    return DUP_Archive_Build_Mode::ZipArchive;
                } else {
                    return DUP_Archive_Build_Mode::Unconfigured;
                }
                break;
        }
    }

    /**
	 *  Builds a list of files and directories to be included in the archive
	 *
	 *  Get the directory size recursively, but don't calc the snapshot directory, exclusion directories
	 *  @link http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx Windows filename restrictions
	 *
	 *  @return obj Returns a DUP_Archive object
	 */
	public function getScannerData()
	{
		$this->createFilterInfo();
		$rootPath	 = duplicator_get_abs_path();

		$this->RecursiveLinks = array();
		//If the root directory is a filter then skip it all
		if (in_array($this->PackDir, $this->FilterDirsAll) || $this->Package->Archive->ExportOnlyDB) {
			$this->Dirs = array();
		} else {
			$this->Dirs[] = $this->PackDir;

			$this->getFileLists($rootPath);

			if ($this->isOuterWPContentDir()) {
				$this->Dirs[] = WP_CONTENT_DIR;
				$this->getFileLists(WP_CONTENT_DIR);
			}

			$this->setDirFilters();
			$this->setFileFilters();
			$this->setTreeFilters();
		}

		$this->FilterDirsAll	 = array_merge($this->FilterDirsAll, $this->FilterInfo->Dirs->Unreadable);
		$this->FilterFilesAll	 = array_merge($this->FilterFilesAll, $this->FilterInfo->Files->Unreadable);
		sort($this->FilterDirsAll);

		return $this;
	}

	/**
	 * Save any property of this class through reflection
	 *
	 * @param $property     A valid public property in this class
	 * @param $value        The value for the new dynamic property
	 *
	 * @return bool	Returns true if the value has changed.
	 */
	public function saveActiveItem($package, $property, $value)
	{
		$package		 = DUP_Package::getActive();
		$reflectionClass = new ReflectionClass($package->Archive);
		$reflectionClass->getProperty($property)->setValue($package->Archive, $value);
		return update_option(DUP_Package::OPT_ACTIVE, $package);
	}

    /**
     *  Properly creates the directory filter list that is used for filtering directories
     *
     * @param string $dirs A semi-colon list of dir paths
     *  /path1_/path/;/path1_/path2/;
     *
     * @returns string A cleaned up list of directory filters
     * @return string
     */
	public function parseDirectoryFilter($dirs = "")
	{
		$filters	 = "";
		$dir_array	 = array_unique(explode(";", $dirs));
		$clean_array = array();
		foreach ($dir_array as $val) {
		    $val = DupLiteSnapLibIOU::safePathUntrailingslashit(DupLiteSnapLibUtil::sanitize_non_stamp_chars_newline_and_trim($val));
			if (strlen($val) >= 2 && is_dir($val)) {
				$clean_array[] = $val;
			}
		}

		if (count($clean_array)) {
			$clean_array = array_unique($clean_array);
			sort($clean_array);
			$filters	 = implode(';', $clean_array).';';
		}
		return $filters;
	}

    /**
     *  Properly creates the file filter list that is used for filtering files
     *
     * @param string $files A semi-colon list of file paths
     *  /path1_/path/file1.ext;/path1_/path2/file2.ext;
     *
     * @returns string A cleaned up list of file filters
     * @return string
     */
	public function parseFileFilter($files = "")
	{
		$filters	 = "";
		$file_array	 = array_unique(explode(";", $files));
		$clean_array = array();
		foreach ($file_array as $val) {
            $val = DupLiteSnapLibIOU::safePathUntrailingslashit(DupLiteSnapLibUtil::sanitize_non_stamp_chars_newline_and_trim($val));
            if (strlen($val) >= 2 && file_exists($val)) {
				$clean_array[] = $val;
			}
		}

		if (count($clean_array)) {
			$clean_array = array_unique($clean_array);
			sort($clean_array);
			$filters	 = implode(';', $clean_array).';';
		}
		return $filters;
	}

	/**
	 *  Properly creates the extension filter list that is used for filtering extensions
	 *
	 *  @param string $dirs A semi-colon list of dir paths
	 *  .jpg;.zip;.gif;
	 *
	 *  @returns string A cleaned up list of extension filters
	 */
	public function parseExtensionFilter($extensions = "")
	{
		$filter_exts = "";
		if (strlen($extensions) >= 1 && $extensions != ";") {
			$filter_exts = str_replace(array(' ', '.'), '', $extensions);
			$filter_exts = str_replace(",", ";", $filter_exts);
			$filter_exts = DUP_Util::appendOnce($extensions, ";");
		}
		return $filter_exts;
	}

	/**
	 * Creates the filter info setup data used for filtering the archive
	 *
	 * @return null
	 */
	private function createFilterInfo()
	{
		//FILTER: INSTANCE ITEMS
		//Add the items generated at create time
		if ($this->FilterOn) {
			$this->FilterInfo->Dirs->Instance	 = array_map('DUP_Util::safePath', explode(";", $this->FilterDirs, -1));
			$this->FilterInfo->Files->Instance	 = array_map('DUP_Util::safePath', explode(";", $this->FilterFiles, -1));
			$this->FilterInfo->Exts->Instance	 = explode(";", $this->FilterExts, -1);
		}

		//FILTER: CORE ITMES
		//Filters Duplicator free packages & All pro local directories
		$wp_root						 = duplicator_get_abs_path();
		$upload_dir						 = wp_upload_dir();
		$upload_dir						 = isset($upload_dir['basedir']) ? basename($upload_dir['basedir']) : 'uploads';
		$wp_content						 = str_replace("\\", "/", WP_CONTENT_DIR);
		$wp_content_upload				 = "{$wp_content}/{$upload_dir}";
		$this->FilterInfo->Dirs->Core	 = array(
			//WP-ROOT
			DUP_Settings::getSsdirPathLegacy(),
            DUP_Settings::getSsdirPathWpCont(),
            $wp_root.'/.opcache',
			//WP-CONTENT
			$wp_content.'/backups-dup-pro',
			$wp_content.'/ai1wm-backups',
			$wp_content.'/backupwordpress',
			$wp_content.'/content/cache',
			$wp_content.'/contents/cache',
			$wp_content.'/infinitewp/backups',
			$wp_content.'/managewp/backups',
			$wp_content.'/old-cache',
			$wp_content.'/plugins/all-in-one-wp-migration/storage',
			$wp_content.'/updraft',
			$wp_content.'/wishlist-backup',
			$wp_content.'/wfcache',
			$wp_content.'/bps-backup', // BulletProof Security backup folder
			$wp_content.'/cache',
			//WP-CONTENT-UPLOADS
			$wp_content_upload.'/aiowps_backups',
			$wp_content_upload.'/backupbuddy_temp',
			$wp_content_upload.'/backupbuddy_backups',
			$wp_content_upload.'/ithemes-security/backups',
			$wp_content_upload.'/mainwp/backup',
			$wp_content_upload.'/pb_backupbuddy',
			$wp_content_upload.'/snapshots',
			$wp_content_upload.'/sucuri',
			$wp_content_upload.'/wp-clone',
			$wp_content_upload.'/wp_all_backup',
			$wp_content_upload.'/wpbackitup_backups'
		);

		if (class_exists('BackWPup')) {
			$upload_dir = wp_upload_dir(null, false, true);
			$this->FilterInfo->Dirs->Core[] = trailingslashit(str_replace( '\\',
					'/',
					$upload_dir['basedir'])).'backwpup-'.BackWPup::get_plugin_data('hash').'-backups/';
			
			$backwpup_cfg_logfolder = get_site_option('backwpup_cfg_logfolder');
			if (false !== $backwpup_cfg_logfolder) {
				$this->FilterInfo->Dirs->Core[] = $wp_content.'/'.$backwpup_cfg_logfolder;
			}
		}
		$duplicator_global_file_filters_on = apply_filters('duplicator_global_file_filters_on', $GLOBALS['DUPLICATOR_GLOBAL_FILE_FILTERS_ON']);
		if ($GLOBALS['DUPLICATOR_GLOBAL_FILE_FILTERS_ON']) {
			$duplicator_global_file_filters = apply_filters('duplicator_global_file_filters', $GLOBALS['DUPLICATOR_GLOBAL_FILE_FILTERS']);
			$this->FilterInfo->Files->Global = $duplicator_global_file_filters;
		}

		// Prevent adding double wp-content dir conflicts
        if ($this->isOuterWPContentDir()) {
            $default_wp_content_dir_path = DUP_Util::safePath(ABSPATH.'wp-content');
            if (file_exists($default_wp_content_dir_path)) {
                if (is_dir($default_wp_content_dir_path)) {
                    $this->FilterInfo->Dirs->Core[] = $default_wp_content_dir_path;
                } else {
                    $this->FilterInfo->Files->Core[] = $default_wp_content_dir_path;
                }
            }
        }        

		$this->FilterDirsAll	 = array_merge($this->FilterInfo->Dirs->Instance, $this->FilterInfo->Dirs->Core);
		$this->FilterExtsAll	 = array_merge($this->FilterInfo->Exts->Instance, $this->FilterInfo->Exts->Core);
		$this->FilterFilesAll	 = array_merge($this->FilterInfo->Files->Instance, $this->FilterInfo->Files->Global);

		$abs_path = duplicator_get_abs_path();
		$this->FilterFilesAll[]	 = $abs_path.'/.htaccess';
		$this->FilterFilesAll[]	 = $abs_path.'/web.config';
		$this->FilterFilesAll[]	 = $abs_path.'/wp-config.php';
		$this->tmpFilterDirsAll	 = $this->FilterDirsAll;

		//PHP 5 on windows decode patch
		if (!DUP_Util::$PHP7_plus && DUP_Util::isWindows()) {
			foreach ($this->tmpFilterDirsAll as $key => $value) {
				if (preg_match('/[^\x20-\x7f]/', $value)) {
					$this->tmpFilterDirsAll[$key] = utf8_decode($value);
				}
			}
		}
	}

	/**
     * Get All Directories then filter
     *
     * @return null
     */
    private function setDirFilters()
    {
        $this->FilterInfo->Dirs->Warning    = array();
        $this->FilterInfo->Dirs->Unreadable = array();
        $this->FilterInfo->Dirs->AddonSites = array();
        $skip_archive_scan                  = DUP_Settings::Get('skip_archive_scan');

        $utf8_key_list  = array();
        $unset_key_list = array();

        //Filter directories invalid test checks for:
        // - characters over 250
        // - invlaid characters
        // - empty string
        // - directories ending with period (Windows incompatable)
        foreach ($this->Dirs as $key => $val) {
            $name = basename($val);

            //Dir is not readble remove flag for removal
            if (!is_readable($this->Dirs[$key])) {
                $unset_key_list[]                     = $key;
                $this->FilterInfo->Dirs->Unreadable[] = DUP_Encoding::toUTF8($val);
            }

            if (!$skip_archive_scan) {
                //Locate invalid directories and warn
                $invalid_test = (defined('PHP_MAXPATHLEN') && (strlen($val) > PHP_MAXPATHLEN)) || preg_match('/(\/|\*|\?|\>|\<|\:|\\|\|)/', $name) || trim($name) == '' || (strrpos($name, '.') == strlen($name) - 1 && substr($name, -1)
                    == '.') || preg_match('/[^\x20-\x7f]/', $name);

                if ($invalid_test) {
                    $utf8_key_list[]                   = $key;
                    $this->FilterInfo->Dirs->Warning[] = DUP_Encoding::toUTF8($val);
                }
            }

            //Check for other WordPress installs
            if ($name === 'wp-admin') {
                $parent_dir = realpath(dirname($this->Dirs[$key]));
                if ($parent_dir != realpath(duplicator_get_abs_path())) {
                    if (file_exists("$parent_dir/wp-includes")) {
                        if (file_exists("$parent_dir/wp-config.php")) {
                            // Ensure we aren't adding any critical directories
                            $parent_name = basename($parent_dir);
                            if (($parent_name != 'wp-includes') && ($parent_name != 'wp-content') && ($parent_name != 'wp-admin')) {
                                $this->FilterInfo->Dirs->AddonSites[] = str_replace("\\", '/', $parent_dir);
                            }
                        }
                    }
                }
            }
        }

        //Try to repair utf8 paths
        foreach ($utf8_key_list as $key) {
            $this->Dirs[$key] = DUP_Encoding::toUTF8($this->Dirs[$key]);
        }

        //Remove unreadable items outside of main loop for performance
        if (count($unset_key_list)) {
            foreach ($unset_key_list as $key) {
                unset($this->Dirs[$key]);
            }
            $this->Dirs = array_values($this->Dirs);
        }
    }

    /**
     * Get all files and filter out error prone subsets
     *
     * @return null
     */
    private function setFileFilters()
    {
        //Init for each call to prevent concatination from stored entity objects
        $this->Size                          = 0;
        $this->FilterInfo->Files->Size       = array();
        $this->FilterInfo->Files->Warning    = array();
        $this->FilterInfo->Files->Unreadable = array();
        $skip_archive_scan                   = DUP_Settings::Get('skip_archive_scan');

        $utf8_key_list  = array();
        $unset_key_list = array();

        $wpconfig_filepath = $this->getWPConfigFilePath();
        if (!is_readable($wpconfig_filepath)) {
            $this->FilterInfo->Files->Unreadable[] = $wpconfig_filepath;
        }

        foreach ($this->Files as $key => $filePath) {

            $fileName = basename($filePath);

            if (!is_readable($filePath)) {
                $unset_key_list[]                      = $key;
                $this->FilterInfo->Files->Unreadable[] = $filePath;
                continue;
            }

            $fileSize   = @filesize($filePath);
            $fileSize   = empty($fileSize) ? 0 : $fileSize;
            $this->Size += $fileSize;

            if (!$skip_archive_scan) {
                $invalid_test = (defined('PHP_MAXPATHLEN') && (strlen($filePath) > PHP_MAXPATHLEN)) || preg_match('/(\/|\*|\?|\>|\<|\:|\\|\|)/', $fileName) || trim($fileName) == "" || preg_match('/[^\x20-\x7f]/', $fileName);

                if ($invalid_test) {
                    $utf8_key_list[]                    = $key;
                    $filePath                           = DUP_Encoding::toUTF8($filePath);
                    $fileName                           = basename($filePath);
                    $this->FilterInfo->Files->Warning[] = array(
                        'name' => $fileName,
                        'dir' => pathinfo($filePath, PATHINFO_DIRNAME),
                        'path' => $filePath);
                }

                if ($fileSize > DUPLICATOR_SCAN_WARNFILESIZE) {
                    //$ext = pathinfo($filePath, PATHINFO_EXTENSION);
                    $this->FilterInfo->Files->Size[] = array(
                        'ubytes' => $fileSize,
                        'bytes' => DUP_Util::byteSize($fileSize, 0),
                        'name' => $fileName,
                        'dir' => pathinfo($filePath, PATHINFO_DIRNAME),
                        'path' => $filePath);
                }
            }
        }

        //Try to repair utf8 paths
        foreach ($utf8_key_list as $key) {
            $this->Files[$key] = DUP_Encoding::toUTF8($this->Files[$key]);
        }

        //Remove unreadable items outside of main loop for performance
        if (count($unset_key_list)) {
            foreach ($unset_key_list as $key) {
                unset($this->Files[$key]);
            }
            $this->Files = array_values($this->Files);
        }
    }

    /**
	 * Recursive function to get all directories in a wp install
	 *
	 * @notes:
	 * 	Older PHP logic which is more stable on older version of PHP
	 * 	NOTE RecursiveIteratorIterator is problematic on some systems issues include:
	 *  - error 'too many files open' for recursion
	 *  - $file->getExtension() is not reliable as it silently fails at least in php 5.2.17
	 *  - issues with when a file has a permission such as 705 and trying to get info (had to fallback to pathinfo)
	 *  - basic conclusion wait on the SPL libs until after php 5.4 is a requirments
	 *  - tight recursive loop use caution for speed
	 *
	 * @return array	Returns an array of directories to include in the archive
	 */
	private function getFileLists($path) {
		$handle = @opendir($path);

		if ($handle) {
			while (($file = readdir($handle)) !== false) {

				if ($file == '.' || $file == '..') {
					continue;
				}

				$fullPath = str_replace("\\", '/', "{$path}/{$file}");

				// @todo: Don't leave it like this. Convert into an option on the package to not follow symbolic links
				// if (is_dir($fullPath) && (is_link($fullPath) == false))
				if (is_dir($fullPath)) {

                    $add = true;
                    if (!is_link($fullPath)){
                        foreach ($this->tmpFilterDirsAll as $key => $val) {
                            $trimmedFilterDir = rtrim($val, '/');
                            if ($fullPath == $trimmedFilterDir || strpos($fullPath, $trimmedFilterDir . '/') !== false) {
                                $add = false;
                                unset($this->tmpFilterDirsAll[$key]);
                                break;
                            }
                        }
                    } else{
                        //Convert relative path of link to absolute path
                        chdir($fullPath);
						$link_path = str_replace("\\", '/', realpath(readlink($fullPath)));
                        chdir(dirname(__FILE__));

                        $link_pos = strpos($fullPath,$link_path);
                        if($link_pos === 0 && (strlen($link_path) <  strlen($fullPath))){
                            $add = false;
                            $this->RecursiveLinks[] = $fullPath;
                            $this->FilterDirsAll[] = $fullPath;
                        } else {
							foreach ($this->tmpFilterDirsAll as $key => $val) {
								$trimmedFilterDir = rtrim($val, '/');
								if ($fullPath == $trimmedFilterDir || strpos($fullPath, $trimmedFilterDir . '/') !== false) {
									$add = false;
									unset($this->tmpFilterDirsAll[$key]);
									break;
								}
							}
						}
                    }

                    if ($add) {
                        $this->getFileLists($fullPath);
                        $this->Dirs[] = $fullPath;
                    }
				} else {
					if ( ! (in_array(pathinfo($file, PATHINFO_EXTENSION), $this->FilterExtsAll)
						|| in_array($fullPath, $this->FilterFilesAll)
						|| in_array($file, $this->FilterFilesAll))) {
						$this->Files[] = $fullPath;
					}
				}
			}
			closedir($handle);
		}
		return $this->Dirs;
	}

	/**
	 *  Builds a tree for both file size warnings and name check warnings
	 *  The trees are used to apply filters from the scan screen
	 *
	 *  @return null
	 */
	private function setTreeFilters()
	{
		//-------------------------
		//SIZE TREE
		//BUILD: File Size tree
		$dir_group = DUP_Util::array_group_by($this->FilterInfo->Files->Size, "dir");
		ksort($dir_group);
		foreach ($dir_group as $dir => $files) {
			$sum = 0;
			foreach ($files as $key => $value) {
				$sum += $value['ubytes'];
			}

			//Locate core paths, wp-admin, wp-includes, etc.
			$iscore = 0;
			foreach ($this->wpCorePaths as $core_dir) {
				if (strpos(DUP_Util::safePath($dir), DUP_Util::safePath($core_dir)) !== false) {
					$iscore = 1;
					break;
				}
			}
			// Check root and content exact dir
			if (!$iscore) {
				if (in_array($dir, $this->wpCoreExactPaths)) {
					$iscore = 1;
				}
			}

			$this->FilterInfo->TreeSize[] = array(
				'size' => DUP_Util::byteSize($sum, 0),
				'dir' => $dir,
				'sdir' => str_replace(duplicator_get_abs_path(), '/', $dir),
				'iscore' => $iscore,
				'files' => $files
			);
		}

		//-------------------------
		//NAME TREE
		//BUILD: Warning tree for file names
		$dir_group = DUP_Util::array_group_by($this->FilterInfo->Files->Warning, "dir");
		ksort($dir_group);
		foreach ($dir_group as $dir => $files) {

			//Locate core paths, wp-admin, wp-includes, etc.
			$iscore = 0;
			foreach ($this->wpCorePaths as $core_dir) {
				if (strpos($dir, $core_dir) !== false) {
					$iscore = 1;
					break;
				}
			}
			// Check root and content exact dir
			if (!$iscore) {
				if (in_array($dir, $this->wpCoreExactPaths)) {
					$iscore = 1;
				}
			}

			$this->FilterInfo->TreeWarning[] = array(
				'dir' => $dir,
				'sdir' => str_replace(duplicator_get_abs_path(), '/', $dir),
				'iscore' => $iscore,
				'count' => count($files),
				'files' => $files);
		}

		//BUILD: Warning tree for dir names
		foreach ($this->FilterInfo->Dirs->Warning as $dir) {
			$add_dir = true;
			foreach ($this->FilterInfo->TreeWarning as $key => $value) {
				if ($value['dir'] == $dir) {
					$add_dir = false;
					break;
				}
			}
			if ($add_dir) {

				//Locate core paths, wp-admin, wp-includes, etc.
				$iscore = 0;
				foreach ($this->wpCorePaths as $core_dir) {
					if (strpos(DUP_Util::safePath($dir), DUP_Util::safePath($core_dir)) !== false) {
						$iscore = 1;
						break;
					}
				}
				// Check root and content exact dir
				if (!$iscore) {
					if (in_array($dir, $this->wpCoreExactPaths)) {
						$iscore = 1;
					}
				}

				$this->FilterInfo->TreeWarning[] = array(
					'dir' => $dir,
					'sdir' => str_replace(duplicator_get_abs_path(), '/', $dir),
					'iscore' => $iscore,
					'count' => 0);
			}
		}

		function _sortDir($a, $b)
		{
			return strcmp($a["dir"], $b["dir"]);
		}
		usort($this->FilterInfo->TreeWarning, "_sortDir");
	}

	public function getWPConfigFilePath()
	{
		$wpconfig_filepath = '';
		$abs_path = duplicator_get_abs_path();
		if (file_exists($abs_path.'/wp-config.php')) {
			$wpconfig_filepath = $abs_path.'/wp-config.php';
		} elseif (@file_exists(dirname($abs_path).'/wp-config.php') && !@file_exists(dirname($abs_path).'/wp-settings.php')) {
			$wpconfig_filepath = dirname($abs_path).'/wp-config.php';
		}
		return $wpconfig_filepath;
	}

	public function isOuterWPContentDir()
	{
		if (!isset($this->isOuterWPContentDir)) {
			$abspath_normalize			 = wp_normalize_path(ABSPATH);
			$wp_content_dir_normalize	 = wp_normalize_path(WP_CONTENT_DIR);
			if (0 !== strpos($wp_content_dir_normalize, $abspath_normalize)) {
				$this->isOuterWPContentDir = true;
			} else {
				$this->isOuterWPContentDir = false;
			}
		}
		return $this->isOuterWPContentDir;
	}

	public function wpContentDirNormalizePath()
	{
		if (!isset($this->wpContentDirNormalizePath)) {
			$this->wpContentDirNormalizePath = trailingslashit(wp_normalize_path(WP_CONTENT_DIR));
		}
		return $this->wpContentDirNormalizePath;
	}

	public function getUrl()
    {
        return DUP_Settings::getSsdirUrl()."/".$this->File;
    }

	public function getLocalDirPath($dir, $basePath = '')
	{
		$isOuterWPContentDir		 = $this->isOuterWPContentDir();
		$wpContentDirNormalizePath	 = $this->wpContentDirNormalizePath();
		$compressDir				 = rtrim(wp_normalize_path(DUP_Util::safePath($this->PackDir)), '/');

		$dir = trailingslashit(wp_normalize_path($dir));
		if ($isOuterWPContentDir && 0 === strpos($dir, $wpContentDirNormalizePath)) {
			$newWPContentDirPath = empty($basePath) ? 'wp-content/' : $basePath.'wp-content/';
			$emptyDir			 = ltrim(str_replace($wpContentDirNormalizePath, $newWPContentDirPath, $dir), '/');
		} else {
            $emptyDir = ltrim($basePath.preg_replace('/^'.preg_quote($compressDir, '/').'(.*)/m', '$1', $dir), '/');
		}
		return $emptyDir;
	}

	public function getLocalFilePath($file, $basePath = '')
	{
		$isOuterWPContentDir		 = $this->isOuterWPContentDir();
		$wpContentDirNormalizePath	 = $this->wpContentDirNormalizePath();
		$compressDir				 = rtrim(wp_normalize_path(DUP_Util::safePath($this->PackDir)), '/');

		$file = wp_normalize_path($file);
		if ($isOuterWPContentDir && 0 === strpos($file, $wpContentDirNormalizePath)) {
			$newWPContentDirPath = empty($basePath) ? 'wp-content/' : $basePath.'wp-content/';
			$localFileName		 = ltrim(str_replace($wpContentDirNormalizePath, $newWPContentDirPath, $file), '/');
		} else {            
			$localFileName = ltrim($basePath.preg_replace('/^'.preg_quote($compressDir, '/').'(.*)/m', '$1', $file), '/');
		}
		return $localFileName;
	}
}classes/package/class.pack.database.php000064400000074666151336065400014120 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (!defined('DUPLICATOR_VERSION'))
    exit;

/**
 * Class for gathering system information about a database
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 */
class DUP_DatabaseInfo
{

    /**
     * The SQL file was built with mysqldump or PHP
     */
    public $buildMode;

    /**
     * A unique list of all the collation table types used in the database
     */
    public $collationList;

    /**
     * Does any filtered table have an upper case character in it
     */
    public $isTablesUpperCase;

    /**
     * Does the database name have any filtered characters in it
     */
    public $isNameUpperCase;

    /**
     * The real name of the database
     */
    public $name;

    /**
     * The full count of all tables in the database
     */
    public $tablesBaseCount;

    /**
     * The count of tables after the tables filter has been applied
     */
    public $tablesFinalCount;

    /**
     * The number of rows from all filtered tables in the database
     */
    public $tablesRowCount;

    /**
     * The estimated data size on disk from all filtered tables in the database
     */
    public $tablesSizeOnDisk;

    /**
     * Gets the server variable lower_case_table_names
     *
     * 0 store=lowercase;	compare=sensitive	(works only on case sensitive file systems )
     * 1 store=lowercase;	compare=insensitive
     * 2 store=exact;		compare=insensitive	(works only on case INsensitive file systems )
     * default is 0/Linux ; 1/Windows
     */
    public $varLowerCaseTables;

    /**
     * The simple numeric version number of the database server
     * @exmaple: 5.5
     */
    public $version;

    /**
     * The full text version number of the database server
     * @exmaple: 10.2 mariadb.org binary distribution
     */
    public $versionComment;

    /**
     * table wise row counts array, Key as table name and value as row count
     *  table name => row count
     */
    public $tableWiseRowCounts;

    /**
     * @var array List of triggers included in the database
     */
    public $triggerList = array();

    /**
     * Integer field file structure of table, table name as key
     */
    private $intFieldsStruct = array();

    /**
     * $currentIndex => processedSchemaSize
     */
    private $indexProcessedSchemaSize = array();

    //CONSTRUCTOR
    function __construct()
    {
        $this->collationList      = array();
        $this->tableWiseRowCounts = array();
    }

    public function addTriggers()
    {
        global $wpdb;

        if (!is_array($triggers = $wpdb->get_results("SHOW TRIGGERS", ARRAY_A))) {
            return;
        }

        foreach ($triggers as $trigger) {
            $name   = $trigger["Trigger"];
            $create = $wpdb->get_row("SHOW CREATE TRIGGER `{$name}`", ARRAY_N);
            $this->triggerList[$name] = array(
                "create" => "DELIMITER ;;\n".$create[2].";;\nDELIMITER ;"
            );
        }
    }
}

class DUP_Database
{
    //PUBLIC
    public $Type = 'MySQL';
    public $Size;
    public $File;
    public $Path;
    public $FilterTables;
    public $FilterOn;
    public $Name;
    public $Compatible;
    public $Comments;

    /**
     *
     * @var DUP_DatabaseInfo 
     */
    public $info = null;
    //PROTECTED
    protected $Package;
    //PRIVATE
    private $tempDbPath;
    private $EOFMarker;
    private $networkFlush;

    /**
     *  Init this object
     */
    function __construct($package)
    {
        $this->Package                  = $package;
        $this->EOFMarker                = "";
        $package_zip_flush              = DUP_Settings::Get('package_zip_flush');
        $this->networkFlush             = empty($package_zip_flush) ? false : $package_zip_flush;
        $this->info                     = new DUP_DatabaseInfo();
        $this->info->varLowerCaseTables = DUP_Util::isWindows() ? 1 : 0;
    }

    /**
     *  Build the database script
     *
     *  @param DUP_Package $package A reference to the package that this database object belongs in
     *
     *  @return null
     */
    public function build($package, $errorBehavior = Dup_ErrorBehavior::ThrowException)
    {
        try {

            $this->Package = $package;
            do_action('duplicator_lite_build_database_before_start', $package);

            $time_start       = DUP_Util::getMicrotime();
            $this->Package->setStatus(DUP_PackageStatus::DBSTART);
            $this->tempDbPath = DUP_Settings::getSsdirTmpPath()."/{$this->File}";

            $package_mysqldump        = DUP_Settings::Get('package_mysqldump');
            $package_phpdump_qrylimit = DUP_Settings::Get('package_phpdump_qrylimit');

            $mysqlDumpPath        = DUP_DB::getMySqlDumpPath();
            $mode                 = DUP_DB::getBuildMode();
            $reserved_db_filepath = duplicator_get_abs_path().'/database.sql';

            $log = "\n********************************************************************************\n";
            $log .= "DATABASE:\n";
            $log .= "********************************************************************************\n";
            $log .= "BUILD MODE:   {$mode}";
            $log .= ($mode == 'PHP') ? "(query limit - {$package_phpdump_qrylimit})\n" : "\n";
            $log .= "MYSQLTIMEOUT: ".DUPLICATOR_DB_MAX_TIME."\n";
            $log .= "MYSQLDUMP:    ";
            $log .= ($mysqlDumpPath) ? "Is Supported" : "Not Supported";
            DUP_Log::Info($log);
            $log = null;

            do_action('duplicator_lite_build_database_start', $package);

            switch ($mode) {
                case 'MYSQLDUMP':
                    $this->mysqlDump($mysqlDumpPath);
                    break;
                case 'PHP' :
                    $this->phpDump($package);
                    break;
            }

            DUP_Log::Info("SQL CREATED: {$this->File}");
            $time_end = DUP_Util::getMicrotime();
            $time_sum = DUP_Util::elapsedTime($time_end, $time_start);

            //File below 10k considered incomplete
            $sql_file_size = is_file($this->tempDbPath) ? @filesize($this->tempDbPath) : 0;
            DUP_Log::Info("SQL FILE SIZE: ".DUP_Util::byteSize($sql_file_size)." ({$sql_file_size})");

            if ($sql_file_size < 1350) {
                $error_message   = "SQL file size too low.";
                $package->BuildProgress->set_failed($error_message);
                $package->Status = DUP_PackageStatus::ERROR;
                $package->Update();
                DUP_Log::error($error_message, "File does not look complete.  Check permission on file and parent directory at [{$this->tempDbPath}]", $errorBehavior);
                do_action('duplicator_lite_build_database_fail', $package);
            } else {
                do_action('duplicator_lite_build_database_completed', $package);
            }

            DUP_Log::Info("SQL FILE TIME: ".date("Y-m-d H:i:s"));
            DUP_Log::Info("SQL RUNTIME: {$time_sum}");

            $this->Size = is_file($this->tempDbPath) ? @filesize($this->tempDbPath) : 0;

            $this->Package->setStatus(DUP_PackageStatus::DBDONE);
        }
        catch (Exception $e) {
            do_action('duplicator_lite_build_database_fail', $package);
            DUP_Log::error("Runtime error in DUP_Database::Build. ".$e->getMessage(), "Exception: {$e}", $errorBehavior);
        }
    }

    /**
     *  Get the database meta-data such as tables as all there details
     *
     *  @return array Returns an array full of meta-data about the database
     */
    public function getScannerData()
    {
        global $wpdb;

        $filterTables = isset($this->FilterTables) ? explode(',', $this->FilterTables) : array();
        $tblBaseCount = 0;
        $tblCount     = 0;

        $tables                     = $wpdb->get_results("SHOW TABLE STATUS", ARRAY_A);
        $info                       = array();
        $info['Status']['Success']  = is_null($tables) ? false : true;
        //DB_Case for the database name is never checked on
        $info['Status']['DB_Case']  = 'Good';
        $info['Status']['DB_Rows']  = 'Good';
        $info['Status']['DB_Size']  = 'Good';
        $info['Status']['TBL_Case'] = 'Good';
        $info['Status']['TBL_Rows'] = 'Good';
        $info['Status']['TBL_Size'] = 'Good';

        $info['Size']       = 0;
        $info['Rows']       = 0;
        $info['TableCount'] = 0;
        $info['TableList']  = array();
        $tblCaseFound       = 0;
        $tblRowsFound       = 0;
        $tblSizeFound       = 0;

        //Grab Table Stats
        $filteredTables = array();
        foreach ($tables as $table) {
            $tblBaseCount++;
            $name = $table["Name"];
            if ($this->FilterOn && is_array($filterTables)) {
                if (in_array($name, $filterTables)) {
                    continue;
                }
            }

            $size = ($table["Data_length"] + $table["Index_length"]);
            $rows = empty($table["Rows"]) ? '0' : $table["Rows"];

            $info['Size']                      += $size;
            $info['Rows']                      += ($table["Rows"]);
            $info['TableList'][$name]['Case']  = preg_match('/[A-Z]/', $name) ? 1 : 0;
            $info['TableList'][$name]['Rows']  = number_format($rows);
            $info['TableList'][$name]['Size']  = DUP_Util::byteSize($size);
            $info['TableList'][$name]['USize'] = $size;
            $filteredTables[] = $name;
            $tblCount++;

            //Table Uppercase
            if ($info['TableList'][$name]['Case']) {
                if (!$tblCaseFound) {
                    $tblCaseFound = 1;
                }
            }

            //Table Row Count
            if ($rows > DUPLICATOR_SCAN_DB_TBL_ROWS) {
                if (!$tblRowsFound) {
                    $tblRowsFound = 1;
                }
            }

            //Table Size
            if ($size > DUPLICATOR_SCAN_DB_TBL_SIZE) {
                if (!$tblSizeFound) {
                    $tblSizeFound = 1;
                }
            }
        }
        $this->setInfoObj($filteredTables);
        $this->info->addTriggers();

        $info['Status']['DB_Case'] = preg_match('/[A-Z]/', $wpdb->dbname) ? 'Warn' : 'Good';
        $info['Status']['DB_Rows'] = ($info['Rows'] > DUPLICATOR_SCAN_DB_ALL_ROWS) ? 'Warn' : 'Good';
        $info['Status']['DB_Size'] = ($info['Size'] > DUPLICATOR_SCAN_DB_ALL_SIZE) ? 'Warn' : 'Good';

        $info['Status']['TBL_Case'] = ($tblCaseFound) ? 'Warn' : 'Good';
        $info['Status']['TBL_Rows'] = ($tblRowsFound) ? 'Warn' : 'Good';
        $info['Status']['TBL_Size'] = ($tblSizeFound) ? 'Warn' : 'Good';
        $info['Status']['Triggers'] = count($this->info->triggerList) > 0 ? 'Warn' : 'Good';

        $info['RawSize']    = $info['Size'];
        $info['Size']       = DUP_Util::byteSize($info['Size']) or "unknown";
        $info['Rows']       = number_format($info['Rows']) or "unknown";
        $info['TableList']  = $info['TableList'] or "unknown";
        $info['TableCount'] = $tblCount;

        $this->info->isTablesUpperCase = $tblCaseFound;
        $this->info->tablesBaseCount   = $tblBaseCount;
        $this->info->tablesFinalCount  = $tblCount;
        $this->info->tablesRowCount    = $info['Rows'];
        $this->info->tablesSizeOnDisk  = $info['Size'];

        return $info;
    }

    /**
     * @param array &$filteredTables Filtered names of tables to include in collation search.
     *        Parameter does not change in the function, is passed by reference only to avoid copying.
     *
     * @return void
     */
    public function setInfoObj(&$filteredTables)
    {
        global $wpdb;
 
        $this->info->buildMode          = DUP_DB::getBuildMode();
        $this->info->version            = DUP_DB::getVersion();
        $this->info->versionComment     = DUP_DB::getVariable('version_comment');
        $this->info->varLowerCaseTables = DUP_DB::getVariable('lower_case_table_names');
        $this->info->name               = $wpdb->dbname;
        $this->info->isNameUpperCase    = preg_match('/[A-Z]/', $wpdb->dbname) ? 1 : 0;
        $this->info->collationList      = DUP_DB::getTableCollationList($filteredTables);
    }

    /**
     * Unset tableWiseRowCounts table key for which row count is unstable
     *
     * @param object $package The reference to the current package being built     *
     * @return void
     */
    public function validateTableWiseRowCounts()
    {
        foreach ($this->Package->Database->info->tableWiseRowCounts as $rewriteTableAs => $rowCount) {
            $newRowCount = $GLOBALS['wpdb']->get_var("SELECT Count(*) FROM `{$rewriteTableAs}`");
            if ($rowCount != $newRowCount) {
                unset($this->Package->Database->info->tableWiseRowCounts[$rewriteTableAs]);
            }
        }
    }

    /**
     *  Build the database script using mysqldump
     *
     *  @return bool  Returns true if the sql script was successfully created
     */
    private function mysqlDump($exePath)
    {
        global $wpdb;
        require_once (DUPLICATOR_PLUGIN_PATH.'classes/utilities/class.u.shell.php');

        $host           = explode(':', DB_HOST);
        $host           = reset($host);
        $port           = strpos(DB_HOST, ':') ? end(explode(':', DB_HOST)) : '';
        $name           = DB_NAME;
        $mysqlcompat_on = isset($this->Compatible) && strlen($this->Compatible);

        //Build command
        $cmd = escapeshellarg($exePath);
        $cmd .= ' --no-create-db';
        $cmd .= ' --single-transaction';
        $cmd .= ' --hex-blob';
        $cmd .= ' --skip-add-drop-table';
        $cmd .= ' --routines';
        $cmd .= ' --quote-names';
        $cmd .= ' --skip-comments';
        $cmd .= ' --skip-set-charset';
        $cmd .= ' --skip-triggers';
        $cmd .= ' --allow-keywords';
        $cmd .= ' --no-tablespaces';

        //Compatibility mode
        if ($mysqlcompat_on) {
            DUP_Log::Info("COMPATIBLE: [{$this->Compatible}]");
            $cmd .= " --compatible={$this->Compatible}";
        }

        //Filter tables
        $res        = $wpdb->get_results('SHOW FULL TABLES', ARRAY_N);
        $tables     = array();
        $baseTables = array();
        foreach ($res as $row) {
            if (DUP_Util::isTableExists($row[0])) {
                $tables[] = $row[0];
                if ('BASE TABLE' == $row[1]) {
                    $baseTables[] = $row[0];
                }
            }
        }
        $filterTables = isset($this->FilterTables) ? explode(',', $this->FilterTables) : null;
        $tblAllCount  = count($tables);

        foreach ($tables as $table) {
            if (in_array($table, $baseTables)) {
                $row_count                                                            = $GLOBALS['wpdb']->get_var("SELECT Count(*) FROM `{$table}`");
                $rewrite_table_as                                                     = $this->rewriteTableNameAs($table);
                $this->Package->Database->info->tableWiseRowCounts[$rewrite_table_as] = $row_count;
            }
        }
        //$tblFilterOn  = ($this->FilterOn) ? 'ON' : 'OFF';

        if (is_array($filterTables) && $this->FilterOn) {
            foreach ($tables as $key => $val) {
                if (in_array($tables[$key], $filterTables)) {
                    $cmd .= " --ignore-table={$name}.{$tables[$key]} ";
                    unset($tables[$key]);
                }
            }
        }

        $cmd .= ' -u '.escapeshellarg(DB_USER);
        $cmd .= (DB_PASSWORD) ?
            ' -p'.DUP_Shell_U::escapeshellargWindowsSupport(DB_PASSWORD) : '';

        $cmd .= ' -h '.escapeshellarg($host);
        $cmd .= (!empty($port) && is_numeric($port) ) ?
            ' -P '.$port : '';

        $isPopenEnabled = DUP_Shell_U::isPopenEnabled();

        if (!$isPopenEnabled) {
            $cmd .= ' -r '.escapeshellarg($this->tempDbPath);
        }

        $cmd .= ' '.escapeshellarg(DB_NAME);
        $cmd .= ' 2>&1';

        if ($isPopenEnabled) {
            $needToRewrite = false;
            foreach ($tables as $tableName) {
                $rewriteTableAs = $this->rewriteTableNameAs($tableName);
                if ($tableName != $rewriteTableAs) {
                    $needToRewrite = true;
                    break;
                }
            }

            if ($needToRewrite) {
                $findReplaceTableNames = array(); // orignal table name => rewrite table name

                foreach ($tables as $tableName) {
                    $rewriteTableAs = $this->rewriteTableNameAs($tableName);
                    if ($tableName != $rewriteTableAs) {
                        $findReplaceTableNames[$tableName] = $rewriteTableAs;
                    }
                }
            }

            $firstLine = '';
            DUP_LOG::trace("Executing mysql dump command by popen: $cmd");
            $handle    = popen($cmd, "r");
            if ($handle) {
                $sql_header = "/* DUPLICATOR-LITE (MYSQL-DUMP BUILD MODE) MYSQL SCRIPT CREATED ON : ".@date("Y-m-d H:i:s")." */\n\n";
                file_put_contents($this->tempDbPath, $sql_header, FILE_APPEND);
                while (!feof($handle)) {
                    $line = fgets($handle); //get ony one line
                    if ($line) {
                        if (empty($firstLine)) {
                            $firstLine = $line;
                            if (false !== stripos($line, 'Using a password on the command line interface can be insecure'))
                                continue;
                        }

                        if ($needToRewrite) {
                            $replaceCount = 1;

                            if (preg_match('/CREATE TABLE `(.*?)`/', $line, $matches)) {
                                $tableName = $matches[1];
                                if (isset($findReplaceTableNames[$tableName])) {
                                    $rewriteTableAs = $findReplaceTableNames[$tableName];
                                    $line           = str_replace('CREATE TABLE `'.$tableName.'`', 'CREATE TABLE `'.$rewriteTableAs.'`', $line, $replaceCount);
                                }
                            } elseif (preg_match('/INSERT INTO `(.*?)`/', $line, $matches)) {
                                $tableName = $matches[1];
                                if (isset($findReplaceTableNames[$tableName])) {
                                    $rewriteTableAs = $findReplaceTableNames[$tableName];
                                    $line           = str_replace('INSERT INTO `'.$tableName.'`', 'INSERT INTO `'.$rewriteTableAs.'`', $line, $replaceCount);
                                }
                            } elseif (preg_match('/LOCK TABLES `(.*?)`/', $line, $matches)) {
                                $tableName = $matches[1];
                                if (isset($findReplaceTableNames[$tableName])) {
                                    $rewriteTableAs = $findReplaceTableNames[$tableName];
                                    $line           = str_replace('LOCK TABLES `'.$tableName.'`', 'LOCK TABLES `'.$rewriteTableAs.'`', $line, $replaceCount);
                                }
                            }
                        }

                        file_put_contents($this->tempDbPath, $line, FILE_APPEND);
                        $output = "Ran from {$exePath}";
                    }
                }
                $mysqlResult = pclose($handle);
            } else {
                $output = '';
            }

            // Password bug > 5.6 (@see http://bugs.mysql.com/bug.php?id=66546)
            if (empty($output) && trim($firstLine) === 'Warning: Using a password on the command line interface can be insecure.') {
                $output = '';
            }
        } else {
            DUP_LOG::trace("Executing mysql dump command $cmd");
            exec($cmd, $output, $mysqlResult);
            $output = implode("\n", $output);

            // Password bug > 5.6 (@see http://bugs.mysql.com/bug.php?id=66546)
            if (trim($output) === 'Warning: Using a password on the command line interface can be insecure.') {
                $output = '';
            }
            $output = (strlen($output)) ? $output : "Ran from {$exePath}";

            $tblCreateCount = count($tables);
            $tblFilterCount = $tblAllCount - $tblCreateCount;

            //DEBUG
            //DUP_Log::Info("COMMAND: {$cmd}");
            DUP_Log::Info("FILTERED: [{$this->FilterTables}]");
            DUP_Log::Info("RESPONSE: {$output}");
            DUP_Log::Info("TABLES: total:{$tblAllCount} | filtered:{$tblFilterCount} | create:{$tblCreateCount}");
        }

        $sql_footer = "\n\n/* Duplicator WordPress Timestamp: ".date("Y-m-d H:i:s")."*/\n";
        $sql_footer .= "/* ".DUPLICATOR_DB_EOF_MARKER." */\n";
        file_put_contents($this->tempDbPath, $sql_footer, FILE_APPEND);
        if ($mysqlResult !== 0) {
            /**
             * -1 error command shell 
             * mysqldump return 
             * 0 - Success
             * 1 - Warning
             * 2 - Exception
             */
            DUP_Log::Info('MYSQL DUMP ERROR '.print_r($mysqlResult, true));
            DUP_Log::error(__('Shell mysql dump error. Change SQL Mode to the "PHP Code" in the Duplicator > Settings > Packages.', 'duplicator'), implode("\n", DupLiteSnapLibIOU::getLastLinesOfFile($this->tempDbPath,
                DUPLICATOR_DB_MYSQLDUMP_ERROR_CONTAINING_LINE_COUNT, DUPLICATOR_DB_MYSQLDUMP_ERROR_CHARS_IN_LINE_COUNT)), Dup_ErrorBehavior::ThrowException);
            return false;
        }

        return true;
    }

    /**
     *  Build the database script using php
     *
     *  @return bool  Returns true if the sql script was successfully created
     */
    private function phpDump($package)
    {
        global $wpdb;

        $wpdb->query("SET session wait_timeout = ".DUPLICATOR_DB_MAX_TIME);
        if (($handle = fopen($this->tempDbPath, 'w+')) == false) {
            DUP_Log::error('[PHP DUMP] ERROR Can\'t open sbStorePath "'.$this->tempDbPath.'"', Dup_ErrorBehavior::ThrowException);
        }
        $tables = $wpdb->get_col("SHOW FULL TABLES WHERE Table_Type != 'VIEW'");

        $filterTables = isset($this->FilterTables) ? explode(',', $this->FilterTables) : null;
        $tblAllCount  = count($tables);
        //$tblFilterOn  = ($this->FilterOn) ? 'ON' : 'OFF';
        $qryLimit     = DUP_Settings::Get('package_phpdump_qrylimit');

        if (is_array($filterTables) && $this->FilterOn) {
            foreach ($tables as $key => $val) {
                if (in_array($tables[$key], $filterTables)) {
                    unset($tables[$key]);
                }
            }
        }
        $tblCreateCount = count($tables);
        $tblFilterCount = $tblAllCount - $tblCreateCount;

        DUP_Log::Info("TABLES: total:{$tblAllCount} | filtered:{$tblFilterCount} | create:{$tblCreateCount}");
        DUP_Log::Info("FILTERED: [{$this->FilterTables}]");

        //Added 'NO_AUTO_VALUE_ON_ZERO' at plugin version 1.2.12 to fix :
        //**ERROR** database error write 'Invalid default value for for older mysql versions
        $sql_header = "/* DUPLICATOR-LITE (PHP BUILD MODE) MYSQL SCRIPT CREATED ON : ".@date("Y-m-d H:i:s")." */\n\n";
        $sql_header .= "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n\n";
        $sql_header .= "SET FOREIGN_KEY_CHECKS = 0;\n\n";
        fwrite($handle, $sql_header);

        //BUILD CREATES:
        //All creates must be created before inserts do to foreign key constraints
        foreach ($tables as $table) {
            $rewrite_table_as   = $this->rewriteTableNameAs($table);
            $create             = $wpdb->get_row("SHOW CREATE TABLE `{$table}`", ARRAY_N);
            $count              = 1;
            $create_table_query = str_replace($table, $rewrite_table_as, $create[1], $count);
            @fwrite($handle, "{$create_table_query};\n\n");
        }

        $procedures = $wpdb->get_col("SHOW PROCEDURE STATUS WHERE `Db` = '{$wpdb->dbname}'", 1);
        if (count($procedures)) {
            foreach ($procedures as $procedure) {
                @fwrite($handle, "DELIMITER ;;\n");
                $create = $wpdb->get_row("SHOW CREATE PROCEDURE `{$procedure}`", ARRAY_N);
                @fwrite($handle, "{$create[2]} ;;\n");
                @fwrite($handle, "DELIMITER ;\n\n");
            }
        }

        $functions = $wpdb->get_col("SHOW FUNCTION STATUS WHERE `Db` = '{$wpdb->dbname}'", 1);
        if (count($functions)) {
            foreach ($functions as $function) {
                @fwrite($handle, "DELIMITER ;;\n");
                $create = $wpdb->get_row("SHOW CREATE FUNCTION `{$function}`", ARRAY_N);
                @fwrite($handle, "{$create[2]} ;;\n");
                @fwrite($handle, "DELIMITER ;\n\n");
            }
        }

        $views = $wpdb->get_col("SHOW FULL TABLES WHERE Table_Type = 'VIEW'");
        if (count($views)) {
            foreach ($views as $view) {
                $create = $wpdb->get_row("SHOW CREATE VIEW `{$view}`", ARRAY_N);
                @fwrite($handle, "{$create[1]};\n\n");
            }
        }

        $table_count  = count($tables);
        $table_number = 0;

        //BUILD INSERTS:
        //Create Insert in 100 row increments to better handle memory
        foreach ($tables as $table) {

            $table_number++;
            if ($table_number % 2 == 0) {
                $this->Package->Status = DupLiteSnapLibUtil::getWorkPercent(DUP_PackageStatus::DBSTART, DUP_PackageStatus::DBDONE, $table_count, $table_number);
                $this->Package->update();
            }

            $row_count        = $wpdb->get_var("SELECT Count(*) FROM `{$table}`");
            $rewrite_table_as = $this->rewriteTableNameAs($table);

            $this->Package->Database->info->tableWiseRowCounts[$rewrite_table_as] = $row_count;

            if ($row_count > $qryLimit) {
                $row_count = ceil($row_count / $qryLimit);
            } else if ($row_count > 0) {
                $row_count = 1;
            }

            if ($row_count >= 1) {
                fwrite($handle, "\n/* INSERT TABLE DATA: {$table} */\n");
            }

            for ($i = 0; $i < $row_count; $i++) {
                $sql   = "";
                $limit = $i * $qryLimit;
                $query = "SELECT * FROM `{$table}` LIMIT {$limit}, {$qryLimit}";
                $rows  = $wpdb->get_results($query, ARRAY_A);

                $select_last_error = $wpdb->last_error;
                if ('' !== $select_last_error) {
                    $fix                            = esc_html__('Please contact your DataBase administrator to fix the error.', 'duplicator');
                    $errorMessage                   = $select_last_error.' '.$fix.'.';
                    $package->BuildProgress->set_failed($errorMessage);
                    $package->BuildProgress->failed = true;
                    $package->failed                = true;
                    $package->Status                = DUP_PackageStatus::ERROR;
                    $package->Update();
                    DUP_Log::error($select_last_error, $fix, Dup_ErrorBehavior::ThrowException);
                    return;
                }

                if (is_array($rows)) {
                    foreach ($rows as $row) {
                        $sql         .= "INSERT INTO `{$rewrite_table_as}` VALUES(";
                        $num_values  = count($row);
                        $num_counter = 1;
                        foreach ($row as $value) {
                            if (is_null($value) || !isset($value)) {
                                ($num_values == $num_counter) ? $sql .= 'NULL' : $sql .= 'NULL, ';
                            } else {
                                ($num_values == $num_counter) ? $sql .= '"'.DUP_DB::escSQL($value, true).'"' : $sql .= '"'.DUP_DB::escSQL($value, true).'", ';
                            }
                            $num_counter++;
                        }
                        $sql .= ");\n";
                    }
                    fwrite($handle, $sql);
                }
            }

            //Flush buffer if enabled
            if ($this->networkFlush) {
                DUP_Util::fcgiFlush();
            }
            $sql  = null;
            $rows = null;
        }

        $sql_footer = "\nSET FOREIGN_KEY_CHECKS = 1; \n\n";
        $sql_footer .= "/* Duplicator WordPress Timestamp: ".date("Y-m-d H:i:s")."*/\n";
        $sql_footer .= "/* ".DUPLICATOR_DB_EOF_MARKER." */\n";
        fwrite($handle, $sql_footer);
        $wpdb->flush();
        fclose($handle);
    }

    private function rewriteTableNameAs($table)
    {
        $table_prefix = $this->getTablePrefix();
        if (!isset($this->sameNameTableExists)) {
            global $wpdb;
            $this->sameNameTableExists = false;
            $all_tables                = $wpdb->get_col("SHOW FULL TABLES WHERE Table_Type != 'VIEW'");
            foreach ($all_tables as $table_name) {
                if (strtolower($table_name) != $table_name && in_array(strtolower($table_name), $all_tables)) {
                    $this->sameNameTableExists = true;
                    break;
                }
            }
        }
        if (false === $this->sameNameTableExists && 0 === stripos($table, $table_prefix) && 0 !== strpos($table, $table_prefix)) {
            $post_fix           = substr($table, strlen($table_prefix));
            $rewrite_table_name = $table_prefix.$post_fix;
        } else {
            $rewrite_table_name = $table;
        }
        return $rewrite_table_name;
    }

    private function getTablePrefix()
    {
        global $wpdb;
        $table_prefix = (is_multisite() && !defined('MULTISITE')) ? $wpdb->base_prefix : $wpdb->get_blog_prefix(0);
        return $table_prefix;
    }

    public function getUrl()
    {
        return DUP_Settings::getSsdirUrl()."/".$this->File;
    }
}classes/package/class.pack.installer.php000064400000051353151336065400014335 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
/* @var $global DUP_Global_Entity */

require_once(DUPLICATOR_PLUGIN_PATH.'/classes/class.archive.config.php');
require_once(DUPLICATOR_PLUGIN_PATH.'/classes/utilities/class.u.zip.php');
require_once(DUPLICATOR_PLUGIN_PATH.'/classes/utilities/class.u.multisite.php');
require_once(DUPLICATOR_PLUGIN_PATH.'/classes/class.password.php');

class DUP_Installer
{

	const DEFAULT_INSTALLER_FILE_NAME_WITHOUT_HASH = 'installer.php';

	//PUBLIC
	public $File;
	public $Size			 = 0;
	public $OptsDBHost;
	public $OptsDBPort;
	public $OptsDBName;
	public $OptsDBUser;
	public $OptsDBCharset;
	public $OptsDBCollation;
	public $OptsSecureOn	 = 0;
	public $OptsSecurePass;
	public $numFilesAdded	 = 0;
	public $numDirsAdded	 = 0;
	//PROTECTED
	protected $Package;

	/**
	 *  Init this object
	 */
	function __construct($package)
	{
		$this->Package = $package;
	}

	public function build($package, $error_behavior = Dup_ErrorBehavior::Quit)
	{
		DUP_Log::Info("building installer");

		$this->Package	 = $package;
		$success		 = false;

		if ($this->create_enhanced_installer_files()) {
			$success = $this->add_extra_files($package);
		} else {
			DUP_Log::Info("error creating enhanced installer files");
		}


		if ($success) {
			// No longer need to store wp-config.txt file in main storage area
			$temp_conf_ark_file_path = $this->getTempWPConfArkFilePath();
			@unlink($temp_conf_ark_file_path);

			$package->BuildProgress->installer_built = true;
		} else {
			$error_message	 = 'Error adding installer';
			$package->BuildProgress->set_failed($error_message);
			$package->Status = DUP_PackageStatus::ERROR;
			$package->Update();

			DUP_Log::error($error_message, "Marking build progress as failed because couldn't add installer files", $error_behavior);
			//$package->BuildProgress->failed = true;
			//$package->setStatus(DUP_PackageStatus::ERROR);
		}

		return $success;
	}

	private function create_enhanced_installer_files()
	{
		$success = false;
		if ($this->create_enhanced_installer()) {
			$success = $this->create_archive_config_file();
		}
		return $success;
	}

	private function create_enhanced_installer()
	{
		$success				 = true;
		$archive_filepath		 = DUP_Settings::getSsdirTmpPath()."/{$this->Package->Archive->File}";
		$installer_filepath		 = apply_filters('duplicator_installer_file_path', DUP_Settings::getSsdirTmpPath()."/{$this->Package->NameHash}_installer.php");
		$template_filepath		 = DUPLICATOR_PLUGIN_PATH.'/installer/installer.tpl';
		$mini_expander_filepath	 = DUPLICATOR_PLUGIN_PATH.'/lib/dup_archive/classes/class.duparchive.mini.expander.php';

		// Replace the @@ARCHIVE@@ token
		$installer_contents = file_get_contents($template_filepath);

		if (DUP_Settings::Get('archive_build_mode') == DUP_Archive_Build_Mode::DupArchive) {
			$mini_expander_string = file_get_contents($mini_expander_filepath);

			if ($mini_expander_string === false) {
				DUP_Log::error(DUP_U::__('Error reading DupArchive mini expander'), DUP_U::__('Error reading DupArchive mini expander'), Dup_ErrorBehavior::LogOnly);
				return false;
			}
		} else {
			$mini_expander_string = '';
		}

		$search_array			 = array('@@ARCHIVE@@', '@@VERSION@@', '@@ARCHIVE_SIZE@@', '@@PACKAGE_HASH@@', '@@SECONDARY_PACKAGE_HASH@@', '@@DUPARCHIVE_MINI_EXPANDER@@');
		$package_hash			 = $this->Package->getPackageHash();
		$secondary_package_hash	 = $this->Package->getSecondaryPackageHash();
		$replace_array			 = array($this->Package->Archive->File, DUPLICATOR_VERSION, @filesize($archive_filepath), $package_hash, $secondary_package_hash, $mini_expander_string);
		$installer_contents		 = str_replace($search_array, $replace_array, $installer_contents);

		if (@file_put_contents($installer_filepath, $installer_contents) === false) {
			DUP_Log::error(esc_html__('Error writing installer contents', 'duplicator'), esc_html__("Couldn't write to $installer_filepath", 'duplicator'));
			$success = false;
		}

		if ($success) {
			$storePath	 = DUP_Settings::getSsdirTmpPath()."/{$this->File}";
			$this->Size	 = @filesize($storePath);
		}

		return $success;
	}

	/**
	 * Create archive.txt file */
	private function create_archive_config_file()
	{
		global $wpdb;

		$success				 = true;
		$archive_config_filepath = DUP_Settings::getSsdirTmpPath()."/{$this->Package->NameHash}_archive.txt";
		$ac						 = new DUP_Archive_Config();
		$extension				 = strtolower($this->Package->Archive->Format);

		$hasher		 = new DUP_PasswordHash(8, FALSE);
		$pass_hash	 = $hasher->HashPassword($this->Package->Installer->OptsSecurePass);

		$this->Package->Database->getScannerData();

		//READ-ONLY: COMPARE VALUES
		$ac->created	 = $this->Package->Created;
		$ac->version_dup = DUPLICATOR_VERSION;
		$ac->version_wp	 = $this->Package->VersionWP;
		$ac->version_db	 = $this->Package->VersionDB;
		$ac->version_php = $this->Package->VersionPHP;
		$ac->version_os	 = $this->Package->VersionOS;
		$ac->dup_type 	 = 'lite';
		$ac->dbInfo		 = $this->Package->Database->info;

		//READ-ONLY: GENERAL
		// $ac->installer_base_name  = $global->installer_base_name;
		$ac->installer_base_name = 'installer.php';
		$ac->installer_backup_name = $this->Package->NameHash.'_installer-backup.php';
		$ac->package_name		 = "{$this->Package->NameHash}_archive.{$extension}";
		$ac->package_hash		 = $this->Package->getPackageHash();
		$ac->package_notes		 = $this->Package->Notes;
		$ac->url_old			 = get_option('siteurl');
		$ac->opts_delete		 = DupLiteSnapJsonU::wp_json_encode_pprint($GLOBALS['DUPLICATOR_OPTS_DELETE']);
		$ac->blogname			 = esc_html(get_option('blogname'));

		$abs_path					 = duplicator_get_abs_path();
		$ac->wproot					 = $abs_path;
		$ac->relative_content_dir	 = str_replace($abs_path, '', WP_CONTENT_DIR);
		$ac->exportOnlyDB			 = $this->Package->Archive->ExportOnlyDB;
		$ac->installSiteOverwriteOn	 = DUPLICATOR_INSTALL_SITE_OVERWRITE_ON;
		$ac->wplogin_url			 = wp_login_url();

		//PRE-FILLED: GENERAL
		$ac->secure_on		 = $this->Package->Installer->OptsSecureOn;
		$ac->secure_pass	 = $pass_hash;
		$ac->skipscan		 = false;
		$ac->dbhost			 = $this->Package->Installer->OptsDBHost;
		$ac->dbname			 = $this->Package->Installer->OptsDBName;
		$ac->dbuser			 = $this->Package->Installer->OptsDBUser;
		$ac->dbpass			 = '';
		$ac->dbcharset		 = $this->Package->Installer->OptsDBCharset;
		$ac->dbcollation     = $this->Package->Installer->OptsDBCollation;

		$ac->wp_tableprefix	 = $wpdb->base_prefix;

		$ac->mu_mode						 = DUP_MU::getMode();
		$ac->is_outer_root_wp_config_file	 = (!file_exists($abs_path.'/wp-config.php')) ? true : false;
		$ac->is_outer_root_wp_content_dir	 = $this->Package->Archive->isOuterWPContentDir();

		$json = DupLiteSnapJsonU::wp_json_encode_pprint($ac);
		DUP_Log::TraceObject('json', $json);

		if (file_put_contents($archive_config_filepath, $json) === false) {
			DUP_Log::error("Error writing archive config", "Couldn't write archive config at $archive_config_filepath", Dup_ErrorBehavior::LogOnly);
			$success = false;
		}

		return $success;
	}

	/**
	 *  Puts an installer zip file in the archive for backup purposes.
	 */
	private function add_extra_files($package)
	{
		$success				 = false;
		$installer_filepath		 = apply_filters('duplicator_installer_file_path', DUP_Settings::getSsdirTmpPath()."/{$this->Package->NameHash}_installer.php");
		$scan_filepath			 = DUP_Settings::getSsdirTmpPath()."/{$this->Package->NameHash}_scan.json";
		$sql_filepath			 = DUP_Settings::getSsdirTmpPath()."/{$this->Package->Database->File}";
		$archive_filepath		 = DUP_Settings::getSsdirTmpPath()."/{$this->Package->Archive->File}";
		$archive_config_filepath = DUP_Settings::getSsdirTmpPath()."/{$this->Package->NameHash}_archive.txt";

		DUP_Log::Info("add_extra_files1");

		if (file_exists($installer_filepath) == false) {
			DUP_Log::error("Installer $installer_filepath not present", '', Dup_ErrorBehavior::LogOnly);
			return false;
		}

		DUP_Log::Info("add_extra_files2");
		if (file_exists($sql_filepath) == false) {
			DUP_Log::error("Database SQL file $sql_filepath not present", '', Dup_ErrorBehavior::LogOnly);
			return false;
		}

		DUP_Log::Info("add_extra_files3");
		if (file_exists($archive_config_filepath) == false) {
			DUP_Log::error("Archive configuration file $archive_config_filepath not present", '', Dup_ErrorBehavior::LogOnly);
			return false;
		}

		DUP_Log::Info("add_extra_files4");
		if ($package->Archive->file_count != 2) {
			DUP_Log::Info("Doing archive file check");
			// Only way it's 2 is if the root was part of the filter in which case the archive won't be there
			DUP_Log::Info("add_extra_files5");
			if (file_exists($archive_filepath) == false) {

				DUP_Log::error("$error_text. **RECOMMENDATION: $fix_text", '', Dup_ErrorBehavior::LogOnly);

				return false;
			}
			DUP_Log::Info("add_extra_files6");
		}

		$wpconfig_filepath = $package->Archive->getWPConfigFilePath();

		if ($package->Archive->Format == 'DAF') {
			DUP_Log::Info("add_extra_files7");
			$success = $this->add_extra_files_using_duparchive($installer_filepath, $scan_filepath, $sql_filepath, $archive_filepath, $archive_config_filepath, $wpconfig_filepath);
		} else {
			DUP_Log::Info("add_extra_files8");
			$success = $this->add_extra_files_using_ziparchive($installer_filepath, $scan_filepath, $sql_filepath, $archive_filepath, $archive_config_filepath, $wpconfig_filepath);
		}

		// No sense keeping the archive config around
		@unlink($archive_config_filepath);
		$package->Archive->Size = @filesize($archive_filepath);

		return $success;
	}

	private function add_extra_files_using_duparchive($installer_filepath, $scan_filepath, $sql_filepath, $archive_filepath, $archive_config_filepath, $wpconfig_filepath)
	{
		$success = false;

		try {
			DUP_Log::Info("add_extra_files_using_da1");
			$htaccess_filepath	 = $this->getHtaccessFilePath();
			$webconf_filepath	 = duplicator_get_abs_path().'/web.config';

			$logger = new DUP_DupArchive_Logger();

			DupArchiveEngine::init($logger, 'DUP_Log::profile');

			$embedded_scan_ark_file_path = $this->getEmbeddedScanFilePath();
			DupArchiveEngine::addRelativeFileToArchiveST($archive_filepath, $scan_filepath, $embedded_scan_ark_file_path);
			$this->numFilesAdded++;

			if (file_exists($htaccess_filepath)) {
				$htaccess_ark_file_path = $this->getHtaccessArkFilePath();
				try {
					DupArchiveEngine::addRelativeFileToArchiveST($archive_filepath, $htaccess_filepath, $htaccess_ark_file_path);
					$this->numFilesAdded++;
				}
				catch (Exception $ex) {
					// Non critical so bury exception
				}
			}

			if (file_exists($webconf_filepath)) {
				try {
					DupArchiveEngine::addRelativeFileToArchiveST($archive_filepath, $webconf_filepath, DUPLICATOR_WEBCONFIG_ORIG_FILENAME);
					$this->numFilesAdded++;
				}
				catch (Exception $ex) {
					// Non critical so bury exception
				}
			}

			if (file_exists($wpconfig_filepath)) {
				$conf_ark_file_path		 = $this->getWPConfArkFilePath();
				$temp_conf_ark_file_path = $this->getTempWPConfArkFilePath();
				if (copy($wpconfig_filepath, $temp_conf_ark_file_path)) {
					$this->cleanTempWPConfArkFilePath($temp_conf_ark_file_path);
					DupArchiveEngine::addRelativeFileToArchiveST($archive_filepath, $temp_conf_ark_file_path, $conf_ark_file_path);
				} else {
					DupArchiveEngine::addRelativeFileToArchiveST($archive_filepath, $wpconfig_filepath, $conf_ark_file_path);
				}
				$this->numFilesAdded++;
			}

			$this->add_installer_files_using_duparchive($archive_filepath, $installer_filepath, $archive_config_filepath);

			$success = true;
		}
		catch (Exception $ex) {
			DUP_Log::error("Error adding installer files to archive. ", $ex->getMessage(), Dup_ErrorBehavior::ThrowException);
		}

		return $success;
	}

	private function add_installer_files_using_duparchive($archive_filepath, $installer_filepath, $archive_config_filepath)
	{
		$installer_backup_filename = $this->Package->NameHash.'_installer-backup.php';
		

		DUP_Log::Info('Adding enhanced installer files to archive using DupArchive');
		DupArchiveEngine::addRelativeFileToArchiveST($archive_filepath, $installer_filepath, $installer_backup_filename);

		$this->numFilesAdded++;

		$base_installer_directory	 = DUPLICATOR_PLUGIN_PATH.'installer';
		$installer_directory		 = "$base_installer_directory/dup-installer";

		$counts				 = DupArchiveEngine::addDirectoryToArchiveST($archive_filepath, $installer_directory, $base_installer_directory, true);
		$this->numFilesAdded += $counts->numFilesAdded;
		$this->numDirsAdded	 += $counts->numDirsAdded;

		$archive_config_relative_path = $this->getArchiveTxtFilePath();

		DupArchiveEngine::addRelativeFileToArchiveST($archive_filepath, $archive_config_filepath, $archive_config_relative_path);
		$this->numFilesAdded++;

		// Include dup archive
		$duparchive_lib_directory	 = DUPLICATOR_PLUGIN_PATH.'lib/dup_archive';
		$duparchive_lib_counts		 = DupArchiveEngine::addDirectoryToArchiveST($archive_filepath, $duparchive_lib_directory, DUPLICATOR_PLUGIN_PATH, true, 'dup-installer/');
		$this->numFilesAdded		 += $duparchive_lib_counts->numFilesAdded;
		$this->numDirsAdded			 += $duparchive_lib_counts->numDirsAdded;

		// Include snaplib
		$snaplib_directory	 = DUPLICATOR_PLUGIN_PATH.'lib/snaplib';
		$snaplib_counts		 = DupArchiveEngine::addDirectoryToArchiveST($archive_filepath, $snaplib_directory, DUPLICATOR_PLUGIN_PATH, true, 'dup-installer/');
		$this->numFilesAdded += $snaplib_counts->numFilesAdded;
		$this->numDirsAdded	 += $snaplib_counts->numDirsAdded;

		// Include fileops
		$fileops_directory	 = DUPLICATOR_PLUGIN_PATH.'lib/fileops';
		$fileops_counts		 = DupArchiveEngine::addDirectoryToArchiveST($archive_filepath, $fileops_directory, DUPLICATOR_PLUGIN_PATH, true, 'dup-installer/');
		$this->numFilesAdded += $fileops_counts->numFilesAdded;
		$this->numDirsAdded	 += $fileops_counts->numDirsAdded;

		// Include config
		$config_directory	 = DUPLICATOR_PLUGIN_PATH.'lib/config';
		$config_counts		 = DupArchiveEngine::addDirectoryToArchiveST($archive_filepath, $config_directory, DUPLICATOR_PLUGIN_PATH, true, 'dup-installer/');
		$this->numFilesAdded += $config_counts->numFilesAdded;
		$this->numDirsAdded	 += $fileops_counts->numDirsAdded;
	}

	private function add_extra_files_using_ziparchive($installer_filepath, $scan_filepath, $sql_filepath, $zip_filepath, $archive_config_filepath, $wpconfig_filepath)
	{
		$htaccess_filepath	 = $this->getHtaccessFilePath();
		$webconfig_filepath	 = duplicator_get_abs_path().'/web.config';

		$success	 = false;
		$zipArchive	 = new ZipArchive();

		if ($zipArchive->open($zip_filepath, ZIPARCHIVE::CREATE) === TRUE) {
			DUP_Log::Info("Successfully opened zip $zip_filepath");

			if (file_exists($htaccess_filepath)) {
				$htaccess_ark_file_path = $this->getHtaccessArkFilePath();
				DUP_Zip_U::addFileToZipArchive($zipArchive, $htaccess_filepath, $htaccess_ark_file_path, true);
			}

			if (file_exists($webconfig_filepath)) {
				DUP_Zip_U::addFileToZipArchive($zipArchive, $webconfig_filepath, DUPLICATOR_WEBCONFIG_ORIG_FILENAME, true);
			}

			if (!empty($wpconfig_filepath)) {
				$conf_ark_file_path		 = $this->getWPConfArkFilePath();
				$temp_conf_ark_file_path = $this->getTempWPConfArkFilePath();
				if (copy($wpconfig_filepath, $temp_conf_ark_file_path)) {
					$this->cleanTempWPConfArkFilePath($temp_conf_ark_file_path);
					DUP_Zip_U::addFileToZipArchive($zipArchive, $temp_conf_ark_file_path, $conf_ark_file_path, true);
				} else {
					DUP_Zip_U::addFileToZipArchive($zipArchive, $wpconfig_filepath, $conf_ark_file_path, true);
				}
			}

			$embedded_scan_file_path = $this->getEmbeddedScanFilePath();
			if (DUP_Zip_U::addFileToZipArchive($zipArchive, $scan_filepath, $embedded_scan_file_path, true)) {
				if ($this->add_installer_files_using_zip_archive($zipArchive, $installer_filepath, $archive_config_filepath, true)) {
					DUP_Log::info("Installer files added to archive");
					DUP_Log::info("Added to archive");

					$success = true;
				} else {
					DUP_Log::error("Unable to add enhanced enhanced installer files to archive.", '', Dup_ErrorBehavior::LogOnly);
				}
			} else {
				DUP_Log::error("Unable to add scan file to archive.", '', Dup_ErrorBehavior::LogOnly);
			}

			if ($zipArchive->close() === false) {
				DUP_Log::error("Couldn't close archive when adding extra files.", '');
				$success = false;
			}

			DUP_Log::Info('After ziparchive close when adding installer');
		}

		return $success;
	}

	// Add installer directory to the archive and the archive.cfg
	private function add_installer_files_using_zip_archive(&$zip_archive, $installer_filepath, $archive_config_filepath, $is_compressed)
	{
		$success = false;
		$installer_backup_filename = $this->Package->NameHash.'_installer-backup.php';

		DUP_Log::Info('Adding enhanced installer files to archive using ZipArchive');

		if (DUP_Zip_U::addFileToZipArchive($zip_archive, $installer_filepath, $installer_backup_filename, true)) {
			DUPLICATOR_PLUGIN_PATH.'installer/';
			$installer_directory = DUPLICATOR_PLUGIN_PATH.'installer/dup-installer';

			if (DUP_Zip_U::addDirWithZipArchive($zip_archive, $installer_directory, true, '', $is_compressed)) {
				$archive_config_local_name = $this->getArchiveTxtFilePath();

				if (DUP_Zip_U::addFileToZipArchive($zip_archive, $archive_config_filepath, $archive_config_local_name, true)) {

					$snaplib_directory	 = DUPLICATOR_PLUGIN_PATH.'lib/snaplib';
					$config_directory	 = DUPLICATOR_PLUGIN_PATH.'lib/config';

					if (DUP_Zip_U::addDirWithZipArchive($zip_archive, $snaplib_directory, true, 'dup-installer/lib/', $is_compressed) &&
						DUP_Zip_U::addDirWithZipArchive($zip_archive, $config_directory, true, 'dup-installer/lib/', $is_compressed)
					) {
						$success = true;
					} else {
						DUP_Log::error("Error adding directory {$snaplib_directory} and {$config_directory} to zipArchive", '', Dup_ErrorBehavior::LogOnly);
					}
				} else {
					DUP_Log::error("Error adding $archive_config_filepath to zipArchive", '', Dup_ErrorBehavior::LogOnly);
				}
			} else {
				DUP_Log::error("Error adding directory $installer_directory to zipArchive", '', Dup_ErrorBehavior::LogOnly);
			}
		} else {
			DUP_Log::error("Error adding backup installer file to zipArchive", '', Dup_ErrorBehavior::LogOnly);
		}

		return $success;
	}

	/**
	 * Get .htaccess file path
	 * 
	 * @return string
	 */
	private function getHtaccessFilePath()
	{
		return duplicator_get_abs_path().'/.htaccess';
	}

	/**
	 * Get .htaccss in archive file
	 * 
	 * @return string
	 */
	private function getHtaccessArkFilePath()
	{
		$packageHash		 = $this->Package->getPackageHash();
		$htaccessArkFilePath = '.htaccess__'.$packageHash;
		return $htaccessArkFilePath;
	}

	/**
	 * Get wp-config.php file path along with name in archive file
	 */
	private function getWPConfArkFilePath()
	{
		if (DUPLICATOR_INSTALL_SITE_OVERWRITE_ON) {
			$package_hash		 = $this->Package->getPackageHash();
			$conf_ark_file_path	 = 'dup-wp-config-arc__'.$package_hash.'.txt';
		} else {
			$conf_ark_file_path = 'wp-config.php';
		}
		return $conf_ark_file_path;
	}

	/**
	 * Get temp wp-config.php file path along with name in temp folder
	 */
	private function getTempWPConfArkFilePath()
	{
		$temp_conf_ark_file_path = DUP_Settings::getSsdirTmpPath().'/'.$this->Package->NameHash.'_wp-config.txt';
		return $temp_conf_ark_file_path;
	}

	/**
	 * Clear out sensitive database connection information
	 *
	 * @param $temp_conf_ark_file_path Temp config file path
	 */
	private static function cleanTempWPConfArkFilePath($temp_conf_ark_file_path)
	{
		if (function_exists('token_get_all')) {
			require_once(DUPLICATOR_PLUGIN_PATH.'lib/config/class.wp.config.tranformer.php');
			$transformer = new DupLiteWPConfigTransformer($temp_conf_ark_file_path);
			$constants	 = array('DB_NAME', 'DB_USER', 'DB_PASSWORD', 'DB_HOST');
			foreach ($constants as $constant) {
				if ($transformer->exists('constant', $constant)) {
					$transformer->update('constant', $constant, '');
				}
			}
		}
	}

	/**
	 * Get scan.json file path along with name in archive file
	 */
	private function getEmbeddedScanFilePath()
	{
		$package_hash				 = $this->Package->getPackageHash();
		$embedded_scan_ark_file_path = 'dup-installer/dup-scan__'.$package_hash.'.json';
		return $embedded_scan_ark_file_path;
	}

	/**
	 * Get archive.txt file path along with name in archive file
	 */
	private function getArchiveTxtFilePath()
	{
		$package_hash			 = $this->Package->getPackageHash();
		$archive_txt_file_path	 = 'dup-installer/dup-archive__'.$package_hash.'.txt';
		return $archive_txt_file_path;
	}
}
classes/package/duparchive/class.pack.archive.duparchive.state.create.php000064400000005327151336065400022625 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once (DUPLICATOR_PLUGIN_PATH.'lib/dup_archive/classes/states/class.duparchive.state.create.php');
require_once (DUPLICATOR_PLUGIN_PATH.'lib/dup_archive/classes/class.duparchive.processing.failure.php');

class DUP_DupArchive_Create_State extends DupArchiveCreateState
{
    /* @var $package DUP_Package */
  //  private $package;

//    public function setPackage(&$package)
     public function setPackage(&$package)
    {
  //      $this->package = &$package;
    }

    // Only one active package so straightforward
   // public static function createFromPackage(&$package)
    public static function get_instance()
    {
        $instance = new DUP_DupArchive_Create_State();

        $data = DUP_Settings::Get('duparchive_create_state');
        
        DUP_Util::objectCopy($data, $instance);
       
        $instance->startTimestamp = time();

        DUP_Log::TraceObject("retrieving create state", $instance);
        
        return $instance;
    }

    public static function createNew($archivePath, $basePath, $timeSliceInSecs, $isCompressed, $setArchiveOffsetToEndOfArchive)
    {
        $instance = new DUP_DupArchive_Create_State();

        if ($setArchiveOffsetToEndOfArchive) {
            $instance->archiveOffset = filesize($archivePath);
        } else {
            $instance->archiveOffset = 0;
        }

        $instance->archivePath           = $archivePath;
        $instance->basePath              = $basePath;
        $instance->currentDirectoryIndex = 0;
        $instance->currentFileOffset     = 0;
        $instance->currentFileIndex      = 0;
        $instance->failures              = array();
        $instance->globSize              = DupArchiveCreateState::DEFAULT_GLOB_SIZE;
        $instance->isCompressed          = $isCompressed;
        $instance->timeSliceInSecs       = $timeSliceInSecs;
        $instance->working               = true;
        $instance->skippedDirectoryCount = 0;
        $instance->skippedFileCount      = 0;

        $instance->startTimestamp = time();

        return $instance;
    }

    public function addFailure($type, $subject, $description, $isCritical = false)
    {
        parent::addFailure($type, $subject, $description, $isCritical);
    }

    public function save()
    {              
        DUP_Log::TraceObject("Saving create state", $this);
        DUP_Settings::Set('duparchive_create_state', $this);
        
        DUP_Settings::Save();
    }
}
classes/package/duparchive/class.pack.archive.duparchive.php000064400000040157151336065400020244 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/duparchive/class.pack.archive.duparchive.state.expand.php');
require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/duparchive/class.pack.archive.duparchive.state.create.php');
require_once (DUPLICATOR_PLUGIN_PATH.'lib/dup_archive/classes/class.duparchive.loggerbase.php');
require_once (DUPLICATOR_PLUGIN_PATH.'lib/dup_archive/classes/class.duparchive.engine.php');
require_once (DUPLICATOR_PLUGIN_PATH.'lib/dup_archive/classes/states/class.duparchive.state.create.php');
require_once (DUPLICATOR_PLUGIN_PATH.'lib/dup_archive/classes/states/class.duparchive.state.expand.php');
require_once (DUPLICATOR_PLUGIN_PATH.'lib/dup_archive/classes/class.duparchive.processing.failure.php');

class DUP_DupArchive_Logger extends DupArchiveLoggerBase
{

    public function log($s, $flush = false, $callingFunctionOverride = null)
    {
        DUP_Log::Trace($s, true, $callingFunctionOverride);
    }
}

class DUP_DupArchive
{

    // Using a worker time override since evidence shorter time works much
    const WorkerTimeInSec = 10;

    /**
     *  CREATE
     *  Creates the zip file and adds the SQL file to the archive
     */
    public static function create($archive, $buildProgress, $package)
    {
        /* @var $buildProgress DUP_Build_Progress */

        DUP_LOG::trace("start");
        try {
            DUP_Log::Open($package->NameHash);

            if ($buildProgress->retries > DUPLICATOR_MAX_BUILD_RETRIES) {
                $error_msg = __('Package build appears stuck so marking package as failed. Is the Max Worker Time set too high?.', 'duplicator');
                DUP_Log::error(esc_html__('Build Failure', 'duplicator'), esc_html($error_msg), Dup_ErrorBehavior::LogOnly);
                //$buildProgress->failed = true;
                $buildProgress->set_failed($error_msg);
                $package->setStatus(DUP_PackageStatus::ERROR);
                ;
                return true;
            } else {
                // If all goes well retries will be reset to 0 at the end of this function.
                $buildProgress->retries++;
                $package->update();
            }

            $done = false;

            DupArchiveEngine::init(new DUP_DupArchive_Logger(), null, $archive);
            DUP_Package::safeTmpCleanup(true);

            $compressDir  = rtrim(DUP_Util::safePath($archive->PackDir), '/');
            $sqlPath      = DUP_Settings::getSsdirTmpPath()."/{$package->Database->File}";
            $archivePath  = DUP_Settings::getSsdirTmpPath()."/{$archive->File}";
            $scanFilepath = DUP_Settings::getSsdirTmpPath()."/{$package->NameHash}_scan.json";
            $skipArchiveFinalization = false;
            $json                    = '';

            if (file_exists($scanFilepath)) {

                $json = file_get_contents($scanFilepath);

                if (empty($json)) {
                    $errorText = __("Scan file $scanFilepath is empty!", 'duplicator');
                    $fixText   = __("Click on \"Resolve This\" button to fix the JSON settings.", 'duplicator');

                    DUP_Log::Trace($errorText);
                    DUP_Log::error(esc_html($errorText)." **RECOMMENDATION:  ".esc_html($fixText).".", '', Dup_ErrorBehavior::LogOnly);

                    //$buildProgress->failed = true;
                    $buildProgress->set_failed($errorText);
                    $package->setStatus(DUP_PackageStatus::ERROR);
                    return true;
                }
            } else {
                DUP_Log::trace("**** scan file $scanFilepath doesn't exist!!");
                $errorMessage = sprintf(__("ERROR: Can't find Scanfile %s. Please ensure there no non-English characters in the package or schedule name.", 'duplicator'), $scanFilepath);

                DUP_Log::error($errorMessage, '', Dup_ErrorBehavior::LogOnly);

                //$buildProgress->failed = true;
                $buildProgress->set_failed($errorMessage);
                $package->setStatus(DUP_PackageStatus::ERROR);
                return true;
            }

            Dup_Log::TraceObject("buildprogress object", $buildProgress, false);

            $scanReport = json_decode($json);

            if ($buildProgress->archive_started == false) {

                $filterDirs        = empty($archive->FilterDirs) ? 'not set' : $archive->FilterDirs;
                $filterExts        = empty($archive->FilterExts) ? 'not set' : $archive->FilterExts;
                $filterFiles       = empty($archive->FilterFiles) ? 'not set' : $archive->FilterFiles;
                $filterOn          = ($archive->FilterOn) ? 'ON' : 'OFF';
                $filterDirsFormat  = rtrim(str_replace(';', "\n\t", $filterDirs));
                $filterFilesFormat = rtrim(str_replace(';', "\n\t", $filterFiles));

                DUP_Log::info("\n********************************************************************************");
                DUP_Log::info("ARCHIVE Type=DUP Mode=DupArchive");
                DUP_Log::info("********************************************************************************");
                DUP_Log::info("ARCHIVE DIR:  ".$compressDir);
                DUP_Log::info("ARCHIVE FILE: ".basename($archivePath));
                DUP_Log::info("FILTERS: *{$filterOn}*");
                DUP_Log::Info("DIRS:\n\t{$filterDirsFormat}");
                DUP_Log::Info("FILES:\n\t{$filterFilesFormat}");
                DUP_Log::info("EXTS:  {$filterExts}");
                DUP_Log::info("----------------------------------------");
                DUP_Log::info("COMPRESSING");
                DUP_Log::info("SIZE:\t".$scanReport->ARC->Size);
                DUP_Log::info("STATS:\tDirs ".$scanReport->ARC->DirCount." | Files ".$scanReport->ARC->FileCount." | Total ".$scanReport->ARC->FullCount);

                if (($scanReport->ARC->DirCount == '') || ($scanReport->ARC->FileCount == '') || ($scanReport->ARC->FullCount == '')) {
                    $error_message = 'Invalid Scan Report Detected';

                    DUP_Log::error($error_message, 'Invalid Scan Report Detected', Dup_ErrorBehavior::LogOnly);
                    $buildProgress->set_failed($error_message);
                    $package->setStatus(DUP_PackageStatus::ERROR);
                    return true;
                }

                try {
                    DupArchiveEngine::createArchive($archivePath, true);
                    $sql_ark_file_path = $package->getSqlArkFilePath();
                    DupArchiveEngine::addRelativeFileToArchiveST($archivePath, $sqlPath, $sql_ark_file_path);
                }
                catch (Exception $ex) {
                    $error_message = 'Error adding database.sql to archive';

                    DUP_Log::error($error_message, $ex->getMessage(), Dup_ErrorBehavior::LogOnly);
                    $buildProgress->set_failed($error_message);
                    $package->setStatus(DUP_PackageStatus::ERROR);
                    return true;
                }

                $buildProgress->archive_started = true;
                $buildProgress->retries = 0;

                $createState                    = DUP_DupArchive_Create_State::createNew($archivePath, $compressDir, self::WorkerTimeInSec, true, true);
                $createState->throttleDelayInUs = 0;

                $createState->save();
                $package->Update();
            }

            try {
                $createState = DUP_DupArchive_Create_State::get_instance();

                if ($buildProgress->retries > 1) {
                    // Indicates it had problems before so move into robustness mode
                    $createState->isRobust = true;
                    $createState->save();
                }

                if ($createState->working) {
                    DUP_LOG::Trace("Create state is working");
                    //die(0);//rsr
                    // DupArchiveEngine::addItemsToArchive($createState, $scanReport->ARC, $archive);
                    DupArchiveEngine::addItemsToArchive($createState, $scanReport->ARC);

                    $buildProgress->set_build_failures($createState->failures);

                    if ($createState->isCriticalFailurePresent()) {
                        throw new Exception($createState->getFailureSummary());
                    }

                    $totalFileCount = count($scanReport->ARC->Files);
                    $package->Status = DupLiteSnapLibUtil::getWorkPercent(DUP_PackageStatus::ARCSTART, DUP_PackageStatus::ARCVALIDATION, $totalFileCount, $createState->currentFileIndex);
                    $buildProgress->retries = 0;
                    $createState->save();

                    DUP_LOG::TraceObject("Stored Create State", $createState);
                    DUP_LOG::TraceObject('Stored build_progress', $package->BuildProgress);

                    if ($createState->working == false) {
                        // Want it to do the final cleanup work in an entirely new thread so return immediately
                        $skipArchiveFinalization = true;
                        DUP_LOG::TraceObject("Done build phase. Create State=", $createState);
                    }
                }
            }
            catch (Exception $ex) {
                $message = __('Problem adding items to archive.', 'duplicator').' '.$ex->getMessage();

                DUP_Log::error(__('Problems adding items to archive.', 'duplicator'), $message, Dup_ErrorBehavior::LogOnly);
                DUP_Log::TraceObject($message." EXCEPTION:", $ex);
                //$buildProgress->failed = true;
                $buildProgress->set_failed($message);
                $package->setStatus(DUP_PackageStatus::ERROR);
                return true;
            }

            //-- Final Wrapup of the Archive
            if ((!$skipArchiveFinalization) && ($createState->working == false)) {

                DUP_LOG::Trace("Create state is not working and not skip archive finalization");

                if (!$buildProgress->installer_built) {

                    if ($package->Installer->build($package, false)) {
                        $package->Runtime = -1;
                        $package->ExeSize = DUP_Util::byteSize($package->Installer->Size);
                        $package->ZipSize = DUP_Util::byteSize($package->Archive->Size);
                        $package->update();
                    } else {
                        $package->update();
                        return;
                    }

                    DUP_Log::Trace("Installer has been built so running expand now");

                    $expandState = DUP_DupArchive_Expand_State::getInstance(true);

                    $expandState->archivePath            = $archivePath;
                    $expandState->working                = true;
                    $expandState->timeSliceInSecs        = self::WorkerTimeInSec;
                    $expandState->basePath               = DUP_Settings::getSsdirTmpPath().'/validate';
                    $expandState->throttleDelayInUs      = 0; // RSR TODO
                    $expandState->validateOnly           = true;
                    $expandState->validationType         = DupArchiveValidationTypes::Standard;
                    $expandState->working                = true;
                    $expandState->expectedDirectoryCount = count($scanReport->ARC->Dirs) - $createState->skippedDirectoryCount + $package->Installer->numDirsAdded;
                    $expandState->expectedFileCount      = count($scanReport->ARC->Files) + 1 - $createState->skippedFileCount + $package->Installer->numFilesAdded;    // database.sql will be in there

                    $expandState->save();

                    $sfc = count($scanReport->ARC->Files);
                    $nfa = $package->Installer->numFilesAdded;
                    Dup_Log::trace("####scan files {$sfc} skipped files {$createState->skippedFileCount} num files added {$nfa}");
                    DUP_LOG::traceObject("EXPAND STATE AFTER SAVE", $expandState);
                } else {

                    try {

                        $expandState = DUP_DupArchive_Expand_State::getInstance();

                        if ($buildProgress->retries > 1) {
                            // Indicates it had problems before so move into robustness mode
                            $expandState->isRobust = true;
                            $expandState->save();
                        }

                        DUP_Log::traceObject('Resumed validation expand state', $expandState);
                        DupArchiveEngine::expandArchive($expandState);
                        $buildProgress->set_validation_failures($expandState->failures);
                        $totalFileCount = count($scanReport->ARC->Files);
                        $archiveSize    = @filesize($expandState->archivePath);

                        $package->Status = DupLiteSnapLibUtil::getWorkPercent(DUP_PackageStatus::ARCVALIDATION, DUP_PackageStatus::COMPLETE, $archiveSize,
                                $expandState->archiveOffset);
                        DUP_LOG::TraceObject("package status after expand=", $package->Status);
                        DUP_LOG::Trace("archive size:{$archiveSize} expand offset:{$expandState->archiveOffset}");
                    }
                    catch (Exception $ex) {
                        DUP_Log::Trace('Exception:'.$ex->getMessage().':'.$ex->getTraceAsString());
                        $buildProgress->set_failed('Error validating archive');
                        $package->setStatus(DUP_PackageStatus::ERROR);
                        return true;
                    }

                    if ($expandState->isCriticalFailurePresent()) {
                        // Fail immediately if critical failure present - even if havent completed processing the entire archive.
                        $error_message = __('Critical failure present in validation', 'duplicator');
                        DUP_Log::error($error_message, $expandState->getFailureSummary(), Dup_ErrorBehavior::LogOnly);
                        $buildProgress->set_failed($error_message);
                        return true;
                    } else if (!$expandState->working) {

                        $buildProgress->archive_built = true;
                        $buildProgress->retries       = 0;
                        $package->update();

                        $timerAllEnd = DUP_Util::getMicrotime();
                        $timerAllSum = DUP_Util::elapsedTime($timerAllEnd, $package->TimerStart);

                        DUP_LOG::traceObject("create state", $createState);

                        $archiveFileSize = @filesize($archivePath);
                        DUP_Log::info("COMPRESSED SIZE: ".DUP_Util::byteSize($archiveFileSize));
                        DUP_Log::info("ARCHIVE RUNTIME: {$timerAllSum}");
                        DUP_Log::info("MEMORY STACK: ".DUP_Server::getPHPMemory());
                        DUP_Log::info("CREATE WARNINGS: ".$createState->getFailureSummary(false, true));
                        DUP_Log::info("VALIDATION WARNINGS: ".$expandState->getFailureSummary(false, true));

                        $archive->file_count = $expandState->fileWriteCount + $expandState->directoryWriteCount;
                        $package->update();
                        $done = true;
                    } else {
                        $expandState->save();
                    }
                }
            }
        }
        catch (Exception $ex) {
            // Have to have a catchall since the main system that calls this function is not prepared to handle exceptions
            DUP_Log::trace('Top level create Exception:'.$ex->getMessage().':'.$ex->getTraceAsString());
            //$buildProgress->failed = true;
            $buildProgress->set_failed('Error encoundtered creating archive. See package log');
            return true;
        }

        $buildProgress->retries = 0;

        return $done;
    }
}classes/package/duparchive/class.pack.archive.duparchive.state.expand.php000064400000012524151336065400022636 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once (DUPLICATOR_PLUGIN_PATH.'lib/dup_archive/classes/states/class.duparchive.state.expand.php');

class DUP_DupArchive_Expand_State extends DupArchiveExpandState
{
    public static function getInstance($reset = false)
    {   
        $instance = new DUP_DupArchive_Expand_State();
        
        if ($reset) {            
            $instance->initMembers();
        } else {
            $instance->loadMembers();            
        }

        return $instance;
    }

    private function loadMembers()
    {
        $data = DUP_Settings::Get('duparchive_expand_state');

        DUP_LOG::traceObject("****RAW EXPAND STATE LOADED****", $data);

        if($data->currentFileHeaderString != null) {
            $this->currentFileHeader      = DUP_JSON::decode($data->currentFileHeaderString);
        } else {
            $this->currentFileHeader      = null;
        }

        if($data->archiveHeaderString != null) {
            $this->archiveHeader      = DUP_JSON::decode($data->archiveHeaderString);
        } else {
            $this->archiveHeader      = null;
        }

        if ($data->failuresString) {
            $this->failures = DUP_JSON::decode($data->failuresString);
        } else {
            $this->failures = array();
        }

        DUP_Util::objectCopy($data, $this, array('archiveHeaderString', 'currentFileHeaderString', 'failuresString'));

//
//        $this->archiveOffset         = $data->archiveOffset;
//        $this->archivePath           = $data->archivePath;
//        $this->basePath              = $data->basePath;
//        $this->currentFileOffset     = $data->currentFileOffset;
//        $this->failures              = $data->failures;
//        $this->isCompressed          = $data->isCompressed;
//        $this->startTimestamp        = $data->startTimestamp;
//        $this->timeSliceInSecs       = $data->timeSliceInSecs;
//        $this->fileWriteCount        = $data->fileWriteCount;
//        $this->directoryWriteCount   = $data->directoryWriteCount;
//        $this->working               = $data->working;
//        $this->directoryModeOverride = $data->directoryModeOverride;
//        $this->fileModeOverride      = $data->fileModeOverride;
//        $this->throttleDelayInUs     = $data->throttleDelayInUs;
//        $this->validateOnly          = $data->validateOnly;
//        $this->validationType        = $data->validationType;
    }

    public function save()
    {
        $data = new stdClass();

        if($this->currentFileHeader != null) {
            $data->currentFileHeaderString      = DupLiteSnapJsonU::wp_json_encode($this->currentFileHeader);
        } else {
            $data->currentFileHeaderString      = null;
        }

        if($this->archiveHeader != null) {
            $data->archiveHeaderString      = DupLiteSnapJsonU::wp_json_encode($this->archiveHeader);
        } else {
            $data->archiveHeaderString      = null;
        }

        $data->failuresString = DupLiteSnapJsonU::wp_json_encode($this->failures);

        // Object members auto skipped
        DUP_Util::objectCopy($this, $data);

//        $data->archiveOffset         = $this->archiveOffset;
//        $data->archivePath           = $this->archivePath;
//        $data->basePath              = $this->basePath;
//        $data->currentFileOffset     = $this->currentFileOffset;
//        $data->failures              = $this->failures;
//        $data->isCompressed          = $this->isCompressed;
//        $data->startTimestamp        = $this->startTimestamp;
//        $data->timeSliceInSecs       = $this->timeSliceInSecs;
//        $data->fileWriteCount        = $this->fileWriteCount;
//        $data->directoryWriteCount   = $this->directoryWriteCount;
//        $data->working               = $this->working;
//        $data->directoryModeOverride = $this->directoryModeOverride;
//        $data->fileModeOverride      = $this->fileModeOverride;
//        $data->throttleDelayInUs     = $this->throttleDelayInUs;
//        $data->validateOnly          = $this->validateOnly;
//        $data->validationType        = $this->validationType;

        DUP_LOG::traceObject("****SAVING EXPAND STATE****", $this);
        DUP_LOG::traceObject("****SERIALIZED STATE****", $data);
        DUP_Settings::Set('duparchive_expand_state', $data);
        DUP_Settings::Save();
    }

    private function initMembers()
    {
        $this->currentFileHeader = null;
        $this->archiveOffset         = 0;
        $this->archiveHeader         = null;
        $this->archivePath           = null;
        $this->basePath              = null;
        $this->currentFileOffset     = 0;
        $this->failures              = array();
        $this->isCompressed          = false;
        $this->startTimestamp        = time();
        $this->timeSliceInSecs       = -1;
        $this->working               = false;
        $this->validateOnly          = false;
        $this->directoryModeOverride = -1;
        $this->fileModeOverride      = -1;
        $this->throttleDelayInUs     = 0;
    }
}
classes/package/duparchive/index.php000064400000000016151336065400013546 0ustar00<?php
//silentclasses/package/class.pack.archive.zip.php000064400000026247151336065400014566 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/class.pack.archive.php');

/**
 *  Creates a zip file using the built in PHP ZipArchive class
 */
class DUP_Zip extends DUP_Archive
{
    //PRIVATE
    private static $compressDir;
    private static $countDirs  = 0;
    private static $countFiles = 0;
    private static $sqlPath;
    private static $zipPath;
    private static $zipFileSize;
    private static $zipArchive;
    private static $limitItems   = 0;
    private static $networkFlush = false;
    private static $scanReport;

    /**
     *  Creates the zip file and adds the SQL file to the archive
     */
    public static function create(DUP_Archive $archive, $buildProgress)
    {
        try {
            $timerAllStart     = DUP_Util::getMicrotime();
            $package_zip_flush = DUP_Settings::Get('package_zip_flush');

            self::$compressDir  = rtrim(wp_normalize_path(DUP_Util::safePath($archive->PackDir)), '/');
            self::$sqlPath      = DUP_Settings::getSsdirTmpPath()."/{$archive->Package->Database->File}";
            self::$zipPath      = DUP_Settings::getSsdirTmpPath()."/{$archive->File}";
            self::$zipArchive   = new ZipArchive();
            self::$networkFlush = empty($package_zip_flush) ? false : $package_zip_flush;

            $filterDirs       = empty($archive->FilterDirs)  ? 'not set' : $archive->FilterDirs;
            $filterExts       = empty($archive->FilterExts)  ? 'not set' : $archive->FilterExts;
			$filterFiles      = empty($archive->FilterFiles) ? 'not set' : $archive->FilterFiles;
            $filterOn         = ($archive->FilterOn) ? 'ON' : 'OFF';
            $filterDirsFormat  = rtrim(str_replace(';', "\n\t", $filterDirs));
			$filterFilesFormat = rtrim(str_replace(';', "\n\t", $filterFiles));
            $lastDirSuccess   = self::$compressDir;

            //LOAD SCAN REPORT
            $json             = file_get_contents(DUP_Settings::getSsdirTmpPath()."/{$archive->Package->NameHash}_scan.json");
            self::$scanReport = json_decode($json);

            DUP_Log::Info("\n********************************************************************************");
            DUP_Log::Info("ARCHIVE (ZIP):");
            DUP_Log::Info("********************************************************************************");
            $isZipOpen = (self::$zipArchive->open(self::$zipPath, ZIPARCHIVE::CREATE) === TRUE);
            if (!$isZipOpen) {
                $error_message = "Cannot open zip file with PHP ZipArchive.";
                $buildProgress->set_failed($error_message);
                DUP_Log::error($error_message, "Path location [".self::$zipPath."]", Dup_ErrorBehavior::LogOnly);
                $archive->Package->setStatus(DUP_PackageStatus::ERROR);
                return;
            }
            DUP_Log::Info("ARCHIVE DIR:  ".self::$compressDir);
            DUP_Log::Info("ARCHIVE FILE: ".basename(self::$zipPath));
            DUP_Log::Info("FILTERS: *{$filterOn}*");
            DUP_Log::Info("DIRS:\n\t{$filterDirsFormat}");
			DUP_Log::Info("FILES:\n\t{$filterFilesFormat}");
            DUP_Log::Info("EXTS:  {$filterExts}");

            DUP_Log::Info("----------------------------------------");
            DUP_Log::Info("COMPRESSING");
            DUP_Log::Info("SIZE:\t".self::$scanReport->ARC->Size);
            DUP_Log::Info("STATS:\tDirs ".self::$scanReport->ARC->DirCount." | Files ".self::$scanReport->ARC->FileCount);

            //ADD SQL
            $sql_ark_file_path = $archive->Package->getSqlArkFilePath();
            $isSQLInZip = self::$zipArchive->addFile(self::$sqlPath, $sql_ark_file_path);

            if ($isSQLInZip) {
                DUP_Log::Info("SQL ADDED: ".basename(self::$sqlPath));
            } else {
                $error_message = "Unable to add database.sql to archive.";
                DUP_Log::error($error_message, "SQL File Path [".self::$sqlPath."]", Dup_ErrorBehavior::LogOnly);
                $buildProgress->set_failed($error_message);
                $archive->Package->setStatus(DUP_PackageStatus::ERROR);
                return;
            }
            self::$zipArchive->close();
            self::$zipArchive->open(self::$zipPath, ZipArchive::CREATE);

            //ZIP DIRECTORIES
            $info = '';
            foreach (self::$scanReport->ARC->Dirs as $dir) {
                $emptyDir = $archive->getLocalDirPath($dir);

                if (is_readable($dir) && self::$zipArchive->addEmptyDir($emptyDir)) {
                    self::$countDirs++;
                    $lastDirSuccess = $dir;
                } else {
                    //Don't warn when dirtory is the root path
                    if (strcmp($dir, rtrim(self::$compressDir, '/')) != 0) {
                        $dir_path = strlen($dir) ? "[{$dir}]" : "[Read Error] - last successful read was: [{$lastDirSuccess}]";
                        $info .= "DIR: {$dir_path}\n";
                    }
                }
            }

            //LOG Unreadable DIR info
            if (strlen($info)) {
                DUP_Log::Info("\nWARNING: Unable to zip directories:");
                DUP_Log::Info($info);
            }

            /**
             * count update for integrity check
             */
            $sumItems   = (self::$countDirs + self::$countFiles);

            /* ZIP FILES: Network Flush
             *  This allows the process to not timeout on fcgi
             *  setups that need a response every X seconds */
            $totalFileCount = count(self::$scanReport->ARC->Files);
            $info = '';
            if (self::$networkFlush) {
                foreach (self::$scanReport->ARC->Files as $file) {
                    $file_size = @filesize($file);
                    $localFileName = $archive->getLocalFilePath($file);

                    if (is_readable($file)) {
                        if (defined('DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR') && DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR && $file_size < DUP_Constants::ZIP_STRING_LIMIT && self::$zipArchive->addFromString($localFileName, file_get_contents($file))) {
                            Dup_Log::Info("Adding {$file} to zip");
                            self::$limitItems++;
                            self::$countFiles++;
                        } elseif (self::$zipArchive->addFile($file, $localFileName)) {
                            Dup_Log::Info("Adding {$file} to zip");
                            self::$limitItems++;
                            self::$countFiles++;
                        } else {
                            $info .= "FILE: [{$file}]\n";
                        }
                    } else {
                        $info .= "FILE: [{$file}]\n";
                    }
                    //Trigger a flush to the web server after so many files have been loaded.
                    if (self::$limitItems > DUPLICATOR_ZIP_FLUSH_TRIGGER) {
                        self::$zipArchive->close();
                        self::$zipArchive->open(self::$zipPath);
                        self::$limitItems = 0;
                        DUP_Util::fcgiFlush();
                        DUP_Log::Info("Items archived [{$sumItems}] flushing response.");
                    }

                    if(self::$countFiles % 500 == 0) {
                        // Every so many files update the status so the UI can display
                        $archive->Package->Status = DupLiteSnapLibUtil::getWorkPercent(DUP_PackageStatus::ARCSTART, DUP_PackageStatus::ARCVALIDATION, $totalFileCount, self::$countFiles);
                        $archive->Package->update();
                    }
                }
            }
            //Normal
            else {
                foreach (self::$scanReport->ARC->Files as $file) {
                    $file_size = @filesize($file);
                    $localFileName = $archive->getLocalFilePath($file);

                    if (is_readable($file)) {
                        if (defined('DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR') && DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR && $file_size < DUP_Constants::ZIP_STRING_LIMIT && self::$zipArchive->addFromString($localFileName, file_get_contents($file))) {
                            self::$countFiles++;
                        } elseif (self::$zipArchive->addFile($file, $localFileName)) {
                            self::$countFiles++;
                        } else {
                            $info .= "FILE: [{$file}]\n";
                        }
                    } else {
                        $info .= "FILE: [{$file}]\n";
                    }

                    if(self::$countFiles % 500 == 0) {
                        // Every so many files update the status so the UI can display
                        $archive->Package->Status = DupLiteSnapLibUtil::getWorkPercent(DUP_PackageStatus::ARCSTART, DUP_PackageStatus::ARCVALIDATION, $totalFileCount, self::$countFiles);
                        $archive->Package->update();
                    }
                }
            }

            //LOG Unreadable FILE info
            if (strlen($info)) {
                DUP_Log::Info("\nWARNING: Unable to zip files:");
                DUP_Log::Info($info);
                unset($info);
            }

            DUP_Log::Info(print_r(self::$zipArchive, true));

            /**
             * count update for integrity check
             */
            $archive->file_count = self::$countDirs + self::$countFiles;
            DUP_Log::Info("FILE ADDED TO ZIP: ".$archive->file_count);


            //--------------------------------
            //LOG FINAL RESULTS
            DUP_Util::fcgiFlush();
            $zipCloseResult = self::$zipArchive->close();
            if($zipCloseResult) {
                DUP_Log::Info("COMPRESSION RESULT: '{$zipCloseResult}'");
            } else {
                $error_message = "ZipArchive close failure.";
                DUP_Log::error($error_message,
					"The ZipArchive engine is having issues zipping up the files on this server. For more details visit the FAQ\n"
					. "I'm getting a ZipArchive close failure when building. How can I resolve this?\n"
					. "[https://snapcreek.com/duplicator/docs/faqs-tech/#faq-package-165-q]",
                      Dup_ErrorBehavior::LogOnly);
                $buildProgress->set_failed($error_message);
                $archive->Package->setStatus(DUP_PackageStatus::ERROR);
                return;
            }

            $timerAllEnd = DUP_Util::getMicrotime();
            $timerAllSum = DUP_Util::elapsedTime($timerAllEnd, $timerAllStart);

            self::$zipFileSize = @filesize(self::$zipPath);
            DUP_Log::Info("COMPRESSED SIZE: ".DUP_Util::byteSize(self::$zipFileSize));
            DUP_Log::Info("ARCHIVE RUNTIME: {$timerAllSum}");
            DUP_Log::Info("MEMORY STACK: ".DUP_Server::getPHPMemory());
            

            
        } catch (Exception $e) {
            $error_message = "Runtime error in class.pack.archive.zip.php constructor.";
            DUP_Log::error($error_message, "Exception: {$e}", Dup_ErrorBehavior::LogOnly);
            $buildProgress->set_failed($error_message);
            $archive->Package->setStatus(DUP_PackageStatus::ERROR);
            return;
        }
    }
}classes/package/class.pack.archive.filters.php000064400000004461151336065400015426 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * The base class for all filter types Directories/Files/Extentions
 *
 * @package Duplicator
 * @subpackage classes/package
 *
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_Archive_Filter_Scope_Base
{
    //All internal storage items that duplicator decides to filter
    public $Core     = array();
    //Global filter items added from settings
    public $Global = array();
    //Items when creating a package or template that a user decides to filter
    public $Instance = array();
}

/**
 * The filter types that belong to directories
 *
 * @package Duplicator
 * @subpackage classes/package
 *
 */
class DUP_Archive_Filter_Scope_Directory extends DUP_Archive_Filter_Scope_Base
{
    //Items that are not readable
    public $Warning    = array();
    //Items that are not readable
    public $Unreadable = array();
    public $AddonSites = array();
}

/**
 * The filter types that belong to files
 *
 * @package Duplicator
 * @subpackage classes/package
 *
 */
class DUP_Archive_Filter_Scope_File extends DUP_Archive_Filter_Scope_Directory
{
    //Items that are too large
    public $Size = array();

}

/**
 * The filter information object which store all information about the filtered
 * data that is gathered to the execution of a scan process
 *
 * @package Duplicator
 * @subpackage classes/package
 *
 */
class DUP_Archive_Filter_Info
{
    //Contains all folder filter info
    public $Dirs       = array();
    //Contains all file filter info
    public $Files      = array();
    //Contains all extensions filter info
    public $Exts       = array();
    public $UDirCount  = 0;
    public $UFileCount = 0;
    public $UExtCount  = 0;
	public $TreeSize;
	public $TreeWarning;

    /**
     *  Init this object
     */
    public function __construct()
    {
        $this->reset();
    }

        /**
     * reset and clean all object
     */
    public function reset()
    {
        $this->Dirs  = new DUP_Archive_Filter_Scope_Directory();
        $this->Files = new DUP_Archive_Filter_Scope_File();
        $this->Exts  = new DUP_Archive_Filter_Scope_Base();
		$this->TreeSize = array();
		$this->TreeWarning = array();
    }
}

classes/package/class.pack.php000064400000210722151336065400012336 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

require_once (DUPLICATOR_PLUGIN_PATH.'classes/utilities/class.u.php');
require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/class.pack.archive.php');
require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/class.pack.installer.php');
require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/class.pack.database.php');

/**
 * Class used to keep track of the build progress
 *
 * @package Duplicator\classes
 */
class DUP_Build_Progress
{
    public $thread_start_time;
    public $initialized = false;
    public $installer_built = false;
    public $archive_started = false;
    public $archive_has_database = false;
    public $archive_built = false;
    public $database_script_built = false;
    public $failed = false;
    public $retries = 0;
    public $build_failures = array();
    public $validation_failures = array();

    /**
     *
     * @var DUP_Package
     */
    private $package;

    /**
     *
     * @param DUP_Package $package
     */
    public function __construct($package)
    {
        $this->package = $package;
    }

    /**
     *
     * @return bool
     */
    public function has_completed()
    {
        return $this->failed || ($this->installer_built && $this->archive_built && $this->database_script_built);
    }

    public function timed_out($max_time)
    {
        if ($max_time > 0) {
            $time_diff = time() - $this->thread_start_time;
            return ($time_diff >= $max_time);
        } else {
            return false;
        }
    }

    public function start_timer()
    {
        $this->thread_start_time = time();
    }

    public function set_validation_failures($failures)
	{
		$this->validation_failures = array();

		foreach ($failures as $failure) {
			$this->validation_failures[] = $failure;
		}
	}

	public function set_build_failures($failures)
	{
		$this->build_failures = array();

		foreach ($failures as $failure) {
			$this->build_failures[] = $failure->description;
		}
	}

	public function set_failed($failure_message = null)
    {
        if($failure_message !== null) {
            $failure = new StdClass();
            $failure->type        = 0;
            $failure->subject     = '';
            $failure->description = $failure_message;
            $failure->isCritical    = true;
            $this->build_failures[] = $failure;
        }

        $this->failed = true;
        $this->package->Status = DUP_PackageStatus::ERROR;
    }
}

/**
 * Class used to emulate and ENUM to give the status of a package from 0 to 100%
 *
 * @package Duplicator\classes
 */
final class DUP_PackageStatus
{
    private function __construct()
    {
    }

	const ERROR = -1;
	const CREATED  = 0;
    const START    = 10;
    const DBSTART  = 20;
    const DBDONE   = 30;
    const ARCSTART = 40;
    const ARCVALIDATION = 60;
    const ARCDONE = 65;
    const COMPLETE = 100;
}

/**
 * Class used to emulate and ENUM to determine how the package was made.
 * For lite only the MANUAL type is used.
 *
 * @package Duplicator\classes
 */
final class DUP_PackageType
{
    const MANUAL    = 0;
    const SCHEDULED = 1;
}

/**
 * Class used to emulate and ENUM to determine the various file types used in a package
 *
 * @package Duplicator\classes
 */
abstract class DUP_PackageFileType
{
    const Installer = 0;
    const Archive = 1;
    const SQL = 2;
    const Log = 3;
    const Scan = 4;
}

/**
 * Class used to store and process all Package logic
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator\classes
 */
class DUP_Package
{
    const OPT_ACTIVE = 'duplicator_package_active';

    //Properties
    public $Created;
    public $Version;
    public $VersionWP;
    public $VersionDB;
    public $VersionPHP;
    public $VersionOS;
    public $ID;
    public $Name;
    public $Hash;
    public $NameHash;
	//Set to DUP_PackageType
    public $Type;
    public $Notes;
    public $ScanFile;
    public $TimerStart = -1;
    public $Runtime;
    public $ExeSize;
    public $ZipSize;
    public $Status;
    public $WPUser;
    //Objects
    public $Archive;
    public $Installer;
    public $Database;

	public $BuildProgress;

    /**
     *  Manages the Package Process
     */
    function __construct()
    {
        $this->ID      = null;
        $this->Version = DUPLICATOR_VERSION;
        $this->Type      = DUP_PackageType::MANUAL;
        $this->Name      = self::getDefaultName();
        $this->Notes     = null;
        $this->Database  = new DUP_Database($this);
        $this->Archive   = new DUP_Archive($this);
        $this->Installer = new DUP_Installer($this);
		$this->BuildProgress = new DUP_Build_Progress($this);
		$this->Status = DUP_PackageStatus::CREATED;
    }

    /**
     * Generates a JSON scan report
     *
     * @return array of scan results
     *
     * @notes: Testing = /wp-admin/admin-ajax.php?action=duplicator_package_scan
     */
    public function runScanner()
    {
        $timerStart     = DUP_Util::getMicrotime();
        $report         = array();
        $this->ScanFile = "{$this->NameHash}_scan.json";

        $report['RPT']['ScanTime'] = "0";
        $report['RPT']['ScanFile'] = $this->ScanFile;

        //SERVER
        $srv           = DUP_Server::getChecks();
        $report['SRV'] = $srv['SRV'];

        //FILES
        $this->Archive->getScannerData();
        $dirCount  = count($this->Archive->Dirs);
        $fileCount = count($this->Archive->Files);
        $fullCount = $dirCount + $fileCount;

        $report['ARC']['Size']      = DUP_Util::byteSize($this->Archive->Size) or "unknown";
        $report['ARC']['DirCount']  = number_format($dirCount);
        $report['ARC']['FileCount'] = number_format($fileCount);
        $report['ARC']['FullCount'] = number_format($fullCount);
        $report['ARC']['WarnFileCount']       = count($this->Archive->FilterInfo->Files->Warning);
        $report['ARC']['WarnDirCount']        = count($this->Archive->FilterInfo->Dirs->Warning);
        $report['ARC']['UnreadableDirCount']  = count($this->Archive->FilterInfo->Dirs->Unreadable);
        $report['ARC']['UnreadableFileCount'] = count($this->Archive->FilterInfo->Files->Unreadable);
		$report['ARC']['FilterDirsAll'] = $this->Archive->FilterDirsAll;
		$report['ARC']['FilterFilesAll'] = $this->Archive->FilterFilesAll;
		$report['ARC']['FilterExtsAll'] = $this->Archive->FilterExtsAll;
        $report['ARC']['FilterInfo'] = $this->Archive->FilterInfo;
        $report['ARC']['RecursiveLinks'] = $this->Archive->RecursiveLinks;
        $report['ARC']['UnreadableItems'] = array_merge($this->Archive->FilterInfo->Files->Unreadable,$this->Archive->FilterInfo->Dirs->Unreadable);
        $report['ARC']['Status']['Size']  = ($this->Archive->Size > DUPLICATOR_SCAN_SIZE_DEFAULT) ? 'Warn' : 'Good';
        $report['ARC']['Status']['Names'] = (count($this->Archive->FilterInfo->Files->Warning) + count($this->Archive->FilterInfo->Dirs->Warning)) ? 'Warn' : 'Good';
        $report['ARC']['Status']['UnreadableItems'] = !empty($this->Archive->RecursiveLinks) || !empty($report['ARC']['UnreadableItems'])? 'Warn' : 'Good';
        /*
        $overwriteInstallerParams = apply_filters('duplicator_overwrite_params_data', array());
        $package_can_be_migrate = !(isset($overwriteInstallerParams['mode_chunking']['value'])
                                    && $overwriteInstallerParams['mode_chunking']['value'] == 3
                                    && isset($overwriteInstallerParams['mode_chunking']['formStatus'])
                                    && $overwriteInstallerParams['mode_chunking']['formStatus'] == 'st_infoonly');
        */
        $package_can_be_migrate = true;
        $report['ARC']['Status']['MigratePackage'] = $package_can_be_migrate ? 'Good' : 'Warn';
        $report['ARC']['Status']['CanbeMigratePackage'] = $package_can_be_migrate;

        $privileges_to_show_create_proc_func = true;
        $procedures = $GLOBALS['wpdb']->get_col("SHOW PROCEDURE STATUS WHERE `Db` = '".$GLOBALS['wpdb']->dbname."'", 1);
        if (count($procedures)) {
            $create = $GLOBALS['wpdb']->get_row("SHOW CREATE PROCEDURE `".$procedures[0]."`", ARRAY_N);
            $privileges_to_show_create_proc_func = isset($create[2]);
        }

        $functions = $GLOBALS['wpdb']->get_col("SHOW FUNCTION STATUS WHERE `Db` = '".$GLOBALS['wpdb']->dbname."'", 1);
        if (count($functions)) {
            $create = $GLOBALS['wpdb']->get_row("SHOW CREATE FUNCTION `".$functions[0]."`", ARRAY_N);
            $privileges_to_show_create_proc_func = $privileges_to_show_create_proc_func && isset($create[2]);
        }

        $privileges_to_show_create_proc_func = apply_filters('duplicator_privileges_to_show_create_proc_func', $privileges_to_show_create_proc_func);
        $report['ARC']['Status']['showCreateProcFuncStatus'] = $privileges_to_show_create_proc_func ? 'Good' : 'Warn';
        $report['ARC']['Status']['showCreateProcFunc'] = $privileges_to_show_create_proc_func;

        //$report['ARC']['Status']['Big']   = count($this->Archive->FilterInfo->Files->Size) ? 'Warn' : 'Good';
        $report['ARC']['Dirs']  = $this->Archive->Dirs;
        $report['ARC']['Files'] = $this->Archive->Files;
		$report['ARC']['Status']['AddonSites'] = count($this->Archive->FilterInfo->Dirs->AddonSites) ? 'Warn' : 'Good';

        //DATABASE
        $db  = $this->Database->getScannerData();
        $report['DB'] = $db;

        //Lite Limits
        $rawTotalSize = $this->Archive->Size + $report['DB']['RawSize'];
        $report['LL']['TotalSize'] = DUP_Util::byteSize($rawTotalSize);
        $report['LL']['Status']['TotalSize'] = ($rawTotalSize > DUPLICATOR_MAX_DUPARCHIVE_SIZE) ? 'Fail' : 'Good';

        $warnings = array(
            $report['SRV']['SYS']['ALL'],
            $report['SRV']['WP']['ALL'],
            $report['ARC']['Status']['Size'],
            $report['ARC']['Status']['Names'],
            $db['Status']['DB_Size'],
            $db['Status']['DB_Rows']
		);

        //array_count_values will throw a warning message if it has null values,
        //so lets replace all nulls with empty string
        foreach ($warnings as $i => $value) {
            if (is_null($value)) {
                $warnings[$i] = '';
            }
        }

        $warn_counts               = is_array($warnings) ? array_count_values($warnings) : 0;
        $report['RPT']['Warnings'] = is_null($warn_counts['Warn']) ? 0 : $warn_counts['Warn'];
        $report['RPT']['Success']  = is_null($warn_counts['Good']) ? 0 : $warn_counts['Good'];
        $report['RPT']['ScanTime'] = DUP_Util::elapsedTime(DUP_Util::getMicrotime(), $timerStart);
        $fp                        = fopen(DUP_Settings::getSsdirTmpPath()."/{$this->ScanFile}", 'w');

        fwrite($fp, DupLiteSnapJsonU::wp_json_encode_pprint($report));
        fclose($fp);

        return $report;
    }

    /**
     * Validates the inputs from the UI for correct data input
	 *
     * @return DUP_Validator
     */
    public function validateInputs()
    {
        $validator = new DUP_Validator();

        $validator->filter_custom($this->Name , DUP_Validator::FILTER_VALIDATE_NOT_EMPTY ,
            array(  'valkey' => 'Name' ,
                    'errmsg' => __('Package name can\'t be empty', 'duplicator'),
                )
            );

        $validator->explode_filter_custom($this->Archive->FilterDirs, ';' , DUP_Validator::FILTER_VALIDATE_FOLDER ,
            array(  'valkey' => 'FilterDirs' ,
                    'errmsg' => __('Directories: <b>%1$s</b> isn\'t a valid path', 'duplicator'),
                )
            );

        $validator->explode_filter_custom($this->Archive->FilterExts, ';' , DUP_Validator::FILTER_VALIDATE_FILE_EXT ,
            array(  'valkey' => 'FilterExts' ,
                    'errmsg' => __('File extension: <b>%1$s</b> isn\'t a valid extension', 'duplicator'),
                )
            );

        $validator->explode_filter_custom($this->Archive->FilterFiles, ';' , DUP_Validator::FILTER_VALIDATE_FILE ,
            array(  'valkey' => 'FilterFiles' ,
                    'errmsg' => __('Files: <b>%1$s</b> isn\'t a valid file name', 'duplicator'),
                )
            );

		//FILTER_VALIDATE_DOMAIN throws notice message on PHP 5.6
		if (defined('FILTER_VALIDATE_DOMAIN')) {
			$validator->filter_var($this->Installer->OptsDBHost, FILTER_VALIDATE_DOMAIN ,  array(
						'valkey' => 'OptsDBHost' ,
						'errmsg' => __('MySQL Server Host: <b>%1$s</b> isn\'t a valid host', 'duplicator'),
						'acc_vals' => array(
							'' ,
							'localhost'
						)
					)
				);
		}

        $validator->filter_var($this->Installer->OptsDBPort, FILTER_VALIDATE_INT , array(
                    'valkey' => 'OptsDBPort' ,
                    'errmsg' => __('MySQL Server Port: <b>%1$s</b> isn\'t a valid port', 'duplicator'),
                    'acc_vals' => array(
                        ''
                    ),
                    'options' => array(
                       'min_range' => 0
                    )
                )
            );

        return $validator;
    }
    
    /**
     * 
     * @return string
     */
    public function getInstDownloadName()
    {
        switch (DUP_Settings::Get('installer_name_mode')) {
            case DUP_Settings::INSTALLER_NAME_MODE_SIMPLE:
                return DUP_Installer::DEFAULT_INSTALLER_FILE_NAME_WITHOUT_HASH;

            case DUP_Settings::INSTALLER_NAME_MODE_WITH_HASH:
            default:
                return basename($this->getLocalPackageFile(DUP_PackageFileType::Installer));
        }
    }

    /**
     *
     * @return bool return true if package is a active_package_id and status is bewteen 0 and 100
     */
    public function isRunning() {
        return DUP_Settings::Get('active_package_id') == $this->ID && $this->Status >= 0 && $this->Status < 100;
    }

    protected function cleanObjectBeforeSave()
    {
        $this->Archive->FilterInfo->reset();
    }

	/**
     * Saves the active package to the package table
     *
     * @return void
     */
	public function save($extension)
	{
        global $wpdb;

		$this->Archive->Format	= strtoupper($extension);
		$this->Archive->File	= "{$this->NameHash}_archive.{$extension}";
		$this->Installer->File	= apply_filters('duplicator_installer_file_path', "{$this->NameHash}_installer.php");
		$this->Database->File	= "{$this->NameHash}_database.sql";
		$this->WPUser          = isset($current_user->user_login) ? $current_user->user_login : 'unknown';

		//START LOGGING
		DUP_Log::Open($this->NameHash);

        do_action('duplicator_lite_build_before_start' , $this);

		$this->writeLogHeader();

		//CREATE DB RECORD
        $this->cleanObjectBeforeSave();
		$packageObj = serialize($this);
		if (!$packageObj) {
			DUP_Log::error("Unable to serialize package object while building record.");
		}

		$this->ID = $this->getHashKey($this->Hash);

		if ($this->ID != 0) {
			DUP_LOG::Trace("ID non zero so setting to start");
			$this->setStatus(DUP_PackageStatus::START);
		} else {
            DUP_LOG::Trace("ID IS zero so creating another package");
            $tablePrefix = DUP_Util::getTablePrefix();
			$results = $wpdb->insert($tablePrefix . "duplicator_packages", array(
				'name' => $this->Name,
				'hash' => $this->Hash,
				'status' => DUP_PackageStatus::START,
				'created' => current_time('mysql', get_option('gmt_offset', 1)),
				'owner' => isset($current_user->user_login) ? $current_user->user_login : 'unknown',
				'package' => $packageObj)
			);
			if ($results === false) {
				$wpdb->print_error();
				DUP_LOG::Trace("Problem inserting package: {$wpdb->last_error}");

				DUP_Log::error("Duplicator is unable to insert a package record into the database table.", "'{$wpdb->last_error}'");
			}
			$this->ID = $wpdb->insert_id;
		}

        do_action('duplicator_lite_build_start' , $this);
	}

	/**
     * Delete all files associated with this package ID
     *
     * @return void
     */
    public function delete()
    {
        global $wpdb;

        $tablePrefix = DUP_Util::getTablePrefix();
        $tblName  = $tablePrefix.'duplicator_packages';
        $getResult = $wpdb->get_results($wpdb->prepare("SELECT name, hash FROM `{$tblName}` WHERE id = %d", $this->ID), ARRAY_A);

        if ($getResult) {
            $row       = $getResult[0];
            $nameHash  = "{$row['name']}_{$row['hash']}";
            $delResult = $wpdb->query($wpdb->prepare("DELETE FROM `{$tblName}` WHERE id = %d", $this->ID));

            if ($delResult != 0) {
                $tmpPath = DUP_Settings::getSsdirTmpPath();
                $ssdPath =  DUP_Settings::getSsdirPath();

                $archiveFile = $this->getArchiveFilename();
                $wpConfigFile = "{$this->NameHash}_wp-config.txt";

                //Perms
                @chmod($tmpPath."/{$archiveFile}", 0644);
                @chmod($tmpPath."/{$nameHash}_database.sql", 0644);
                @chmod($tmpPath."/{$nameHash}_installer.php", 0644);
                @chmod($tmpPath."/{$nameHash}_scan.json", 0644);
                @chmod($tmpPath."/{$wpConfigFile}", 0644);
                @chmod($tmpPath."/{$nameHash}.log", 0644);

                @chmod($ssdPath."/{$archiveFile}", 0644);
                @chmod($ssdPath."/{$nameHash}_database.sql", 0644);
                @chmod($ssdPath."/{$nameHash}_installer.php", 0644);
                @chmod($ssdPath."/{$nameHash}_scan.json", 0644);
                // In older version, The plugin was storing [HASH]_wp-config.txt in main storage area. The below line code is for backward compatibility
                @chmod($ssdPath."/{$wpConfigFile}", 0644);
                @chmod($ssdPath."/{$nameHash}.log", 0644);
                //Remove
                @unlink($tmpPath."/{$archiveFile}");
                @unlink($tmpPath."/{$nameHash}_database.sql");
                @unlink($tmpPath."/{$nameHash}_installer.php");
                @unlink($tmpPath."/{$nameHash}_scan.json");
                @unlink($tmpPath."/{$wpConfigFile}");
                @unlink($tmpPath."/{$nameHash}.log");

                @unlink($ssdPath."/{$archiveFile}");
                @unlink($ssdPath."/{$nameHash}_database.sql");
                @unlink($ssdPath."/{$nameHash}_installer.php");
                @unlink($ssdPath."/{$nameHash}_scan.json");
                // In older version, The plugin was storing [HASH]_wp-config.txt in main storage area. The below line code is for backward compatibility
                @unlink($ssdPath."/{$wpConfigFile}");
                @unlink($ssdPath."/{$nameHash}.log");
            }
        }
    }

    /**
     * Get package archive size.
     * If package isn't complete it get size from sum of temp files.
     *
     * @return int size in byte 
     */
    public function getArchiveSize() {
        $size = 0;

        if ($this->Status >= DUP_PackageStatus::COMPLETE) {
            $size = $this->Archive->Size;
        } else {
            $tmpSearch = glob(DUP_Settings::getSsdirTmpPath() . "/{$this->NameHash}_*");
            if (is_array($tmpSearch)) {
                $result = array_map('filesize', $tmpSearch);
                $size = array_sum($result);
            }
        }

        return $size;
    }

    /**
     * Return true if active package exist and have an active status
     *
     * @return bool
     */
    public static function is_active_package_present()
    {
        $activePakcs = self::get_ids_by_status(array(
                array('op' => '>=', 'status' => DUP_PackageStatus::CREATED),
                array('op' => '<', 'status' => DUP_PackageStatus::COMPLETE)
                ), true);

        return in_array(DUP_Settings::Get('active_package_id'), $activePakcs);
    }

    /**
     *
     * @param array $conditions es. [
     *                                  relation = 'AND',
     *                                  [ 'op' => '>=' ,
     *                                    'status' =>  DUP_PackageStatus::START ]
     *                                  [ 'op' => '<' ,
     *                                    'status' =>  DUP_PackageStatus::COMPLETED ]
     *                              ]
     * @return string
     */
    protected static function statusContitionsToWhere($conditions = array())
    {
        if (empty($conditions)) {
            return '';
        } else {
            $accepted_op = array('<', '>', '=', '<>', '>=', '<=');
            $relation    = (isset($conditions['relation']) && strtoupper($conditions['relation']) == 'OR') ? ' OR ' : ' AND ';
            unset($conditions['relation']);

            $str_conds = array();

            foreach ($conditions as $cond) {
                $op          = (isset($cond['op']) && in_array($cond['op'], $accepted_op)) ? $cond['op'] : '=';
                $status      = isset($cond['status']) ? (int) $cond['status'] : 0;
                $str_conds[] = 'status '.$op.' '.$status;
            }

            return ' WHERE '.implode($relation, $str_conds).' ';
        }
    }

    /**
     * Get packages with status conditions and/or pagination
     *
     * @global wpdb $wpdb
     *
     * @param array                 //  $conditions es. [
     *                                      relation = 'AND',
     *                                      [ 'op' => '>=' ,
     *                                        'status' =>  DUP_PackageStatus::START ]
     *                                      [ 'op' => '<' ,
     *                                        'status' =>  DUP_PackageStatus::COMPLETED ]
     *                                   ]
     *                                  if empty get all pacages
     * @param int $limit            // max row numbers fi false the limit is PHP_INT_MAX
     * @param int $offset           // offset 0 is at begin
     * @param string $orderBy       // default `id` ASC if empty no order
     * @param string $resultType    //  ids => int[]
     *                                  row => row without backage blob
     *                                  fullRow => row with package blob
     *                                  objs => array of DUP_Package objects
     *
     * @return DUP_Package[]|array[]|int[]
     */
    public static function get_packages_by_status($conditions = array(), $limit = false, $offset = 0, $orderBy = '`id` ASC', $resultType = 'obj')
    {
        global $wpdb;
        $table = $wpdb->base_prefix."duplicator_packages";
        $where = self::statusContitionsToWhere($conditions);

        $packages   = array();
        $offsetStr  = ' OFFSET '.(int) $offset;
        $limitStr   = ' LIMIT '.($limit !== false ? max(0, $limit) : PHP_INT_MAX);
        $orderByStr = empty($orderBy) ? '' : ' ORDER BY '.$orderBy.' ';
        switch ($resultType) {
            case 'ids':
                $cols = '`id`';
                break;
            case 'row':
                $cols = '`id`,`name`,`hash`,`status`,`created`,`owner`';
                break;
            case 'fullRow':
                $cols = '*';
                break;
            case 'objs':
            default:
                $cols = '`status`,`package`';
                break;
        }

        $rows = $wpdb->get_results('SELECT '.$cols.' FROM `'.$table.'` '.$where.$orderByStr.$limitStr.$offsetStr);
        if ($rows != null) {
            switch ($resultType) {
                case 'ids':
                    foreach ($rows as $row) {
                        $packages[] = $row->id;
                    }
                    break;
                case 'row':
                case 'fullRow':
                    $packages = $rows;
                    break;
                case 'objs':
                default:
                    foreach ($rows as $row) {
                        $Package = unserialize($row->package);
                        if ($Package) {
                            // We was not storing Status in Lite 1.2.52, so it is for backward compatibility
                            if (!isset($Package->Status)) {
                                $Package->Status = $row->status;
                            }

                            $packages[] = $Package;
                        }
                    }
            }
        }
        return $packages;
    }

    /**
     * Get packages row db with status conditions and/or pagination
     *
     * @param array             //  $conditions es. [
     *                                  relation = 'AND',
     *                                  [ 'op' => '>=' ,
     *                                    'status' =>  DUP_PackageStatus::START ]
     *                                  [ 'op' => '<' ,
     *                                    'status' =>  DUP_PackageStatus::COMPLETED ]
     *                              ]
     *                              if empty get all pacages
     * @param int $limit        // max row numbers
     * @param int $offset       // offset 0 is at begin
     * @param string $orderBy   // default `id` ASC if empty no order
     *
     * @return array[]      // return row database without package blob
     */
    public static function get_row_by_status($conditions = array(), $limit = false, $offset = 0, $orderBy = '`id` ASC')
    {
        return self::get_packages_by_status($conditions, $limit, $offset, $orderBy, 'row');
    }

    /**
     * Get packages ids with status conditions and/or pagination
     *
     * @param array             //  $conditions es. [
     *                                  relation = 'AND',
     *                                  [ 'op' => '>=' ,
     *                                    'status' =>  DUP_PackageStatus::START ]
     *                                  [ 'op' => '<' ,
     *                                    'status' =>  DUP_PackageStatus::COMPLETED ]
     *                              ]
     *                              if empty get all pacages
     * @param int $limit        // max row numbers
     * @param int $offset       // offset 0 is at begin
     * @param string $orderBy   // default `id` ASC if empty no order
     *
     * @return array[]      // return row database without package blob
     */
    public static function get_ids_by_status($conditions = array(), $limit = false, $offset = 0, $orderBy = '`id` ASC')
    {
        return self::get_packages_by_status($conditions, $limit, $offset, $orderBy, 'ids');
    }

    /**
     * count package with status condition
     *
     * @global wpdb $wpdb
     * @param array $conditions es. [
     *                                  relation = 'AND',
     *                                  [ 'op' => '>=' ,
     *                                    'status' =>  DUP_PackageStatus::START ]
     *                                  [ 'op' => '<' ,
     *                                    'status' =>  DUP_PackageStatus::COMPLETED ]
     *                              ]
     * @return int
     */
    public static function count_by_status($conditions = array())
    {
        global $wpdb;

        $table = $wpdb->base_prefix."duplicator_packages";
        $where = self::statusContitionsToWhere($conditions);

        $count = $wpdb->get_var("SELECT count(id) FROM `{$table}` ".$where);
        return $count;
    }

    /**
     * Execute $callback function foreach package result
     * For each iteration the memory is released
     *
     * @param callable $callback    // function callback(DUP_Package $package)
     * @param array             //  $conditions es. [
     *                                  relation = 'AND',
     *                                  [ 'op' => '>=' ,
     *                                    'status' =>  DUP_PackageStatus::START ]
     *                                  [ 'op' => '<' ,
     *                                    'status' =>  DUP_PackageStatus::COMPLETED ]
     *                              ]
     *                              if empty get all pacages
     * @param int $limit        // max row numbers
     * @param int $offset       // offset 0 is at begin
     * @param string $orderBy   // default `id` ASC if empty no order
     *
     * @return void
     */
    public static function by_status_callback($callback, $conditions = array(), $limit = false, $offset = 0, $orderBy = '`id` ASC')
    {
        if (!is_callable($callback)) {
            throw new Exception('No callback function passed');
        }

        $offset      = max(0, $offset);
        $numPackages = self::count_by_status($conditions);
        $maxLimit    = $offset + ($limit !== false ? max(0, $limit) : PHP_INT_MAX - $offset);
        $numPackages = min($maxLimit, $numPackages);
        $orderByStr = empty($orderBy) ? '' : ' ORDER BY '.$orderBy.' ';

        global $wpdb;
        $table = $wpdb->base_prefix."duplicator_packages";
        $where = self::statusContitionsToWhere($conditions);
        $sql   = 'SELECT * FROM `'.$table.'` '.$where.$orderByStr.' LIMIT 1 OFFSET ';

        for (; $offset < $numPackages; $offset ++) {
            $rows = $wpdb->get_results($sql.$offset);
            if ($rows != null) {
                $Package = @unserialize($rows[0]->package);
                if ($Package) {
                    if (empty($Package->ID)) {
                        $Package->ID = $rows[0]->id;
                    }
                    // We was not storing Status in Lite 1.2.52, so it is for backward compatibility
                    if (!isset($Package->Status)) {
                        $Package->Status = $rows[0]->status;
                    }
                    call_user_func($callback, $Package);
                    unset($Package);
                }
                unset($rows);
            }
        }
    }

    public static function purge_incomplete_package()
    {
        $packages = self::get_packages_by_status(array(
                'relation' => 'AND',
                array('op' => '>=', 'status' => DUP_PackageStatus::CREATED),
                array('op' => '<', 'status' => DUP_PackageStatus::COMPLETE)
                ), 1, 0, '`id` ASC');


        if (count($packages) > 0) {
            foreach ($packages as $package) {
                if (!$package->isRunning()) {
                    $package->delete();
                }
            }
        }
    }

    /**
     * Check the DupArchive build to make sure it is good
     *
     * @return void
     */
	public function runDupArchiveBuildIntegrityCheck()
    {
        //INTEGRITY CHECKS
        //We should not rely on data set in the serlized object, we need to manually check each value
        //indepentantly to have a true integrity check.
        DUP_Log::info("\n********************************************************************************");
        DUP_Log::info("INTEGRITY CHECKS:");
        DUP_Log::info("********************************************************************************");

        //------------------------
        //SQL CHECK:  File should be at minimum 5K.  A base WP install with only Create tables is about 9K
        $sql_temp_path = DUP_Settings::getSsdirTmpPath() . '/' . $this->Database->File;
        $sql_temp_size = @filesize($sql_temp_path);
        $sql_easy_size = DUP_Util::byteSize($sql_temp_size);
        $sql_done_txt = DUP_Util::tailFile($sql_temp_path, 3);
        DUP_Log::Trace('[DUP ARCHIVE] '.__FUNCTION__.' '.__LINE__);

        // Note: Had to add extra size check of 800 since observed bad sql when filter was on 
        if (!strstr($sql_done_txt, 'DUPLICATOR_MYSQLDUMP_EOF') || (!$this->Database->FilterOn && $sql_temp_size < 5120) || ($this->Database->FilterOn && $this->Database->info->tablesFinalCount > 0 && $sql_temp_size < 800)) {
            DUP_Log::Trace('[DUP ARCHIVE] '.__FUNCTION__.' '.__LINE__);

            $error_text = "ERROR: SQL file not complete.  The file {$sql_temp_path} looks too small ($sql_temp_size bytes) or the end of file marker was not found.";
            $this->BuildProgress->set_failed($error_text);
            $this->setStatus(DUP_PackageStatus::ERROR);
            DUP_Log::error("$error_text", '', Dup_ErrorBehavior::LogOnly);
            return;
        }

        DUP_Log::Trace('[DUP ARCHIVE] '.__FUNCTION__.' '.__LINE__);
        DUP_Log::Info("SQL FILE: {$sql_easy_size}");

        //------------------------
        //INSTALLER CHECK:
        $exe_temp_path = DUP_Settings::getSsdirTmpPath() . '/' . $this->Installer->File;

        $exe_temp_size = @filesize($exe_temp_path);
        $exe_easy_size = DUP_Util::byteSize($exe_temp_size);
        $exe_done_txt = DUP_Util::tailFile($exe_temp_path, 10);

        if (!strstr($exe_done_txt, 'DUPLICATOR_INSTALLER_EOF') && !$this->BuildProgress->failed) {
            //$this->BuildProgress->failed = true;
            $error_message = 'ERROR: Installer file not complete.  The end of file marker was not found.  Please try to re-create the package.';

            $this->BuildProgress->set_failed($error_message);
            $this->Status = DUP_PackageStatus::ERROR;
            $this->update();
            DUP_Log::error($error_message, '', Dup_ErrorBehavior::LogOnly);
            return;
        }
        DUP_Log::info("INSTALLER FILE: {$exe_easy_size}");

        //------------------------
        //ARCHIVE CHECK:
        DUP_LOG::trace("Archive file count is " . $this->Archive->file_count);

        if ($this->Archive->file_count != -1) {
            $zip_easy_size = DUP_Util::byteSize($this->Archive->Size);
            if (!($this->Archive->Size)) {
                //$this->BuildProgress->failed = true;
                $error_message = "ERROR: The archive file contains no size.";

                $this->BuildProgress->set_failed($error_message);
                $this->setStatus(DUP_PackageStatus::ERROR);
                DUP_Log::error($error_message, "Archive Size: {$zip_easy_size}", Dup_ErrorBehavior::LogOnly);
                return;
            }

            $scan_filepath = DUP_Settings::getSsdirTmpPath() . "/{$this->NameHash}_scan.json";
            $json = '';

            DUP_LOG::Trace("***********Does $scan_filepath exist?");
            if (file_exists($scan_filepath)) {
                $json = file_get_contents($scan_filepath);
            } else {
                $error_message = sprintf(__("Can't find Scanfile %s. Please ensure there no non-English characters in the package or schedule name.", 'duplicator'), $scan_filepath);

                //$this->BuildProgress->failed = true;
                //$this->setStatus(DUP_PackageStatus::ERROR);
                $this->BuildProgress->set_failed($error_message);
                $this->setStatus(DUP_PackageStatus::ERROR);

                DUP_Log::error($error_message, '', Dup_ErrorBehavior::LogOnly);
                return;
            }

            $scanReport = json_decode($json);

			//RSR TODO: rework/simplify the validateion of duparchive
            $dirCount = count($scanReport->ARC->Dirs);
            $numInstallerDirs = $this->Installer->numDirsAdded;
            $fileCount = count($scanReport->ARC->Files);
            $numInstallerFiles = $this->Installer->numFilesAdded;

            $expected_filecount = $dirCount + $numInstallerDirs + $fileCount + $numInstallerFiles + 1 -1;   // Adding database.sql but subtracting the root dir
			//Dup_Log::trace("#### a:{$dirCount} b:{$numInstallerDirs} c:{$fileCount} d:{$numInstallerFiles} = {$expected_filecount}");

            DUP_Log::info("ARCHIVE FILE: {$zip_easy_size} ");
            DUP_Log::info(sprintf(__('EXPECTED FILE/DIRECTORY COUNT: %1$s', 'duplicator'), number_format($expected_filecount)));
            DUP_Log::info(sprintf(__('ACTUAL FILE/DIRECTORY COUNT: %1$s', 'duplicator'), number_format($this->Archive->file_count)));

            $this->ExeSize = $exe_easy_size;
            $this->ZipSize = $zip_easy_size;

            /* ------- ZIP Filecount Check -------- */
            // Any zip of over 500 files should be within 2% - this is probably too loose but it will catch gross errors
            DUP_LOG::trace("Expected filecount = $expected_filecount and archive filecount=" . $this->Archive->file_count);

            if ($expected_filecount > 500) {
                $straight_ratio = (float) $expected_filecount / (float) $this->Archive->file_count;

                $warning_count = $scanReport->ARC->WarnFileCount + $scanReport->ARC->WarnDirCount + $scanReport->ARC->UnreadableFileCount + $scanReport->ARC->UnreadableDirCount;
                DUP_LOG::trace("Warn/unread counts) warnfile:{$scanReport->ARC->WarnFileCount} warndir:{$scanReport->ARC->WarnDirCount} unreadfile:{$scanReport->ARC->UnreadableFileCount} unreaddir:{$scanReport->ARC->UnreadableDirCount}");
                $warning_ratio = ((float) ($expected_filecount + $warning_count)) / (float) $this->Archive->file_count;
                DUP_LOG::trace("Straight ratio is $straight_ratio and warning ratio is $warning_ratio. # Expected=$expected_filecount # Warning=$warning_count and #Archive File {$this->Archive->file_count}");

                // Allow the real file count to exceed the expected by 10% but only allow 1% the other way
                if (($straight_ratio < 0.90) || ($straight_ratio > 1.01)) {
                    // Has to exceed both the straight as well as the warning ratios
                    if (($warning_ratio < 0.90) || ($warning_ratio > 1.01)) {
                        $error_message = sprintf('ERROR: File count in archive vs expected suggests a bad archive (%1$d vs %2$d).', $this->Archive->file_count, $expected_filecount);
                        $this->BuildProgress->set_failed($error_message);
                        $this->Status  = DUP_PackageStatus::ERROR;
                        $this->update();

                        DUP_Log::error($error_message, '');
                        return;
                    }
                }
            }
        }

        /* ------ ZIP CONSISTENCY CHECK ------ */
        if ($this->Archive->getBuildMode() == DUP_Archive_Build_Mode::ZipArchive) {
            DUP_LOG::trace("Running ZipArchive consistency check");
            $zipPath = DUP_Settings::getSsdirTmpPath()."/{$this->Archive->File}";
                        
            $zip = new ZipArchive();

            // ZipArchive::CHECKCONS will enforce additional consistency checks
            $res = $zip->open($zipPath, ZipArchive::CHECKCONS);

            if ($res !== TRUE) {
                $consistency_error = sprintf(__('ERROR: Cannot open created archive. Error code = %1$s', 'duplicator'), $res);

                DUP_LOG::trace($consistency_error);
                switch ($res) {
                    case ZipArchive::ER_NOZIP :
                        $consistency_error = __('ERROR: Archive is not valid zip archive.', 'duplicator');
                        break;

                    case ZipArchive::ER_INCONS :
                        $consistency_error = __("ERROR: Archive doesn't pass consistency check.", 'duplicator');
                        break;


                    case ZipArchive::ER_CRC :
                        $consistency_error = __("ERROR: Archive checksum is bad.", 'duplicator');
                        break;
                }

                $this->BuildProgress->set_failed($consistency_error);
                $this->Status = DUP_PackageStatus::ERROR;
                $this->update();

                DUP_LOG::trace($consistency_error);
                DUP_Log::error($consistency_error, '');
            } else {
                DUP_Log::info(__('ARCHIVE CONSISTENCY TEST: Pass', 'duplicator'));
                DUP_LOG::trace("Zip for package $this->ID passed consistency test");
            }

            $zip->close();
        }
    }

    public function getLocalPackageFile($file_type)
    {
        $file_path = null;

        if ($file_type == DUP_PackageFileType::Installer) {
            DUP_Log::Trace("Installer requested");
            $file_name = apply_filters('duplicator_installer_file_path', $this->getInstallerFilename());
        } else if ($file_type == DUP_PackageFileType::Archive) {
            DUP_Log::Trace("Archive requested");
            $file_name = $this->getArchiveFilename();
        } else if ($file_type == DUP_PackageFileType::SQL) {
            DUP_Log::Trace("SQL requested");
            $file_name = $this->getDatabaseFilename();
        } else {
            DUP_Log::Trace("Log requested");
            $file_name = $this->getLogFilename();
        }

        $file_path = DUP_Settings::getSsdirPath() . "/$file_name";
        DUP_Log::Trace("File path $file_path");

        if (file_exists($file_path)) {
            return $file_path;
        } else {
            return null;
        }
    }

    public function getScanFilename()
    {
        return $this->NameHash . '_scan.json';
    }

    public function getScanUrl()
    {
        return DUP_Settings::getSsdirUrl()."/".$this->getScanFilename();
    }

    public function getLogFilename()
    {
        return $this->NameHash . '.log';
    }

    public function getLogUrl()
    {
        return DUP_Settings::getSsdirUrl()."/".$this->getLogFilename();
    }

    public function getArchiveFilename()
    {
        $extension = strtolower($this->Archive->Format);

        return "{$this->NameHash}_archive.{$extension}";
    }

    public function getInstallerFilename()
    {
        return "{$this->NameHash}_installer.php";
    }

    public function getDatabaseFilename()
    {
        return $this->NameHash . '_database.sql';
    }

    /**
     * @param int $type
     * @return array
     */
    public function getPackageFileDownloadInfo($type)
    {
        $result = array(
            "filename" => "",
            "url"      => ""
        );

        switch ($type){
            case DUP_PackageFileType::Archive;
                $result["filename"] = $this->Archive->File;
                $result["url"]      = $this->Archive->getURL();
                break;
            case DUP_PackageFileType::SQL;
                $result["filename"] = $this->Database->File;
                $result["url"]      = $this->Database->getURL();
                break;
            case DUP_PackageFileType::Log;
                $result["filename"] = $this->getLogFilename();
                $result["url"]      = $this->getLogUrl();
                break;
            case DUP_PackageFileType::Scan;
                $result["filename"] = $this->getScanFilename();
                $result["url"]      = $this->getScanUrl();
                break;
            default:
                break;
        }

        return $result;
    }

    public function getInstallerDownloadInfo()
    {
        return array(
            "id"   => $this->ID,
            "hash" => $this->Hash
        );
    }

    /**
     * Removes all files except those of active packages
     */
    public static function not_active_files_tmp_cleanup()
	{
		//Check for the 'tmp' folder just for safe measures
		if (! is_dir(DUP_Settings::getSsdirTmpPath()) && (strpos(DUP_Settings::getSsdirTmpPath(), 'tmp') !== false) ) {
			return;
		}

        $globs = glob(DUP_Settings::getSsdirTmpPath().'/*.*');
		if (! is_array($globs) || $globs === FALSE) {
			return;
		}
        
        // RUNNING PACKAGES
        $active_pack = self::get_row_by_status(array(
            'relation' => 'AND',
            array('op' => '>=' , 'status' => DUP_PackageStatus::CREATED ),
            array('op' => '<' , 'status' => DUP_PackageStatus::COMPLETE )
        ));
        $active_files = array();
        foreach($active_pack as $row) {
            $active_files[] = $row->name.'_'.$row->hash;
        }

        // ERRORS PACKAGES
        $err_pack = self::get_row_by_status(array(
            array('op' => '<' , 'status' => DUP_PackageStatus::CREATED )
        ));
        $force_del_files = array();
        foreach($err_pack as $row) {
            $force_del_files[] =  $row->name.'_'.$row->hash;
        }

        // Don't remove json file;
        $extension_filter = array('json');

        // Calculate delta time for old files
        $oldTimeToClean = time() - DUPLICATOR_TEMP_CLEANUP_SECONDS;

        foreach ($globs as $glob_full_path) {
            // Don't remove sub dir
            if (is_dir($glob_full_path)) {
                continue;
            }

            $file_name = basename($glob_full_path);
            // skip all active packages
            foreach ($active_files  as $c_nameHash) {
                if (strpos($file_name, $c_nameHash) === 0) {
                    continue 2;
                }
            }

            // Remove all old files
            if (filemtime($glob_full_path) <= $oldTimeToClean) {
                @unlink($glob_full_path);
                continue;
            }

            // remove all error packages files
            foreach ($force_del_files  as $c_nameHash) {
                if (strpos($file_name, $c_nameHash) === 0) {
                    @unlink($glob_full_path);
                    continue 2;
                }
            }

            $file_info = pathinfo($glob_full_path);
            // skip json file for pre build packages
            if (in_array($file_info['extension'], $extension_filter) || in_array($file_name, $active_files)) {
                continue;
            }

            @unlink($glob_full_path);
        }
    }

	/**
     * Cleans up the temp storage folder have a time interval
     *
     * @return void
     */
    public static function safeTmpCleanup($purge_temp_archives = false)
    {
        if ($purge_temp_archives) {
            $dir = DUP_Settings::getSsdirTmpPath() . "/*_archive.zip.*";
            foreach (glob($dir) as $file_path) {
                unlink($file_path);
            }
            $dir = DUP_Settings::getSsdirTmpPath() . "/*_archive.daf.*";
            foreach (glob($dir) as $file_path) {
                unlink($file_path);
            }
        } else {
            //Remove all temp files that are 24 hours old
            $dir = DUP_Settings::getSsdirTmpPath() . "/*";

            $files = glob($dir);

            if ($files !== false) {
                foreach ($files as $file_path) {
                    // Cut back to keeping things around for just an hour 15 min
                    if (filemtime($file_path) <= time() - DUPLICATOR_TEMP_CLEANUP_SECONDS) {
                        unlink($file_path);
                    }
                }
            }
        }
    }

	/**
     * Starts the package DupArchive progressive build process - always assumed to only run off active package, NOT one in the package table
     *
     * @return obj Returns a DUP_Package object
     */
	public function runDupArchiveBuild()
    {
        $this->BuildProgress->start_timer();
        DUP_Log::Trace('Called');

        if ($this->BuildProgress->failed) {

            DUP_LOG::Trace("build progress failed so setting package to failed");
            $this->setStatus(DUP_PackageStatus::ERROR);
            $message = "Package creation failed.";
            DUP_Log::Trace($message);
            return true;
        }

        if ($this->BuildProgress->initialized == false) {
            DUP_Log::Trace('[DUP ARCHIVE] INIZIALIZE');
            $this->BuildProgress->initialized = true;
            $this->TimerStart = Dup_Util::getMicrotime();
            $this->update();
        }

        //START BUILD
        if (!$this->BuildProgress->database_script_built) {
            DUP_Log::Info('[DUP ARCHIVE] BUILDING DATABASE');
            $this->Database->build($this, Dup_ErrorBehavior::ThrowException);
            DUP_Log::Info('[DUP ARCHIVE] VALIDATING DATABASE');
            $this->Database->validateTableWiseRowCounts();
            $this->BuildProgress->database_script_built = true;
            $this->update();
            DUP_Log::Info('[DUP ARCHIVE] DONE DATABASE');
        } else if (!$this->BuildProgress->archive_built) {
            DUP_Log::Info('[DUP ARCHIVE] BUILDING ARCHIVE');
            $this->Archive->build($this);
            $this->update();
            DUP_Log::Info('[DUP ARCHIVE] DONE ARCHIVE');
        } else if (!$this->BuildProgress->installer_built) {
            DUP_Log::Info('[DUP ARCHIVE] BUILDING INSTALLER');
            // Installer being built is stuffed into the archive build phase
        }

        if ($this->BuildProgress->has_completed()) {
            DUP_Log::Info('[DUP ARCHIVE] HAS COMPLETED CLOSING');

            if (!$this->BuildProgress->failed) {
				DUP_LOG::Info("[DUP ARCHIVE] DUP ARCHIVE INTEGRITY CHECK");
                // Only makees sense to perform build integrity check on completed archives
                $this->runDupArchiveBuildIntegrityCheck();
            } else {
				DUP_LOG::trace("top of loop build progress failed");
			}

            $timerEnd = DUP_Util::getMicrotime();
            $timerSum = DUP_Util::elapsedTime($timerEnd, $this->TimerStart);
            $this->Runtime = $timerSum;

            //FINAL REPORT
            $info = "\n********************************************************************************\n";
            $info .= "RECORD ID:[{$this->ID}]\n";
            $info .= "TOTAL PROCESS RUNTIME: {$timerSum}\n";
            $info .= "PEAK PHP MEMORY USED: " . DUP_Server::getPHPMemory(true) . "\n";
            $info .= "DONE PROCESSING => {$this->Name} " . @date("Y-m-d H:i:s") . "\n";

            DUP_Log::info($info);
            DUP_LOG::trace("Done package building");

            if (!$this->BuildProgress->failed) {
                DUP_Log::Trace('[DUP ARCHIVE] HAS COMPLETED DONE');
                $this->setStatus(DUP_PackageStatus::COMPLETE);
				DUP_LOG::Trace("Cleaning up duparchive temp files");
                //File Cleanup
                $this->buildCleanup();
                do_action('duplicator_lite_build_completed' , $this);
            } else {
                DUP_Log::Trace('[DUP ARCHIVE] HAS COMPLETED ERROR');
            }
        }
        DUP_Log::Close();
        return $this->BuildProgress->has_completed();
    }

    /**
     * Starts the package build process
     *
     * @return obj Returns a DUP_Package object
     */
    public function runZipBuild()
    {
        $timerStart = DUP_Util::getMicrotime();

        DUP_Log::Trace('#### start of zip build');
        //START BUILD
        //PHPs serialze method will return the object, but the ID above is not passed
        //for one reason or another so passing the object back in seems to do the trick
        $this->Database->build($this, Dup_ErrorBehavior::ThrowException);
        $this->Database->validateTableWiseRowCounts();
        $this->Archive->build($this);
        $this->Installer->build($this);

        //INTEGRITY CHECKS
        /*DUP_Log::Info("\n********************************************************************************");
        DUP_Log::Info("INTEGRITY CHECKS:");
        DUP_Log::Info("********************************************************************************");*/
        $this->runDupArchiveBuildIntegrityCheck();
        $dbSizeRead  = DUP_Util::byteSize($this->Database->Size);
        $zipSizeRead = DUP_Util::byteSize($this->Archive->Size);
        $exeSizeRead = DUP_Util::byteSize($this->Installer->Size);

        $timerEnd = DUP_Util::getMicrotime();
        $timerSum = DUP_Util::elapsedTime($timerEnd, $timerStart);

        $this->Runtime = $timerSum;
        $this->ExeSize = $exeSizeRead;
        $this->ZipSize = $zipSizeRead;


        $this->buildCleanup();

        //FINAL REPORT
        $info = "\n********************************************************************************\n";
        $info .= "RECORD ID:[{$this->ID}]\n";
        $info .= "TOTAL PROCESS RUNTIME: {$timerSum}\n";
        $info .= "PEAK PHP MEMORY USED: ".DUP_Server::getPHPMemory(true)."\n";
        $info .= "DONE PROCESSING => {$this->Name} ".@date(get_option('date_format')." ".get_option('time_format'))."\n";

        
        DUP_Log::Info($info);
        DUP_Log::Close();

        $this->setStatus(DUP_PackageStatus::COMPLETE);
        return $this;
    }

    /**
     *  Saves the active options associted with the active(latest) package.
     *
     *  @see DUP_Package::getActive
     *
     *  @param $_POST $post The Post server object
     *
     *  @return null
     */
    public function saveActive($post = null)
    {
        global $wp_version;

        if (isset($post)) {
            $post = stripslashes_deep($post);

            $name = isset($post['package-name']) ? trim($post['package-name']) : self::getDefaultName();
            $name = str_replace(array(' ', '-'), '_', $name);
            $name = str_replace(array('.', ';', ':', "'", '"'), '', $name);
            $name = sanitize_file_name($name);
            $name = substr(trim($name), 0, 40);

            if (isset($post['filter-dirs'])) {
                $post_filter_dirs = sanitize_text_field($post['filter-dirs']);
                $filter_dirs  = $this->Archive->parseDirectoryFilter($post_filter_dirs);
            } else {
                $filter_dirs  = '';
            }            

            if (isset($post['filter-files'])) {
                $post_filter_files = sanitize_text_field($post['filter-files']);
                $filter_files = $this->Archive->parseFileFilter($post_filter_files);
            } else {
                $filter_files = '';
            }

            if (isset($post['filter-exts'])) {
                $post_filter_exts = sanitize_text_field($post['filter-exts']);
                $filter_exts  = $this->Archive->parseExtensionFilter($post_filter_exts);
            } else {
                $filter_exts  = '';
            }

			$tablelist = '';
            if (isset($post['dbtables'])) {
                $tablelist   = implode(',', $post['dbtables']);
            }

            if (isset($post['dbcompat'])) {
                $post_dbcompat = sanitize_text_field($post['dbcompat']);
                $compatlist = isset($post['dbcompat'])	 ? implode(',', $post_dbcompat) : '';
            } else {
                $compatlist = '';
            }

            $dbversion    = DUP_DB::getVersion();
            $dbversion    = is_null($dbversion) ? '- unknown -'  : sanitize_text_field($dbversion);
            $dbcomments   = sanitize_text_field(DUP_DB::getVariable('version_comment'));
            $dbcomments   = is_null($dbcomments) ? '- unknown -' : sanitize_text_field($dbcomments);

            //PACKAGE
            $this->Created    = gmdate("Y-m-d H:i:s");
            $this->Version    = DUPLICATOR_VERSION;
            $this->VersionOS  = defined('PHP_OS') ? PHP_OS : 'unknown';
            $this->VersionWP  = $wp_version;
            $this->VersionPHP = phpversion();
            $this->VersionDB  = sanitize_text_field($dbversion);
            $this->Name       = sanitize_text_field($name);
            $this->Hash       = $this->makeHash();
            $this->NameHash   = sanitize_text_field("{$this->Name}_{$this->Hash}");

            $this->Notes                    = sanitize_textarea_field($post['package-notes']);
            //ARCHIVE
            $this->Archive->PackDir         = duplicator_get_abs_path();
            $this->Archive->Format          = 'ZIP';
            $this->Archive->FilterOn        = isset($post['filter-on']) ? 1 : 0;
			$this->Archive->ExportOnlyDB    = isset($post['export-onlydb']) ? 1 : 0;
            $this->Archive->FilterDirs      = sanitize_textarea_field($filter_dirs);
			$this->Archive->FilterFiles    = sanitize_textarea_field($filter_files);
            $this->Archive->FilterExts      = str_replace(array('.', ' '), '', $filter_exts);
            //INSTALLER
            $this->Installer->OptsDBHost		= sanitize_text_field($post['dbhost']);
            $this->Installer->OptsDBPort		= sanitize_text_field($post['dbport']);
            $this->Installer->OptsDBName		= sanitize_text_field($post['dbname']);
            $this->Installer->OptsDBUser		= sanitize_text_field($post['dbuser']);
            $this->Installer->OptsDBCharset		= sanitize_text_field($post['dbcharset']);
            $this->Installer->OptsDBCollation   = sanitize_text_field($post['dbcollation']);
            $this->Installer->OptsSecureOn		= isset($post['secure-on']) ? 1 : 0;
            $post_secure_pass                   = sanitize_text_field($post['secure-pass']);
			$this->Installer->OptsSecurePass	= DUP_Util::installerScramble($post_secure_pass);
            //DATABASE
            $this->Database->FilterOn       = isset($post['dbfilter-on']) ? 1 : 0;
            $this->Database->FilterTables   = sanitize_text_field($tablelist);
            $this->Database->Compatible     = $compatlist;
            $this->Database->Comments       = sanitize_text_field($dbcomments);

            update_option(self::OPT_ACTIVE, $this);
        }
    }

	/**
     * Update the serialized package and status in the database
     *
     * @return void
     */
    public function update()
    {
        global $wpdb;

        $this->Status = number_format($this->Status, 1, '.', '');
        $this->cleanObjectBeforeSave();
        $packageObj = serialize($this);

        if (!$packageObj) {
            DUP_Log::error("Package SetStatus was unable to serialize package object while updating record.");
        }

        $wpdb->flush();
        $tablePrefix = DUP_Util::getTablePrefix();
        $table = $tablePrefix."duplicator_packages";
        $sql  = "UPDATE `{$table}` SET  status = {$this->Status},";
        $sql .= "package = '" . esc_sql($packageObj) . "'";
        $sql .= "WHERE ID = {$this->ID}";

        DUP_Log::Trace("UPDATE PACKAGE ID = {$this->ID} STATUS = {$this->Status}");

        //DUP_Log::Trace('####Executing SQL' . $sql . '-----------');
        $wpdb->query($sql);
    }

    /**
     * Save any property of this class through reflection
     *
     * @param $property     A valid public property in this class
     * @param $value        The value for the new dynamic property
     *
     * @return null
     */
    public function saveActiveItem($property, $value)
    {
        $package = self::getActive();

        $reflectionClass = new ReflectionClass($package);
        $reflectionClass->getProperty($property)->setValue($package, $value);
        update_option(self::OPT_ACTIVE, $package);
    }

    /**
     * Sets the status to log the state of the build
     * The status level for where the package is
     *
     * @param int $status
     *
     * @return void
     */
    public function setStatus($status)
    {
        if (!isset($status)) {
            DUP_Log::error("Package SetStatus did not receive a proper code.");
        }
        $this->Status = $status;
        $this->update();
    }

    /**
     * Does a hash already exists
     * Returns 0 if no hash is found, if found returns the table ID
     *
     * @param string $hash An existing hash value
     *
     * @return int 
     */
    public function getHashKey($hash)
    {
        global $wpdb;

        $tablePrefix = DUP_Util::getTablePrefix();
        $table = $tablePrefix."duplicator_packages";
        $qry   = $wpdb->get_row("SELECT ID, hash FROM `{$table}` WHERE hash = '{$hash}'");
        if (is_null($qry) || strlen($qry->hash) == 0) {
            return 0;
        } else {
            return $qry->ID;
        }
    }

    /**
     * Makes the hashkey for the package files
     *
     * @return string // A unique hashkey
     */
    public function makeHash()
    {
        try {
            if (function_exists('random_bytes') && DUP_Util::PHP53()) {
                return bin2hex(random_bytes(8)) . mt_rand(1000, 9999) . '_' . date("YmdHis");
            } else {
                return strtolower(md5(uniqid(rand(), true))) . '_' . date("YmdHis");
            }
        } catch (Exception $exc) {
            return strtolower(md5(uniqid(rand(), true))) . '_' . date("YmdHis");
        }
    }

    /**
     * Gets the active package which is defined as the package that was lasted saved.
     * Do to cache issues with the built in WP function get_option moved call to a direct DB call.
     *
     * @see DUP_Package::saveActive
     *
     * @return DUP_Package // A copy of the DUP_Package object
     */
    public static function getActive()
    {
        global $wpdb;

        $obj = new DUP_Package();
        $row = $wpdb->get_row($wpdb->prepare("SELECT option_value FROM `{$wpdb->options}` WHERE option_name = %s LIMIT 1", self::OPT_ACTIVE));
        if (is_object($row)) {
            $obj = @unserialize($row->option_value);
        }
        //Incase unserilaize fails
        $obj = (is_object($obj)) ? $obj : new DUP_Package();

        return $obj;
    }

    /**
     * Gets the Package by ID
     *
     * @param int $id A valid package id form the duplicator_packages table
     *
     * @return DUP_Package  // A copy of the DUP_Package object
     */
    public static function getByID($id)
    {
        global $wpdb;
        $obj         = new DUP_Package();
        $tablePrefix = DUP_Util::getTablePrefix();
        $sql         = $wpdb->prepare("SELECT * FROM `{$tablePrefix}duplicator_packages` WHERE ID = %d", $id);
        $row         = $wpdb->get_row($sql);
        if (is_object($row)) {
            $obj = @unserialize($row->package);
            // We was not storing Status in Lite 1.2.52, so it is for backward compatibility
            if (!isset($obj->Status)) {
                $obj->Status = $row->status;
            }
        }
        //Incase unserilaize fails
        $obj = (is_object($obj)) ? $obj : null;
        return $obj;
    }

    /**
     *  Gets a default name for the package
     *
     *  @return string   // A default package name such as 20170218_blogname
     */
    public static function getDefaultName($preDate = true)
    {
        //Remove specail_chars from final result
        $special_chars = array(".", "-");
        $name          = ($preDate)
							? date('Ymd') . '_' . sanitize_title(get_bloginfo('name', 'display'))
							: sanitize_title(get_bloginfo('name', 'display')) . '_' . date('Ymd');
        $name          = substr(sanitize_file_name($name), 0, 40);
        $name          = str_replace($special_chars, '', $name);
        return $name;
    }

    /**
     *  Cleanup all tmp files
     *
     *  @param all empty all contents
     *
     *  @return null
     */
    public static function tempFileCleanup($all = false)
    {
        //Delete all files now
        if ($all) {
            $dir = DUP_Settings::getSsdirTmpPath()."/*";
            foreach (glob($dir) as $file) {
                @unlink($file);
            }
        }
        //Remove scan files that are 24 hours old
        else {
            $dir = DUP_Settings::getSsdirTmpPath()."/*_scan.json";
            foreach (glob($dir) as $file) {
                if (filemtime($file) <= time() - 86400) {
                    @unlink($file);
                }
            }
        }
    }

    /**
     *  Provides various date formats
     *
     *  @param $utcDate created date in the GMT timezone
     *  @param $format  Various date formats to apply
     *
     *  @return string  // a formated date based on the $format
     */
    public static function getCreatedDateFormat($utcDate, $format = 1)
    {
        $date = get_date_from_gmt($utcDate);
        $date = new DateTime($date);
        switch ($format) {
            //YEAR
            case 1: return $date->format('Y-m-d H:i');
                break;
            case 2: return $date->format('Y-m-d H:i:s');
                break;
            case 3: return $date->format('y-m-d H:i');
                break;
            case 4: return $date->format('y-m-d H:i:s');
                break;
            //MONTH
            case 5: return $date->format('m-d-Y H:i');
                break;
            case 6: return $date->format('m-d-Y H:i:s');
                break;
            case 7: return $date->format('m-d-y H:i');
                break;
            case 8: return $date->format('m-d-y H:i:s');
                break;
            //DAY
            case 9: return $date->format('d-m-Y H:i');
                break;
            case 10: return $date->format('d-m-Y H:i:s');
                break;
            case 11: return $date->format('d-m-y H:i');
                break;
            case 12: return $date->format('d-m-y H:i:s');
                break;
            default :
                return $date->format('Y-m-d H:i');
        }
    }

    /**
     *  Cleans up all the tmp files as part of the package build process
     */
    public function buildCleanup()
    {
        $files   = DUP_Util::listFiles(DUP_Settings::getSsdirTmpPath());
        $newPath = DUP_Settings::getSsdirPath();

        $filesToStore = array(
            $this->Installer->File,
            $this->Archive->File,
        );

        foreach ($files as $file) {

            $fileName = basename($file);
            if (!strstr($fileName, $this->NameHash)) {
                continue;
            }

            if (in_array($fileName, $filesToStore)) {
                if (function_exists('rename')) {
                    rename($file, "{$newPath}/{$fileName}");
                } elseif (function_exists('copy')) {
                    copy($file, "{$newPath}/{$fileName}");
                } else {
                    throw new Exception('PHP copy and rename functions not found!  Contact hosting provider!');
                }
            }

            if (file_exists($file)) {
                unlink($file);
            }
        }

    }



    /**
     * Get package hash
     *
     * @return string package hash
     */
    public function getPackageHash() {
        $hashParts = explode('_', $this->Hash);
        $firstPart = substr($hashParts[0], 0, 7);
        $secondPart = substr($hashParts[1], -8);
        $package_hash = $firstPart.'-'.$secondPart;
        return $package_hash;
    }
    
    public function getSecondaryPackageHash() {
        $newHash = $this->makeHash();
        $hashParts = explode('_', $newHash);
        $firstPart = substr($hashParts[0], 0, 7);
        
        $hashParts = explode('_', $this->Hash);
        $secondPart = substr($hashParts[1], -8);
        
        $package_hash = $firstPart.'-'.$secondPart;
        return $package_hash;
    }

    /**
     *  Provides the full sql file path in archive
     *
     *  @return the full sql file path in archive
     */
    public function getSqlArkFilePath()
    {
        $package_hash = $this->getPackageHash();
        $sql_ark_file_Path = 'dup-installer/dup-database__'.$package_hash.'.sql';
        return $sql_ark_file_Path;
    }
	
	private function writeLogHeader()
	{
        $php_max_time   = @ini_get("max_execution_time");
        if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('memory_limit'))
            $php_max_memory = @ini_set('memory_limit', DUPLICATOR_PHP_MAX_MEMORY);
        else
            $php_max_memory = @ini_get('memory_limit');

        $php_max_time   = ($php_max_time == 0) ? "(0) no time limit imposed" : "[{$php_max_time}] not allowed";
        $php_max_memory = ($php_max_memory === false) ? "Unabled to set php memory_limit" : DUPLICATOR_PHP_MAX_MEMORY." ({$php_max_memory} default)";

		$info = "********************************************************************************\n";
        $info .= "DUPLICATOR-LITE PACKAGE-LOG: ".@date(get_option('date_format')." ".get_option('time_format'))."\n";
        $info .= "NOTICE: Do NOT post to public sites or forums \n";
        $info .= "********************************************************************************\n";
        $info .= "VERSION:\t".DUPLICATOR_VERSION."\n";
        $info .= "WORDPRESS:\t{$GLOBALS['wp_version']}\n";
        $info .= "PHP INFO:\t".phpversion().' | '.'SAPI: '.php_sapi_name()."\n";
        $info .= "SERVER:\t\t{$_SERVER['SERVER_SOFTWARE']} \n";
        $info .= "PHP TIME LIMIT: {$php_max_time} \n";
        $info .= "PHP MAX MEMORY: {$php_max_memory} \n";
        $info .= "MEMORY STACK: ".DUP_Server::getPHPMemory();
        DUP_Log::Info($info);

        $info = null;
	}
}classes/class.io.php000064400000005040151336065400010427 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * @copyright 2018 Snap Creek LLC
 * Class for all IO operations
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_IO
{
    /**
     * Safely deletes a file
     *
     * @param string $file	The full filepath to the file
     *
     * @return TRUE on success or if file does not exist. FALSE on failure
     */
    public static function deleteFile($file)
	{
		if (file_exists($file)) {
			if (@unlink($file) === false) {
				DUP_Log::Info("Could not delete file: {$file}");
				return false;
			}
		}
		return true;
	}

	/**
     * Removes a directory recursively except for the root of a WP Site
     *
     * @param string $directory	The full filepath to the directory to remove
     *
     * @return TRUE on success FALSE on failure
     */
	public static function deleteTree($directory)
	{
		$success = true;

        if(!file_exists("{$directory}/wp-config.php")) {
            $filenames = array_diff(scandir($directory), array('.', '..'));

            foreach ($filenames as $filename) {
                if (is_dir("$directory/$filename")) {
                    $success = self::deleteTree("$directory/$filename");
                } else {
                    $success = @unlink("$directory/$filename");
                }

                if ($success === false) {
					break;
                }
            }
        } else {
            return false;
        }

		return $success && @rmdir($directory);
	}

    /**
     * Safely copies a file to a directory
     *
     * @param string $source_file       The full filepath to the file to copy
     * @param string $dest_dir			The full path to the destination directory were the file will be copied
     * @param string $delete_first		Delete file before copying the new one
     *
     *  @return TRUE on success or if file does not exist. FALSE on failure
     */
    public static function copyFile($source_file, $dest_dir, $delete_first = false)
    {
        //Create directory
        if (file_exists($dest_dir) == false)
        {
            if (wp_mkdir_p($dest_dir) === false) {
                return false;
            }
        }

        //Remove file with same name before copy
        $filename = basename($source_file);
        $dest_filepath = $dest_dir . "/$filename";
        if($delete_first)
        {
            self::deleteFile($dest_filepath);
        }

        return copy($source_file, $dest_filepath);
    }
}
classes/class.archive.config.php000064400000002041151336065400012703 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * @copyright 2016 Snap Creek LLC
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_Archive_Config
{
    //READ-ONLY: COMPARE VALUES
    public $created;
    public $version_dup;
    public $version_wp;
    public $version_db;
    public $version_php;
    public $version_os;
    public $dbInfo;
    //READ-ONLY: GENERAL
    public $url_old;
    public $opts_delete;
    public $blogname;
    public $wproot;
    public $wplogin_url;
	public $relative_content_dir;
    public $exportOnlyDB;
    public $installSiteOverwriteOn;

    //PRE-FILLED: GENERAL
    public $secure_on;
    public $secure_pass;
    public $skipscan;
    public $dbhost;
    public $dbname;
    public $dbuser;
    public $dbpass;
    public $dbcharset;
    public $dbcollation;

    // MULTISITE
    public $mu_mode;

    public $wp_tableprefix;

    public $is_outer_root_wp_config_file;
    public $is_outer_root_wp_content_dir;
}
classes/class.constants.php000064400000000226151336065400012035 0ustar00<?php
defined("ABSPATH") || exit;
class DUP_Constants
{
    const ZIP_STRING_LIMIT = 70000;   // Cutoff for using ZipArchive addtostring vs addfile
}
classes/index.php000064400000000016151336065400010021 0ustar00<?php
//silentclasses/host/class.liquidweb.host.php000064400000001145151336065400013740 0ustar00<?php
/**
 * wpengine custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\HOST
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUP_Liquidweb_Host implements DUP_Host_interface
{

    public static function getIdentifier()
    {
        return DUP_Custom_Host_Manager::HOST_LIQUIDWEB;
    }

    public function isHosting()
    {
        return apply_filters('duplicator_liquidweb_host_check', file_exists(DupLiteSnapLibIOU::safePathUntrailingslashit(WPMU_PLUGIN_DIR).'/liquid-web.php'));
    }

    public function init()
    {

    }
}classes/host/class.wpengine.host.php000064400000002617151336065400013574 0ustar00<?php
defined("ABSPATH") or die("");

// New encryption class

class DUP_WPEngine_Host implements DUP_Host_interface
{
    public function init()
    {
        add_filter('duplicator_installer_file_path', array(__CLASS__, 'installerFilePath'), 10, 1);
        add_filter('duplicator_global_file_filters_on', '__return_true');
        add_filter('duplicator_global_file_filters', array(__CLASS__, 'globalFileFilters'), 10, 1);
        add_filter('duplicator_defaults_settings', array(__CLASS__, 'defaultsSettings'));
    }

    public static function getIdentifier()
    {
        return DUP_Custom_Host_Manager::HOST_WPENGINE;
    }


    public function isHosting()
    {
        return apply_filters('duplicator_wp_engine_host_check', file_exists(DupLiteSnapLibIOU::safePathUntrailingslashit(WPMU_PLUGIN_DIR).'/wpengine-security-auditor.php'));
    }

    public static function installerFilePath($path)
    {
        $path_info = pathinfo($path);
        $newPath   = $path;
        if ('php' == $path_info['extension']) {
            $newPath = substr_replace($path, '.txt', -4);
        }
        return $newPath;
    }

    public static function globalFileFilters($files)
    {
        $files[] = wp_normalize_path(WP_CONTENT_DIR).'/mysql.sql';
        return $files;
    }

    public static function defaultsSettings($defaults)
    {
        $defaults['package_zip_flush'] = '1';
        return $defaults;
    }

}classes/host/interface.host.php000064400000001135151336065400012606 0ustar00<?php
/**
 * interface for specific hostings class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\HOST
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

interface DUP_Host_interface
{

    /**
     * return the current host itentifier
     *
     * @return string
     */
    public static function getIdentifier();

    /**
     * @return bool true if is current host
     */
    public function isHosting();

    /**
     * the init function.
     * is called only if isHosting is true
     *
     * @return void
     */
    public function init();
}classes/host/class.wordpresscom.host.php000064400000001162151336065400014501 0ustar00<?php
/**
 * godaddy custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\HOST
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUP_WordpressCom_Host implements DUP_Host_interface
{

    public static function getIdentifier()
    {
        return DUP_Custom_Host_Manager::HOST_WORDPRESSCOM;
    }

    public function isHosting()
    {
        return apply_filters('duplicator_pro_wordpress_host_check', file_exists(DupLiteSnapLibIOU::safePathUntrailingslashit(WPMU_PLUGIN_DIR).'/wpcomsh-loader.php'));
    }

    public function init()
    {

    }
}classes/host/class.flywheel.host.php000064400000001146151336065400013573 0ustar00<?php

/**
 * Flywheel custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\HOST
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUP_Flywheel_Host implements DUP_Host_interface
{

    public static function getIdentifier()
    {
        return DUP_Custom_Host_Manager::HOST_FLYWHEEL;
    }

    public function isHosting()
    {
        $path = duplicator_get_home_path().'/.fw-config.php';
        return apply_filters('duplicator_host_check', file_exists($path), self::getIdentifier());
    }

    public function init()
    {

    }
}
classes/host/class.custom.host.manager.php000064400000011032151336065400014672 0ustar00<?php

/**
 * custom hosting manager
 * singleton class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\HOST
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

require_once (DUPLICATOR_PLUGIN_PATH . '/classes/host/interface.host.php');
require_once (DUPLICATOR_PLUGIN_PATH . '/classes/host/class.godaddy.host.php');
require_once (DUPLICATOR_PLUGIN_PATH . '/classes/host/class.wpengine.host.php');
require_once (DUPLICATOR_PLUGIN_PATH . '/classes/host/class.wordpresscom.host.php');
require_once (DUPLICATOR_PLUGIN_PATH . '/classes/host/class.liquidweb.host.php');
require_once (DUPLICATOR_PLUGIN_PATH . '/classes/host/class.pantheon.host.php');
require_once (DUPLICATOR_PLUGIN_PATH . '/classes/host/class.flywheel.host.php');

class DUP_Custom_Host_Manager
{
    const HOST_GODADDY      = 'godaddy';
    const HOST_WPENGINE     = 'wpengine';
    const HOST_WORDPRESSCOM = 'wordpresscom';
    const HOST_LIQUIDWEB    = 'liquidweb';
    const HOST_PANTHEON     = 'pantheon';
    const HOST_FLYWHEEL     = 'flywheel';

    /**
     *
     * @var DUP_Custom_Host_Manager
     */
    protected static $instance = null;

    /**
     *
     * @var bool
     */
    private $initialized = false;

    /**
     *
     * @var DUP_Host_interface[]
     */
    private $customHostings = array();

    /**
     *
     * @var string[]
     */
    private $activeHostings = array();

    /**
     *
     * @return self
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    private function __construct()
    {
        $this->customHostings[DUP_WPEngine_Host::getIdentifier()]     = new DUP_WPEngine_Host();
        $this->customHostings[DUP_GoDaddy_Host::getIdentifier()]      = new DUP_GoDaddy_Host();
        $this->customHostings[DUP_WordpressCom_Host::getIdentifier()] = new DUP_WordpressCom_Host();
        $this->customHostings[DUP_Liquidweb_Host::getIdentifier()]    = new DUP_Liquidweb_Host();
        $this->customHostings[DUP_Pantheon_Host::getIdentifier()]     = new DUP_Pantheon_Host();
        $this->customHostings[DUP_Flywheel_Host::getIdentifier()]     = new DUP_Flywheel_Host();
    }

    public function init()
    {
        if ($this->initialized) {
            return true;
        }
        foreach ($this->customHostings as $cHost) {
            if (!($cHost instanceof DUP_Host_interface)) {
                throw new Exception('Host must implement DUP_Host_interface');
            }
            if ($cHost->isHosting()) {
                $this->activeHostings[] = $cHost->getIdentifier();
                $cHost->init();
            }
        }
        $this->initialized = true;
        return true;
    }

    public function getActiveHostings()
    {
        return $this->activeHostings;
    }

    public function isHosting($identifier)
    {
        return in_array($identifier, $this->activeHostings);
    }

    public function isManaged()
    {
        if ($this->isHosting(self::HOST_WORDPRESSCOM)) {
            return true;
        }

        if ($this->isHosting(self::HOST_GODADDY)) {
            return true;
        }

        if ($this->isHosting(self::HOST_WPENGINE)) {
            return true;
        }

        if ($this->isHosting(self::HOST_LIQUIDWEB)) {
            return true;
        }

        if ($this->isHosting(self::HOST_PANTHEON)) {
            return true;
        }

        if ($this->isHosting(self::HOST_FLYWHEEL)) {
            return true;
        }

        if ($this->WPConfigIsNotWriteable()) {
            return true;
        }

        if ($this->notAccessibleCoreDirPresent()) {
            return true;
        }

        return false;
    }

    public function WPConfigIsNotWriteable()
    {
        $wpConfigPath = duplicator_get_abs_path()."/wp-config.php";

        return file_exists($wpConfigPath) && !is_writeable($wpConfigPath);
    }

    public function notAccessibleCoreDirPresent()
    {
        $absPath = duplicator_get_abs_path();
        $coreDirs = array(
            $absPath.'/wp-admin',
            $absPath.'/wp-includes',
            WP_CONTENT_DIR
        );

        foreach ($coreDirs as $coreDir) {
            if (file_exists($coreDir) && !is_writeable($coreDir)) {
                return true;
            }
        }

        return false;
    }

    public function getHosting($identifier)
    {
        if ($this->isHosting($identifier)) {
            return $this->activeHostings[$identifier];
        } else {
            return false;
        }
    }
}
classes/host/class.pantheon.host.php000064400000001137151336065400013570 0ustar00<?php
/**
 * godaddy custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\HOST
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUP_Pantheon_Host implements DUP_Host_interface
{

    public static function getIdentifier()
    {
        return DUP_Custom_Host_Manager::HOST_PANTHEON;
    }

    public function isHosting()
    {
        return apply_filters('duplicator_pantheon_host_check', file_exists(DupLiteSnapLibIOU::safePathUntrailingslashit(WPMU_PLUGIN_DIR).'/pantheon.php'));
    }

    public function init()
    {

    }
}classes/host/class.godaddy.host.php000064400000001312151336065400013362 0ustar00<?php
defined("ABSPATH") or die("");

class DUP_GoDaddy_Host implements DUP_Host_interface
{

    public static function getIdentifier()
    {
        return DUP_Custom_Host_Manager::HOST_GODADDY;
    }

    public function isHosting()
    {
        return apply_filters('duplicator_godaddy_host_check', file_exists(DupLiteSnapLibIOU::safePathUntrailingslashit(WPMU_PLUGIN_DIR).'/gd-system-plugin.php'));
    }

    public function init()
    {
        add_filter('duplicator_defaults_settings', array(__CLASS__, 'defaultsSettings'));
    }

    public static function defaultsSettings($defaults)
    {
        $defaults['archive_build_mode'] = DUP_Archive_Build_Mode::DupArchive;
        return $defaults;
    }
}classes/class.settings.php000064400000024441151336065400011666 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (!defined('DUPLICATOR_VERSION'))
    exit;

abstract class DUP_Archive_Build_Mode
{

    const Unconfigured = -1;
    const Auto         = 0; // should no longer be used
    //  const Shell_Exec   = 1;
    const ZipArchive   = 2;
    const DupArchive   = 3;

}

class DUP_Settings
{

    const OPT_SETTINGS                  = 'duplicator_settings';
    const INSTALLER_NAME_MODE_WITH_HASH = 'withhash';
    const INSTALLER_NAME_MODE_SIMPLE    = 'simple';
    const STORAGE_POSITION_LECAGY       = 'legacy';
    const STORAGE_POSITION_WP_CONTENT   = 'wpcont';
    const SSDIR_NAME_LEGACY             = 'wp-snapshots';
    const SSDIR_NAME_NEW                = 'backups-dup-lite';

    protected static $Data;
    protected static $ssDirPath = null;
    protected static $ssDirUrl  = null;

    /**
     *  Class used to manage all the settings for the plugin
     */
    public static function init()
    {
        self::$Data = get_option(self::OPT_SETTINGS);
        //when the plugin updated, this will be true
        if (empty(self::$Data) || empty(self::$Data['version']) || version_compare(DUPLICATOR_VERSION, self::$Data['version'], '>')) {
            self::SetDefaults();
        }
    }

    /**
     *  Find the setting value
     *  @param string $key	The name of the key to find
     *  @return The value stored in the key returns null if key does not exist
     */
    public static function Get($key = '')
    {
        $result = null;
        if (isset(self::$Data[$key])) {
            $result = self::$Data[$key];
        } else {
            $defaults = self::GetAllDefaults();
            if (isset($defaults[$key])) {
                $result = $defaults[$key];
            }
        }
        return $result;
    }

    /**
     *  Set the settings value in memory only
     *  @param string $key		The name of the key to find
     *  @param string $value		The value to set
     *  remarks:	 The Save() method must be called to write the Settings object to the DB
     */
    public static function Set($key, $value)
    {
        if (isset(self::$Data[$key])) {
            self::$Data[$key] = ($value == null) ? '' : $value;
        } elseif (!empty($key)) {
            self::$Data[$key] = ($value == null) ? '' : $value;
        }
    }

    public static function setStoragePosition($newPosition)
    {
        $legacyPath = self::getSsdirPathLegacy();
        $wpContPath = self::getSsdirPathWpCont();

        $oldStoragePost = self::Get('storage_position');

        self::resetPositionVars();

        switch ($newPosition) {
            case self::STORAGE_POSITION_LECAGY:
                self::$Data['storage_position'] = self::STORAGE_POSITION_LECAGY;
                if (!DUP_Util::initSnapshotDirectory()) {
                    self::resetPositionVars();
                    self::$Data['storage_position'] = $oldStoragePost;
                    return false;
                }
                if (is_dir($wpContPath)) {
                    if (DupLiteSnapLibIOU::moveContentDirToTarget($wpContPath, $legacyPath, true)) {
                        DupLiteSnapLibIOU::rrmdir($wpContPath);
                    }
                }
                break;
            case self::STORAGE_POSITION_WP_CONTENT:
                self::$Data['storage_position'] = self::STORAGE_POSITION_WP_CONTENT;
                if (!DUP_Util::initSnapshotDirectory()) {
                    self::resetPositionVars();
                    self::$Data['storage_position'] = $oldStoragePost;
                    return false;
                }
                if (is_dir($legacyPath)) {
                    if (DupLiteSnapLibIOU::moveContentDirToTarget($legacyPath, $wpContPath, true)) {
                        DupLiteSnapLibIOU::rrmdir($legacyPath);
                    }
                }
                break;
            default:
                throw new Exception('Unknown storage position');
        }

        return true;
    }

    protected static function resetPositionVars()
    {
        self::$ssDirPath = null;
        self::$ssDirUrl  = null;
    }

    /**
     *  Saves all the setting values to the database
     *  @return True if option value has changed, false if not or if update failed.
     */
    public static function Save()
    {
        return update_option(self::OPT_SETTINGS, self::$Data);
    }

    /**
     *  Deletes all the setting values to the database
     *  @return True if option value has changed, false if not or if update failed.
     */
    public static function Delete()
    {
        return delete_option(self::OPT_SETTINGS);
    }

    /**
     *  Sets the defaults if they have not been set
     *  @return True if option value has changed, false if not or if update failed.
     */
    public static function SetDefaults()
    {
        $defaults   = self::GetAllDefaults();
        self::$Data = apply_filters('duplicator_defaults_settings', $defaults);
        return self::Save();
    }

    /**
     *  DeleteWPOption: Cleans up legacy data
     */
    public static function DeleteWPOption($optionName)
    {
        if (in_array($optionName, $GLOBALS['DUPLICATOR_OPTS_DELETE'])) {
            return delete_option($optionName);
        }
        return false;
    }

    public static function GetAllDefaults()
    {
        $default            = array();
        $default['version'] = DUPLICATOR_VERSION;

        //Flag used to remove the wp_options value duplicator_settings which are all the settings in this class
        $default['uninstall_settings'] = isset(self::$Data['uninstall_settings']) ? self::$Data['uninstall_settings'] : true;
        //Flag used to remove entire wp-snapshot directory
        $default['uninstall_files']    = isset(self::$Data['uninstall_files']) ? self::$Data['uninstall_files'] : true;
        //Flag used to remove all tables
        $default['uninstall_tables']   = isset(self::$Data['uninstall_tables']) ? self::$Data['uninstall_tables'] : true;

        //Flag used to show debug info
        $default['package_debug']            = isset(self::$Data['package_debug']) ? self::$Data['package_debug'] : false;
        //Flag used to enable mysqldump
        $default['package_mysqldump']        = isset(self::$Data['package_mysqldump']) ? self::$Data['package_mysqldump'] : true;
        //Optional mysqldump search path
        $default['package_mysqldump_path']   = isset(self::$Data['package_mysqldump_path']) ? self::$Data['package_mysqldump_path'] : '';
        //Optional mysql limit size
        $default['package_phpdump_qrylimit'] = isset(self::$Data['package_phpdump_qrylimit']) ? self::$Data['package_phpdump_qrylimit'] : "100";
        //Optional mysqldump search path
        $default['package_zip_flush']        = isset(self::$Data['package_zip_flush']) ? self::$Data['package_zip_flush'] : false;
        //Optional mysqldump search path
        $default['installer_name_mode']      = isset(self::$Data['installer_name_mode']) ? self::$Data['installer_name_mode'] : self::INSTALLER_NAME_MODE_SIMPLE;
        // storage position
        $default['storage_position']         = isset(self::$Data['storage_position']) ? self::$Data['storage_position'] : self::STORAGE_POSITION_WP_CONTENT;

        //Flag for .htaccess file
        $default['storage_htaccess_off'] = isset(self::$Data['storage_htaccess_off']) ? self::$Data['storage_htaccess_off'] : false;
        // Initial archive build mode
        if (isset(self::$Data['archive_build_mode'])) {
            $default['archive_build_mode'] = self::$Data['archive_build_mode'];
        } else {
            $is_ziparchive_available       = apply_filters('duplicator_is_ziparchive_available', class_exists('ZipArchive'));
            $default['archive_build_mode'] = $is_ziparchive_available ? DUP_Archive_Build_Mode::ZipArchive : DUP_Archive_Build_Mode::DupArchive;
        }

        // $default['package_zip_flush'] = apply_filters('duplicator_package_zip_flush_default_setting', '0');
        //Skip scan archive
        $default['skip_archive_scan']      = isset(self::$Data['skip_archive_scan']) ? self::$Data['skip_archive_scan'] : false;
        $default['unhook_third_party_js']  = isset(self::$Data['unhook_third_party_js']) ? self::$Data['unhook_third_party_js'] : false;
        $default['unhook_third_party_css'] = isset(self::$Data['unhook_third_party_css']) ? self::$Data['unhook_third_party_css'] : false;

        $default['active_package_id'] = -1;

        return $default;
    }

    public static function get_create_date_format()
    {
        static $ui_create_frmt = null;
        if (is_null($ui_create_frmt)) {
            $ui_create_frmt = is_numeric(self::Get('package_ui_created')) ? self::Get('package_ui_created') : 1;
        }
        return $ui_create_frmt;
    }

    public static function getSsdirPathLegacy()
    {
        return DupLiteSnapLibIOU::safePathTrailingslashit(duplicator_get_abs_path()).self::SSDIR_NAME_LEGACY;
    }

    public static function getSsdirPathWpCont()
    {
        return DupLiteSnapLibIOU::safePathTrailingslashit(WP_CONTENT_DIR).self::SSDIR_NAME_NEW;
    }

    public static function getSsdirPath()
    {
        if (is_null(self::$ssDirPath)) {
            if (self::Get('storage_position') === self::STORAGE_POSITION_LECAGY) {
                self::$ssDirPath = self::getSsdirPathLegacy();
            } else {
                self::$ssDirPath = self::getSsdirPathWpCont();
            }
        }
        return self::$ssDirPath;
    }

    public static function getSsdirUrl()
    {
        if (is_null(self::$ssDirUrl)) {
            if (self::Get('storage_position') === self::STORAGE_POSITION_LECAGY) {
                self::$ssDirUrl = DupLiteSnapLibIOU::trailingslashit(DUPLICATOR_SITE_URL).self::SSDIR_NAME_LEGACY;
            } else {
                self::$ssDirUrl = DupLiteSnapLibIOU::trailingslashit(content_url()).self::SSDIR_NAME_NEW;
            }
        }
        return self::$ssDirUrl;
    }

    public static function getSsdirTmpPath()
    {
        return self::getSsdirPath().'/tmp';
    }

    public static function getSsdirInstallerPath()
    {
        return self::getSsdirPath().'/installer';
    }
}classes/class.plugin.upgrade.php000064400000004642151336065400012753 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**

 * Upgrade logic of plugin resides here

 */
class DUP_LITE_Plugin_Upgrade
{

    const DUP_VERSION_OPT_KEY = 'duplicator_version_plugin';

    public static function onActivationAction()
    {
        if (($oldDupVersion = get_option(self::DUP_VERSION_OPT_KEY, false)) === false) {
            self::newInstallation();
        } else {
            self::updateInstallation($oldDupVersion);
        }

        //Setup All Directories
        DUP_Util::initSnapshotDirectory();
    }

    protected static function newInstallation()
    {
        self::updateDatabase();

        //WordPress Options Hooks
        update_option(self::DUP_VERSION_OPT_KEY, DUPLICATOR_VERSION);
    }

    protected static function updateInstallation($oldVersion)
    {
        self::updateDatabase();

        //PRE 1.3.35
        //Do not update to new wp-content storage till after
        if (version_compare($oldVersion, '1.3.35', '<')) {
            DUP_Settings::Set('storage_position', DUP_Settings::STORAGE_POSITION_LECAGY);
            DUP_Settings::Save();
        }

        //PRE 1.4.7
        //Remove the core dup-install file that might exist in local storage directory
        if (version_compare($oldVersion, '1.4.7', '<')) {
            $ssdir           = DUP_Settings::getSsdirPath();
            $dupInstallFile  = "{$ssdir}/dup-installer/main.installer.php";
            if (file_exists($dupInstallFile) ) {
                @unlink("{$dupInstallFile}");
            }
        }
        
        //WordPress Options Hooks
        update_option(self::DUP_VERSION_OPT_KEY, DUPLICATOR_VERSION);
    }

    protected static function updateDatabase()
    {
        global $wpdb;

        $table_name = $wpdb->prefix."duplicator_packages";

        //PRIMARY KEY must have 2 spaces before for dbDelta to work
        //see: https://codex.wordpress.org/Creating_Tables_with_Plugins
        $sql = "CREATE TABLE `{$table_name}` (
			   id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
			   name VARCHAR(250) NOT NULL,
			   hash VARCHAR(50) NOT NULL,
			   status INT(11) NOT NULL,
			   created DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
			   owner VARCHAR(60) NOT NULL,
			   package LONGTEXT NOT NULL,
			   PRIMARY KEY  (id),
			   KEY hash (hash))";

        $abs_path = duplicator_get_abs_path();
        require_once($abs_path.'/wp-admin/includes/upgrade.php');
        @dbDelta($sql);
    }
}classes/ui/class.ui.messages.php000064400000006501151336065400012663 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Used to generate a thick box inline dialog such as an alert or confirm pop-up
 *
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/ui
 * @copyright (c) 2017, Snapcreek LLC
 */

class DUP_UI_Messages
{
    const UNIQUE_ID_PREFIX = 'dup_ui_msg_';
    const NOTICE           = 'updated';
    const WARNING          = 'update-nag';
    const ERROR            = 'error';

    private static $unique_id = 0;
    private $id;
    public $type              = self::NOTICE;
    public $content           = '';
    public $wrap_cont_tag     = 'p';
    public $hide_on_init      = true;
    public $is_dismissible    = false;
    /**
     *
     * @var int delay in milliseconds
     */
    public $auto_hide_delay   = 0;
    public $callback_on_show  = null;
    public $callback_on_hide  = null;

    public function __construct($content = '', $type = self::NOTICE)
    {
        self::$unique_id ++;
        $this->id = self::UNIQUE_ID_PREFIX.self::$unique_id;

        $this->content = (string) $content;
        $this->type    = $type;
    }

    protected function get_notice_classes($classes = array())
    {
        if (is_string($classes)) {
            $classes = explode(' ', $classes);
        } else if (is_array($classes)) {

        } else {
            $classes = array();
        }

        if ($this->is_dismissible) {
            $classes[] = 'is-dismissible';
        }

        $result = array_merge(array('notice', $this->type), $classes);
        return trim(implode(' ', $result));
    }

    public function initMessage()
    {
        $classes = array();
        if ($this->hide_on_init) {
            $classes[] = 'no_display';
        }

        $this->wrap_tag = empty($this->wrap_tag) ? 'p' : $this->wrap_tag;
        echo '<div id="'.$this->id.'" class="'.$this->get_notice_classes($classes).'">'.
        '<'.$this->wrap_cont_tag.' class="msg-content">'.
        $this->content.
        '</'.$this->wrap_cont_tag.'>'.
        '</div>';
    }

    public function updateMessage($jsVarName, $echo = true)
    {
        $result = 'jQuery("#'.$this->id.' > .msg-content").html('.$jsVarName.');';
        
        if ($echo) {
            echo $result;
        } else {
            return $result;
        }
    }

    public function showMessage($echo = true)
    {
        $callStr = !empty($this->callback_on_show) ? $this->callback_on_show.';' : '';
        $result  = 'jQuery("#'.$this->id.'").fadeIn( "slow", function() { $(this).removeClass("no_display");'.$callStr.' });';
        if ($this->auto_hide_delay > 0) {
            $result .= 'setTimeout(function () { '.$this->hideMessage(false).' }, '.$this->auto_hide_delay.');';
        }

        if ($echo) {
            echo $result;
        } else {
            return $result;
        }
    }

    public function hideMessage($echo = true)
    {
        $callStr = !empty($this->callback_on_hide) ? $this->callback_on_hide.';' : '';
        $result  = 'jQuery("#'.$this->id.'").fadeOut( "slow", function() { $(this).addClass("no_display");'.$callStr.' });';

        if ($echo) {
            echo $result;
        } else {
            return $result;
        }
    }
}classes/ui/index.php000064400000000016151336065400010436 0ustar00<?php
//silentclasses/ui/class.ui.dialog.php000064400000015371151336065400012320 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Used to generate a thick-box inline dialog such as an alert or confirm pop-up
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/ui
 * @copyright (c) 2017, Snapcreek LLC
 *
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_UI_Dialog
{
    /**
     * The title that shows up in the dialog
     */
    public $title;

    /**
     * The message displayed in the body of the dialog
     */
    public $message;

    /**
     * The width of the dialog the default is used if not set
     * Alert = 475px (default) |  Confirm = 500px (default)
     */
    public $width;

    /**
     * The height of the dialog the default is used if not set
     * Alert = 125px (default) |  Confirm = 150px (default)
     */
    public $height;

    /**
     * When the progress meter is running show this text
     * Available only on confirm dialogs
     */
    public $progressText;

    /**
     * When true a progress meter will run until page is reloaded
     * Available only on confirm dialogs
     */
    public $progressOn = true;

    /**
     * The javascript call back method to call when the 'Yes' button is clicked
     * Available only on confirm dialogs
     */
    public $jscallback;

    /**
     *
     * @var string
     */
    public $okText;

    /**
     *
     * @var string
     */
    public $cancelText;

    /**
     * If true close dialog on confirm
     * @var bool
     */
    public $closeOnConfirm = false;


    /**
     * The id given to the full dialog
     */
    private $id;

    /**
     * A unique id that is added to all id elements
     */
    private $uniqid;

    /**
     *  Init this object when created
     */
    public function __construct()
    {
        add_thickbox();
        $this->progressText = __('Processing please wait...', 'duplicator');
        $this->uniqid		= substr(uniqid('',true),0,14) . rand();
        $this->id           = 'dup-dlg-'.$this->uniqid;
        $this->okText       = __('OK', 'duplicator');
        $this->cancelText   = __('Cancel', 'duplicator');
    }

    /**
     * Gets the unique id that is assigned to each instance of a dialog
     *
     * @return int      The unique ID of this dialog
     */
    public function getID()
    {
        return $this->id;
    }

    /**
     * Gets the unique id that is assigned to each instance of a dialogs message text
     *
     * @return int      The unique ID of the message
     */
    public function getMessageID()
    {
        return "{$this->id}_message";
    }

    /**
     * Initialize the alert base html code used to display when needed
     *
     * @return string	The html content used for the alert dialog
     */
    public function initAlert()
    {
        $onClickClose = '';
        if (!is_null($this->jscallback)) {
            $onClickClose .= $this->jscallback.';';
        }
        $onClickClose .= 'tb_remove();';

        if (strlen($this->okText) == 0) {
            $hideButton = "style='display:none'";
        }

        $html = '
		<div id="'.esc_attr($this->id).'" style="display:none">
			<div class="dup-dlg-alert-txt">
				'.$this->message.'
				<br/><br/>
			</div>
			<div class="dup-dlg-alert-btns">
				<input type="button" class="button button-large" value="'.esc_attr($this->okText).'" onclick="'.$onClickClose.'" '. $hideButton . '/>
			</div>
		</div>';

        echo $html;
    }

    /**
     * Shows the alert base JS code used to display when needed
     *
     * @return string	The javascript content used for the alert dialog
     */
    public function showAlert()
    {
        $this->width  = is_numeric($this->width) ? $this->width : 500;
        $this->height = is_numeric($this->height) ? $this->height : 175;

        $html = "tb_show('".esc_js($this->title)."', '#TB_inline?width=".esc_js($this->width)."&height=".esc_js($this->height)."&inlineId=".esc_js($this->id)."');\n" .
				 "var styleData = jQuery('#TB_window').attr('style') + 'height: ".esc_js($this->height)."px !important';\n" .
			 	 "jQuery('#TB_window').attr('style', styleData);";

		echo $html;
    }

    /**
     * Shows the confirm base JS code used to display when needed
     *
     * @return string	The javascript content used for the confirm dialog
     */
    public function initConfirm()
    {
        $progress_data  = '';
        $progress_func2 = '';

        $onClickConfirm = '';
        if (!is_null($this->jscallback)) {
            $onClickConfirm .= $this->jscallback.';';
        }

        //Enable the progress spinner
        if ($this->progressOn) {
            $progress_func1 = "__DUP_UI_Dialog_".$this->uniqid;
            $progress_func2 = ";{$progress_func1}(this)";
            $progress_data  = "<div class='dup-dlg-confirm-progress'><i class='fas fa-circle-notch fa-spin fa-lg fa-fw'></i> ".esc_js($this->progressText)."</div>
				<script>
					function {$progress_func1}(obj)
					{
						jQuery(obj).parent().parent().find('.dup-dlg-confirm-progress').show();
						jQuery(obj).closest('.dup-dlg-confirm-btns').find('input').attr('disabled', 'true');
					}
				</script>";
            $onClickConfirm .= $progress_func2.';';
        }

        if ($this->closeOnConfirm) {
             $onClickConfirm .= 'tb_remove();';
        }

        $html =
            '<div id="'.esc_attr($this->id).'" style="display:none">
				<div class="dup-dlg-confirm-txt">
					<span id="'.esc_attr($this->id).'_message">'.esc_html($this->message).'</span>
					<br/><br/>
					'.$progress_data.'
				</div>
				<div class="dup-dlg-confirm-btns">
					<input type="button" class="button button-large" value="'.esc_attr($this->okText).'" onclick="'.$onClickConfirm.'" />
					<input type="button" class="button button-large" value="'.esc_attr($this->cancelText).'" onclick="tb_remove()" />
				</div>
			</div>';

        echo $html;
    }

    /**
     * Shows the confirm base JS code used to display when needed
     *
     * @return string	The javascript content used for the confirm dialog
     */
    public function showConfirm()
    {
        $this->width  = is_numeric($this->width) ? $this->width : 500;
        $this->height = is_numeric($this->height) ? $this->height : 225;
        $html = "tb_show('".esc_js($this->title)."', '#TB_inline?width=".esc_js($this->width)."&height=".esc_js($this->height)."&inlineId=".esc_js($this->id)."');\n" .
				 "var styleData = jQuery('#TB_window').attr('style') + 'height: ".esc_js($this->height)."px !important';\n" .
			 	 "jQuery('#TB_window').attr('style', styleData);";

		echo $html;
    }
}classes/ui/class.ui.screen.base.php000064400000010170151336065400013241 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * The base class for all screen.php files.  This class is used to control items that are common
 * among all screens, namely the Help tab and Screen Options drop down items.  When creating a
 * screen object please extent this class.
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/ui
 * @copyright (c) 2017, Snapcreek LLC
 *
 */
// Exit if accessed directly
if (!defined('DUPLICATOR_VERSION'))
    exit;

class DUP_UI_Screen
{

    /**
     * Used as a placeholder for the current screen object
     */
    public $screen;

    /**
     *  Init this object when created
     */
    public function __construct()
    {
        
    }

    public static function getCustomCss()
    {
        $screen = get_current_screen();
        if (!in_array($screen->id, array(
            'toplevel_page_duplicator',
            'duplicator_page_duplicator-tools',
            'duplicator_page_duplicator-settings',
            'duplicator_page_duplicator-gopro'))) {
            return;
        }

        $colorScheme = self::getCurrentColorScheme();
        if ($colorScheme !== false) {
            ?>
            <style>
                .link-style {
                    color: <?php echo $colorScheme->colors[2]; ?>;
                }

                .link-style:hover {
                    color: <?php echo $colorScheme->colors[3]; ?>;
                }
            </style>
            <?php
        }
    }

    public static function getCurrentColorScheme()
    {
        global $_wp_admin_css_colors;
        if(!isset($_wp_admin_css_colors) || !is_array($_wp_admin_css_colors)){
            return false;
        }

        $colorScheme = get_user_option('admin_color');

        if (isset($_wp_admin_css_colors[$colorScheme])) {
            return $_wp_admin_css_colors[$colorScheme];
        } else {
             return $_wp_admin_css_colors[DupLiteSnapLibUtil::arrayKeyFirst($_wp_admin_css_colors)];
        }
    }

    /**
     * Get the help support tab view content shown in the help system
     *
     * @param string $guide		The target URL to navigate to on the online user guide
     * @param string $faq		The target URL to navigate to on the online user tech FAQ
     *
     * @return null
     */
    public function getSupportTab($guide, $faq)
    {
        $content = __("<b>Need Help?</b>  Please check out these resources first:"
            ."<ul>"
            ."<li><a href='https://snapcreek.com/duplicator/docs/guide{$guide}' target='_sc-faq'>Full Online User Guide</a></li>"
            ."<li><a href='https://snapcreek.com/duplicator/docs/faqs-tech{$faq}' target='_sc-faq'>Frequently Asked Questions</a></li>"
            ."</ul>", 'duplicator');

        $this->screen->add_help_tab(array(
            'id'      => 'dup_help_tab_callback',
            'title'   => esc_html__('Support', 'duplicator'),
            'content' => "<p>{$content}</p>"
            )
        );
    }

    /**
     * Get the help support side bar found in the right most part of the help system
     *
     * @return null
     */
    public function getHelpSidbar()
    {
        $txt_title = __("Resources", 'duplicator');
        $txt_home  = __("Knowledge Base", 'duplicator');
        $txt_guide = __("Full User Guide", 'duplicator');
        $txt_faq   = __("Technical FAQs", 'duplicator');
        $txt_sets  = __("Package Settings", 'duplicator');
        $this->screen->set_help_sidebar(
            "<div class='dup-screen-hlp-info'><b>".esc_html($txt_title).":</b> <br/>"
            ."<i class='fa fa-home'></i> <a href='https://snapcreek.com/duplicator/docs/' target='_sc-home'>".esc_html($txt_home)."</a> <br/>"
            ."<i class='fa fa-book'></i> <a href='https://snapcreek.com/duplicator/docs/guide/' target='_sc-guide'>".esc_html($txt_guide)."</a> <br/>"
            ."<i class='far fa-file-code'></i> <a href='https://snapcreek.com/duplicator/docs/faqs-tech/' target='_sc-faq'>".esc_html($txt_faq)."</a> <br/>"
            ."<i class='fa fa-cog'></i> <a href='admin.php?page=duplicator-settings&tab=package'>".esc_html($txt_sets)."</a></div>"
        );
    }
}classes/ui/class.ui.notice.php000064400000036166151336065400012347 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Used to display notices in the WordPress Admin area
 * This class takes advantage of the admin_notice action.
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/ui
 * @copyright (c) 2017, Snapcreek LLC
 *
 */

class DUP_UI_Notice
{

    const OPTION_KEY_ACTIVATE_PLUGINS_AFTER_INSTALL = 'duplicator_reactivate_plugins_after_installation';

    //TEMPLATE VALUE: This is a just a simple example for setting up quick notices
    const OPTION_KEY_NEW_NOTICE_TEMPLATE            = 'duplicator_new_template_notice';
    const OPTION_KEY_IS_PRO_ENABLE_NOTICE_DISMISSED = 'duplicator_is_pro_enable_notice_dismissed';
    const OPTION_KEY_IS_MU_NOTICE_DISMISSED         = 'duplicator_is_mu_notice_dismissed';

    const GEN_INFO_NOTICE    = 0;
    const GEN_SUCCESS_NOTICE = 1;
    const GEN_WARNING_NOTICE = 2;
    const GEN_ERROR_NOTICE   = 3;

    /**
     * init notice actions
     */
    public static function init()
    {
        $methods = array(
            'showReservedFilesNotice',
            'installAutoDeactivatePlugins',
            'showFeedBackNotice',
            'showNoExportCapabilityNotice',
            //FUTURE NOTICE TEMPLATE
            //'newNotice_TEMPLATE',
        );
        foreach ($methods as $method) {
            add_action('admin_notices', array(__CLASS__, $method));
        }
    }

     /**
      * NOTICE SAMPLE:  This method serves as a quick example for how to quickly setup a new notice
      * Please do not edit this method, but simply use to copy a new setup.
     */
    public static function newNotice_TEMPLATE()
    {
        if (get_option(self::OPTION_KEY_NEW_NOTICE_TEMPLATE) != true) {
            return;
        }

        $screen = get_current_screen();
        if (!in_array($screen->parent_base, array('plugins', 'duplicator'))) {
            return;
        }

        ?>
        <div class="notice notice-success duplicator-admin-notice is-dismissible" data-to-dismiss="<?php echo esc_attr(self::OPTION_KEY_NEW_NOTICE_TEMPLATE); ?>" >
            <p>
                <?php esc_html_e('NOTICE: This is a sample message notice demo.', 'duplicator'); ?><br>
                <?php
                echo sprintf(__('Example for passing dynamic data to notice message <i>%s</i> to <i>%s</i>', 'duplicator'),
                    esc_html("test 1"),
                    esc_html(time()));
                ?>
            </p>
            <p>
                <?php echo sprintf(__('More info here: Goto <a href="%s">General Settings</a>', 'duplicator'), 'admin.php?page=duplicator-settings'); ?>
            </p>
        </div>
        <?php
    }

    /**
     * Shows a display message in the wp-admin if any reserved files are found
     *
     * @return string   Html formatted text notice warnings
     */
    public static function showReservedFilesNotice()
    {
        //Show only on Duplicator pages and Dashboard when plugin is active
        $dup_active = is_plugin_active('duplicator/duplicator.php');
        $dup_perm   = current_user_can('manage_options');
        if (!$dup_active || !$dup_perm)
            return;

        $screen = get_current_screen();
        if (!isset($screen))
            return;

        $is_installer_cleanup_req = ($screen->id == 'duplicator_page_duplicator-tools' && isset($_GET['action']) && $_GET['action'] == 'installer');
        if (DUP_Server::hasInstallerFiles() && !$is_installer_cleanup_req) {
            DUP_Migration::renameInstallersPhpFiles();

            $on_active_tab = isset($_GET['section']) ? $_GET['section'] : '';
            echo '<div class="dup-updated notice notice-success dup-global-error-reserved-files" id="message"><p>';

            //Safe Mode Notice
            $safe_html = '';
            if (get_option("duplicator_exe_safe_mode", 0) > 0) {
                $safe_msg1 = __('Safe Mode:', 'duplicator');
                $safe_msg2 = __('During the install safe mode was enabled deactivating all plugins.<br/> Please be sure to ', 'duplicator');
                $safe_msg3 = __('re-activate the plugins', 'duplicator');
                $safe_html = "<div class='notice-safemode'><b>{$safe_msg1}</b><br/>{$safe_msg2} <a href='plugins.php'>{$safe_msg3}</a>!</div><br/>";
            }

            //On Tools > Cleanup Page
            if ($screen->id == 'duplicator_page_duplicator-tools' && ($on_active_tab == "info" || $on_active_tab == '')) {

                $title = __('This site has been successfully migrated!', 'duplicator');
                $msg1  = __('Final step(s):', 'duplicator');
                $msg2  = __('This message will be removed after all installer files are removed.  Installer files must be removed to maintain a secure site.  '
                    .'Click the link above or button below to remove all installer files and complete the migration.', 'duplicator');

                echo "<b class='pass-msg'><i class='fa fa-check-circle'></i> ".esc_html($title)."</b> <br/> {$safe_html} <b>".esc_html($msg1)."</b> <br/>";
                printf("1. <a href='javascript:void(0)' onclick='jQuery(\"#dup-remove-installer-files-btn\").click()'>%s</a><br/>", esc_html__('Remove Installation Files Now!', 'duplicator'));
                printf("2. <a href='https://wordpress.org/support/plugin/duplicator/reviews/?filter=5' target='wporg'>%s</a> <br/> ", esc_html__('Optionally, Review Duplicator at WordPress.org...', 'duplicator'));
                echo "<div class='pass-msg'>".esc_html($msg2)."</div>";

                //All other Pages
            } else {

                $title = __('Migration Almost Complete!', 'duplicator');
                $msg   = __('Reserved Duplicator installation files have been detected in the root directory.  Please delete these installation files to '
                    .'avoid security issues. <br/> Go to:Duplicator > Tools > Information >Stored Data and click the "Remove Installation Files" button', 'duplicator');

                $nonce = wp_create_nonce('duplicator_cleanup_page');
                $url   = self_admin_url('admin.php?page=duplicator-tools&tab=diagnostics&section=info&_wpnonce='.$nonce);
                echo "<b>{$title}</b><br/> {$safe_html} {$msg}";
                @printf("<br/><a href='{$url}'>%s</a>", __('Take me there now!', 'duplicator'));
            }
            echo "</p></div>";
        }
    }

    /**
     * Shows a message for redirecting a page
     *
     * @return string   The location to redirect to
     */
    public static function redirect($location)
    {
        echo '<div class="dup-redirect"><i class="fas fa-circle-notch fa-spin fa-fw"></i>';
        esc_html__('Redirecting Please Wait...', 'duplicator');
        echo '</div>';
        echo "<script>window.location = '{$location}';</script>";
        die(esc_html__('Invalid token permissions to perform this request.', 'duplicator'));
    }

    /**
     * Shows install deactivated function
     */
    public static function installAutoDeactivatePlugins()
    {
        $reactivatePluginsAfterInstallation = get_option(self::OPTION_KEY_ACTIVATE_PLUGINS_AFTER_INSTALL, false);
        if (is_array($reactivatePluginsAfterInstallation)) {
            $installedPlugins  = array_keys(get_plugins());
            $shouldBeActivated = array();
            foreach ($reactivatePluginsAfterInstallation as $pluginSlug => $pluginTitle) {
                if (in_array($pluginSlug, $installedPlugins) && !is_plugin_active($pluginSlug)) {
                    $shouldBeActivated[$pluginSlug] = $pluginTitle;
                }
            }

            if (empty($shouldBeActivated)) {
                delete_option(self::OPTION_KEY_ACTIVATE_PLUGINS_AFTER_INSTALL);
            } else {
                $activatePluginsAnchors = array();
                foreach ($shouldBeActivated as $slug => $title) {
                    $activateURL              = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$slug), 'activate-plugin_'.$slug);
                    $anchorTitle              = sprintf(esc_html__('Activate %s', 'duplicator'), $title);
                    $activatePluginsAnchors[] = '<a href="'.$activateURL.'" 
                                                    title="'.esc_attr($anchorTitle).'">'.
                        $title.'</a>';
                }
                ?>
                <div class="update-nag duplicator-plugin-activation-admin-notice notice notice-warning duplicator-admin-notice is-dismissible"
                     data-to-dismiss="<?php echo esc_attr(self::OPTION_KEY_ACTIVATE_PLUGINS_AFTER_INSTALL); ?>" >
                    <p>
                        <?php
                        echo "<b>".esc_html__("Warning!", "duplicator")."</b> ".esc_html__("Migration Almost Complete!", "duplicator")." <br/>";
                        echo esc_html__("Plugin(s) listed here have been deactivated during installation to help prevent issues. Please activate them to finish this migration: ", "duplicator")."<br/>";
                        echo implode(' ,', $activatePluginsAnchors);
                        ?>
                    </p>
                </div>
                <?php
            }
        }
    }

    /**
     * Shows feedback notices after certain no. of packages successfully created
     */
    public static function showFeedBackNotice()
    {
        $notice_id = 'rate_us_feedback';

        if (!current_user_can('manage_options')) {
            return;
        }

        $notices = get_user_meta(get_current_user_id(), DUPLICATOR_ADMIN_NOTICES_USER_META_KEY, true);
        if (empty($notices)) {
            $notices = array();
        }

        $duplicator_pages = array(
            'toplevel_page_duplicator',
            'duplicator_page_duplicator-tools',
            'duplicator_page_duplicator-settings',
            'duplicator_page_duplicator-gopro',
        );

        if (!in_array(get_current_screen()->id, $duplicator_pages) || (isset($notices[$notice_id]) && 'true' === $notices[$notice_id])) {
            return;
        }

        // not using DUP_Util::getTablePrefix() in place of $tablePrefix because DUP_UI_Notice included initially (Duplicator\Lite\Requirement is depended on the DUP_UI_Notice)
        $tablePrefix = (is_multisite() && is_plugin_active_for_network('duplicator/duplicator.php')) ? $GLOBALS['wpdb']->base_prefix : $GLOBALS['wpdb']->prefix;
        $packagesCount = $GLOBALS['wpdb']->get_var('SELECT count(id) FROM '.$tablePrefix.'duplicator_packages WHERE status=100');

        if ($packagesCount < DUPLICATOR_FEEDBACK_NOTICE_SHOW_AFTER_NO_PACKAGE) {
            return;
        }

        $notices[$notice_id] = 'false';
        update_user_meta(get_current_user_id(), DUPLICATOR_ADMIN_NOTICES_USER_META_KEY, $notices);
        $dismiss_url = wp_nonce_url(
            add_query_arg(array(
            'action'    => 'duplicator_set_admin_notice_viewed',
            'notice_id' => esc_attr($notice_id),
                ), admin_url('admin-post.php')),
            'duplicator_set_admin_notice_viewed',
            'nonce'
        );
        ?>
        <div class="notice updated duplicator-message duplicator-message-dismissed" data-notice_id="<?php echo esc_attr($notice_id); ?>">
            <div class="duplicator-message-inner">
                <div class="duplicator-message-icon">
                    <img src="<?php echo esc_url(DUPLICATOR_PLUGIN_URL."assets/img/logo.png"); ?>" style="text-align:top; margin:0; height:60px; width:60px;" alt="Duplicator">
                </div>
                <div class="duplicator-message-content">
                    <p><strong><?php echo __('Congrats!', 'duplicator'); ?></strong> <?php printf(esc_html__('You created over %d packages with Duplicator. Great job! If you can spare a minute, please help us by leaving a five star review on WordPress.org.', 'duplicator'), DUPLICATOR_FEEDBACK_NOTICE_SHOW_AFTER_NO_PACKAGE); ?></p>
                    <p class="duplicator-message-actions">
                        <a href="https://wordpress.org/support/plugin/duplicator/reviews/?filter=5/#new-post" target="_blank" class="button button-primary duplicator-notice-rate-now"><?php esc_html_e("Sure! I'd love to help", 'duplicator'); ?></a>
                        <a href="<?php echo esc_url_raw($dismiss_url); ?>" class="button duplicator-notice-dismiss"><?php esc_html_e('Hide Notification', 'duplicator'); ?></a>
                    </p>
                </div>
            </div>
        </div>
        <?php
    }

    /**
     * Shows a display message in the wp-admin if the logged in user role has not export capability
     *
     * @return void
     */
    public static function showNoExportCapabilityNotice()
    {
        if (is_admin() && in_array('administrator', $GLOBALS['current_user']->roles) && !current_user_can('export')) {
            $errorMessage = __('<strong>Duplicator</strong><hr> Your logged-in user role does not have export capability so you don\'t have access to Duplicator functionality.', 'duplicator').
                "<br>".
                sprintf(__('<strong>RECOMMENDATION:</strong> Add export capability to your role. See FAQ: <a target="_blank" href="%s">%s</a>', 'duplicator'), 'https://snapcreek.com/duplicator/docs/faqs-tech/#faq-licensing-040-q', __('Why is the Duplicator/Packages menu missing from my admin menu?', 'duplicator'));
            DUP_UI_Notice::displayGeneralAdminNotice($errorMessage, self::GEN_ERROR_NOTICE, true);
        }
    }

    /**
     * display genral admin notice by printing it
     *
     * @param string $htmlMsg html code to be printed
     * @param integer $noticeType constant value of SELF::GEN_
     * @param boolean $isDismissible whether the notice is dismissable or not. Default is true 
     * @param array|string $extraClasses add more classes to the notice div
     * @return void
     */
    public static function displayGeneralAdminNotice($htmlMsg, $noticeType, $isDismissible = true, $extraClasses = array())
    {
        if (empty($extraClasses)) {
            $classes = array();
        } elseif (is_array($extraClasses)) {
            $classes = $extraClasses;
        } else {
            $classes = array($extraClasses);
        }

        $classes[] = 'notice';

        switch ($noticeType) {
            case self::GEN_INFO_NOTICE:
                $classes[] = 'notice-info';
                break;
            case self::GEN_SUCCESS_NOTICE:
                $classes[] = 'notice-success';
                break;
            case self::GEN_WARNING_NOTICE:
                $classes[] = 'notice-warning';
                break;
            case self::GEN_ERROR_NOTICE:
                $classes[] = 'notice-error';
                break;
            default:
                throw new Exception('Invalid Admin notice type!');
        }

        if ($isDismissible) {
            $classes[] = 'is-dismissible';
        }

        $classesStr = implode(' ', $classes);
        ?>
        <div class="<?php echo esc_attr($classesStr); ?>">
            <p>
                <?php
                if (self::GEN_ERROR_NOTICE == $noticeType) {
                    ?>
                    <i class='fa fa-exclamation-triangle'></i>
                    <?php
                }
                ?>
                <?php
                echo $htmlMsg;
                ?>
            </p>
        </div>
        <?php
    }
}classes/ui/class.ui.viewstate.php000064400000004457151336065400013077 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Gets the view state of UI elements to remember its viewable state
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/ui
 * @copyright (c) 2017, Snapcreek LLC
 *
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_UI_ViewState
{
    /**
     * The key used in the wp_options table
     *
     * @var string
     */
    private static $optionsViewStateKey = 'duplicator_ui_view_state';

    /**
     * Save the view state of UI elements
     *
     * @param string $key A unique key to define the UI element
     * @param string $value A generic value to use for the view state
     *
     * @return bool Returns true if the value was successfully saved
     */
    public static function save($key, $value)
    {
        $view_state       = array();
        $view_state       = get_option(self::$optionsViewStateKey);
        $view_state[$key] = $value;
        $success          = update_option(self::$optionsViewStateKey, $view_state);
        return $success;
    }

    /**
     * 	Gets all the values from the settings array
     *
     *  @return array Returns and array of all the values stored in the settings array
     */
    public static function getArray()
    {
        return get_option(self::$optionsViewStateKey);
    }

    /**
     * Sets all the values from the settings array
     * @param array $view_state states
     * 
     * @return boolean Returns whether updated or not
     */
    public static function setArray($view_state)
    {
        return update_option(self::$optionsViewStateKey, $view_state);
    }

    /**
     * Return the value of the of view state item
     *
     * @param type $searchKey The key to search on
     * @return string Returns the value of the key searched or null if key is not found
     */
    public static function getValue($searchKey)
    {
        $view_state = get_option(self::$optionsViewStateKey);
        if (is_array($view_state)) {
            foreach ($view_state as $key => $value) {
                if ($key == $searchKey) {
                    return $value;
                }
            }
        }
        return null;
    }
}classes/class.db.php000064400000020052151336065400010405 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Lightweight abstraction layer for common simple database routines
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 *
 */
// Exit if accessed directly
if (!defined('DUPLICATOR_VERSION')) exit;

class DUP_DB extends wpdb
{
    const MAX_TABLE_COUNT_IN_PACKET    = 100;
    
	public static $remove_placeholder_escape_exists = null;

	public static function init()
	{
		global $wpdb;
		self::$remove_placeholder_escape_exists = method_exists($wpdb, 'remove_placeholder_escape');
	}

	/**
	 * Get the requested MySQL system variable
	 *
	 * @param string $name The database variable name to lookup
	 *
	 * @return string the server variable to query for
	 */
	public static function getVariable($name)
	{
		global $wpdb;
		if (strlen($name)) {
			$row = $wpdb->get_row("SHOW VARIABLES LIKE '{$name}'", ARRAY_N);
			return isset($row[1]) ? $row[1] : null;
		} else {
			return null;
		}
	}

	/**
	 * Gets the MySQL database version number
	 *
	 * @param bool $full    True:  Gets the full version
	 *                      False: Gets only the numeric portion i.e. 5.5.6 or 10.1.2 (for MariaDB)
	 *
	 * @return false|string 0 on failure, version number on success
	 */
	public static function getVersion($full = false)
	{
		global $wpdb;

		if ($full) {
			$version = self::getVariable('version');
		} else {
			$version = preg_replace('/[^0-9.].*/', '', self::getVariable('version'));
		}

		//Fall-back for servers that have restricted SQL for SHOW statement
		if (empty($version)) {
			$version = $wpdb->db_version();
		}

		return empty($version) ? 0 : $version;
	}

	/**
	 * Try to return the mysqldump path on Windows servers
	 *
	 * @return boolean|string
	 */
	public static function getWindowsMySqlDumpRealPath()
	{
		if (function_exists('php_ini_loaded_file')) {
			$get_php_ini_path = php_ini_loaded_file();
			if (file_exists($get_php_ini_path)) {
				$search = array(
					dirname(dirname($get_php_ini_path)).'/mysql/bin/mysqldump.exe',
					dirname(dirname(dirname($get_php_ini_path))).'/mysql/bin/mysqldump.exe',
					dirname(dirname($get_php_ini_path)).'/mysql/bin/mysqldump',
					dirname(dirname(dirname($get_php_ini_path))).'/mysql/bin/mysqldump',
				);

				foreach ($search as $mysqldump) {
					if (file_exists($mysqldump)) {
						return str_replace("\\", "/", $mysqldump);
					}
				}
			}
		}

		unset($search);
		unset($get_php_ini_path);

		return false;
	}

    /**
     * Returns the correct database build mode PHP, MYSQLDUMP, PHPCHUNKING
     *
     * @return string	Returns a string with one of theses three values PHP, MYSQLDUMP, PHPCHUNKING
     */
    public static function getBuildMode()
    {
        $package_mysqldump = DUP_Settings::Get('package_mysqldump');
        $mysqlDumpPath     = DUP_DB::getMySqlDumpPath();

        return ($mysqlDumpPath && $package_mysqldump) ? 'MYSQLDUMP' : 'PHP';
    }

    /**
     * Returns the mysqldump path if the server is enabled to execute it otherwise false
     *
     * @return boolean|string
     */
    public static function getMySqlDumpPath()
    {
        //Is shell_exec possible
        if (!DUP_Util::hasShellExec()) {
            return false;
        }

        $custom_mysqldump_path = DUP_Settings::Get('package_mysqldump_path');
        $custom_mysqldump_path = (strlen($custom_mysqldump_path)) ? $custom_mysqldump_path : '';

        //Common Windows Paths
        if (DUP_Util::isWindows()) {
            $paths = array(
                $custom_mysqldump_path,
                'mysqldump.exe',
                self::getWindowsMySqlDumpRealPath(),
                'C:/xampp/mysql/bin/mysqldump.exe',
                'C:/Program Files/xampp/mysql/bin/mysqldump',
                'C:/Program Files/MySQL/MySQL Server 6.0/bin/mysqldump',
                'C:/Program Files/MySQL/MySQL Server 5.5/bin/mysqldump',
                'C:/Program Files/MySQL/MySQL Server 5.4/bin/mysqldump'
            );

            //Common Linux Paths
        } else {
            $paths = array(
                $custom_mysqldump_path,
                'mysqldump',
                '/usr/local/bin/mysqldump',
                '/usr/local/mysql/bin/mysqldump',
                '/usr/mysql/bin/mysqldump',
                '/usr/bin/mysqldump',
                '/opt/local/lib/mysql6/bin/mysqldump',
				'/opt/local/lib/mysql5/bin/mysqldump',
				'/usr/bin/mysqldump',
            );
        }

		$exec_available = function_exists('exec');
        foreach ($paths as $path) {
			if (@file_exists($path)) {
				if (DUP_Util::isExecutable($path)) {
					return $path;
				}
			} elseif ($exec_available) {
				$out = array();
				$rc  = -1;
				$cmd = $path . ' --help';
				@exec($cmd, $out, $rc);
				if ($rc === 0) {
					return $path;
				}
			}
        }

        return false;
    }

    /**
     * Returns all collation types that are assigned to the tables and columns table in
     * the current database.  Each element in the array is unique
     *
     * @param array &$tablesToInclude A list of tables to include in the search.
     *        Parameter does not change in the function, is passed by reference only to avoid copying.
     *
     * @return array    Returns an array with all the collation types being used
     */
    public static function getTableCollationList(&$tablesToInclude)
    {
        global $wpdb;
        static $collations = null;
        if (is_null($collations)) {
            $collations = array();
            //use half the number of tables since we are using them twice
            foreach (array_chunk($tablesToInclude, self::MAX_TABLE_COUNT_IN_PACKET) as $tablesChunk) {
                $sqlTables = implode(",", array_map(array(__CLASS__, 'escValueToQueryString'), $tablesChunk));

                //UNION is by default DISTINCT
                $query = "SELECT `COLLATION_NAME` FROM `information_schema`.`columns` WHERE `COLLATION_NAME` IS NOT NULL AND `table_schema` = '{$wpdb->dbname}' "
                    . "AND `table_name` in (" . $sqlTables . ")"
                    . "UNION SELECT `TABLE_COLLATION` FROM `information_schema`.`tables` WHERE `TABLE_COLLATION` IS NOT NULL AND `table_schema` = '{$wpdb->dbname}' "
                    . "AND `table_name` in (" . $sqlTables . ")";

                if (!$wpdb->query($query)) {
                    DUP_Log::Info("GET TABLE COLLATION ERROR: " . $wpdb->last_error);
                    continue;
                }

                $collations = array_unique(array_merge($collations, $wpdb->get_col()));
            }
            sort($collations);
        }
        return $collations;
    }

	/**
	 * Returns an escaped SQL string
	 *
	 * @param string	$sql						The SQL to escape
	 * @param bool		$removePlaceholderEscape	Patch for how the default WP function works.
	 *
	 * @return boolean|string
	 * @also see: https://make.wordpress.org/core/2017/10/31/changed-behaviour-of-esc_sql-in-wordpress-4-8-3/
	 */
	public static function escSQL($sql, $removePlaceholderEscape = false)
	{
		global $wpdb;

		$removePlaceholderEscape = $removePlaceholderEscape && self::$remove_placeholder_escape_exists;

		if ($removePlaceholderEscape) {
			return $wpdb->remove_placeholder_escape(@esc_sql($sql));
		} else {
			return @esc_sql($sql);
		}
	}
    
     /**
     * this function escape sql string without add and remove remove_placeholder_escape
     * doesn't work on array
     *
     * @global type $wpdb
     * @param mixed $sql
     * @return string
     */
    public static function escValueToQueryString($value)
    {
        global $wpdb;

        if (is_null($value)) {
            return 'NULL';
        }

        if ($wpdb->use_mysqli) {
            return '"'.mysqli_real_escape_string($wpdb->dbh, $value).'"';
        } else {
            return '"'.mysql_real_escape_string($value, $wpdb->dbh).'"';
        }
    }
}classes/class.password.php000064400000014360151336065400011667 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
#
# Portable PHP password hashing framework.
#
# Version 0.5 / genuine.
#
# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
# the public domain.  Revised in subsequent years, still public domain.
#
# There's absolutely no warranty.
#
# The homepage URL for this framework is:
#
#	http://www.openwall.com/phpass/
#
# Please be sure to update the Version line if you edit this file in any way.
# It is suggested that you leave the main version number intact, but indicate
# your project name (after the slash) and add your own revision information.
#
# Please do not change the "private" password hashing method implemented in
# here, thereby making your hashes incompatible.  However, if you must, please
# change the hash type identifier (the "$P$") to something different.
#
# Obviously, since this code is in the public domain, the above are not
# requirements (there can be none), but merely suggestions.
#

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_PasswordHash
{

	var $itoa64;
	var $iteration_count_log2;
	var $portable_hashes;
	var $random_state;

	function __construct($iteration_count_log2, $portable_hashes)
	{
		$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

		if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
			$iteration_count_log2 = 8;
		$this->iteration_count_log2 = $iteration_count_log2;

		$this->portable_hashes = $portable_hashes;

		$this->random_state = microtime();
		if (function_exists('getmypid'))
			$this->random_state .= getmypid();
	}

	function PasswordHash($iteration_count_log2, $portable_hashes)
	{
		self::__construct($iteration_count_log2, $portable_hashes);
	}

	function get_random_bytes($count)
	{
		$output = '';
		if (@is_readable('/dev/urandom') &&
		    ($fh = @fopen('/dev/urandom', 'rb'))) {
			$output = fread($fh, $count);
			fclose($fh);
		}

		if (strlen($output) < $count) {
			$output = '';
			for ($i = 0; $i < $count; $i += 16) {
				$this->random_state =
				    md5(microtime() . $this->random_state);
				$output .= md5($this->random_state, TRUE);
			}
			$output = substr($output, 0, $count);
		}

		return $output;
	}

	function encode64($input, $count)
	{
		$output = '';
		$i = 0;
		do {
			$value = ord($input[$i++]);
			$output .= $this->itoa64[$value & 0x3f];
			if ($i < $count)
				$value |= ord($input[$i]) << 8;
			$output .= $this->itoa64[($value >> 6) & 0x3f];
			if ($i++ >= $count)
				break;
			if ($i < $count)
				$value |= ord($input[$i]) << 16;
			$output .= $this->itoa64[($value >> 12) & 0x3f];
			if ($i++ >= $count)
				break;
			$output .= $this->itoa64[($value >> 18) & 0x3f];
		} while ($i < $count);

		return $output;
	}

	function gensalt_private($input)
	{
		$output = '$P$';
		$output .= $this->itoa64[min($this->iteration_count_log2 +
			((PHP_VERSION >= '5') ? 5 : 3), 30)];
		$output .= $this->encode64($input, 6);

		return $output;
	}

	function crypt_private($password, $setting)
	{
		$output = '*0';
		if (substr($setting, 0, 2) === $output)
			$output = '*1';

		$id = substr($setting, 0, 3);
		# We use "$P$", phpBB3 uses "$H$" for the same thing
		if ($id !== '$P$' && $id !== '$H$')
			return $output;

		$count_log2 = strpos($this->itoa64, $setting[3]);
		if ($count_log2 < 7 || $count_log2 > 30)
			return $output;

		$count = 1 << $count_log2;

		$salt = substr($setting, 4, 8);
		if (strlen($salt) !== 8)
			return $output;

		# We were kind of forced to use MD5 here since it's the only
		# cryptographic primitive that was available in all versions
		# of PHP in use.  To implement our own low-level crypto in PHP
		# would have resulted in much worse performance and
		# consequently in lower iteration counts and hashes that are
		# quicker to crack (by non-PHP code).
		$hash = md5($salt . $password, TRUE);
		do {
			$hash = md5($hash . $password, TRUE);
		} while (--$count);

		$output = substr($setting, 0, 12);
		$output .= $this->encode64($hash, 16);

		return $output;
	}

	function gensalt_blowfish($input)
	{
		# This one needs to use a different order of characters and a
		# different encoding scheme from the one in encode64() above.
		# We care because the last character in our encoded string will
		# only represent 2 bits.  While two known implementations of
		# bcrypt will happily accept and correct a salt string which
		# has the 4 unused bits set to non-zero, we do not want to take
		# chances and we also do not want to waste an additional byte
		# of entropy.
		$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

		$output = '$2a$';
		$output .= chr(ord('0') + (int)($this->iteration_count_log2 / 10));
		$output .= chr(ord('0') + $this->iteration_count_log2 % 10);
		$output .= '$';

		$i = 0;
		do {
			$c1 = ord($input[$i++]);
			$output .= $itoa64[$c1 >> 2];
			$c1 = ($c1 & 0x03) << 4;
			if ($i >= 16) {
				$output .= $itoa64[$c1];
				break;
			}

			$c2 = ord($input[$i++]);
			$c1 |= $c2 >> 4;
			$output .= $itoa64[$c1];
			$c1 = ($c2 & 0x0f) << 2;

			$c2 = ord($input[$i++]);
			$c1 |= $c2 >> 6;
			$output .= $itoa64[$c1];
			$output .= $itoa64[$c2 & 0x3f];
		} while (1);

		return $output;
	}

	function HashPassword($password)
	{
		$random = '';

		if (CRYPT_BLOWFISH === 1 && !$this->portable_hashes) {
			$random = $this->get_random_bytes(16);
			$hash =
			    crypt($password, $this->gensalt_blowfish($random));
			if (strlen($hash) === 60)
				return $hash;
		}

		if (strlen($random) < 6)
			$random = $this->get_random_bytes(6);
		$hash =
		    $this->crypt_private($password,
		    $this->gensalt_private($random));
		if (strlen($hash) === 34)
			return $hash;

		# Returning '*' on error is safe here, but would _not_ be safe
		# in a crypt(3)-like function used _both_ for generating new
		# hashes and for validating passwords against existing hashes.
		return '*';
	}

	function CheckPassword($password, $stored_hash)
	{
		$hash = $this->crypt_private($password, $stored_hash);
		if ($hash[0] === '*')
			$hash = crypt($password, $stored_hash);

		return $hash === $stored_hash;
	}
}

classes/class.logging.php000064400000035515151336065400011460 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (!defined('DUPLICATOR_VERSION')) exit;

/**
 * Helper Class for logging
 * @package Duplicator\classes
 */
abstract class Dup_ErrorBehavior
{
	const LogOnly			 = 0;
	const ThrowException	 = 1;
	const Quit			 = 2;
}

class DUP_Log
{
    /**
     * The file handle used to write to the package log file
     */
    private static $logFileHandle = null;

    /**
     * Get the setting which indicates if tracing is enabled
     */
    private static $traceEnabled = false;

    public static $profileLogs = null;
    
	/**
	 * Init this static object
	 */
	public static function Init()
	{
		self::$traceEnabled = (DUP_Settings::Get('trace_log_enabled') == 1);
	}

    /**
     * Open a log file connection for writing to the package log file
     *
     * @param string $nameHas The Name of the log file to create
     *
     * @return nul
     */
    public static function Open($nameHash)
    {
        if (!isset($nameHash)) {
            throw new Exception("A name value is required to open a file log.");
        }
        self::Close();
        if ((self::$logFileHandle = @fopen(DUP_Settings::getSsdirPath()."/{$nameHash}.log", "a+")) === false) {
            self::$logFileHandle = null;
            return false;
        } else {
            /**
             * By initializing the error_handler on opening the log, I am sure that when a package is processed, the handler is active.
             */
            DUP_Handler::init_error_handler();
            return true;
        }
    }

    /**
     * Close the package log file connection if is opened
     *
     * @return bool Returns TRUE on success or FALSE on failure.
     */
    public static function Close()
    {
        $result = true;
        
        if (!is_null(self::$logFileHandle)) {
            $result              = @fclose(self::$logFileHandle);
            self::$logFileHandle = null;
        } else {
            $result = true;
        }
        return $result;
    }

    /**
     *  General information send to the package log if opened
     *  @param string $msg	The message to log
     *
     *  REPLACE TO DEBUG: Memory consumption as script runs
     * 	$results = DUP_Util::byteSize(memory_get_peak_usage(true)) . "\t" . $msg;
     * 	@fwrite(self::$logFileHandle, "{$results} \n");
     *
     *  @param string $msg	The message to log
     *
     *  @return null
     */
    public static function Info($msg)
    {
        if (self::$traceEnabled) {
            self::Trace($msg);
        }
        if (!is_null(self::$logFileHandle)) {
            @fwrite(self::$logFileHandle, $msg."\n");
        }
    }

    public static function print_r_info($val, $name = '')
    {
        $msg = empty($name) ? '' : 'VALUE '.$name.': ';
        $msg .= print_r($val, true);
        self::info($msg);
    }

	/**
	 * Does the trace file exists
	 *
	 * @return bool Returns true if an active trace file exists
	 */
	public static function TraceFileExists()
	{
		$file_path = self::getTraceFilepath();
		return file_exists($file_path);
	}

	/**
	 * Gets the current file size of the active trace file
	 *
	 * @return string   Returns a human readable file size of the active trace file
	 */
	public static function getTraceStatus()
	{
		$file_path	 = DUP_Log::getTraceFilepath();
		$backup_path = DUP_Log::getBackupTraceFilepath();

		if (file_exists($file_path)) {

            $filesize = is_file($file_path) ? @filesize($file_path) : 0;

            //Its possible mulitple trace log files exist due to size
			if (is_file($backup_path)) {
				$filesize += @filesize($backup_path);
			}

			$message = sprintf('%1$s', DUP_Util::byteSize($filesize));
		} else {
			$message = esc_html__('No Log', 'duplicator');
		}

		return $message;
	}

	// RSR TODO: Swap trace logic out for real trace later
	public static function Trace($message, $calling_function_override = null)
	{

		if (self::$traceEnabled) {
			$unique_id = sprintf("%08x", abs(crc32($_SERVER['REMOTE_ADDR'].$_SERVER['REQUEST_TIME'].$_SERVER['REMOTE_PORT'])));

			if ($calling_function_override == null) {
				$calling_function = DupLiteSnapLibUtil::getCallingFunctionName();
			} else {
				$calling_function = $calling_function_override;
			}

			if (is_object($message)) {
				$ov		 = get_object_vars($message);
				$message = print_r($ov, true);
			} else if (is_array($message)) {
				$message = print_r($message, true);
			}

			$logging_message			 = "{$unique_id}|{$calling_function} | {$message}";
			$ticks						 = time() + ((int) get_option('gmt_offset') * 3600);
			$formatted_time				 = date('d-m-H:i:s', $ticks);
			$formatted_logging_message	 = "{$formatted_time}|DUP|{$logging_message} \r\n";

			// Always write to error log - if they don't want the info they can turn off WordPress error logging or tracing
			self::ErrLog($logging_message);

			// Everything goes to the plugin log, whether it's part of package generation or not.
			self::WriteToTrace($formatted_logging_message);
		}
	}

    public static function print_r_trace($val, $name = '', $calling_function_override = null)
    {
        $msg = empty($name) ? '' : 'VALUE '.$name.': ';
        $msg .= print_r($val, true);
        self::trace($msg, $calling_function_override);
    }

	public static function errLog($message)
	{
		$message = 'DUP:'.$message;
		error_log($message);
	}

	public static function TraceObject($msg, $o, $log_private_members = true)
	{
		if (self::$traceEnabled) {
			if (!$log_private_members) {
				$o = get_object_vars($o);
			}
			self::Trace($msg.':'.print_r($o, true));
		}
	}

	public static function GetDefaultKey()
	{
		$auth_key	 = defined('AUTH_KEY') ? AUTH_KEY : 'atk';
		$auth_key	 .= defined('DB_HOST') ? DB_HOST : 'dbh';
		$auth_key	 .= defined('DB_NAME') ? DB_NAME : 'dbn';
		$auth_key	 .= defined('DB_USER') ? DB_USER : 'dbu';
		return hash('md5', $auth_key);
	}

    /**
	 * Gets the current file size of the old trace file "1"
	 *
	 * @return string   Returns a human readable file size of the active trace file
	 */
	public static function GetBackupTraceFilepath()
	{
		$default_key		 = self::getDefaultKey();
		$backup_log_filename = "dup_$default_key.log1";
		$backup_path		 = DUP_Settings::getSsdirPath()."/".$backup_log_filename;
		return $backup_path;
	}

	/**
	 * Gets the active trace file path
	 *
	 * @return string   Returns the full path to the active trace file (i.e. dup-pro_hash.log)
	 */
	public static function GetTraceFilepath()
	{
		$default_key	 = self::getDefaultKey();
		$log_filename	 = "dup_$default_key.log";
		$file_path		 = DUP_Settings::getSsdirPath()."/".$log_filename;
		return $file_path;
	}

	/**
	 * Deletes the trace log and backup trace log files
	 *
	 * @return null
	 */
	public static function DeleteTraceLog()
	{
		$file_path	 = self::GetTraceFilepath();
		$backup_path = self::GetBackupTraceFilepath();
		self::trace("deleting $file_path");
		@unlink($file_path);
		self::trace("deleting $backup_path");
		@unlink($backup_path);
	}

    /**
     *  Called when an error is detected and no further processing should occur
     * @param string $msg The message to log
     * @param string $detail Additional details to help resolve the issue if possible
     * @param int $behavior
     * @throws Exception
     */
	public static function error($msg, $detail = '', $behavior = Dup_ErrorBehavior::Quit)
	{

		error_log($msg.' DETAIL:'.$detail);
		$source = self::getStack(debug_backtrace());

		$err_msg = "\n==================================================================================\n";
		$err_msg .= "DUPLICATOR ERROR\n";
		$err_msg .= "Please try again! If the error persists see the Duplicator 'Help' menu.\n";
		$err_msg .= "---------------------------------------------------------------------------------\n";
		$err_msg .= "MESSAGE:\n\t{$msg}\n";
		if (strlen($detail)) {
			$err_msg .= "DETAILS:\n\t{$detail}\n";
		}
		$err_msg .= "TRACE:\n{$source}";
		$err_msg .= "==================================================================================\n\n";
		@fwrite(self::$logFileHandle, "{$err_msg}");

		switch ($behavior) {
            
			case Dup_ErrorBehavior::ThrowException:
				DUP_LOG::trace("throwing exception");
                throw new Exception($msg);
				break;

			case Dup_ErrorBehavior::Quit:
				DUP_LOG::trace("quitting");
				die("DUPLICATOR ERROR: Please see the 'Package Log' file link below.");
				break;

			default:
			// Nothing
		}
	}

	/**
	 * The current stack trace of a PHP call
	 * @param $stacktrace The current debug stack
	 * @return string
	 */
	public static function getStack($stacktrace)
	{
		$output	 = "";
		$i		 = 1;
		foreach ($stacktrace as $node) {
			$output .= "\t $i. ".basename($node['file'])." : ".$node['function']." (".$node['line'].")\n";
			$i++;
		}
		return $output;
	}

	/**
	 * Manages writing the active or backup log based on the size setting
	 *
	 * @return null
	 */
	private static function WriteToTrace($formatted_logging_message)
	{
		$log_filepath = self::GetTraceFilepath();

		if (@filesize($log_filepath) > DUPLICATOR_MAX_LOG_SIZE) {
			$backup_log_filepath = self::GetBackupTraceFilepath();

			if (file_exists($backup_log_filepath)) {
				if (@unlink($backup_log_filepath) === false) {
					self::errLog("Couldn't delete backup log $backup_log_filepath");
				}
			}

			if (@rename($log_filepath, $backup_log_filepath) === false) {
				self::errLog("Couldn't rename log $log_filepath to $backup_log_filepath");
			}
		}

		if (@file_put_contents($log_filepath, $formatted_logging_message, FILE_APPEND) === false) {
			// Not en error worth reporting
		}
	}
}

class DUP_Handler
{
    const MODE_OFF         = 0; // don't write in log
    const MODE_LOG         = 1; // write errors in log file
    const MODE_VAR         = 2; // put php errors in $varModeLog static var
    const SHUTDOWN_TIMEOUT = 'tm';

    /**
     *
     * @var bool
     */
    private static $initialized = false;

    /**
     *
     * @var array
     */
    private static $shutdownReturns = array(
        'tm' => 'timeout'
    );

    /**
     *
     * @var int
     */
    private static $handlerMode = self::MODE_LOG;

    /**
     *
     * @var bool // print code reference and errno at end of php error line  [CODE:10|FILE:test.php|LINE:100]
     */
    private static $codeReference = true;

    /**
     *
     * @var bool // print prefix in php error line [PHP ERR][WARN] MSG: .....
     */
    private static $errPrefix = true;

    /**
     *
     * @var string // php errors in MODE_VAR
     */
    private static $varModeLog = '';

    /**
     * This function only initializes the error handler the first time it is called
     */
    public static function init_error_handler()
    {
        if (!self::$initialized) {
            @set_error_handler(array(__CLASS__, 'error'));
            @register_shutdown_function(array(__CLASS__, 'shutdown'));
            self::$initialized = true;
        }
    }

    /**
     * Error handler
     *
     * @param  integer $errno   Error level
     * @param  string  $errstr  Error message
     * @param  string  $errfile Error file
     * @param  integer $errline Error line
     * @return void
     */
    public static function error($errno, $errstr, $errfile, $errline)
    {
        switch (self::$handlerMode) {
            case self::MODE_OFF:
                if ($errno == E_ERROR) {
                    $log_message = self::getMessage($errno, $errstr, $errfile, $errline);
                    DUP_Log::error($log_message);
                }
                break;
            case self::MODE_VAR:
                self::$varModeLog .= self::getMessage($errno, $errstr, $errfile, $errline)."\n";
                break;
            case self::MODE_LOG:
            default:
                switch ($errno) {
                    case E_ERROR :
                        $log_message = self::getMessage($errno, $errstr, $errfile, $errline);
                        DUP_Log::error($log_message);
                        break;
                    case E_NOTICE :
                    case E_WARNING :
                    default :
                        $log_message = self::getMessage($errno, $errstr, $errfile, $errline);
                        DUP_Log::Info($log_message);
                        break;
                }
        }
    }

    private static function getMessage($errno, $errstr, $errfile, $errline)
    {
        $result = '';

        if (self::$errPrefix) {
            $result = '[PHP ERR]';
            switch ($errno) {
                case E_ERROR :
                    $result .= '[FATAL]';
                    break;
                case E_WARNING :
                    $result .= '[WARN]';
                    break;
                case E_NOTICE :
                    $result .= '[NOTICE]';
                    break;
                default :
                    $result .= '[ISSUE]';
                    break;
            }
            $result .= ' MSG:';
        }

        $result .= $errstr;

        if (self::$codeReference) {
            $result .= ' [CODE:'.$errno.'|FILE:'.$errfile.'|LINE:'.$errline.']';
            $result .= "\n".wp_debug_backtrace_summary();
        }

        return $result;
    }

    /**
     * if setMode is called without params set as default
     *
     * @param int $mode
     * @param bool $errPrefix // print prefix in php error line [PHP ERR][WARN] MSG: .....
     * @param bool $codeReference // print code reference and errno at end of php error line  [CODE:10|FILE:test.php|LINE:100]
     */
    public static function setMode($mode = self::MODE_LOG, $errPrefix = true, $codeReference = true)
    {
        switch ($mode) {
            case self::MODE_OFF:
            case self::MODE_VAR:
                self::$handlerMode = $mode;
                break;
            case self::MODE_LOG:
            default:
                self::$handlerMode = self::MODE_LOG;
        }

        self::$varModeLog    = '';
        self::$errPrefix     = $errPrefix;
        self::$codeReference = $codeReference;
    }

    /**
     *
     * @return string // return var log string in MODE_VAR
     */
    public static function getVarLog()
    {
        return self::$varModeLog;
    }

    /**
     *
     * @return string // return var log string in MODE_VAR and clean var
     */
    public static function getVarLogClean()
    {
        $result           = self::$varModeLog;
        self::$varModeLog = '';
        return $result;
    }

    /**
     *
     * @param string $status // timeout
     * @param string
     */
    public static function setShutdownReturn($status, $str)
    {
        self::$shutdownReturns[$status] = $str;
    }

    /**
     * Shutdown handler
     *
     * @return void
     */
    public static function shutdown()
    {
        if (($error = error_get_last())) {
            if (preg_match('/^Maximum execution time (?:.+) exceeded$/i', $error['message'])) {
                echo self::$shutdownReturns[self::SHUTDOWN_TIMEOUT];
            }
            self::error($error['type'], $error['message'], $error['file'], $error['line']);
        }
    }
}
classes/utilities/class.u.shell.php000064400000002452151336065400013411 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_Shell_U
{
    /**
     * Escape a string to be used as a shell argument with bypass support for Windows
     *
     * 	NOTES:
     * 		Provides a way to support shell args on Windows OS and allows %,! on Windows command line
     * 		Safe if input is know such as a defined constant and not from user input escape shellarg
     * 		on Windows with turn %,! into spaces
     *
     * @return string
     */
    public static function escapeshellargWindowsSupport($string)
    {
        if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
            if (strstr($string, '%') || strstr($string, '!')) {
                $result = '"'.str_replace('"', '', $string).'"';
                return $result;
            }
        }
        return escapeshellarg($string);
    }

    /**
     *
     * @return boolean
     *
     */
    public static function isPopenEnabled() {

        if (!DUP_Util::isIniFunctionEnalbe('popen') || !DUP_Util::isIniFunctionEnalbe('proc_open')) {
            $ret = false;
        } else {
            $ret = true;
        }

        $ret = apply_filters('duplicator_is_popen_enabled', $ret);
        return $ret;
    }
}classes/utilities/class.u.zip.php000064400000013646151336065400013113 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Utility class for zipping up content
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_Zip_U
{
    /**
     * Add a directory to an existing ZipArchive object
     *
     * @param ZipArchive $zipArchive        An existing ZipArchive object
     * @param string     $directoryPath     The full directory path to add to the ZipArchive
     * @param bool       $retainDirectory   Should the full directory path be retained in the archive
     *
     * @return bool Returns true if the directory was added to the object
     */
    public static function addDirWithZipArchive(&$zipArchive, $directoryPath, $retainDirectory, $localPrefix, $isCompressed)
    {
        $success = TRUE;
        $directoryPath = rtrim($directoryPath, '/\\').'/';
		if (!$fp = @opendir($directoryPath)) {
			return FALSE;
		}
		while (FALSE !== ($file = readdir($fp))) {
			if ($file === '.' || $file === '..')    continue;
            $objectPath = $directoryPath . $file;
            // Not used DUP_U::safePath(), because I would like to decrease max_nest_level
            // Otherwise we will get the error:
            // PHP Fatal error:  Uncaught Error: Maximum function nesting level of '512' reached, aborting! in ...
            // $objectPath = DUP_U::safePath($objectPath);
            $objectPath = str_replace("\\", '/', $objectPath);
            $localName = ltrim(str_replace($directoryPath, '', $objectPath), '/');
            if ($retainDirectory) {
                $localName = basename($directoryPath)."/$localName";
            }
            $localName = $localPrefix . $localName;

			if (is_dir($objectPath)) {
                $localPrefixArg = substr($localName, 0, strrpos($localName, '/')).'/';
                $added = self::addDirWithZipArchive($zipArchive, $objectPath, $retainDirectory, $localPrefixArg, $isCompressed);
			} else if (is_readable($objectPath)) {
                $added = DUP_Zip_U::addFileToZipArchive($zipArchive, $objectPath, $localName, $isCompressed);                
            } else {
                $added = FALSE;
            }

            if (!$added) {
                DUP_Log::error("Couldn't add file $objectPath to archive", '', false);
                $success = FALSE;
                break;
            }
		}
		@closedir($fp);
		return $success;
    }


    public static function extractFiles($archiveFilepath, $relativeFilesToExtract, $destinationDirectory, $useShellUnZip)
    {
        // TODO: Unzip using either shell unzip or ziparchive
        if($useShellUnZip) {
            $shellExecPath = DUPX_Server::get_unzip_filepath();
            $filenameString = implode(' ', $relativeFilesToExtract);
            $command = "{$shellExecPath} -o -qq \"{$archiveFilepath}\" {$filenameString} -d {$destinationDirectory} 2>&1";
            $stderr = shell_exec($command);

            if ($stderr != '') {
                $errorMessage = DUP_U::__("Error extracting {$archiveFilepath}): {$stderr}");

                throw new Exception($errorMessage);
            }
        } else {
            $zipArchive = new ZipArchive();
            $result = $zipArchive->open($archiveFilepath);

            if($result !== true) {
                throw new Exception("Error opening {$archiveFilepath} when extracting. Error code: {$retVal}");
            }

            $result = $zipArchive->extractTo($destinationDirectory, $relativeFilesToExtract);

            if($result === false) {
                throw new Exception("Error extracting {$archiveFilepath}.");
            }
        }
    }

    /**
     * Add a directory to an existing ZipArchive object
     *
     * @param string    $sourceFilePath     The file to add to the zip file
     * @param string    $zipFilePath        The zip file to be added to
     * @param bool      $deleteOld          Delete the zip file before adding a file
     * @param string    $newName            Rename the $sourceFile if needed
     *
     * @return bool Returns true if the file was added to the zip file
     */
	public static function zipFile($sourceFilePath, $zipFilePath, $deleteOld, $newName, $isCompressed)
    {
        if ($deleteOld && file_exists($zipFilePath)) {
            DUP_IO::deleteFile($zipFilePath);
        }

        if (file_exists($sourceFilePath)) {
            $zip_archive = new ZipArchive();

            $is_zip_open = ($zip_archive->open($zipFilePath, ZIPARCHIVE::CREATE) === TRUE);

            if ($is_zip_open === false) {
                DUP_Log::error("Cannot create zip archive {$zipFilePath}");
            } else {
                //ADD SQL
                if ($newName == null) {
                    $source_filename = basename($sourceFilePath);
                    DUP_Log::Info("adding {$source_filename}");
                } else {
                    $source_filename = $newName;
                    DUP_Log::Info("new name added {$newName}");
                }

                $in_zip = DUP_Zip_U::addFileToZipArchive($zip_archive, $sourceFilePath, $source_filename, $isCompressed);

                if ($in_zip === false) {
                    DUP_Log::error("Unable to add {$sourceFilePath} to $zipFilePath");
                }

                $zip_archive->close();

                return true;
            }
        } else {
            DUP_Log::error("Trying to add {$sourceFilePath} to a zip but it doesn't exist!");
        }

        return false;
    }

    public static function addFileToZipArchive(&$zipArchive, $filepath, $localName, $isCompressed)
    {
		$added = $zipArchive->addFile($filepath, $localName);
        return $added;
    }
}classes/utilities/class.u.string.php000064400000006011151336065400013603 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Utility class working with strings
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DUP
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
class DUP_STR
{

    /**
     * Append the value to the string if it doesn't already exist
     *
     * @param string $string The string to append to
     * @param string $value The string to append to the $string
     *
     * @return string Returns the string with the $value appended once
     */
    public static function appendOnce($string, $value)
    {
        return $string.(substr($string, -1) == $value ? '' : $value);
    }

    /**
     * Returns true if the string contains UTF8 characters
     * @see http://php.net/manual/en/function.mb-detect-encoding.php
     *
     * @param string  $string     The class name where the $destArray exists
     *
     * @return null
     */
    public static function hasUTF8($string)
    {
        return preg_match('%(?:
            [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
            |\xE0[\xA0-\xBF][\x80-\xBF]               # excluding overlongs
            |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
            |\xED[\x80-\x9F][\x80-\xBF]               # excluding surrogates
            |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
            |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
            |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
            )+%xs', $string);
    }

    /**
     * Returns true if the $needle is found in the $haystack
     *
     * @param string  $haystack     The full string to search in
     * @param string  $needle       The string to for
     *
     * @return bool
     */
    public static function contains($haystack, $needle)
    {
        $pos = strpos($haystack, $needle);
        return ($pos !== false);
    }

    /**
     * Returns true if the $haystack string starts with the $needle
     *
     * @param string  $haystack     The full string to search in
     * @param string  $needle       The string to for
     *
     * @return bool Returns true if the $haystack string starts with the $needle
     */
    public static function startsWith($haystack, $needle)
    {
        $length = strlen($needle);
        return (substr($haystack, 0, $length) === $needle);
    }

    /**
     * Returns true if the $haystack string ends with the $needle
     *
     * @param string  $haystack     The full string to search in
     * @param string  $needle       The string to for
     *
     * @return bool Returns true if the $haystack string ends with the $needle
     */
    public static function endsWith($haystack, $needle)
    {
        $length = strlen($needle);
        if ($length == 0) {
            return true;
        }
        return (substr($haystack, -$length) === $needle);
    }


}

classes/utilities/class.u.multisite.php000064400000001613151336065400014317 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Methods used to work with WordPress MU sites
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 *
 * @todo Refactor out IO methods into class.io.php file
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_MU
{
    public static function isMultisite()
    {
        return self::getMode() > 0;
    }

    // 0 = single site; 1 = multisite subdomain; 2 = multisite subdirectory
    public static function getMode()
    {
		if(is_multisite()) {
            if (defined('SUBDOMAIN_INSTALL') && SUBDOMAIN_INSTALL) {
                return 1;
            } else {
                return 2;
            }
        } else {
            return 0;
        }
    }
}classes/utilities/class.u.validator.php000064400000013417151336065400014272 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Validate variables
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 *
 */
// Exit if accessed directly
if (!defined('DUPLICATOR_VERSION')) {
    exit;
}

class DUP_Validator
{
    /**
     * @var array $patterns
     */
    private static $patterns = array(
        'fdir' => '/^([a-zA-Z]:[\\\\\/]|\/|\\\\\\\\|\/\/)[^<>\0]+$/',
        'ffile' => '/^([a-zA-Z]:[\\\\\/]|\/|\\\\\\\\|\/\/)[^<>\0]+$/',
        'fext' => '/^\.?[^\\\\\/*:<>\0?"|\s\.]+$/',
        'email' => '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_\`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/',
        'empty' => '/^$/',
        'nempty' => '/^.+$/',
    );

    const FILTER_VALIDATE_IS_EMPTY  = 'empty';
    const FILTER_VALIDATE_NOT_EMPTY = 'nempty';
    const FILTER_VALIDATE_FILE      = 'ffile';
    const FILTER_VALIDATE_FOLDER    = 'fdir';
    const FILTER_VALIDATE_FILE_EXT  = 'fext';
    const FILTER_VALIDATE_EMAIL     = 'email';

    /**
     * @var array $errors [ ['key' => string field key,
     *                      'msg' => error message ] , [] ]
     */
    private $errors = array();

    /**
     *
     */
    public function __construct()
    {
        $this->errors = array();
    }

    /**
     *
     */
    public function reset()
    {
        $this->errors = array();
    }

    /**
     *
     * @return bool
     */
    public function isSuccess()
    {
        return empty($this->errors);
    }

    /**
     *
     * @return array
     */
    public function getErrors()
    {
        return $this->errors;
    }

    /**
     *
     * @return array return errors messages
     */
    public function getErrorsMsg()
    {
        $result = array();
        foreach ($this->errors as $err) {
            $result[] = $err['msg'];
        }
        return $result;
    }

    /**
     *
     * @param string $format printf format message where %s is the variable content default "%s\n"
     * @param bool $echo if false return string
     * @return void|string
     */
    public function getErrorsFormat($format = "%s\n", $echo = true)
    {
        $msgs = $this->getErrorsMsg();

        ob_start();
        foreach ($msgs as $msg) {
            printf($format, $msg);
        }

        if ($echo) {
            ob_end_flush();
        } else {
            return ob_get_clean();
        }
    }

    /**
     *
     * @param string $key
     * @param string $msg
     */
    protected function addError($key, $msg)
    {
        $this->errors[] = array(
            'key' => $key,
            'msg' => $msg
        );
    }

    /**
     * filter_var function wrapper see http://php.net/manual/en/function.filter-var.php
     *
     * additional options
     * valkey => key of field
     * errmsg => error message; % s will be replaced with the contents of the variable  es. "<b>%s</b> isn't a valid field"
     * acc_vals => array of accepted values that skip validation
     *
     * @param mixed $variable
     * @param int $filter
     * @param array $options
     * @return mixed
     */
    public function filter_var($variable, $filter = FILTER_DEFAULT, $options = array())
    {
        $success = true;
        $result  = null;

        if (isset($options['acc_vals']) && in_array($variable, $options['acc_vals'])) {
            return $variable;
        }

        if ($filter === FILTER_VALIDATE_BOOLEAN) {
            $options['flags'] = FILTER_NULL_ON_FAILURE;

            $result = filter_var($variable, $filter, $options);

            if (is_null($result)) {
                $success = false;
            }
        } else {
            $result = filter_var($variable, $filter, $options);

            if ($result === false) {
                $success = false;
            }
        }

        if (!$success) {
            $key = isset($options['valkey']) ? $options['valkey'] : '';

            if (isset($options['errmsg'])) {
                $msg = sprintf($options['errmsg'], $variable);
            } else {
                $msg = sprintf('%1$s isn\'t a valid value', $variable);
            }

            $this->addError($key, $msg);
        }

        return $result;
    }

    /**
     * validation of predefined regular expressions
     *
     * @param mixed $variable
     * @param string $filter
     * @param array $options
     * @return type
     * @throws Exception
     */
    public function filter_custom($variable, $filter, $options = array())
    {

        if (!isset(self::$patterns[$filter])) {
            throw new Exception('Filter not valid');
        }

        $options = array_merge($options, array(
            'options' => array(
                'regexp' => self::$patterns[$filter])
            )
        );

        //$options['regexp'] = self::$patterns[$filter];

        return $this->filter_var($variable, FILTER_VALIDATE_REGEXP, $options);
    }

    /**
     * it explodes a string with a delimiter and validates every element of the array
     *
     * @param string $variable
     * @param string $delimiter
     * @param string $filter
     * @param array $options
     */
    public function explode_filter_custom($variable, $delimiter, $filter, $options = array())
    {
        if (empty($variable)) {
            return array();
        }

        $vals = explode($delimiter, trim($variable, $delimiter));
        $res  = array();

        foreach ($vals as $val) {
            $res[] = $this->filter_custom($val, $filter, $options);
        }

        return $res;
    }
}classes/utilities/class.u.json.php000064400000011340151336065400013247 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Utility class for working with JSON data
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_JSON
{
	protected static $_messages = array(
		JSON_ERROR_NONE => 'No error has occurred',
		JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
		JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
		JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
		JSON_ERROR_SYNTAX => 'Syntax error',
		JSON_ERROR_UTF8 => 'Malformed UTF-8 characters. To resolve see https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=malformed_utf8#faq-package-170-q'
	);

	/**
	 * Used on PHP 5.3+ to better handle calling the json_encode method
	 *
	 * Returns a string containing the JSON representation of the supplied value
	 *
	 * @return string 
	 */
	public static function customEncode($value, $iteration = 1)
	{
		if (DUP_Util::$on_php_53_plus) {
            $encoded = DupLiteSnapJsonU::wp_json_encode_pprint($value);

			switch (json_last_error()) {
				case JSON_ERROR_NONE:
					return $encoded;
				case JSON_ERROR_DEPTH:
					throw new RuntimeException('Maximum stack depth exceeded');
				case JSON_ERROR_STATE_MISMATCH:
					throw new RuntimeException('Underflow or the modes mismatch');
				case JSON_ERROR_CTRL_CHAR:
					throw new RuntimeException('Unexpected control character found');
				case JSON_ERROR_SYNTAX:
					throw new RuntimeException('Syntax error, malformed JSON');
				case JSON_ERROR_UTF8:
					if ($iteration == 1) {
						$clean = self::makeUTF8($value);
						return self::customEncode($clean, $iteration + 1);
					} else {
						throw new RuntimeException('UTF-8 error loop');
					}
				default:
					throw new RuntimeException('Unknown error');
			}
		} else {
			return self::oldCustomEncode($value);
		}
	}

    public static function safeEncode($data, $options = 0, $depth = 512)
    {
        try {
            $jsonString = DupLiteSnapJsonU::wp_json_encode($data, $options, $depth);
        } catch (Exception $e) {
            $jsonString = false;
        }

        if (($jsonString === false) || trim($jsonString) == '') {
            $jsonString = self::customEncode($value);

            if (($jsonString === false) || trim($jsonString) == '') {
                throw new Exception('Unable to generate JSON from object');
            }
        }
        return $jsonString;
    }

	/**
	 * Attempts to only call the json_decode method directly
	 *
	 * Returns the value encoded in json in appropriate PHP type. Values true, false and null are returned as TRUE, FALSE and NULL respectively.
	 * NULL is returned if the json cannot be decoded or if the encoded data is deeper than the recursion limit.
	 *
	 * @return object
	 */
	public static function decode($json, $assoc = false)
	{
		$result = json_decode($json, $assoc);

		if ($result !== null) {
			return $result;
		}

		if (function_exists('json_last_error')) {
			throw new RuntimeException(self::$_messages[json_last_error()]);
		} else {
			throw new RuntimeException("DUP_JSON decode error");
		}

	}

	private static function makeUTF8($mixed)
	{
		if (is_array($mixed)) {
			foreach ($mixed as $key => $value) {
				$mixed[$key] = self::makeUTF8($value);
			}
		} else if (is_string($mixed)) {
			return utf8_encode($mixed);
		}
		return $mixed;
	}

	private static function escapeString($str)
	{
		return addcslashes($str, "\v\t\n\r\f\"\\/");
	}

	private static function oldCustomEncode($in)
	{
		$out = "";

		if (is_object($in)) {
			$arr[$key]	 = "\"".self::escapeString($key)."\":\"{$val}\"";
			$in			 = get_object_vars($in);
		}

		if (is_array($in)) {
			$obj = false;
			$arr = array();

			foreach ($in AS $key => $val) {
				if (!is_numeric($key)) {
					$obj = true;
				}
				$arr[$key] = self::oldCustomEncode($val);
			}

			if ($obj) {
				foreach ($arr AS $key => $val) {
					$arr[$key] = "\"".self::escapeString($key)."\":{$val}";
				}
				$val = implode(',', $arr);
				$out .= "{{$val}}";
			} else {
				$val = implode(',', $arr);
				$out .= "[{$val}]";
			}
		} elseif (is_bool($in)) {
			$out .= $in ? 'true' : 'false';
		} elseif (is_null($in)) {
			$out .= 'null';
		} elseif (is_string($in)) {
			$out .= "\"".self::escapeString($in)."\"";
		} else {
			$out .= $in;
		}

		return "{$out}";
	}
}classes/utilities/class.u.migration.php000064400000011532151336065400014272 0ustar00<?php

/**
 * Utility class managing th emigration data
 *
 * Standard: PSR_2
 * @link http://www.php_fig.org/psr/psr_2
 * @copyright (c) 2017, Snapcreek LLC
 * @license https://opensource.org/licenses/GPL_3.0 GNU Public License
 *
 */

defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUP_Migration
{
    const CLEAN_INSTALL_REPORT_OPTION    = 'duplicator_clean_install_report';
    const ARCHIVE_REGEX_PATTERN          = '/^(.+_[a-z0-9]{7,}_[0-9]{14})_archive\.(?:zip|daf)$/';

    /**
     * messages to be displayed in the successful migration box
     *
     * @var array
     */
    protected static $migrationCleanupReport = array(
        'removed' => array(),
        'stored'  => array(),
        'instFile' => array()
    );

    /**
     * Check the root path and in case there are installer files without hashes rename them.
     *
     * @return void
     */
    public static function renameInstallersPhpFiles()
    {
        $pathsTocheck = array(
            DupLiteSnapLibIOU::safePathTrailingslashit(ABSPATH),
            DupLiteSnapLibIOU::safePathTrailingslashit(DupLiteSnapLibUtilWp::getHomePath()),
            DupLiteSnapLibIOU::safePathTrailingslashit(WP_CONTENT_DIR)
        );

        $pathsTocheck = array_unique($pathsTocheck);

        $filesToCheck = array();
        foreach ($pathsTocheck as $cFolder) {
            if (
                !is_dir($cFolder) ||
                !is_writable($cFolder) // rename permissions
            ) {
                continue;
            }
            $cFile = $cFolder . 'installer.php';
            if (
                !is_file($cFile) ||
                !DupLiteSnapLibIOU::chmod($cFile, 'u+rw') ||
                !is_readable($cFile)
            ) {
                continue;
            }
            $filesToCheck[] = $cFile;
        }

        $installerTplCheck = '/class DUPX_Bootstrap.+const\s+ARCHIVE_FILENAME\s*=\s*[\'"](.+?)[\'"]\s*;.*const\s+PACKAGE_HASH\s*=\s*[\'"](.+?)[\'"];/s';

        foreach ($filesToCheck as $file) {
            $fileName = basename($file);
            if (($content = @file_get_contents($file, false, null, 0, 5000)) === false) {
                continue;
            }
            $matches = null;
            if (preg_match($installerTplCheck, $content, $matches) !== 1) {
                continue;
            }

            $archiveName = $matches[1];
            $hash = $matches[2];
            $matches = null;

            if (preg_match(self::ARCHIVE_REGEX_PATTERN, $archiveName, $matches) !== 1) {
                if (DupLiteSnapLibIOU::unlink($file)) {
                    self::$migrationCleanupReport['instFile'][] = "<div class='failure'>"
                        . "<i class='fa fa-check green'></i> "
                        . sprintf(__('Installer file <b>%s</b> removed for secority reasons', 'duplicator'), esc_html($fileName))
                        . "</div>";
                } else {
                    self::$migrationCleanupReport['instFile'][] = "<div class='success'>"
                        . '<i class="fa fa-exclamation-triangle red"></i> '
                        . sprintf(__('Can\'t remove installer file <b>%s</b>, please remove it for security reasons', 'duplicator'), esc_html($fileName))
                        . '</div>';
                }
                continue;
            }

            $archiveHash =  $matches[1];
            if (strpos($file, $archiveHash) === false) {
                if (DupLiteSnapLibIOU::rename($file, dirname($file) . '/' . $archiveHash . '_installer.php', true)) {
                    self::$migrationCleanupReport['instFile'][] = "<div class='failure'>"
                        . "<i class='fa fa-check green'></i> "
                        . sprintf(__('Installer file <b>%s</b> renamed with HASH', 'duplicator'), esc_html($fileName))
                        . "</div>";
                } else {
                    self::$migrationCleanupReport['instFile'][] = "<div class='success'>"
                        . '<i class="fa fa-exclamation-triangle red"></i> '
                        . sprintf(__('Can\'t rename installer file <b>%s</b> with HASH, please remove it for security reasons', 'duplicator'), esc_html($fileName))
                        . '</div>';
                }
            }
        }
    }

    /**
     * return cleanup report
     *
     * @return array
     */
    public static function getCleanupReport()
    {
        $option = get_option(self::CLEAN_INSTALL_REPORT_OPTION);
        if (is_array($option)) {
            self::$migrationCleanupReport = array_merge(self::$migrationCleanupReport, $option);
        }

        return self::$migrationCleanupReport;
    }

    /**
     * save clean up report in wordpress options
     *
     * @return boolean
     */
    public static function saveCleanupReport()
    {
        return add_option(self::CLEAN_INSTALL_REPORT_OPTION, self::$migrationCleanupReport, '', 'no');
    }
}
classes/utilities/class.u.php000064400000063456151336065400012316 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Recursivly scans a directory and finds all sym-links and unreadable files
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 *
 * @todo Refactor out IO methods into class.io.php file
 */
class DUP_Util
{

    /**
     * Is PHP 5.2.9 or better running
     */
    public static $on_php_529_plus;

    /**
     * Is PHP 5.3 or better running
     */
    public static $on_php_53_plus;

    /**
     * Is PHP 5.4 or better running
     */
    public static $on_php_54_plus;

    /**
     * Is PHP 7 or better running
     */
    public static $PHP7_plus;

    /**
     * array of ini disable functions
     *
     * @var array
     */
    private static $iniDisableFuncs = null;

    /**
     *  Initialized on load (see end of file)
     */
    public static function init()
    {
        self::$on_php_529_plus = version_compare(PHP_VERSION, '5.2.9') >= 0;
        self::$on_php_53_plus  = version_compare(PHP_VERSION, '5.3.0') >= 0;
        self::$on_php_54_plus  = version_compare(PHP_VERSION, '5.4.0') >= 0;
        self::$PHP7_plus       = version_compare(PHP_VERSION, '7.0.0', '>=');
    }

    public static function getArchitectureString()
    {
        $php_int_size = PHP_INT_SIZE;

        switch ($php_int_size) {
            case 4:
                return esc_html__('32-bit', 'duplicator');
                break;
            case 8:
                return esc_html__('64-bit', 'duplicator');
                break;
            default:
                return esc_html__('Unknown', 'duplicator');
        }
    }

    public static function objectCopy($srcObject, $destObject, $skipMemberArray = null)
    {
        foreach ($srcObject as $member_name => $member_value) {
            if (!is_object($member_value) && (($skipMemberArray == null) || !in_array($member_name, $skipMemberArray))) {
                // Skipping all object members
                $destObject->$member_name = $member_value;
            }
        }
    }

    public static function getWPCoreDirs()
    {
        $wp_core_dirs = array(get_home_path().'wp-admin', get_home_path().'wp-includes');

        //if wp_content is overrided
        $wp_path = get_home_path()."wp-content";
        if (get_home_path().'wp-content' != WP_CONTENT_DIR) {
            $wp_path = WP_CONTENT_DIR;
        }
        $wp_path = str_replace("\\", "/", $wp_path);

        $wp_core_dirs[] = $wp_path;
        $wp_core_dirs[] = $wp_path.'/plugins';
        $wp_core_dirs[] = $wp_path.'/themes';

        return $wp_core_dirs;
    }

    /**
     * return absolute path for the files that are core directories
     * @return string array
     */
    public static function getWPCoreFiles()
    {
        $wp_cored_dirs = array(get_home_path().'wp-config.php');
        return $wp_cored_dirs;
    }

    /**
     * Groups an array into arrays by a given key, or set of keys, shared between all array members.
     *
     * Based on {@author Jake Zatecky}'s {@link https://github.com/jakezatecky/array_group_by array_group_by()} function.
     * This variant allows $key to be closures.
     *
     * @param array $array   The array to have grouping performed on.
     * @param mixed $key,... The key to group or split by. Can be a _string_, an _integer_, a _float_, or a _callable_.
     *                       - If the key is a callback, it must return a valid key from the array.
     *                       - If the key is _NULL_, the iterated element is skipped.
     *                       - string|oink callback ( mixed $item )
     *
     * @return array|null Returns a multidimensional array or `null` if `$key` is invalid.
     */
    public static function array_group_by(array $array, $key)
    {
        if (!is_string($key) && !is_int($key) && !is_float($key) && !is_callable($key)) {
            trigger_error('array_group_by(): The key should be a string, an integer, or a callback', E_USER_ERROR);
            return null;
        }
        $func    = (!is_string($key) && is_callable($key) ? $key : null);
        $_key    = $key;
        // Load the new array, splitting by the target key
        $grouped = array();
        foreach ($array as $value) {
            $key = null;
            if (is_callable($func)) {
                $key = call_user_func($func, $value);
            } elseif (is_object($value) && isset($value->{$_key})) {
                $key = $value->{$_key};
            } elseif (isset($value[$_key])) {
                $key = $value[$_key];
            }
            if ($key === null) {
                continue;
            }
            $grouped[$key][] = $value;
        }
        // Recursively build a nested grouping if more parameters are supplied
        // Each grouped array value is grouped according to the next sequential key
        if (func_num_args() > 2) {
            $args = func_get_args();
            foreach ($grouped as $key => $value) {
                $params        = array_merge(array($value), array_slice($args, 2, func_num_args()));
                $grouped[$key] = call_user_func_array('DUP_Util::array_group_by', $params);
            }
        }
        return $grouped;
    }

    /**
     * PHP_SAPI for FCGI requires a data flush of at least 256
     * bytes every 40 seconds or else it forces a script halt
     *
     * @return string A series of 256 space characters
     */
    public static function fcgiFlush()
    {
        echo(str_repeat(' ', 300));
        @flush();
        @ob_flush();
    }

    public static function isWpDebug()
    {
        return defined('WP_DEBUG') && WP_DEBUG;
    }

    /**
     * Returns the last N lines of a file. Equivalent to tail command
     *
     * @param string $filepath The full path to the file to be tailed
     * @param int $lines The number of lines to return with each tail call
     *
     * @return string The last N parts of the file
     */
    public static function tailFile($filepath, $lines = 2)
    {
        // Open file
        $f = @fopen($filepath, "rb");
        if ($f === false)
            return false;

        // Sets buffer size
        $buffer = 256;

        // Jump to last character
        fseek($f, -1, SEEK_END);

        // Read it and adjust line number if necessary
        // (Otherwise the result would be wrong if file doesn't end with a blank line)
        if (fread($f, 1) != "\n")
            $lines -= 1;

        // Start reading
        $output = '';
        $chunk  = '';

        // While we would like more
        while (ftell($f) > 0 && $lines >= 0) {
            // Figure out how far back we should jump
            $seek   = min(ftell($f), $buffer);
            // Do the jump (backwards, relative to where we are)
            fseek($f, -$seek, SEEK_CUR);
            // Read a chunk and prepend it to our output
            $output = ($chunk  = fread($f, $seek)).$output;
            // Jump back to where we started reading
            fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR);
            // Decrease our line counter
            $lines  -= substr_count($chunk, "\n");
        }

        // While we have too many lines
        // (Because of buffer size we might have read too many)
        while ($lines++ < 0) {
            // Find first newline and remove all text before that
            $output = substr($output, strpos($output, "\n") + 1);
        }
        fclose($f);
        return trim($output);
    }

    /**
     * Display human readable byte sizes
     *
     * @param int $size    The size in bytes
     *
     * @return string The size of bytes readable such as 100KB, 20MB, 1GB etc.
     */
    public static function byteSize($size, $roundBy = 2)
    {
        try {
            $units = array('B', 'KB', 'MB', 'GB', 'TB');
            for ($i = 0; $size >= 1024 && $i < 4; $i++) {
                $size /= 1024;
            }
            return round($size, $roundBy).$units[$i];
        }
        catch (Exception $e) {
            return "n/a";
        }
    }

    /**
     * Makes path safe for any OS
     *      Paths should ALWAYS READ be "/"
     *          uni: /home/path/file.txt
     *          win:  D:/home/path/file.txt
     *
     * @param string $path		The path to make safe
     *
     * @return string A path with all slashes facing "/"
     */
    public static function safePath($path)
    {
        return str_replace("\\", "/", $path);
    }

    /**
     * Get current microtime as a float.  Method is used for simple profiling
     *
     * @see elapsedTime
     *
     * @return  string   A float in the form "msec sec", where sec is the number of seconds since the Unix epoch
     */
    public static function getMicrotime()
    {
        return microtime(true);
    }

    /**
     * Append the value to the string if it doesn't already exist
     *
     * @param string $string The string to append to
     * @param string $value The string to append to the $string
     *
     * @return string Returns the string with the $value appended once
     */
    public static function appendOnce($string, $value)
    {
        return $string.(substr($string, -1) == $value ? '' : $value);
    }

    /**
     * Return a string with the elapsed time
     *
     * @see getMicrotime()
     *
     * @param mixed number $end     The final time in the sequence to measure
     * @param mixed number $start   The start time in the sequence to measure
     *
     * @return  string   The time elapsed from $start to $end
     */
    public static function elapsedTime($end, $start)
    {
        return sprintf("%.2f sec.", abs($end - $start));
    }

    /**
     * List all of the files of a path
     *
     * @param string $path The full path to a system directory
     *
     * @return array of all files in that path
     *
     * Notes:
     * 	- Avoid using glob() as GLOB_BRACE is not an option on some operating systems
     * 	- Pre PHP 5.3 DirectoryIterator will crash on unreadable files
     *  - Scandir will not crash on unreadable items, but will not return results
     */
    public static function listFiles($path = '.')
    {
        try {
            $files = array();
            if ($dh    = opendir($path)) {
                while (($file = readdir($dh)) !== false) {
                    if ($file == '.' || $file == '..')
                        continue;
                    $full_file_path = trailingslashit($path).$file;
                    $files[]        = str_replace("\\", '/', $full_file_path);
                }
                @closedir($dh);
            }
            return $files;
        }
        catch (Exception $exc) {
            $result = array();
            $files  = @scandir($path);
            if (is_array($files)) {
                foreach ($files as $file) {
                    $result[] = str_replace("\\", '/', $path).$file;
                }
            }
            return $result;
        }
    }

    /**
     * List all of the directories of a path
     *
     * @param string $path The full path to a system directory
     *
     * @return array of all dirs in the $path
     */
    public static function listDirs($path = '.')
    {
        $dirs = array();

        foreach (new DirectoryIterator($path) as $file) {
            if ($file->isDir() && !$file->isDot()) {
                $dirs[] = DUP_Util::safePath($file->getPathname());
            }
        }
        return $dirs;
    }

    /**
     * Does the directory have content
     *
     * @param string $path The full path to a system directory
     *
     * @return bool Returns true if directory is empty
     */
    public static function isDirectoryEmpty($path)
    {
        if (!is_readable($path))
            return NULL;
        return (count(scandir($path)) == 2);
    }

    /**
     * Size of the directory recursively in bytes
     *
     * @param string $path The full path to a system directory
     *
     * @return int Returns the size of the directory in bytes
     *
     */
    public static function getDirectorySize($path)
    {
        if (!file_exists($path))
            return 0;
        if (is_file($path))
            return filesize($path);

        $size = 0;
        $list = glob($path."/*");
        if (!empty($list)) {
            foreach ($list as $file)
                $size += self::getDirectorySize($file);
        }
        return $size;
    }

    /**
     * Can shell_exec be called on this server
     *
     * @return bool Returns true if shell_exec can be called on server
     *
     */
    public static function hasShellExec()
    {
        $cmds = array('shell_exec', 'escapeshellarg', 'escapeshellcmd', 'extension_loaded');

        //Function disabled at server level
        if (array_intersect($cmds, array_map('trim', explode(',', @ini_get('disable_functions')))))
            return apply_filters('duplicator_is_shellzip_available', false);

        //Suhosin: http://www.hardened-php.net/suhosin/
        //Will cause PHP to silently fail
        if (extension_loaded('suhosin')) {
            $suhosin_ini = @ini_get("suhosin.executor.func.blacklist");
            if (array_intersect($cmds, array_map('trim', explode(',', $suhosin_ini))))
                return apply_filters('duplicator_is_shellzip_available', false);
        }

        if (! function_exists('shell_exec')) {
			return apply_filters('duplicator_is_shellzip_available', false);
	    }

        // Can we issue a simple echo command?
        if (!@shell_exec('echo duplicator'))
            return apply_filters('duplicator_is_shellzip_available', false);

        return apply_filters('duplicator_is_shellzip_available', true);
    }

    /**
     * Is the server running Windows operating system
     *
     * @return bool Returns true if operating system is Windows
     *
     */
    public static function isWindows()
    {
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            return true;
        }
        return false;
    }

    /**
     * Wrap to prevent malware scanners from reporting false/positive
     * Switched from our old method to avoid WordFence reporting a false positive
     *
     * @param string $string The string to decrypt i.e. base64_decode
     *
     * @return string Returns the string base64 decoded
     */
    public static function installerUnscramble($string)
    {
        return base64_decode($string);
    }

    /**
     * Wrap to prevent malware scanners from reporting false/positive
     * Switched from our old method to avoid WordFence reporting a false positive
     *
     * @param string $string The string to decrypt i.e. base64_encode
     *
     * @return string Returns the string base64 encode
     */
    public static function installerScramble($string)
    {
        return base64_encode($string);
    }
    const SECURE_ISSUE_DIE    = 'die';
    const SECURE_ISSUE_THROW  = 'throw';
    const SECURE_ISSUE_RETURN = 'return';

    /**
     * Does the current user have the capability
     *
     * @param type $permission
     * @param type $exit    //  SECURE_ISSUE_DIE die script with die function
     *                          SECURE_ISSUE_THROW throw an exception if fail
     *                          SECURE_ISSUE_RETURN return false if fail
     *
     * @return boolean      // return false is fail and $exit is SECURE_ISSUE_THROW
     *                      // true if success
     *
     * @throws Exception    // thow exception if $exit is SECURE_ISSUE_THROW
     */
    public static function hasCapability($permission = 'read', $exit = self::SECURE_ISSUE_DIE)
    {
        $capability = apply_filters('wpfront_user_role_editor_duplicator_translate_capability', $permission);

        if (!current_user_can($capability)) {
            $exitMsg = __('You do not have sufficient permissions to access this page.', 'duplicator');
            DUP_LOG::Trace('You do not have sufficient permissions to access this page. PERMISSION: '.$permission);

            switch ($exit) {
                case self::SECURE_ISSUE_THROW:
                    throw new Exception($exitMsg);
                case self::SECURE_ISSUE_RETURN:
                    return false;
                case self::SECURE_ISSUE_DIE:
                default:
                    wp_die($exitMsg);
            }
        }
        return true;
    }

    /**
     *  Gets the name of the owner of the current PHP script
     *
     * @return string The name of the owner of the current PHP script
     */
    public static function getCurrentUser()
    {
        $unreadable = 'Undetectable';
        if (function_exists('get_current_user') && is_callable('get_current_user')) {
            $user = get_current_user();
            return strlen($user) ? $user : $unreadable;
        }
        return $unreadable;
    }

    /**
     * Gets the owner of the PHP process
     *
     * @return string Gets the owner of the PHP process
     */
    public static function getProcessOwner()
    {
        $unreadable = 'Undetectable';
        $user       = '';
        try {
            if (function_exists('exec')) {
                $user = @exec('whoami');
            }

            if (!strlen($user) && function_exists('posix_getpwuid') && function_exists('posix_geteuid')) {
                $user = posix_getpwuid(posix_geteuid());
                $user = $user['name'];
            }

            return strlen($user) ? $user : $unreadable;
        }
        catch (Exception $ex) {
            return $unreadable;
        }
    }

    /**
     * Creates the snapshot directory if it doesn't already exist
     *
     * @return bool
     */
    public static function initSnapshotDirectory()
    {
        $error = false;

        $path_wproot = duplicator_get_abs_path();
        $path_ssdir  = DUP_Settings::getSsdirPath();
        $path_plugin = DUP_Util::safePath(DUPLICATOR_PLUGIN_PATH);

        if (!file_exists($path_ssdir)) {
            $old_root_perm = @fileperms($path_wproot);

            //--------------------------------
            //CHMOD DIRECTORY ACCESS
            //wordpress root directory
            DupLiteSnapLibIOU::chmod($path_wproot, 'u+rwx');

            //snapshot directory
            if (DupLiteSnapLibIOU::dirWriteCheckOrMkdir($path_ssdir, 'u+rwx,go+rx') == false) {
                $error = true;
            }

            // restore original root perms
            DupLiteSnapLibIOU::chmod($path_wproot, $old_root_perm);

            if ($error) {
                return false;
            }
        }

        DupLiteSnapLibIOU::chmod($path_ssdir, 'u+rwx,go+rx');

        DupLiteSnapLibIOU::dirWriteCheckOrMkdir(DUP_Settings::getSsdirTmpPath(), 'u+rwx');

        //plugins dir/files
        DupLiteSnapLibIOU::dirWriteCheckOrMkdir($path_plugin.'files', 'u+rwx');

        //--------------------------------
        //FILE CREATION
        //SSDIR: Create Index File
        $fileName = $path_ssdir.'/index.php';
        if (!file_exists($fileName)) {
            $ssfile = @fopen($fileName, 'w');
            @fwrite($ssfile,
                    '<?php error_reporting(0);  if (stristr(php_sapi_name(), "fcgi")) { $url  =  "http://" . $_SERVER["HTTP_HOST"]; header("Location: {$url}/404.html");} else { header("HTTP/1.1 404 Not Found", true, 404);} exit(); ?>');
            @fclose($ssfile);
        }

        //SSDIR: Create .htaccess
        $storage_htaccess_off = DUP_Settings::Get('storage_htaccess_off');
        $fileName             = $path_ssdir.'/.htaccess';
        if ($storage_htaccess_off) {
            @unlink($fileName);
        } else if (!file_exists($fileName)) {
            $htfile   = @fopen($fileName, 'w');
            $htoutput = "Options -Indexes";
            @fwrite($htfile, $htoutput);
            @fclose($htfile);
        }

        //SSDIR: Robots.txt file
        $fileName = $path_ssdir.'/robots.txt';
        if (!file_exists($fileName)) {
            $robotfile = @fopen($fileName, 'w');
            @fwrite($robotfile,
                    "User-agent: * \n"
                    ."Disallow: /".DUP_Settings::SSDIR_NAME_LEGACY."/\n"
                    ."Disallow: /".DUP_Settings::SSDIR_NAME_NEW."/");
            @fclose($robotfile);
        }

        return true;
    }

    /**
     * Attempts to get the file zip path on a users system
     *
     * @return null
     */
    public static function getZipPath()
    {
        $filepath = null;

        if (self::hasShellExec()) {
            if (shell_exec('hash zip 2>&1') == NULL) {
                $filepath = 'zip';
            } else {
                $possible_paths = array(
                    '/usr/bin/zip',
                    '/opt/local/bin/zip'
                    //'C:/Program\ Files\ (x86)/GnuWin32/bin/zip.exe');
                );

                foreach ($possible_paths as $path) {
                    if (@file_exists($path)) {
                        $filepath = $path;
                        break;
                    }
                }
            }
        }

        return $filepath;
    }

    /**
     * Is the server PHP 5.3 or better
     *
     * @return  bool    Returns true if the server PHP 5.3 or better
     */
    public static function PHP53()
    {
        return version_compare(PHP_VERSION, '5.3.2', '>=');
    }

    /**
     * Returns an array of the WordPress core tables.
     *
     * @return array  Returns all WP core tables
     */
    public static function getWPCoreTables()
    {
        global $wpdb;
        $result = array();
        foreach (self::getWPCoreTablesEnd() as $tend) {
            $result[] = $wpdb->prefix.$tend;
        }
        return $result;
    }

    public static function getWPCoreTablesEnd()
    {
        return array(
            'commentmeta',
            'comments',
            'links',
            'options',
            'postmeta',
            'posts',
            'term_relationships',
            'term_taxonomy',
            'termmeta',
            'terms',
            'usermeta',
            'blogs',
            'blog_versions',
            'blogmeta',
            'users',
            'site',
            'sitemeta',
            'signups',
            'registration_log',
            'blog_versions');
    }

    public static function isWPCoreTable($table)
    {
        global $wpdb;

        if (strpos($table, $wpdb->prefix) !== 0) {
            return false;
        }

        $subTName = substr($table, strlen($wpdb->prefix));
        $coreEnds = self::getWPCoreTablesEnd();

        if (in_array($subTName, $coreEnds)) {
            return true;
        } else if (is_multisite()) {
            $exTable = explode('_', $subTName);
            if (count($exTable) >= 2 && is_numeric($exTable[0])) {
                $tChekc = implode('_', array_slice($exTable, 1));
                if (get_blog_details((int) $exTable[0], false) !== false && in_array($tChekc, $coreEnds)) {
                    return true;
                }
            }
        }

        return false;
    }

    public static function getWPBlogIdTable($table)
    {
        global $wpdb;

        if (!is_multisite() || strpos($table, $wpdb->prefix) !== 0) {
            return 0;
        }

        $subTName = substr($table, strlen($wpdb->prefix));
        $exTable  = explode('_', $subTName);
        if (count($exTable) >= 2 && is_numeric($exTable[0]) && get_blog_details((int) $exTable[0], false) !== false) {
            return (int) $exTable[0];
        } else {
            return 0;
        }
    }

    /**
     * Check given table is exist in real
     * 
     * @param $table string Table name
     * @return booleam
     */
    public static function isTableExists($table)
    {
        // It will clear the $GLOBALS['wpdb']->last_error var
        $GLOBALS['wpdb']->flush();
        $sql = "SELECT 1 FROM `".esc_sql($table)."` LIMIT 1;";
        $ret = $GLOBALS['wpdb']->get_var($sql);
        if (empty($GLOBALS['wpdb']->last_error))
            return true;
        return false;
    }

    /**
     * Finds if its a valid executable or not
     *
     * @param type $exe A non zero length executable path to find if that is executable or not.
     * @param type $expectedValue expected value for the result
     * @return boolean
     */
    public static function isExecutable($cmd)
    {
        if (strlen($cmd) < 1)
            return false;

        if (@is_executable($cmd)) {
            return true;
        }

        $output = shell_exec($cmd);
        if (!is_null($output)) {
            return true;
        }

        $output = shell_exec($cmd.' -?');
        if (!is_null($output)) {
            return true;
        }

        return false;
    }

    /**
     * Display human readable byte sizes
     *
     * @param string $size	The size in bytes
     *
     * @return string Human readable bytes such as 50MB, 1GB
     */
    public static function readableByteSize($size)
    {
        try {
            $units = array('B', 'KB', 'MB', 'GB', 'TB');
            for ($i = 0; $size >= 1024 && $i < 4; $i++)
                $size  /= 1024;
            return round($size, 2).$units[$i];
        }
        catch (Exception $e) {
            return "n/a";
        }
    }

    public static function getTablePrefix()
    {
        global $wpdb;
        $tablePrefix = (is_multisite() && is_plugin_active_for_network('duplicator/duplicator.php')) ? $wpdb->base_prefix : $wpdb->prefix;
        return $tablePrefix;
    }

    /**
     * return ini disable functions array
     *
     * @return array
     */
    public static function getIniDisableFuncs()
    {
        if (is_null(self::$iniDisableFuncs)) {
            $tmpFuncs              = ini_get('disable_functions');
            $tmpFuncs              = explode(',', $tmpFuncs);
            self::$iniDisableFuncs = array();
            foreach ($tmpFuncs as $cFunc) {
                self::$iniDisableFuncs[] = trim($cFunc);
            }
        }

        return self::$iniDisableFuncs;
    }

    /**
     * Check if function exists and isn't in ini disable_functions
     *
     * @param string $function_name
     * @return bool
     */
    public static function isIniFunctionEnalbe($function_name)
    {
        return function_exists($function_name) && !in_array($function_name, self::getIniDisableFuncs());
    }
}classes/utilities/class.u.scancheck.php000064400000012073151336065400014224 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Recursivly scans a directory and finds all sym-links and unreadable files
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 *
 */

// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

class DUP_ScanCheck
{
    /**
     * The number of files scanned
     */
    public $fileCount = 0;

    /**
     * The number of directories scanned
     */
    public $dirCount  = 0;

    /**
     * The maximum count of files before the recursive function stops
     */
    public $maxFiles = 1000000;

    /**
     * The maximum count of directories before the recursive function stops
     */
    public $maxDirs = 75000;

    /**
     * Recursivly scan the root directory provided
     */
    public $recursion = true;

    /**
     * Stores a list of symbolic link files
     */
    public $symLinks = array();

    /**
     *  Stores a list of files unreadable by PHP
     */
    public $unreadable = array();

	 /**
     *  Stores a list of dirs with utf8 settings
     */
    public $nameTestDirs = array();

	 /**
     *  Stores a list of files with utf8 settings
     */
    public $nameTestFiles = array();

    /**
     *  If the maxFiles or maxDirs limit is reached then true
     */
    protected $limitReached = false;

    /**
     *  Is the server running on Windows
     */
    private $isWindows = false;

    /**
     *  Init this instance of the object
     */
    function __construct()
    {
       $this->isWindows = defined('PHP_WINDOWS_VERSION_BUILD');
    }

    /**
     * Start the scan process
     *
     * @param string $dir A valid directory path where the scan will run
     * @param array $results Used for recursion, do not pass in value with calling
     *
     * @return obj  The scan check object with the results of the scan
     */
    public function run($dir, &$results = array())
    {
        //Stop Recursion if Max search is reached
        if ($this->fileCount > $this->maxFiles || $this->dirCount > $this->maxDirs) {
            $this->limitReached = true;
            return $results;
        }

        $files = @scandir($dir);
        if (is_array($files)) {
            foreach ($files as $key => $value) {
                $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
                if ($path) {
                    //Files
                    if (!is_dir($path)) {
                        if (!is_readable($path)) {
                            $results[]          = $path;
                            $this->unreadable[] = $path;
                        } else if ($this->isLink($path)) {
                            $results[]        = $path;
                            $this->symLinks[] = $path;
                        } else {
							$name = basename($path);
							$invalid_test =  preg_match('/(\/|\*|\?|\>|\<|\:|\\|\|)/', $name)
								|| trim($name) == ''
								|| (strrpos($name, '.') == strlen($name) - 1 && substr($name, -1) == '.')
								|| preg_match('/[^\x20-\x7f]/', $name);

							if ($invalid_test) {
								if (! DUP_Util::$PHP7_plus && DUP_Util::isWindows()) {
									$this->nameTestFiles[] = utf8_decode($path);
								} else {
									$this->nameTestFiles[] = $path;
								}
							}
						}
                        $this->fileCount++;
                    }
                    //Dirs
                    else if ($value != "." && $value != "..") {
                        if (!$this->isLink($path) && $this->recursion) {
                            $this->Run($path, $results);
                        }

                        if (!is_readable($path)) {
                            $results[]          = $path;
                            $this->unreadable[] = $path;
                        } else if ($this->isLink($path)) {
                            $results[]        = $path;
                            $this->symLinks[] = $path;
                        } else {

							$invalid_test = strlen($path) > 244
								|| trim($path) == ''
								|| preg_match('/[^\x20-\x7f]/', $path);

							if ($invalid_test) {
								if (! DUP_Util::$PHP7_plus && DUP_Util::isWindows()) {
									$this->nameTestDirs[] = utf8_decode($path);
								} else {
									$this->nameTestDirs[] = $path;
								}
							}
						}

                        $this->dirCount++;
                    }
                }
            }
        }
        return $this;
    }

    /**
     * Separation logic for supporting how different operating systems work
     *
     * @param string $target A valid file path
     *
     * @return bool  Is the target a sym link
     */
    private function isLink($target)
    {
		//Currently Windows does not support sym-link detection
        if ($this->isWindows) {
           return false;
        } elseif (is_link($target)) {
            return true;
        }
        return false;
    }
}classes/class.server.php000064400000033424151336065400011335 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
require_once (DUPLICATOR_PLUGIN_PATH.'classes/utilities/class.u.php');

/**
 * Used to get various pieces of information about the server environment
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 *
 */

class DUP_Server
{

	const LockFileName = 'lockfile.txt';

	// Possibly use in the future if we want to prevent double building
	public static function isEngineLocked()
	{
		if (self::setEngineLock(true)) {
			self::setEngineLock(false);
			$locked = false;
		} else {
			$locked = true;
		}
	}

	// Possibly use in the future if we want to prevent double building
	public static function setEngineLock($shouldLock)
	{
		$success		 = false;
		$locking_file	 = @fopen(self::LockFileName, 'c+');
		if ($locking_file != false) {
			if ($shouldLock) {
				$success = @flock($locking_file, LOCK_EX | LOCK_NB);
			} else {
				$success = @flock($locking_file, LOCK_UN);
			}

			@fclose($locking_file);
		}
		return $success;
	}

    public static function mysqlEscapeIsOk()
    {
        $escape_test_string            = chr(0).chr(26)."\r\n'\"\\";
        $escape_expected_result        = "\"\\0\Z\\r\\n\\'\\\"\\\\\"";
        $escape_actual_result          = DUP_DB::escValueToQueryString($escape_test_string);
        $result                        = $escape_expected_result === $escape_actual_result;

        if (!$result) {
            $msg = "mysqli_real_escape_string test results\n".
                "Expected escape result: ".$escape_expected_result."\n".
                "Actual escape result: ".$escape_actual_result;
            DUP_Log::trace($msg);

        }

        return $result;
    }

	/**
	 * Gets the system requirements which must pass to build a package
	 *
	 * @return array   An array of requirements
	 */
	public static function getRequirements()
	{
		$dup_tests = array();

		//PHP SUPPORT
		$safe_ini						 = strtolower(ini_get('safe_mode'));
		$dup_tests['PHP']['SAFE_MODE']	 = $safe_ini != 'on' || $safe_ini != 'yes' || $safe_ini != 'true' || ini_get("safe_mode") != 1 ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['PHP']['SAFE_MODE'], 'SAFE_MODE is on.');

		$dup_tests['PHP']['VERSION'] = DUP_Util::$on_php_529_plus ? 'Pass' : 'Fail';
		$phpversion					 = phpversion();
		self::logRequirementFail($dup_tests['PHP']['VERSION'], 'PHP version('.$phpversion.') is lower than 5.2.9');

		if (DUP_Settings::Get('archive_build_mode') == DUP_Archive_Build_Mode::ZipArchive) {
			$dup_tests['PHP']['ZIP'] = class_exists('ZipArchive') ? 'Pass' : 'Fail';
			self::logRequirementFail($dup_tests['PHP']['ZIP'], 'ZipArchive class doesn\'t exist.');
		}

		$dup_tests['PHP']['FUNC_1'] = function_exists("file_get_contents") ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['PHP']['FUNC_1'], 'file_get_contents function doesn\'t exist.');

		$dup_tests['PHP']['FUNC_2'] = function_exists("file_put_contents") ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['PHP']['FUNC_2'], 'file_put_contents function doesn\'t exist.');

		$dup_tests['PHP']['FUNC_3'] = function_exists("mb_strlen") ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['PHP']['FUNC_3'], 'mb_strlen function doesn\'t exist.');

		$dup_tests['PHP']['ALL'] = !in_array('Fail', $dup_tests['PHP']) ? 'Pass' : 'Fail';

		//REQUIRED PATHS
		$abs_path					 = duplicator_get_abs_path();
		$handle_test				 = @opendir($abs_path);
		$dup_tests['IO']['WPROOT']	 = is_writeable($abs_path) && $handle_test ? 'Pass' : 'Warn';
		@closedir($handle_test);
		self::logRequirementFail($dup_tests['IO']['WPROOT'], $abs_path.' (abs path) can\'t be opened.');

		$dup_tests['IO']['SSDIR'] = is_writeable(DUP_Settings::getSsdirPath()) ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['IO']['SSDIR'], DUP_Settings::getSsdirPath().' (DUPLICATOR_SSDIR_PATH) can\'t be writeable.');

		$dup_tests['IO']['SSTMP'] = is_writeable(DUP_Settings::getSsdirTmpPath()) ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['IO']['SSTMP'], DUP_Settings::getSsdirTmpPath().' (DUPLICATOR_SSDIR_PATH_TMP) can\'t be writeable.');

		$dup_tests['IO']['ALL'] = !in_array('Fail', $dup_tests['IO']) ? 'Pass' : 'Fail';

		//SERVER SUPPORT
		$dup_tests['SRV']['MYSQLi'] = function_exists('mysqli_connect') ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['SRV']['MYSQLi'], 'mysqli_connect function doesn\'t exist.');

        //mysqli_real_escape_string test
        $dup_tests['SRV']['MYSQL_ESC'] = self::mysqlEscapeIsOk() ? 'Pass' : 'Fail';
        self::logRequirementFail($dup_tests['SRV']['MYSQL_ESC'], "The function mysqli_real_escape_string is not escaping strings as expected.");

		$db_version						 = DUP_DB::getVersion();
		$dup_tests['SRV']['MYSQL_VER']	 = version_compare($db_version, '5.0', '>=') ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['SRV']['MYSQL_VER'], 'MySQL version '.$db_version.' is lower than 5.0.');

		$dup_tests['SRV']['ALL'] = !in_array('Fail', $dup_tests['SRV']) ? 'Pass' : 'Fail';

		//RESERVED FILES
		$dup_tests['RES']['INSTALL'] = !(self::hasInstallerFiles()) ? 'Pass' : 'Fail';
		self::logRequirementFail($dup_tests['RES']['INSTALL'], 'Installer file(s) are exist on the server.');
		$dup_tests['Success']		 = $dup_tests['PHP']['ALL'] == 'Pass' && $dup_tests['IO']['ALL'] == 'Pass' && $dup_tests['SRV']['ALL'] == 'Pass' && $dup_tests['RES']['INSTALL'] == 'Pass';

		$dup_tests['Warning'] = $dup_tests['IO']['WPROOT'] == 'Warn';

		return $dup_tests;
	}

	/**
	 * Logs requirement fail status informative message
	 *
	 * @param string $testStatus Either it is Pass or Fail
	 * @param string $errorMessage Error message which should be logged
	 * @return void
	 */
	private static function logRequirementFail($testStatus, $errorMessage)
	{
		if (empty($testStatus)) {
			throw new Exception('Exception: Empty $testStatus [File: '.__FILE__.', Ln: '.__LINE__);
		}

		if (empty($errorMessage)) {
			throw new Exception('Exception: Empty $errorMessage [File: '.__FILE__.', Ln: '.__LINE__);
		}

		$validTestStatuses = array('Pass', 'Fail', 'Warn');

		if (!in_array($testStatus, $validTestStatuses)) {
			throw new Exception('Exception: Invalid $testStatus value: '.$testStatus.' [File: '.__FILE__.', Ln: '.__LINE__);
		}

		if ('Fail' == $testStatus) {
			DUP_LOG::trace($errorMessage);
		}
	}

	/**
	 * Gets the system checks which are not required
	 *
	 * @return array   An array of system checks
	 */
	public static function getChecks()
	{
		$checks = array();

		//PHP/SYSTEM SETTINGS
		//Web Server
		$php_test0 = false;
		foreach ($GLOBALS['DUPLICATOR_SERVER_LIST'] as $value) {
			if (stristr($_SERVER['SERVER_SOFTWARE'], $value)) {
				$php_test0 = true;
				break;
			}
		}
		self::logCheckFalse($php_test0, 'Any out of server software ('.implode(', ', $GLOBALS['DUPLICATOR_SERVER_LIST']).') doesn\'t exist.');

		$php_test1	 = ini_get("open_basedir");
		$php_test1	 = empty($php_test1) ? true : false;
		self::logCheckFalse($php_test1, 'open_basedir is enabled.');

		$max_execution_time	 = ini_get("max_execution_time");
		$php_test2			 = ($max_execution_time > DUPLICATOR_SCAN_TIMEOUT) || (strcmp($max_execution_time, 'Off') == 0 || $max_execution_time == 0) ? true : false;
		if (strcmp($max_execution_time, 'Off') == 0) {
			$max_execution_time_error_message = '$max_execution_time should not be'.$max_execution_time;
		} else {
			$max_execution_time_error_message = '$max_execution_time ('.$max_execution_time.') should not  be lower than the DUPLICATOR_SCAN_TIMEOUT'.DUPLICATOR_SCAN_TIMEOUT;
		}
		self::logCheckFalse($php_test2, $max_execution_time_error_message);

		$php_test3 = function_exists('mysqli_connect');
		self::logCheckFalse($php_test3, 'mysqli_connect function doesn\'t exist.');

		$php_test4 = DUP_Util::$on_php_53_plus ? true : false;
		self::logCheckFalse($php_test4, 'PHP Version is lower than 5.3.');

		$checks['SRV']['PHP']['websrv']		 = $php_test0;
		$checks['SRV']['PHP']['openbase']	 = $php_test1;
		$checks['SRV']['PHP']['maxtime']	 = $php_test2;
		$checks['SRV']['PHP']['mysqli']		 = $php_test3;
		$checks['SRV']['PHP']['version']	 = $php_test4;
        //MANAGED HOST
        $checks['SRV']['SYS']['managedHost'] = !DUP_Custom_Host_Manager::getInstance()->isManaged();
		$checks['SRV']['SYS']['ALL']		 = ($php_test0 && $php_test1 && $php_test2 && $php_test3 && $php_test4 && $checks['SRV']['SYS']['managedHost']) ? 'Good' : 'Warn';

		//WORDPRESS SETTINGS
		global $wp_version;
		$wp_test1 = version_compare($wp_version, DUPLICATOR_SCAN_MIN_WP) >= 0 ? true : false;
		self::logCheckFalse($wp_test1, 'WP version ('.$wp_version.') is lower than the DUPLICATOR_SCAN_MIN_WP ('.DUPLICATOR_SCAN_MIN_WP.').');

		//Core Files
		$files						 = array();
		$proper_wp_config_file_path	 = duplicator_get_abs_path().'/wp-config.php';
		$files['wp-config.php']		 = file_exists($proper_wp_config_file_path);
		self::logCheckFalse($files['wp-config.php'], 'The wp-config.php file doesn\'t exist on the '.$proper_wp_config_file_path);

		/** searching wp-config in working word press is not worthy
		 * if this script is executing that means wp-config.php exists :)
		 * we need to know the core folders and files added by the user at this point
		 * retaining old logic as else for the case if its used some where else
		 */
		//Core dir and files logic
		if (isset($_POST['file_notice']) && isset($_POST['dir_notice'])) {
			//means if there are core directories excluded or core files excluded return false
			if ((bool) $_POST['file_notice'] || (bool) $_POST['dir_notice'])
				$wp_test2	 = false;
			else
				$wp_test2	 = true;
		} else {
			$wp_test2 = $files['wp-config.php'];
		}

		//Cache
		/*
		  $Package = DUP_Package::getActive();
		  $cache_path = DUP_Util::safePath(WP_CONTENT_DIR) . '/cache';
		  $dirEmpty = DUP_Util::isDirectoryEmpty($cache_path);
		  $dirSize = DUP_Util::getDirectorySize($cache_path);
		  $cach_filtered = in_array($cache_path, explode(';', $Package->Archive->FilterDirs));
		  $wp_test3 = ($cach_filtered || $dirEmpty || $dirSize < DUPLICATOR_SCAN_CACHESIZE ) ? true : false;
		 */
		$wp_test3 = is_multisite();
		self::logCheckFalse($wp_test3, 'WP is multi-site setup.');

		$checks['SRV']['WP']['version']	 = $wp_test1;
		$checks['SRV']['WP']['core']	 = $wp_test2;
		$checks['SRV']['WP']['ismu']	 = $wp_test3;
		$checks['SRV']['WP']['ALL']		 = $wp_test1 && $wp_test2 && !$wp_test3 ? 'Good' : 'Warn';

		return $checks;
	}

	/**
	 * Logs checks false informative message
	 *
	 * @param boolean $check Either it is true or false
	 * @param string $errorMessage Error message which should be logged when check is false
	 * @return void
	 */
	private static function logCheckFalse($check, $errorMessage)
	{
		if (empty($errorMessage)) {
			throw new Exception('Exception: Empty $errorMessage variable [File: '.__FILE__.', Ln: '.__LINE__);
		}

		if (filter_var($check, FILTER_VALIDATE_BOOLEAN) === false) {
			DUP_LOG::trace($errorMessage);
		}
	}

	/**
	 * Check to see if duplicator installer files are present
	 *
	 * @return bool   True if any reserved files are found
	 */
	public static function hasInstallerFiles()
	{
		$files = self::getInstallerFiles();
		foreach ($files as $file => $path) {
			if (false !== strpos($path, '*')) {
				$glob_files = glob($path);
				if (!empty($glob_files)) {
					return true;
				}
			} elseif (file_exists($path))
				return true;
		}
		return false;
	}

	/**
	 * Gets a list of all the installer files by name and full path
	 *
	 * @remarks
	 *  FILES:		installer.php, installer-backup.php, dup-installer-bootlog__[HASH].txt
	 * 	DIRS:		dup-installer
	 * 	DEV FILES:	wp-config.orig
	 * 	Last set is for lazy developer cleanup files that a developer may have
	 *  accidently left around lets be proactive for the user just in case.
	 *
	 * @return array [file_name, file_path]
	 */
	public static function getInstallerFiles()
	{
		// alphanumeric 7 time, then -(dash), then 8 digits
		$abs_path				 = duplicator_get_abs_path();
		$four_digit_glob_pattern = '[0-9][0-9][0-9][0-9]';
		$retArr					 = array(
			basename(DUPLICATOR_INSTALLER_DIRECTORY).' '.esc_html__('(directory)', 'duplicator') => DUPLICATOR_INSTALLER_DIRECTORY,
			DUPLICATOR_INSTALL_PHP																 => $abs_path.'/'.DUPLICATOR_INSTALL_PHP,
			'[HASH]'.'_'.DUPLICATOR_INSTALL_PHP													 => $abs_path.'/*_*'.$four_digit_glob_pattern.'_'.DUPLICATOR_INSTALL_PHP,
			DUPLICATOR_INSTALL_BAK																 => $abs_path.'/'.DUPLICATOR_INSTALL_BAK,
			'[HASH]'.'_'.DUPLICATOR_INSTALL_BAK													 => $abs_path.'/*_*'.$four_digit_glob_pattern.'_'.DUPLICATOR_INSTALL_BAK,
			'[HASH]_archive.zip|daf'															 => $abs_path.'/*_*'.$four_digit_glob_pattern.'_archive.[zd][ia][pf]',
			'dup-installer-bootlog__[HASH].txt'													 => $abs_path.'/dup-installer-bootlog__'.DUPLICATOR_INSTALLER_HASH_PATTERN.'.txt',
		);
		if (DUPLICATOR_INSTALL_SITE_OVERWRITE_ON) {
			$retArr['dup-wp-config-arc__[HASH].txt'] = $abs_path.'/dup-wp-config-arc__'.DUPLICATOR_INSTALLER_HASH_PATTERN.'.txt';
		}
		return $retArr;
	}

	/**
	 * Get the IP of a client machine
	 *
	 * @return string   IP of the client machine
	 */
	public static function getClientIP()
	{
		if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
			return $_SERVER["HTTP_X_FORWARDED_FOR"];
		} else if (array_key_exists('REMOTE_ADDR', $_SERVER)) {
			return $_SERVER["REMOTE_ADDR"];
		} else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
			return $_SERVER["HTTP_CLIENT_IP"];
		}
		return '';
	}

	/**
	 * Get PHP memory usage
	 *
	 * @return string   Returns human readable memory usage.
	 */
	public static function getPHPMemory($peak = false)
	{
		if ($peak) {
			$result = 'Unable to read PHP peak memory usage';
			if (function_exists('memory_get_peak_usage')) {
				$result = DUP_Util::byteSize(memory_get_peak_usage(true));
			}
		} else {
			$result = 'Unable to read PHP memory usage';
			if (function_exists('memory_get_usage')) {
				$result = DUP_Util::byteSize(memory_get_usage(true));
			}
		}
		return $result;
	}
}lib/forceutf8/README.md000064400000003555151336065400010511 0ustar00forceutf8
=========

PHP Class Encoding featuring popular \ForceUTF8\Encoding::toUTF8() function --formerly known as forceUTF8()-- that fixes mixed encoded strings.

Description
===========

If you apply the PHP function utf8_encode() to an already-UTF8 string it will return a garbled UTF8 string.

This class addresses this issue and provides a handy static function called \ForceUTF8\Encoding::toUTF8().

You don't need to know what the encoding of your strings is. It can be Latin1 (iso 8859-1), Windows-1252 or UTF8, or the string can have a mix of them. \ForceUTF8\Encoding::toUTF8() will convert everything to UTF8.

Sometimes you have to deal with services that are unreliable in terms of encoding, possibly mixing UTF8 and Latin1 in the same string.

Update:

I've included another function, \ForceUTF8\Encoding::fixUTF8(), which will fix the double (or multiple) encoded UTF8 string that looks garbled.

Usage:
======

    use \ForceUTF8\Encoding;

    $utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

    $latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

also:

    $utf8_string = Encoding::fixUTF8($garbled_utf8_string);

Examples:

    use \ForceUTF8\Encoding;

    echo Encoding::fixUTF8("Fédération Camerounaise de Football\n");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football\n");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football\n");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football\n");

will output:

    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football

Install via composer:
=====================
Edit your composer.json file to include the following:

```json
{
    "require": {
        "neitanod/forceutf8": "dev-master"
    }
}
```

lib/forceutf8/index.php000064400000000016151336065400011037 0ustar00<?php
//silentlib/forceutf8/Encoding.php000064400000026220151336065400011463 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
Copyright (c) 2008 Sebastián Grignoli
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. Neither the name of copyright holders nor the names of its
   contributors may be used to endorse or promote products derived
   from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/

/**
 * @author   "Sebastián Grignoli" <grignoli@gmail.com>
 * @package  Encoding
 * @version  2.0
 * @link     https://github.com/neitanod/forceutf8
 * @example  https://github.com/neitanod/forceutf8
 * @license  Revised BSD 
  */

//namespace ForceUTF8;
if (!class_exists('DUP_Encoding'))
{
	class DUP_Encoding {

		const ICONV_TRANSLIT = "TRANSLIT";
		const ICONV_IGNORE = "IGNORE";
		const WITHOUT_ICONV = "";

		protected static $win1252ToUtf8 = array(
			  128 => "\xe2\x82\xac",

			  130 => "\xe2\x80\x9a",
			  131 => "\xc6\x92",
			  132 => "\xe2\x80\x9e",
			  133 => "\xe2\x80\xa6",
			  134 => "\xe2\x80\xa0",
			  135 => "\xe2\x80\xa1",
			  136 => "\xcb\x86",
			  137 => "\xe2\x80\xb0",
			  138 => "\xc5\xa0",
			  139 => "\xe2\x80\xb9",
			  140 => "\xc5\x92",
			  142 => "\xc5\xbd",
			  145 => "\xe2\x80\x98",
			  146 => "\xe2\x80\x99",
			  147 => "\xe2\x80\x9c",
			  148 => "\xe2\x80\x9d",
			  149 => "\xe2\x80\xa2",
			  150 => "\xe2\x80\x93",
			  151 => "\xe2\x80\x94",
			  152 => "\xcb\x9c",
			  153 => "\xe2\x84\xa2",
			  154 => "\xc5\xa1",
			  155 => "\xe2\x80\xba",
			  156 => "\xc5\x93",

			  158 => "\xc5\xbe",
			  159 => "\xc5\xb8"
		);

		protected static $brokenUtf8ToUtf8 = array(
			"\xc2\x80" => "\xe2\x82\xac",

			"\xc2\x82" => "\xe2\x80\x9a",
			"\xc2\x83" => "\xc6\x92",
			"\xc2\x84" => "\xe2\x80\x9e",
			"\xc2\x85" => "\xe2\x80\xa6",
			"\xc2\x86" => "\xe2\x80\xa0",
			"\xc2\x87" => "\xe2\x80\xa1",
			"\xc2\x88" => "\xcb\x86",
			"\xc2\x89" => "\xe2\x80\xb0",
			"\xc2\x8a" => "\xc5\xa0",
			"\xc2\x8b" => "\xe2\x80\xb9",
			"\xc2\x8c" => "\xc5\x92",

			"\xc2\x8e" => "\xc5\xbd",


			"\xc2\x91" => "\xe2\x80\x98",
			"\xc2\x92" => "\xe2\x80\x99",
			"\xc2\x93" => "\xe2\x80\x9c",
			"\xc2\x94" => "\xe2\x80\x9d",
			"\xc2\x95" => "\xe2\x80\xa2",
			"\xc2\x96" => "\xe2\x80\x93",
			"\xc2\x97" => "\xe2\x80\x94",
			"\xc2\x98" => "\xcb\x9c",
			"\xc2\x99" => "\xe2\x84\xa2",
			"\xc2\x9a" => "\xc5\xa1",
			"\xc2\x9b" => "\xe2\x80\xba",
			"\xc2\x9c" => "\xc5\x93",

			"\xc2\x9e" => "\xc5\xbe",
			"\xc2\x9f" => "\xc5\xb8"
		);

		protected static $utf8ToWin1252 = array(
		   "\xe2\x82\xac" => "\x80",

		   "\xe2\x80\x9a" => "\x82",
		   "\xc6\x92"     => "\x83",
		   "\xe2\x80\x9e" => "\x84",
		   "\xe2\x80\xa6" => "\x85",
		   "\xe2\x80\xa0" => "\x86",
		   "\xe2\x80\xa1" => "\x87",
		   "\xcb\x86"     => "\x88",
		   "\xe2\x80\xb0" => "\x89",
		   "\xc5\xa0"     => "\x8a",
		   "\xe2\x80\xb9" => "\x8b",
		   "\xc5\x92"     => "\x8c",

		   "\xc5\xbd"     => "\x8e",


		   "\xe2\x80\x98" => "\x91",
		   "\xe2\x80\x99" => "\x92",
		   "\xe2\x80\x9c" => "\x93",
		   "\xe2\x80\x9d" => "\x94",
		   "\xe2\x80\xa2" => "\x95",
		   "\xe2\x80\x93" => "\x96",
		   "\xe2\x80\x94" => "\x97",
		   "\xcb\x9c"     => "\x98",
		   "\xe2\x84\xa2" => "\x99",
		   "\xc5\xa1"     => "\x9a",
		   "\xe2\x80\xba" => "\x9b",
		   "\xc5\x93"     => "\x9c",

		   "\xc5\xbe"     => "\x9e",
		   "\xc5\xb8"     => "\x9f"
		);

		static function toUTF8($text){
	  /**
	   * Function \ForceUTF8\Encoding::toUTF8
	   *
	   * This function leaves UTF8 characters alone, while converting almost all non-UTF8 to UTF8.
	   *
	   * It assumes that the encoding of the original string is either Windows-1252 or ISO 8859-1.
	   *
	   * It may fail to convert characters to UTF-8 if they fall into one of these scenarios:
	   *
	   * 1) when any of these characters:   ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß
	   *    are followed by any of these:  ("group B")
	   *                                    ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶•¸¹º»¼½¾¿
	   * For example:   %ABREPRESENT%C9%BB. «REPRESENTÉ»
	   * The "«" (%AB) character will be converted, but the "É" followed by "»" (%C9%BB)
	   * is also a valid unicode character, and will be left unchanged.
	   *
	   * 2) when any of these: àáâãäåæçèéêëìíîï  are followed by TWO chars from group B,
	   * 3) when any of these: ðñòó  are followed by THREE chars from group B.
	   *
	   * @name toUTF8
	   * @param string $text  Any string.
	   * @return string  The same string, UTF8 encoded
	   *
	   */

		if(is_array($text))
		{
		  foreach($text as $k => $v)
		  {
			$text[$k] = self::toUTF8($v);
		  }
		  return $text;
		} 

		if(!is_string($text)) {
		  return $text;
		}

		$max = self::strlen($text);

		$buf = "";
		for($i = 0; $i < $max; $i++){
			$c1 = $text[$i];
			if($c1>="\xc0"){ //Should be converted to UTF8, if it's not UTF8 already
			  $c2 = $i+1 >= $max? "\x00" : $text[$i+1];
			  $c3 = $i+2 >= $max? "\x00" : $text[$i+2];
			  $c4 = $i+3 >= $max? "\x00" : $text[$i+3];
				if($c1 >= "\xc0" & $c1 <= "\xdf"){ //looks like 2 bytes UTF8
					if($c2 >= "\x80" && $c2 <= "\xbf"){ //yeah, almost sure it's UTF8 already
						$buf .= $c1 . $c2;
						$i++;
					} else { //not valid UTF8.  Convert it.
						$cc1 = (chr(ord($c1) / 64) | "\xc0");
						$cc2 = ($c1 & "\x3f") | "\x80";
						$buf .= $cc1 . $cc2;
					}
				} elseif($c1 >= "\xe0" & $c1 <= "\xef"){ //looks like 3 bytes UTF8
					if($c2 >= "\x80" && $c2 <= "\xbf" && $c3 >= "\x80" && $c3 <= "\xbf"){ //yeah, almost sure it's UTF8 already
						$buf .= $c1 . $c2 . $c3;
						$i = $i + 2;
					} else { //not valid UTF8.  Convert it.
						$cc1 = (chr(ord($c1) / 64) | "\xc0");
						$cc2 = ($c1 & "\x3f") | "\x80";
						$buf .= $cc1 . $cc2;
					}
				} elseif($c1 >= "\xf0" & $c1 <= "\xf7"){ //looks like 4 bytes UTF8
					if($c2 >= "\x80" && $c2 <= "\xbf" && $c3 >= "\x80" && $c3 <= "\xbf" && $c4 >= "\x80" && $c4 <= "\xbf"){ //yeah, almost sure it's UTF8 already
						$buf .= $c1 . $c2 . $c3 . $c4;
						$i = $i + 3;
					} else { //not valid UTF8.  Convert it.
						$cc1 = (chr(ord($c1) / 64) | "\xc0");
						$cc2 = ($c1 & "\x3f") | "\x80";
						$buf .= $cc1 . $cc2;
					}
				} else { //doesn't look like UTF8, but should be converted
						$cc1 = (chr(ord($c1) / 64) | "\xc0");
						$cc2 = (($c1 & "\x3f") | "\x80");
						$buf .= $cc1 . $cc2;
				}
			} elseif(($c1 & "\xc0") == "\x80"){ // needs conversion
				  if(isset(self::$win1252ToUtf8[ord($c1)])) { //found in Windows-1252 special cases
					  $buf .= self::$win1252ToUtf8[ord($c1)];
				  } else {
					$cc1 = (chr(ord($c1) / 64) | "\xc0");
					$cc2 = (($c1 & "\x3f") | "\x80");
					$buf .= $cc1 . $cc2;
				  }
			} else { // it doesn't need conversion
				$buf .= $c1;
			}
		}
		return $buf;
	  }

		static function toWin1252($text, $option = self::WITHOUT_ICONV) {
		  if(is_array($text)) {
			foreach($text as $k => $v) {
			  $text[$k] = self::toWin1252($v, $option);
			}
			return $text;
		  } else if(is_string($text)) {
			return self::utf8_decode($text, $option);
		  } else {
			return $text;
		  }
		}

		static function toISO8859($text) {
		  return self::toWin1252($text);
		}

		static function toLatin1($text) {
		  return self::toWin1252($text);
		}

		static function fixUTF8($text, $option = self::WITHOUT_ICONV){
		  if(is_array($text)) {
			foreach($text as $k => $v) {
			  $text[$k] = self::fixUTF8($v, $option);
			}
			return $text;
		  }

		  $last = "";
		  while($last <> $text){
			$last = $text;
			$text = self::toUTF8(self::utf8_decode($text, $option));
		  }
		  $text = self::toUTF8(self::utf8_decode($text, $option));
		  return $text;
		}

		static function UTF8FixWin1252Chars($text){
		  // If you received an UTF-8 string that was converted from Windows-1252 as it was ISO8859-1
		  // (ignoring Windows-1252 chars from 80 to 9F) use this function to fix it.
		  // See: http://en.wikipedia.org/wiki/Windows-1252

		  return str_replace(array_keys(self::$brokenUtf8ToUtf8), array_values(self::$brokenUtf8ToUtf8), $text);
		}

		static function removeBOM($str=""){
		  if(substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) {
			$str=substr($str, 3);
		  }
		  return $str;
		}

		protected static function strlen($text)
		{
			if((version_compare(PHP_VERSION, '7.2.0') >= 0)) {
				return (function_exists('mb_strlen'))
					? mb_strlen($text,'8bit')
					: strlen($text);
			} else {
				return (function_exists('mb_strlen') && ((int) ini_get('mbstring.func_overload')) & 2)
						? mb_strlen($text,'8bit')
						: strlen($text);
			}
		}

		public static function normalizeEncoding($encodingLabel)
		{
		  $encoding = strtoupper($encodingLabel);
		  $encoding = preg_replace('/[^a-zA-Z0-9\s]/', '', $encoding);
		  $equivalences = array(
			  'ISO88591' => 'ISO-8859-1',
			  'ISO8859'  => 'ISO-8859-1',
			  'ISO'      => 'ISO-8859-1',
			  'LATIN1'   => 'ISO-8859-1',
			  'LATIN'    => 'ISO-8859-1',
			  'UTF8'     => 'UTF-8',
			  'UTF'      => 'UTF-8',
			  'WIN1252'  => 'ISO-8859-1',
			  'WINDOWS1252' => 'ISO-8859-1'
		  );

		  if(empty($equivalences[$encoding])){
			return 'UTF-8';
		  }

		  return $equivalences[$encoding];
		}

		public static function encode($encodingLabel, $text)
		{
		  $encodingLabel = self::normalizeEncoding($encodingLabel);
		  if($encodingLabel == 'ISO-8859-1') return self::toLatin1($text);
		  return self::toUTF8($text);
		}

		protected static function utf8_decode($text, $option)
		{
		  if ($option == self::WITHOUT_ICONV || !function_exists('iconv')) {
			 $o = utf8_decode(
			   str_replace(array_keys(self::$utf8ToWin1252), array_values(self::$utf8ToWin1252), self::toUTF8($text))
			 );
		  } else {
			 $o = iconv("UTF-8", "Windows-1252" . ($option == self::ICONV_TRANSLIT ? '//TRANSLIT' : ($option == self::ICONV_IGNORE ? '//IGNORE' : '')), $text);
		  }
		  return $o;
		}
	}
}lib/snaplib/class.snaplib.exceptions.php000064400000000706151336065400014375 0ustar00<?php
/**
 * Snap exceptions
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLib_32BitSizeLimitException', false)) {

    class DupLiteSnapLib_32BitSizeLimitException extends Exception
    {
        
    }
}lib/snaplib/class.snaplib.u.json.php000064400000025520151336065400013431 0ustar00<?php
/**
 * Snap JSON utils
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package SnapLib
 * @copyright (c) 2019, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!interface_exists('JsonSerializable')) {
    define('SNAP_WP_JSON_SERIALIZE_COMPATIBLE', true);

    /**
     * JsonSerializable interface.
     *
     * Compatibility shim for PHP <5.4
     *
     * @link https://secure.php.net/jsonserializable
     *
     * @since 4.4.0
     */
    interface JsonSerializable
    {

        public function jsonSerialize();
    }
}

if (!class_exists('DupLiteSnapJsonU', false)) {


    class DupLiteSnapJsonU
    {

        /**
         * Encode a variable into JSON, with some sanity checks.
         *
         * @since 4.1.0
         *
         * @param mixed $data    Variable (usually an array or object) to encode as JSON.
         * @param int   $options Optional. Options to be passed to json_encode(). Default 0.
         * @param int   $depth   Optional. Maximum depth to walk through $data. Must be
         *                       greater than 0. Default 512.
         * @return string|false The JSON encoded string, or false if it cannot be encoded.
         */
        public static function wp_json_encode($data, $options = 0, $depth = 512)
        {
            if (function_exists('wp_json_encode')) {
                return wp_json_encode($data, $options, $depth);
            }

            /*
             * json_encode() has had extra params added over the years.
             * $options was added in 5.3, and $depth in 5.5.
             * We need to make sure we call it with the correct arguments.
             */
            if (version_compare(PHP_VERSION, '5.5', '>=')) {
                $args = array($data, $options, $depth);
            } elseif (version_compare(PHP_VERSION, '5.3', '>=')) {
                $args = array($data, $options);
            } else {
                $args = array($data);
            }

            // Prepare the data for JSON serialization.
            $args[0] = self::_wp_json_prepare_data($data);

            $json = @call_user_func_array('json_encode', $args);

            // If json_encode() was successful, no need to do more sanity checking.
            // ... unless we're in an old version of PHP, and json_encode() returned
            // a string containing 'null'. Then we need to do more sanity checking.
            if (false !== $json && ( version_compare(PHP_VERSION, '5.5', '>=') || false === strpos($json, 'null') )) {
                return $json;
            }

            try {
                $args[0] = self::_wp_json_sanity_check($data, $depth);
            }
            catch (Exception $e) {
                return false;
            }

            return call_user_func_array('json_encode', $args);
        }

        /**
         * wp_json_encode with pretty print if define exists
         *
         * @param mixed $data    Variable (usually an array or object) to encode as JSON.
         * @param int   $options Optional. Options to be passed to json_encode(). Default 0.
         * @param int   $depth   Optional. Maximum depth to walk through $data. Must be
         *                       greater than 0. Default 512.
         * @return string|false The JSON encoded string, or false if it cannot be encoded.
         */
        public static function wp_json_encode_pprint($data, $options = 0, $depth = 512)
        {
            if (defined('JSON_PRETTY_PRINT')) {
                return self::wp_json_encode($data, JSON_PRETTY_PRINT | $options, $depth);
            } else {
                return self::wp_json_encode($data, $options, $depth);
            }
        }

        /**
         * Prepares response data to be serialized to JSON.
         *
         * This supports the JsonSerializable interface for PHP 5.2-5.3 as well.
         *
         * @ignore
         * @since 4.4.0
         * @access private
         *
         * @param mixed $data Native representation.
         * @return bool|int|float|null|string|array Data ready for `json_encode()`.
         */
        private static function _wp_json_prepare_data($data)
        {
            if (!defined('SNAP_WP_JSON_SERIALIZE_COMPATIBLE') || SNAP_WP_JSON_SERIALIZE_COMPATIBLE === false || !defined('WP_JSON_SERIALIZE_COMPATIBLE') || WP_JSON_SERIALIZE_COMPATIBLE === false) {
                return $data;
            }

            switch (gettype($data)) {
                case 'boolean':
                case 'integer':
                case 'double':
                case 'string':
                case 'NULL':
                    // These values can be passed through.
                    return $data;

                case 'array':
                    // Arrays must be mapped in case they also return objects.
                    return array_map(array(__CLASS__, '_wp_json_prepare_data'), $data);

                case 'object':
                    // If this is an incomplete object (__PHP_Incomplete_Class), bail.
                    if (!is_object($data)) {
                        return null;
                    }

                    if ($data instanceof JsonSerializable) {
                        $data = $data->jsonSerialize();
                    } else {
                        $data = get_object_vars($data);
                    }

                    // Now, pass the array (or whatever was returned from jsonSerialize through).
                    return self::_wp_json_prepare_data($data);

                default:
                    return null;
            }
        }

        /**
         * Perform sanity checks on data that shall be encoded to JSON.
         *
         * @ignore
         * @since 4.1.0
         * @access private
         *
         * @see wp_json_encode()
         *
         * @param mixed $data  Variable (usually an array or object) to encode as JSON.
         * @param int   $depth Maximum depth to walk through $data. Must be greater than 0.
         * @return mixed The sanitized data that shall be encoded to JSON.
         */
        private static function _wp_json_sanity_check($data, $depth)
        {
            if ($depth < 0) {
                throw new Exception('Reached depth limit');
            }

            if (is_array($data)) {
                $output = array();
                foreach ($data as $id => $el) {
                    // Don't forget to sanitize the ID!
                    if (is_string($id)) {
                        $clean_id = self::_wp_json_convert_string($id);
                    } else {
                        $clean_id = $id;
                    }

                    // Check the element type, so that we're only recursing if we really have to.
                    if (is_array($el) || is_object($el)) {
                        $output[$clean_id] = self::_wp_json_sanity_check($el, $depth - 1);
                    } elseif (is_string($el)) {
                        $output[$clean_id] = self::_wp_json_convert_string($el);
                    } else {
                        $output[$clean_id] = $el;
                    }
                }
            } elseif (is_object($data)) {
                $output = new stdClass;
                foreach ($data as $id => $el) {
                    if (is_string($id)) {
                        $clean_id = self::_wp_json_convert_string($id);
                    } else {
                        $clean_id = $id;
                    }

                    if (is_array($el) || is_object($el)) {
                        $output->$clean_id = self::_wp_json_sanity_check($el, $depth - 1);
                    } elseif (is_string($el)) {
                        $output->$clean_id = self::_wp_json_convert_string($el);
                    } else {
                        $output->$clean_id = $el;
                    }
                }
            } elseif (is_string($data)) {
                return self::_wp_json_convert_string($data);
            } else {
                return $data;
            }

            return $output;
        }

        private static function _wp_json_convert_string($string)
        {
            static $use_mb = null;
            if (is_null($use_mb)) {
                $use_mb = function_exists('mb_convert_encoding');
            }

            if ($use_mb) {
                $encoding = mb_detect_encoding($string, mb_detect_order(), true);
                if ($encoding) {
                    return mb_convert_encoding($string, 'UTF-8', $encoding);
                } else {
                    return mb_convert_encoding($string, 'UTF-8', 'UTF-8');
                }
            } else {
                return self::wp_check_invalid_utf8($string, true);
            }
        }

        /**
         * Checks for invalid UTF8 in a string.
         *
         * @since 2.8.0
         *
         * @staticvar bool $utf8_pcre
         *
         * @param string  $string The text which is to be checked.
         * @param bool    $strip Optional. Whether to attempt to strip out invalid UTF8. Default is false.
         * @return string The checked text.
         */
        public static function wp_check_invalid_utf8($string, $strip = false)
        {
            $string = (string) $string;

            if (0 === strlen($string)) {
                return '';
            }

            // Check for support for utf8 in the installed PCRE library once and store the result in a static
            static $utf8_pcre = null;
            if (!isset($utf8_pcre)) {
                $utf8_pcre = @preg_match('/^./u', 'a');
            }
            // We can't demand utf8 in the PCRE installation, so just return the string in those cases
            if (!$utf8_pcre) {
                return $string;
            }

            // preg_match fails when it encounters invalid UTF8 in $string
            if (1 === @preg_match('/^./us', $string)) {
                return $string;
            }

            // Attempt to strip the bad chars if requested (not recommended)
            if ($strip && function_exists('iconv')) {
                return iconv('utf-8', 'utf-8', $string);
            }

            return '';
        }

        /**
         * @param mixed $val object to be encoded
         * @return string escaped json string
         */
        public static function json_encode_esc_attr($val)
        {
            return esc_attr(json_encode($val));
        }

        /**
         * this function return a json encoded string without quotes at the beginning and the end
         * 
         * @param string $string
         * @return string
         * @throws Exception
         */
        public static function getJsonWithoutQuotes($string)
        {
            if (!is_string($string)) {
                throw new Exception('the function getJsonStringWithoutQuotes take only strings');
            }

            return substr(self::wp_json_encode($string), 1, -1);
        }
    }
}
lib/snaplib/class.snaplib.u.util.php000064400000046750151336065400013445 0ustar00<?php
/**
 * Utility functions
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package snaplib
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibUtil', false)) {

    class DupLiteSnapLibUtil
    {

        public static function getArrayValue(&$array, $key, $required = true, $default = null)
        {
            if (array_key_exists($key, $array)) {
                return $array[$key];
            } else {
                if ($required) {
                    throw new Exception("Key {$key} not present in array");
                } else {
                    return $default;
                }
            }
        }

        /**
         * Gets the calling function name from where this method is called
         *
         * @return  string   Returns the calling function name from where this method is called
         */
        public static function getCallingFunctionName($backTraceBack = 0)
        {
            $callers     = debug_backtrace();
            $backTraceL1 = 1 + $backTraceBack;
            $backTraceL2 = 2 + $backTraceBack;
            $result      = '['.str_pad(basename($callers[$backTraceL1]['file']), 25, '_', STR_PAD_RIGHT).':'.str_pad($callers[$backTraceL1]['line'], 4, ' ', STR_PAD_LEFT).']';
            if (isset($callers[$backTraceL2]) && (isset($callers[$backTraceL2]['class']) || isset($callers[$backTraceL2]['function']))) {
                $result .= ' [';
                $result .= isset($callers[$backTraceL2]['class']) ? $callers[$backTraceL2]['class'].'::' : '';
                $result .= isset($callers[$backTraceL2]['function']) ? $callers[$backTraceL2]['function'] : '';
                $result .= ']';
            }

            return str_pad($result, 80, '_', STR_PAD_RIGHT);
        }

        public static function getWorkPercent($startingPercent, $endingPercent, $totalTaskCount, $currentTaskCount)
        {
            if ($totalTaskCount > 0) {
                $percent = $startingPercent + (($endingPercent - $startingPercent) * ($currentTaskCount / (float) $totalTaskCount));
            } else {
                $percent = $startingPercent;
            }

            return min(max($startingPercent, $percent), $endingPercent);
        }

        public static function make_hash()
        {
            // IMPORTANT!  Be VERY careful in changing this format - the FTP delete logic requires 3 segments with the last segment to be the date in YmdHis format.
            try {
                if (function_exists('random_bytes') && self::PHP53()) {
                    return bin2hex(random_bytes(8)).mt_rand(1000, 9999).'_'.date("YmdHis");
                } else {
                    return strtolower(md5(uniqid(rand(), true))).'_'.date("YmdHis");
                }
            }
            catch (Exception $exc) {
                return strtolower(md5(uniqid(rand(), true))).'_'.date("YmdHis");
            }
        }

        public static function PHP53()
        {
            return version_compare(PHP_VERSION, '5.3.2', '>=');
        }

        /**
         * Groups an array into arrays by a given key, or set of keys, shared between all array members.
         *
         * Based on {@author Jake Zatecky}'s {@link https://github.com/jakezatecky/array_group_by array_group_by()} function.
         * This variant allows $key to be closures.
         *
         * @param array $array   The array to have grouping performed on.
         * @param mixed $key,... The key to group or split by. Can be a _string_, an _integer_, a _float_, or a _callable_.
         *                       - If the key is a callback, it must return a valid key from the array.
         *                       - If the key is _NULL_, the iterated element is skipped.
         *                       - string|int callback ( mixed $item )
         *
         * @return array|null Returns a multidimensional array or `null` if `$key` is invalid.
         */
        public static function arrayGroupBy(array $array, $key)
        {
            if (!is_string($key) && !is_int($key) && !is_float($key) && !is_callable($key)) {
                trigger_error('array_group_by(): The key should be a string, an integer, or a callback', E_USER_ERROR);
                return null;
            }
            $func    = (!is_string($key) && is_callable($key) ? $key : null);
            $_key    = $key;
            // Load the new array, splitting by the target key
            $grouped = array();
            foreach ($array as $value) {
                $key = null;
                if (is_callable($func)) {
                    $key = call_user_func($func, $value);
                } elseif (is_object($value) && isset($value->{$_key})) {
                    $key = $value->{$_key};
                } elseif (isset($value[$_key])) {
                    $key = $value[$_key];
                }
                if ($key === null) {
                    continue;
                }
                $grouped[$key][] = $value;
            }
            // Recursively build a nested grouping if more parameters are supplied
            // Each grouped array value is grouped according to the next sequential key
            if (func_num_args() > 2) {
                $args = func_get_args();
                foreach ($grouped as $key => $value) {
                    $params        = array_merge(array($value), array_slice($args, 2, func_num_args()));
                    $grouped[$key] = call_user_func_array(array(__CLASS__, 'arrayGroupBy'), $params);
                }
            }
            return $grouped;
        }

        /**
         * Converts human readable types (10GB) to bytes
         *
         * @param string $from   A human readable byte size such as 100MB
         *
         * @return int	Returns and integer of the byte size
         */
        public static function convertToBytes($from)
        {
            if (is_numeric($from)) {
                return $from;
            }

            $number = substr($from, 0, -2);
            switch (strtoupper(substr($from, -2))) {
                case "KB": return $number * 1024;
                case "MB": return $number * pow(1024, 2);
                case "GB": return $number * pow(1024, 3);
                case "TB": return $number * pow(1024, 4);
                case "PB": return $number * pow(1024, 5);
            }

            $number = substr($from, 0, -1);
            switch (strtoupper(substr($from, -1))) {
                case "K": return $number * 1024;
                case "M": return $number * pow(1024, 2);
                case "G": return $number * pow(1024, 3);
                case "T": return $number * pow(1024, 4);
                case "P": return $number * pow(1024, 5);
            }
            return $from;
        }

        /**
         *  Sanitize input for XSS code
         *
         *  @param string $val		The value to sanitize
         *
         *  @return string Returns the input value cleaned up.
         */
        public static function sanitize($input)
        {
            return filter_var($input, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
        }

        /**
         * remove all non stamp chars from string
         * 
         * @param string $string
         * @return string
         */
        public static function sanitize_non_stamp_chars($string)
        {
            return preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/u', '', $string);
        }

        /**
         * remove all non stamp chars from string and newline
         * trim string 
         * 
         * @param string $string
         * @return string
         */
        public static function sanitize_non_stamp_chars_and_newline($string)
        {
            return preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\r\n]/u', '', $string);
        }

        /**
         * remove all non stamp chars from string and newline
         * trim string 
         * 
         * @param string $string
         * @return string
         */
        public static function sanitize_non_stamp_chars_newline_and_trim($string)
        {
            return trim(self::sanitize_non_stamp_chars_and_newline($string));
        }

        /**
         * Determines whether a PHP ini value is changeable at runtime.
         *
         * @since 4.6.0
         *
         * @staticvar array $ini_all
         *
         * @link https://secure.php.net/manual/en/function.ini-get-all.php
         *
         * @param string $setting The name of the ini setting to check.
         * @return bool True if the value is changeable at runtime. False otherwise.
         */
        public static function wp_is_ini_value_changeable($setting)
        {
            // if ini_set is disabled can change the values
            if (!function_exists('ini_set')) {
                return false;
            }

            if (function_exists('wp_is_ini_value_changeable')) {
                return wp_is_ini_value_changeable($setting);
            }

            static $ini_all;

            if (!isset($ini_all)) {
                $ini_all = false;
                // Sometimes `ini_get_all()` is disabled via the `disable_functions` option for "security purposes".
                if (function_exists('ini_get_all')) {
                    $ini_all = ini_get_all();
                }
            }

            // Bit operator to workaround https://bugs.php.net/bug.php?id=44936 which changes access level to 63 in PHP 5.2.6 - 5.2.17.
            if (isset($ini_all[$setting]['access']) && ( INI_ALL === ( $ini_all[$setting]['access'] & 7 ) || INI_USER === ( $ini_all[$setting]['access'] & 7 ) )) {
                return true;
            }

            // If we were unable to retrieve the details, fail gracefully to assume it's changeable.
            if (!is_array($ini_all)) {
                return true;
            }

            return false;
        }

        /**
         * The val value returns if it is between min and max otherwise it returns min or max
         * 
         * @param int $val
         * @param int $min
         * @param int $max
         * @return int
         */
        public static function getIntBetween($val, $min, $max)
        {
            return min((int) $max, max((int) $min, (int) $val));
        }

        /**
         * Find matching string from $strArr1 and $strArr2 until first numeric occurence
         *
         * @param array   $strArr1                  array of strings
         * @param array   $strArr2                  array of strings
         * @return string matching str which will be best for replacement
         */
        public static function getMatchingStrFromArrayElemsUntilFirstNumeric($strArr1, $strArr2)
        {
            $matchingStr   = '';
            $strPartialArr = array();
            foreach ($strArr1 as $str1) {
                $str1_str_length     = strlen($str1);
                $tempStr1Chars       = str_split($str1);
                $tempPartialStr      = '';
                // The flag is for whether non-numeric character passed after numeric character occurence in str1. For ex. str1 is utf8mb4, the flag wil be true when parsing m after utf8.
                $numericCharPassFlag = false;
                $charPositionInStr1  = 0;
                while ($charPositionInStr1 < $str1_str_length) {
                    if ($numericCharPassFlag && !is_numeric($tempStr1Chars[$charPositionInStr1])) {
                        break;
                    }
                    if (is_numeric($tempStr1Chars[$charPositionInStr1])) {
                        $numericCharPassFlag = true;
                    }
                    $tempPartialStr .= $tempStr1Chars[$charPositionInStr1];
                    $charPositionInStr1++;
                }
                $strPartialArr[] = $tempPartialStr;
            }
            foreach ($strPartialArr as $strPartial) {
                if (!empty($matchingStr)) {
                    break;
                }
                foreach ($strArr2 as $str2) {
                    if (0 === stripos($str2, $strPartial)) {
                        $matchingStr = $str2;
                        break;
                    }
                }
            }

            return $matchingStr;
        }

        /**
         * Find matching string from $strArr1 and $strArr2
         *
         * @param array   $strArr1                  array of strings
         * @param array   $strArr2                  array of strings
         * @param boolean $match_until_first_numeric only match until first numeric occurrence
         * @return string matching str which will be best for replacement
         */
        public static function getMatchingStrFromArrayElemsBasedOnUnderScore($strArr1, $strArr2)
        {
            $matchingStr = '';

            $str1PartialFirstArr        = array();
            $str1PartialFirstArr        = array();
            $str1PartialStartNMiddleArr = array();
            $str1PartialMiddleNLastArr  = array();
            $str1PartialLastArr         = array();
            foreach ($strArr1 as $str1) {
                $str1PartialArr        = explode('_', $str1);
                $str1_parts_count      = count($str1PartialArr);
                $str1PartialFirstArr[] = $str1PartialArr[0];
                $str1LastPartIndex     = $str1_parts_count - 1;
                if ($str1LastPartIndex > 0) {
                    $str1PartialLastArr[]         = $str1PartialArr[$str1LastPartIndex];
                    $str1PartialStartNMiddleArr[] = substr($str1, 0, strripos($str1, '_'));
                    $str1PartialMiddleNLastArr[]  = substr($str1, stripos($str1, '_') + 1);
                }
            }
            for ($caseNo = 1; $caseNo <= 5; $caseNo++) {
                if (!empty($matchingStr)) {
                    break;
                }
                foreach ($strArr2 as $str2) {
                    switch ($caseNo) {
                        // Both Start and End match
                        case 1:
                            $str2PartialArr    = explode('_', $str2);
                            $str2FirstPart     = $str2PartialArr[0];
                            $str2PartsCount    = count($str2PartialArr);
                            $str2LastPartIndex = $str2PartsCount - 1;
                            if ($str2LastPartIndex > 0) {
                                $str2LastPart = $str2PartialArr[$str2LastPartIndex];
                            } else {
                                $str2LastPart = '';
                            }
                            if (!empty($str2LastPart) && !empty($str1PartialLastArr) && in_array($str2FirstPart, $str1PartialFirstArr) && in_array($str2LastPart, $str1PartialLastArr)) {
                                $matchingStr = $str2;
                            }
                            break;
                        // Start Middle Match
                        case 2:
                            $str2PartialFirstNMiddleParts = substr($str2, 0, strripos($str2, '_'));
                            if (in_array($str2PartialFirstNMiddleParts, $str1PartialStartNMiddleArr)) {
                                $matchingStr = $str2;
                            }
                            break;
                        // End Middle Match
                        case 3:
                            $str2PartialMiddleNLastParts = stripos($str2, '_') !== false ? substr($str2, stripos($str2, '_') + 1) : '';
                            if (!empty($str2PartialMiddleNLastParts) && in_array($str2PartialMiddleNLastParts, $str1PartialMiddleNLastArr)) {
                                $matchingStr = $str2;
                            }
                            break;
                        // Start Match
                        case 4:
                            $str2PartialArr = explode('_', $str2);
                            $str2FirstPart  = $str2PartialArr[0];
                            if (in_array($str2FirstPart, $str1PartialFirstArr)) {
                                $matchingStr = $str2;
                            }
                            break;
                        // End Match
                        case 5:
                            $str2PartialArr    = explode('_', $str2);
                            $str2PartsCount    = count($str2PartialArr);
                            $str2LastPartIndex = $str2PartsCount - 1;
                            if ($str2LastPartIndex > 0) {
                                $str2LastPart = $str2PartialArr[$str2LastPartIndex];
                            } else {
                                $str2LastPart = '';
                            }
                            if (!empty($str2LastPart) && in_array($str2LastPart, $str1PartialLastArr)) {
                                $matchingStr = $str2;
                            }
                            break;
                    }
                    if (!empty($matchingStr)) {
                        break;
                    }
                }
            }
            return $matchingStr;
        }

        /**
         * Gets a specific external variable by name and optionally filters it
         * @param int $type <p>One of <b><code>INPUT_GET</code></b>, <b><code>INPUT_POST</code></b>, <b><code>INPUT_COOKIE</code></b>, <b><code>INPUT_SERVER</code></b>, or <b><code>INPUT_ENV</code></b>.</p>
         * @param string $variable_name <p>Name of a variable to get.</p>
         * @param int $filter <p>The ID of the filter to apply. The Types of filters manual page lists the available filters.</p> <p>If omitted, <b><code>FILTER_DEFAULT</code></b> will be used, which is equivalent to <b><code>FILTER_UNSAFE_RAW</code></b>. This will result in no filtering taking place by default.</p>
         * @param mixed $options <p>Associative array of options or bitwise disjunction of flags. If filter accepts options, flags can be provided in "flags" field of array.</p>
         * @return mixed <p>Value of the requested variable on success, <b><code>FALSE</code></b> if the filter fails, or <b><code>NULL</code></b> if the <code>variable_name</code> variable is not set. If the flag <b><code>FILTER_NULL_ON_FAILURE</code></b> is used, it returns <b><code>FALSE</code></b> if the variable is not set and <b><code>NULL</code></b> if the filter fails.</p>
         * @link http://php.net/manual/en/function.filter-input.php
         * @see filter_var(), filter_input_array(), filter_var_array()
         * @since PHP 5 >= 5.2.0, PHP 7
         */
        public static function filterInputRequest($variable_name, $filter = FILTER_DEFAULT, $options = NULL)
        {
            if (isset($_GET[$variable_name]) && !isset($_POST[$variable_name])) {
                return filter_input(INPUT_GET, $variable_name, $filter, $options);
            }

            return filter_input(INPUT_POST, $variable_name, $filter, $options);
        }

        /**
         * Implemented array_key_first
         *
         * @link https://www.php.net/manual/en/function.array-key-first.php
         * @param array $arr
         * @return int|string|null
         */
        public static function arrayKeyFirst($arr)
        {
            if (!function_exists('array_key_first')) {
                foreach ($arr as $key => $unused) {
                    return $key;
                }
                return null;
            } else {
                return array_key_first($arr);
            }
        }

        /**
         * Get number of bit supported by PHP
         *
         * @return string
         */
        public static function getArchitectureString()
        {
            return (PHP_INT_SIZE * 8).'-bit';
        }
    }
}
lib/snaplib/class.snaplib.u.url.php000064400000017207151336065400013265 0ustar00<?php
/**
 * Utility class used for working with URLs
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibURLU', false)) {

    class DupLiteSnapLibURLU
    {

        protected static $DEF_ARRAY_PARSE_URL = array(
            'scheme'   => false,
            'host'     => false,
            'port'     => false,
            'user'     => false,
            'pass'     => false,
            'path'     => '',
            'scheme'   => false,
            'query'    => false,
            'fragment' => false
        );

        /**
         * Append a new query value to the end of a URL
         *
         * @param string $url   The URL to append the new value to
         * @param string $key   The new key name
         * @param string $value The new key name value
         *
         * @return string Returns the new URL with with the query string name and value
         */
        public static function appendQueryValue($url, $key, $value)
        {
            $separator    = (parse_url($url, PHP_URL_QUERY) == NULL) ? '?' : '&';
            $modified_url = $url."$separator$key=$value";

            return $modified_url;
        }

        /**
         * add www. in url if don't have
         * 
         * @param string $url
         * @return string
         */
        public static function wwwAdd($url)
        {
            return preg_replace('/^((?:\w+\:)?\/\/)(?!www\.)(.+)/', '$1www.$2', $url);
        }

        /**
         * remove www. in url if don't have
         * 
         * @param string $url
         * @return string
         */
        public static function wwwRemove($url)
        {
            return preg_replace('/^((?:\w+\:)?\/\/)www\.(.+)/', '$1$2', $url);
        }

        /**
         * Fetches current URL via php
         *
         * @param bool $queryString If true the query string will also be returned.
         * @param int $getParentDirLevel if 0 get current script name or parent folder, if 1 parent folder if 2 parent of parent folder ... 
         *
         * @returns The current page url
         */
        public static function getCurrentUrl($queryString = true, $requestUri = false, $getParentDirLevel = 0)
        {
            // *** HOST
            if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {
                $host = $_SERVER['HTTP_X_ORIGINAL_HOST'];
            } else {
                $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; //WAS SERVER_NAME and caused problems on some boxes
            }

            // *** PROTOCOL
            if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
                $_SERVER ['HTTPS'] = 'on';
            }
            if (isset($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'https') {
                $_SERVER ['HTTPS'] = 'on';
            }
            if (isset($_SERVER['HTTP_CF_VISITOR'])) {
                $visitor = json_decode($_SERVER['HTTP_CF_VISITOR']);
                if ($visitor->scheme == 'https') {
                    $_SERVER ['HTTPS'] = 'on';
                }
            }
            $protocol = 'http'.((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') ? 's' : '');

            if ($requestUri) {
                $serverUrlSelf = preg_replace('/\?.*$/', '', $_SERVER['REQUEST_URI']);
            } else {
                // *** SCRIPT NAME
                $serverUrlSelf = $_SERVER['SCRIPT_NAME'];
                for ($i = 0; $i < $getParentDirLevel; $i++) {
                    $serverUrlSelf = preg_match('/^[\\\\\/]?$/', dirname($serverUrlSelf)) ? '' : dirname($serverUrlSelf);
                }
            }

            // *** QUERY STRING 
            $query = ($queryString && isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0 ) ? '?'.$_SERVER['QUERY_STRING'] : '';

            return $protocol.'://'.$host.$serverUrlSelf.$query;
        }

        /**
         * this function is a native PHP parse_url wrapper
         * this function returns an associative array with all the keys present and the values = false if they do not exist.
         * 
         * @param string $url <p>The URL to parse. Invalid characters are replaced by <i>_</i>.</p>
         * @param int $component
         * @return mixed <p>On seriously malformed URLs, <b>parse_url()</b> may return <b><code>FALSE</code></b>.</p><p>If the <code>component</code> parameter is omitted, an associative <code>array</code> is returned. At least one element will be present within the array. Potential keys within this array are:</p><ul> <li>  scheme - e.g. http  </li> <li>  host  </li> <li>  port  </li> <li>  user  </li> <li>  pass  </li> <li>  path  </li> <li>  query - after the question mark <i>&#63;</i>  </li> <li>  fragment - after the hashmark <i>#</i>  </li> </ul><p>If the <code>component</code> parameter is specified, <b>parse_url()</b> returns a <code>string</code> (or an <code>integer</code>, in the case of <b><code>PHP_URL_PORT</code></b>) instead of an <code>array</code>. If the requested component doesn't exist within the given URL, <b><code>NULL</code></b> will be returned.</p>
         */
        public static function parseUrl($url, $component = -1)
        {
            $result = parse_url($url, $component);
            if (is_array($result)) {
                $result = array_merge(self::$DEF_ARRAY_PARSE_URL, $result);
            }

            return $result;
        }

        /**
         * this function build a url from array result of parse url.
         * if work with both parse_url native function result and snap parseUrl result
         * 
         * @param array $parts
         * @return bool|string return false if param isn't array
         */
        public static function buildUrl($parts)
        {
            if (!is_array($parts)) {
                return false;
            }

            $result = '';
            $result .= (isset($parts['scheme']) && $parts['scheme'] !== false) ? $parts['scheme'].':' : '';
            $result .= (
                (isset($parts['user']) && $parts['user'] !== false) ||
                (isset($parts['host']) && $parts['host'] !== false)) ? '//' : '';

            $result .= (isset($parts['user']) && $parts['user'] !== false) ? $parts['user'] : '';
            $result .= (isset($parts['pass']) && $parts['pass'] !== false) ? ':'.$parts['pass'] : '';
            $result .= (isset($parts['user']) && $parts['user'] !== false) ? '@' : '';

            $result .= (isset($parts['host']) && $parts['host'] !== false) ? $parts['host'] : '';
            $result .= (isset($parts['port']) && $parts['port'] !== false) ? ':'.$parts['port'] : '';

            $result .= (isset($parts['path']) && $parts['path'] !== false) ? $parts['path'] : '';
            $result .= (isset($parts['query']) && $parts['query'] !== false) ? '?'.$parts['query'] : '';
            $result .= (isset($parts['fragment']) && $parts['fragment'] !== false) ? '#'.$parts['fragment'] : '';

            return $result;
        }

        /**
         * encode alla chars
         * 
         * @param string $url
         * @return string
         */
        public static function urlEncodeAll($url)
        {
            $hex = unpack('H*', urldecode($url));
            return preg_replace('~..~', '%$0', strtoupper($hex[1]));
        }
    }
}
lib/snaplib/class.snaplib.u.string.php000064400000007766151336065400014002 0ustar00<?php
/**
 * Snap strings utils
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibStringU', false)) {

    class DupLiteSnapLibStringU
    {

        public static function boolToString($b)
        {
            return ($b ? 'true' : 'false');
        }

        public static function truncateString($s, $maxWidth)
        {
            if (strlen($s) > $maxWidth) {
                $s = substr($s, 0, $maxWidth - 3).'...';
            }

            return $s;
        }

        /**
         * Returns true if the $haystack string starts with the $needle
         *
         * @param string  $haystack     The full string to search in
         * @param string  $needle       The string to for
         *
         * @return bool Returns true if the $haystack string starts with the $needle
         */
        public static function startsWith($haystack, $needle)
        {
            $length = strlen($needle);
            return (substr($haystack, 0, $length) === $needle);
        }

        /**
         * Returns true if the $haystack string end with the $needle
         *
         * @param string  $haystack     The full string to search in
         * @param string  $needle       The string to for
         *
         * @return bool Returns true if the $haystack string starts with the $needle
         */
        public static function endsWith($haystack, $needle)
        {
            $length = strlen($needle);
            if ($length == 0) {
                return true;
            }

            return (substr($haystack, -$length) === $needle);
        }

        /**
         * Returns true if the $needle is found in the $haystack
         *
         * @param string  $haystack     The full string to search in
         * @param string  $needle       The string to for
         *
         * @return bool
         */
        public static function contains($haystack, $needle)
        {
            $pos = strpos($haystack, $needle);
            return ($pos !== false);
        }

        /**
         * 
         * @param string $glue
         * @param array $pieces
         * @param string $format
         * @return string
         */
        public static function implodeKeyVals($glue, $pieces, $format = '%s="%s"')
        {
            $strList = array();
            foreach ($pieces as $key => $value) {
                if (is_scalar($value)) {
                    $strList[] = sprintf($format, $key, $value);
                } else {
                    $strList[] = sprintf($format, $key, print_r($value, true));
                }
            }
            return implode($glue, $strList);
        }

        /**
         * Replace last occurrence
         *
         * @param  String  $search         The value being searched for
         * @param  String  $replace        The replacement value that replaces found search values
         * @param  String  $str        The string or array being searched and replaced on, otherwise known as the haystack
         * @param  Boolean $caseSensitive Whether the replacement should be case sensitive or not
         *
         * @return String
         */
        public static function strLastReplace($search, $replace, $str, $caseSensitive = true)
        {
            $pos = $caseSensitive ? strrpos($str, $search) : strripos($str, $search);
            if (false !== $pos) {
                $str = substr_replace($str, $replace, $pos, strlen($search));
            }
            return $str;
        }

        /**
         * 
         * @param string $string
         * @return boolean
         */
        public static function isHTML($string)
        {
            return ($string != strip_tags($string));
        }
    }
}
lib/snaplib/snaplib.all.php000064400000002424151336065400011657 0ustar00<?php
/**
 * include all snap lib
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package snaplib
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!defined('DUPLITE_SNAPLIB_INCLUDE_ALL')) {
    define('DUPLITE_SNAPLIB_INCLUDE_ALL', true);

    $dir = dirname(__FILE__);

    require_once($dir.'/class.snaplib.exceptions.php');
    require_once($dir.'/class.snaplib.logger.php');
    require_once($dir.'/class.snaplib.u.util.php');
    require_once($dir.'/class.snaplib.u.io.php');
    require_once($dir.'/class.snaplib.u.db.php');
    require_once($dir.'/class.snaplib.u.json.php');
    require_once($dir.'/class.snaplib.jsonSerializable.abstract.php');
    require_once($dir.'/class.snaplib.u.net.php');
    require_once($dir.'/class.snaplib.u.orig.files.manager.php');
    require_once($dir.'/class.snaplib.u.os.php');
    require_once($dir.'/class.snaplib.u.stream.php');
    require_once($dir.'/class.snaplib.u.string.php');
    require_once($dir.'/class.snaplib.u.ui.php');
    require_once($dir.'/class.snaplib.u.url.php');
    require_once($dir.'/class.snaplib.u.wp.php');
}
lib/snaplib/class.snaplib.u.os.php000064400000003375151336065400013105 0ustar00<?php
/**
 * Snap OS utils
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibOSU', false)) {

    class DupLiteSnapLibOSU
    {

        const DEFAULT_WINDOWS_MAXPATH = 260;
        const DEFAULT_LINUX_MAXPATH   = 4096;

        /**
         * return true if current SO is windows
         *
         * @staticvar bool $isWindows
         * @return bool
         */
        public static function isWindows()
        {
            static $isWindows = null;
            if (is_null($isWindows)) {
                $isWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
            }
            return $isWindows;
        }

        public static function isOSX()
        {
            static $isOSX = null;
            if (is_null($isOSX)) {
                $isOSX = (strtoupper(substr(PHP_OS, 0, 6)) === 'DARWIN');
            }
            return $isOSX;
        }

        /**
         *  return current SO path path len
         * @staticvar int $maxPath
         * @return int
         */
        public static function maxPathLen()
        {
            static $maxPath = null;
            if (is_null($maxPath)) {
                if (defined('PHP_MAXPATHLEN')) {
                    $maxPath = PHP_MAXPATHLEN;
                } else {
                    // for PHP < 5.3.0
                    $maxPath = self::isWindows() ? self::DEFAULT_WINDOWS_MAXPATH : self::DEFAULT_LINUX_MAXPATH;
                }
            }
            return $maxPath;
        }
    }
}
lib/snaplib/class.snaplib.u.db.php000064400000021051151336065400013040 0ustar00<?php
/**
 * Snap Database utils
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package SnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DupLiteSnapLibDB
{

    const CACHE_PREFIX_PRIMARY_KEY_COLUMN = 'pkcol_';
    const DB_ENGINE_MYSQL                 = 'MySQL';
    const DB_ENGINE_MARIA                 = 'MariaDB';
    const DB_ENGINE_PERCONA               = 'Percona';

    private static $cache = array();

    /**
     * 
     * @param mysqli $dbh // Database connection handle
     * @param string $tableName
     * @return string|string[] // return array if primary key is composite key
     * @throws Exception
     */
    public static function getUniqueIndexColumn(\mysqli $dbh, $tableName, $logCallback = null)
    {
        $cacheKey = self::CACHE_PREFIX_PRIMARY_KEY_COLUMN.$tableName;

        if (!isset(self::$cache[$cacheKey])) {
            $query  = 'SHOW COLUMNS FROM `'.mysqli_real_escape_string($dbh, $tableName).'` WHERE `Key` IN ("PRI","UNI")';
            if (($result = mysqli_query($dbh, $query)) === false) {
                if (is_callable($logCallback)) {
                    call_user_func($logCallback, $dbh, $result, $query);
                }
                throw new Exception('SHOW KEYS QUERY ERROR: '.mysqli_error($dbh));
            }

            if (is_callable($logCallback)) {
                call_user_func($logCallback, $dbh, $result, $query);
            }

            if ($result->num_rows == 0) {
                self::$cache[$cacheKey] = false;
            } else {
                $primary = false;
                $unique  = false;

                while ($row = $result->fetch_assoc()) {
                    switch ($row['Key']) {
                        case 'PRI':
                            if ($primary === false) {
                                $primary = $row['Field'];
                            } else {
                                if (is_scalar($primary)) {
                                    $primary = array($primary);
                                }
                                $primary[] = $row['Field'];
                            }
                            break;
                        case 'UNI':
                            $unique = $row['Field'];
                            break;
                        default:
                            break;
                    }
                }
                if ($primary !== false) {
                    self::$cache[$cacheKey] = $primary;
                } else if ($unique !== false) {
                    self::$cache[$cacheKey] = $unique;
                } else {
                    self::$cache[$cacheKey] = false;
                }
            }

            $result->free();
        }

        return self::$cache[$cacheKey];
    }

    /**
     * 
     * @param array $row
     * @param string|string[] $indexColumns
     * @return string|string[]
     */
    public static function getOffsetFromRowAssoc($row, $indexColumns, $lastOffset)
    {
        if (is_array($indexColumns)) {
            $result = array();
            foreach ($indexColumns as $col) {
                $result[$col] = isset($row[$col]) ? $row[$col] : 0;
            }
            return $result;
        } else if (strlen($indexColumns) > 0) {
            return isset($row[$indexColumns]) ? $row[$indexColumns] : 0;
        } else {
            return $lastOffset + 1;
        }
    }

    /**
     * This function performs a select by structuring the primary key as offset if the table has a primary key. 
     * For optimization issues, no checks are performed on the input query and it is assumed that the select has at least a where value.
     * If there are no conditions, you still have to perform an always true condition, for example
     * SELECT * FROM `copy1_postmeta` WHERE 1
     * 
     * @param mysqli $dbh // Database connection handle
     * @param string $query
     * @param string $table
     * @param int $offset
     * @param int $limit // 0 no limit
     * @param mixed $lastRowOffset // last offset to use on next function call
     * @return mysqli_result 
     * @throws Exception // exception on query fail
     */
    public static function selectUsingPrimaryKeyAsOffset(\mysqli $dbh, $query, $table, $offset, $limit, &$lastRowOffset = null, $logCallback = null)
    {
        $where     = '';
        $orderby   = '';
        $offsetStr = '';
        $limitStr  = $limit > 0 ? ' LIMIT '.$limit : '';

        if (($primaryColumn = self::getUniqueIndexColumn($dbh, $table, $logCallback)) == false) {
            $offsetStr = ' OFFSET '.(is_scalar($offset) ? $offset : 0);
        } else {
            if (is_array($primaryColumn)) {
                // COMPOSITE KEY
                $orderByCols = array();
                foreach ($primaryColumn as $colIndex => $col) {
                    $orderByCols[] = '`'.$col.'` ASC';
                }
                $orderby = ' ORDER BY '.implode(',', $orderByCols);
            } else {
                $orderby = ' ORDER BY `'.$primaryColumn.'` ASC';
            }
            $where = self::getOffsetKeyCondition($dbh, $primaryColumn, $offset);
        }
        $query .= $where.$orderby.$limitStr.$offsetStr;

        if (($result = mysqli_query($dbh, $query)) === false) {
            if (is_callable($logCallback)) {
                call_user_func($logCallback, $dbh, $result, $query);
            }
            throw new Exception('SELECT ERROR: '.mysqli_error($dbh));
        }

        if (is_callable($logCallback)) {
            call_user_func($logCallback, $dbh, $result, $query);
        }

        if ($primaryColumn == false) {
            $lastRowOffset = $offset + $result->num_rows;
        } else {
            if ($result->num_rows == 0) {
                $lastRowOffset = $offset;
            } else {
                $result->data_seek(($result->num_rows - 1));
                $row = $result->fetch_assoc();
                if (is_array($primaryColumn)) {
                    $lastRowOffset = array();
                    foreach ($primaryColumn as $col) {
                        $lastRowOffset[$col] = $row[$col];
                    }
                } else {
                    $lastRowOffset = $row[$primaryColumn];
                }
                $result->data_seek(0);
            }
        }

        return $result;
    }

    /**
     * Depending on the structure type of the primary key returns the condition to position at the right offset
     * 
     * @param string|string[] $primaryColumn
     * @param mixed $offset
     * @return string
     */
    protected static function getOffsetKeyCondition(\mysqli $dbh, $primaryColumn, $offset)
    {
        $condition = '';

        if ($offset === 0) {
            return '';
        }

        // COUPOUND KEY
        if (is_array($primaryColumn)) {
            foreach ($primaryColumn as $colIndex => $col) {
                if (is_array($offset) && isset($offset[$col]) && $offset[$col] > 0) {
                    $condition .= ($colIndex == 0 ? '' : ' OR ');
                    $condition .= ' (';
                    for ($prevColIndex = 0; $prevColIndex < $colIndex; $prevColIndex++) {
                        $condition .= ' `'.$primaryColumn[$prevColIndex].'` = "'.mysqli_real_escape_string($dbh, $offset[$primaryColumn[$prevColIndex]]).'" AND ';
                    }
                    $condition .= ' `'.$col.'` > "'.mysqli_real_escape_string($dbh, $offset[$col]).'")';
                }
            }
        } else {
            $condition = '`'.$primaryColumn.'` > "'.mysqli_real_escape_string($dbh, (is_scalar($offset) ? $offset : 0)).'"';
        }

        return (strlen($condition) ? ' AND ('.$condition.')' : '');
    }

    public static function getDBEngine(\mysqli $dbh)
    {
        $result = mysqli_query($dbh, "SHOW VARIABLES LIKE 'version%'");
        $rows    = @mysqli_fetch_all($result);
        @mysqli_free_result($result);

        $version        = isset($rows[0][1]) ? $rows[0][1] : false;
        $versionComment = isset($rows[1][1]) ? $rows[1][1] : false;

        //Default is mysql
        if ($version === false && $versionComment === false) {
            return self::DB_ENGINE_MYSQL;
        }

        if (stripos($version, 'maria') !== false || stripos($versionComment, 'maria') !== false) {
            return self::DB_ENGINE_MARIA;
        }

        if (stripos($version, 'percona') !== false || stripos($versionComment, 'percona') !== false) {
            return self::DB_ENGINE_PERCONA;
        }

        return self::DB_ENGINE_MYSQL;
    }
}
lib/snaplib/index.php000064400000000017151336065400010563 0ustar00<?php
//silentlib/snaplib/class.snaplib.u.stream.php000064400000001317151336065400013751 0ustar00<?php
/**
 * Snap stream utils
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibStreamU', false)) {

    class DupLiteSnapLibStreamU
    {

        public static function streamGetLine($handle, $length, $ending)
        {
            $line = stream_get_line($handle, $length, $ending);

            if ($line === false) {
                throw new Exception('Error reading line.');
            }

            return $line;
        }
    }
}lib/snaplib/class.snaplib.jsonSerializable.abstract.php000064400000013520151336065400017314 0ustar00<?php
/**
 * Json class serialize / unserialize json
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package SnapLib
 * @copyright (c) 2019, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapJsonSerializable', false)) {

    abstract class DupLiteSnapJsonSerializable
    {

        const CLASS_KEY_FOR_JSON_SERIALIZE = '==_CLASS_==_NAME_==';

        protected static function objectToPublicArrayClass($obj = null)
        {
            $reflect = new ReflectionObject($obj);
            $result  = array(
                self::CLASS_KEY_FOR_JSON_SERIALIZE => $reflect->name
            );

            if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
                /**
                 * get all props of current class but not props private of parent class
                 */
                $props = $reflect->getProperties();

                foreach ($props as $prop) {
                    $prop->setAccessible(true);
                    $propName  = $prop->getName();
                    $propValue = $prop->getValue($obj);

                    $result[$propName] = self::parseValueToArray($propValue);
                }
            } else {
                $objArray = (array) $obj;
                $re       = '/(?:.*\x00)?(.+)/';
                $subst    = '$1';

                foreach ($objArray as $origPropName => $propValue) {
                    $propName          = preg_replace($re, $subst, $origPropName, 1);
                    $result[$propName] = self::parseValueToArray($propValue);
                }
            }
            return $result;
        }

        protected static function parseValueToArray($value)
        {
            if (is_object($value)) {
                return self::objectToPublicArrayClass($value);
            } else if (is_array($value)) {
                $result = array();
                foreach ($value as $key => $arrayVal) {
                    $result[$key] = self::parseValueToArray($arrayVal);
                }
                return $result;
            } else {
                return $value;
            }
        }

        protected static function parseArrayToValue($value, $classFromProp = null)
        {
            if (($newClassName = self::getClassFromArray($value, $classFromProp)) !== false) {
                if (class_exists($newClassName)) {
                    $newObj = new $newClassName();
                } else {
                    $newObj = new StdClass();
                }

                if (is_subclass_of($newObj, __CLASS__)) {
                    $newObj->initFromPublicArray($value, $classFromProp);
                } else {
                    $reflect      = new ReflectionObject($newObj);
                    $excludeProps = array(self::CLASS_KEY_FOR_JSON_SERIALIZE);

                    $privateProps = $reflect->getProperties(ReflectionProperty::IS_PROTECTED + ReflectionProperty::IS_PRIVATE + ReflectionProperty::IS_STATIC);
                    foreach ($privateProps as $pros) {
                        $excludeProps[] = $pros->getName();
                    }

                    foreach ($value as $arrayProp => $arrayValue) {
                        if (in_array($arrayProp, $excludeProps)) {
                            continue;
                        }
                        $newObj->{$arrayProp} = self::parseArrayToValue($arrayValue, $classFromProp);
                    }
                }
                return $newObj;
            } else if (is_array($value)) {
                $result = array();
                foreach ($value as $key => $arrayVal) {
                    $result[$key] = self::parseArrayToValue($arrayVal);
                }
                return $result;
            } else {
                return $value;
            }
        }

        protected function initFromPublicArray($array, $classFromProp = null)
        {
            if (!is_array($array)) {
                return false;
            }

            $reflect        = new ReflectionObject($this);
            $classFromArray = self::getClassFromArray($array, $classFromProp);

            if ($classFromArray == false || $classFromArray !== $reflect->name) {
                return false;
            }

            $excludeProps = array(self::CLASS_KEY_FOR_JSON_SERIALIZE);
            $privateProps = $reflect->getProperties(ReflectionProperty::IS_PRIVATE + ReflectionProperty::IS_STATIC);

            foreach ($privateProps as $pros) {
                $excludeProps[] = $pros->getName();
            }

            foreach ($array as $propName => $propValue) {
                if (in_array($propName, $excludeProps)) {
                    continue;
                }
                $this->{$propName} = self::parseArrayToValue($propValue, $classFromProp);
            }
        }

        protected static function getClassFromArray($array, $classFromProp = null)
        {
            if (!is_array($array)) {
                return false;
            } else if (isset($array[self::CLASS_KEY_FOR_JSON_SERIALIZE])) {
                return $array[self::CLASS_KEY_FOR_JSON_SERIALIZE];
            } else if (!is_null($classFromProp) && isset($array[$classFromProp])) {
                return $array[$classFromProp];
            } else {
                return false;
            }
        }

        /**
         *
         */
        public function jsonSerialize()
        {
            return DupLiteSnapJsonU::wp_json_encode_pprint(self::objectToPublicArrayClass($this));
        }

        /**
         *
         * @param string $json
         * @return type
         */
        public static function jsonUnserialize($json, $classFromProp = null)
        {
            $publicArray = json_decode($json, true);
            return self::parseArrayToValue($publicArray, $classFromProp);
        }
    }
}
lib/snaplib/class.snaplib.u.net.php000064400000003447151336065400013252 0ustar00<?php
/**
 * Snap Net utils
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibNetU', false)) {

    class DupLiteSnapLibNetU
    {

        public static function postWithoutWait($url, $params)
        {
            foreach ($params as $key => &$val) {
                if (is_array($val)) {
                    $val = implode(',', $val);
                }
                $post_params[] = $key.'='.urlencode($val);
            }

            $post_string = implode('&', $post_params);

            $parts = parse_url($url);

            $fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 60);

            $out = "POST ".$parts['path']." HTTP/1.1\r\n";
            $out .= "Host: ".$parts['host']."\r\n";
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out .= "Content-Length: ".strlen($post_string)."\r\n";
            $out .= "Connection: Close\r\n\r\n";

            if (isset($post_string)) {
                $out .= $post_string;
            }

            fwrite($fp, $out);

            fclose($fp);
        }

        public static function getRequestValue($paramName, $isRequired = true, $default = null)
        {
            if (isset($_REQUEST[$paramName])) {

                return $_REQUEST[$paramName];
            } else {

                if ($isRequired) {
                    throw new Exception("Parameter $paramName not present");
                }

                return $default;
            }
        }
    }
}lib/snaplib/wordpress.core.files.php000064400000353741151336065400013553 0ustar00<?php
/**
 * >>>>>> THIS FILE IS AUTOGENERATED DON'T MODIFY THIS DIRECTLY <<<<<
 * >>>>>> USE THE GENERATOR SCRIPT <<<<<
 *
 * >>>>>> THIS FILE IS AUTOGENERATED DON'T MODIFY THIS DIRECTLY <<<<<
 * >>>>>> USE THE GENERATOR SCRIPT <<<<<
 *
 * >>>>>> THIS FILE IS AUTOGENERATED DON'T MODIFY THIS DIRECTLY <<<<<
 * >>>>>> USE THE GENERATOR SCRIPT <<<<<
 *
 * Core wordpress file list
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package snaplib
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/*
 * >>>>>> THIS FILE IS AUTOGENERATED DON'T MODIFY THIS DIRECTLY <<<<<
 * >>>>>> USE THE GENERATOR SCRIPT <<<<<
 *
 * >>>>>> THIS FILE IS AUTOGENERATED DON'T MODIFY THIS DIRECTLY <<<<<
 * >>>>>> USE THE GENERATOR SCRIPT <<<<<
 *
 * >>>>>> THIS FILE IS AUTOGENERATED DON'T MODIFY THIS DIRECTLY <<<<<
 * >>>>>> USE THE GENERATOR SCRIPT <<<<<
 *
 */
self::$corePathList = array(
    'wp-login.php'         => array(),
    'wp-config-sample.php' => array(),
    'wp-activate.php'      => array(),
    'wp-comments-post.php' => array(),
    'wp-signup.php'        => array(),
    'wp-mail.php'          => array(),
    'wp-links-opml.php'    => array(),
    'wp-load.php'          => array(),
    'wp-blog-header.php'   => array(),
    'wp-content'           => array(
        'index.php' => array()
    ),
    'wp-includes'          => array(
        'category-template.php'                          => array(),
        'class-wp-recovery-mode-email-service.php'       => array(),
        'default-constants.php'                          => array(),
        'class-wp-http-requests-hooks.php'               => array(),
        'class-wp-block-patterns-registry.php'           => array(),
        'media.php'                                      => array(),
        'block-patterns.php'                             => array(),
        'functions.php'                                  => array(),
        'ms-network.php'                                 => array(),
        'class-requests.php'                             => array(),
        'cache.php'                                      => array(),
        'class-wp-dependency.php'                        => array(),
        'class-wp-http-proxy.php'                        => array(),
        'class-phpass.php'                               => array(),
        'ms-settings.php'                                => array(),
        'class-wp-customize-manager.php'                 => array(),
        'class-wp-block-styles-registry.php'             => array(),
        'class-wp-recovery-mode-key-service.php'         => array(),
        'class-walker-category.php'                      => array(),
        'class-wp-metadata-lazyloader.php'               => array(),
        'blocks.php'                                     => array(),
        'l10n.php'                                       => array(),
        'cron.php'                                       => array(),
        'template.php'                                   => array(),
        'class-wp-widget-factory.php'                    => array(),
        'class-wp-network.php'                           => array(),
        'nav-menu-template.php'                          => array(),
        'class-wp-matchesmapregex.php'                   => array(),
        'feed-rdf.php'                                   => array(),
        'widgets'                                        => array(
            'class-wp-widget-pages.php'           => array(),
            'class-wp-widget-text.php'            => array(),
            'class-wp-widget-custom-html.php'     => array(),
            'class-wp-widget-recent-comments.php' => array(),
            'class-wp-widget-tag-cloud.php'       => array(),
            'class-wp-widget-links.php'           => array(),
            'class-wp-widget-media-video.php'     => array(),
            'class-wp-widget-archives.php'        => array(),
            'class-wp-widget-search.php'          => array(),
            'class-wp-widget-calendar.php'        => array(),
            'class-wp-widget-meta.php'            => array(),
            'class-wp-widget-media.php'           => array(),
            'class-wp-nav-menu-widget.php'        => array(),
            'class-wp-widget-media-audio.php'     => array(),
            'class-wp-widget-recent-posts.php'    => array(),
            'class-wp-widget-categories.php'      => array(),
            'class-wp-widget-rss.php'             => array(),
            'class-wp-widget-media-image.php'     => array(),
            'class-wp-widget-media-gallery.php'   => array()
        ),
        'class-wp-paused-extensions-storage.php'         => array(),
        'class-walker-page-dropdown.php'                 => array(),
        'class-wp-text-diff-renderer-inline.php'         => array(),
        'theme-compat'                                   => array(
            'sidebar.php'        => array(),
            'embed-404.php'      => array(),
            'embed-content.php'  => array(),
            'footer-embed.php'   => array(),
            'header-embed.php'   => array(),
            'header.php'         => array(),
            'footer.php'         => array(),
            'embed.php'          => array(),
            'comments.php'       => array(),
            'comments-popup.php' => array()
        ),
        'class-phpmailer.php'                            => array(),
        'class-wp-post-type.php'                         => array(),
        'class-wp-locale-switcher.php'                   => array(),
        'load.php'                                       => array(),
        'class-wp-recovery-mode-cookie-service.php'      => array(),
        'class-wp-role.php'                              => array(),
        'pluggable-deprecated.php'                       => array(),
        'class-wp-oembed-controller.php'                 => array(),
        'class-wp-term.php'                              => array(),
        'class-smtp.php'                                 => array(),
        'capabilities.php'                               => array(),
        'IXR'                                            => array(
            'class-IXR-server.php'              => array(),
            'class-IXR-date.php'                => array(),
            'class-IXR-request.php'             => array(),
            'class-IXR-error.php'               => array(),
            'class-IXR-client.php'              => array(),
            'class-IXR-base64.php'              => array(),
            'class-IXR-clientmulticall.php'     => array(),
            'class-IXR-value.php'               => array(),
            'class-IXR-message.php'             => array(),
            'class-IXR-introspectionserver.php' => array()
        ),
        'class-wp-text-diff-renderer-table.php'          => array(),
        'class-wp-xmlrpc-server.php'                     => array(),
        'class-wp-site-query.php'                        => array(),
        'class-wp-admin-bar.php'                         => array(),
        'session.php'                                    => array(),
        'class-wp-block-type-registry.php'               => array(),
        'rewrite.php'                                    => array(),
        'registration-functions.php'                     => array(),
        'option.php'                                     => array(),
        'class-walker-comment.php'                       => array(),
        'post-formats.php'                               => array(),
        'class-wp-customize-setting.php'                 => array(),
        'pluggable.php'                                  => array(),
        'class-wp-block-type.php'                        => array(),
        'class-wp-http-response.php'                     => array(),
        'class-wp-error.php'                             => array(),
        'deprecated.php'                                 => array(),
        'blocks'                                         => array(
            'pullquote'           => array(
                'block.json' => array()
            ),
            'gallery'             => array(
                'block.json' => array()
            ),
            'code'                => array(
                'block.json' => array()
            ),
            'more'                => array(
                'block.json' => array()
            ),
            'social-link.php'     => array(),
            'image'               => array(
                'block.json' => array()
            ),
            'latest-posts'        => array(
                'block.json' => array()
            ),
            'block'               => array(
                'block.json' => array()
            ),
            'media-text'          => array(
                'block.json' => array()
            ),
            'archives.php'        => array(),
            'spacer'              => array(
                'block.json' => array()
            ),
            'buttons'             => array(
                'block.json' => array()
            ),
            'video'               => array(
                'block.json' => array()
            ),
            'subhead'             => array(
                'block.json' => array()
            ),
            'audio'               => array(
                'block.json' => array()
            ),
            'table'               => array(
                'block.json' => array()
            ),
            'latest-comments.php' => array(),
            'social-links'        => array(
                'block.json' => array()
            ),
            'button'              => array(
                'block.json' => array()
            ),
            'rss'                 => array(
                'block.json' => array()
            ),
            'columns'             => array(
                'block.json' => array()
            ),
            'calendar.php'        => array(),
            'calendar'            => array(
                'block.json' => array()
            ),
            'quote'               => array(
                'block.json' => array()
            ),
            'text-columns'        => array(
                'block.json' => array()
            ),
            'separator'           => array(
                'block.json' => array()
            ),
            'archives'            => array(
                'block.json' => array()
            ),
            'social-link'         => array(
                'block.json' => array()
            ),
            'missing'             => array(
                'block.json' => array()
            ),
            'shortcode.php'       => array(),
            'verse'               => array(
                'block.json' => array()
            ),
            'categories'          => array(
                'block.json' => array()
            ),
            'classic'             => array(
                'block.json' => array()
            ),
            'tag-cloud'           => array(
                'block.json' => array()
            ),
            'latest-posts.php'    => array(),
            'rss.php'             => array(),
            'shortcode'           => array(
                'block.json' => array()
            ),
            'file'                => array(
                'block.json' => array()
            ),
            'categories.php'      => array(),
            'index.php'           => array(),
            'search'              => array(
                'block.json' => array()
            ),
            'list'                => array(
                'block.json' => array()
            ),
            'column'              => array(
                'block.json' => array()
            ),
            'group'               => array(
                'block.json' => array()
            ),
            'preformatted'        => array(
                'block.json' => array()
            ),
            'html'                => array(
                'block.json' => array()
            ),
            'nextpage'            => array(
                'block.json' => array()
            ),
            'latest-comments'     => array(
                'block.json' => array()
            ),
            'block.php'           => array(),
            'heading'             => array(
                'block.json' => array()
            ),
            'search.php'          => array(),
            'tag-cloud.php'       => array(),
            'paragraph'           => array(
                'block.json' => array()
            )
        ),
        'default-filters.php'                            => array(),
        'ms-load.php'                                    => array(),
        'class-wp-feed-cache.php'                        => array(),
        'plugin.php'                                     => array(),
        'fonts'                                          => array(
            'dashicons.svg'   => array(),
            'dashicons.woff2' => array(),
            'dashicons.ttf'   => array(),
            'dashicons.woff'  => array(),
            'dashicons.eot'   => array()
        ),
        'query.php'                                      => array(),
        'class-pop3.php'                                 => array(),
        'class-wp-user-request.php'                      => array(),
        'class-wp-user-meta-session-tokens.php'          => array(),
        'class-wp-oembed.php'                            => array(),
        'class-wp-editor.php'                            => array(),
        'class-wp-image-editor-gd.php'                   => array(),
        'class.wp-scripts.php'                           => array(),
        'class-walker-nav-menu.php'                      => array(),
        'author-template.php'                            => array(),
        'ms-blogs.php'                                   => array(),
        'class-wp-simplepie-sanitize-kses.php'           => array(),
        'class-wp-walker.php'                            => array(),
        'taxonomy.php'                                   => array(),
        'compat.php'                                     => array(),
        'class-wp-block.php'                             => array(),
        'category.php'                                   => array(),
        'atomlib.php'                                    => array(),
        'class.wp-dependencies.php'                      => array(),
        'class-wp-recovery-mode.php'                     => array(),
        'Requests'                                       => array(
            'Utility'         => array(
                'CaseInsensitiveDictionary.php' => array(),
                'FilteredIterator.php'          => array()
            ),
            'IDNAEncoder.php' => array(),
            'Transport'       => array(
                'cURL.php'      => array(),
                'fsockopen.php' => array()
            ),
            'Proxy.php'       => array(),
            'IPv6.php'        => array(),
            'Exception.php'   => array(),
            'Hooks.php'       => array(),
            'Proxy'           => array(
                'HTTP.php' => array()
            ),
            'Response.php'    => array(),
            'IRI.php'         => array(),
            'SSL.php'         => array(),
            'Auth'            => array(
                'Basic.php' => array()
            ),
            'Response'        => array(
                'Headers.php' => array()
            ),
            'Session.php'     => array(),
            'Exception'       => array(
                'Transport'     => array(
                    'cURL.php' => array()
                ),
                'HTTP'          => array(
                    '431.php'     => array(),
                    '415.php'     => array(),
                    '428.php'     => array(),
                    '414.php'     => array(),
                    '408.php'     => array(),
                    '417.php'     => array(),
                    '502.php'     => array(),
                    '306.php'     => array(),
                    '412.php'     => array(),
                    '410.php'     => array(),
                    '416.php'     => array(),
                    '505.php'     => array(),
                    '401.php'     => array(),
                    '305.php'     => array(),
                    '404.php'     => array(),
                    '403.php'     => array(),
                    '411.php'     => array(),
                    '500.php'     => array(),
                    '429.php'     => array(),
                    '504.php'     => array(),
                    '402.php'     => array(),
                    '501.php'     => array(),
                    '405.php'     => array(),
                    '409.php'     => array(),
                    '406.php'     => array(),
                    '413.php'     => array(),
                    '304.php'     => array(),
                    '418.php'     => array(),
                    '511.php'     => array(),
                    '407.php'     => array(),
                    '503.php'     => array(),
                    '400.php'     => array(),
                    'Unknown.php' => array()
                ),
                'HTTP.php'      => array(),
                'Transport.php' => array()
            ),
            'Auth.php'        => array(),
            'Cookie'          => array(
                'Jar.php' => array()
            ),
            'Transport.php'   => array(),
            'Cookie.php'      => array(),
            'Hooker.php'      => array()
        ),
        'revision.php'                                   => array(),
        'wp-diff.php'                                    => array(),
        'class-wp-roles.php'                             => array(),
        'sitemaps'                                       => array(
            'class-wp-sitemaps-index.php'      => array(),
            'class-wp-sitemaps-renderer.php'   => array(),
            'class-wp-sitemaps-stylesheet.php' => array(),
            'class-wp-sitemaps-registry.php'   => array(),
            'class-wp-sitemaps.php'            => array(),
            'class-wp-sitemaps-provider.php'   => array(),
            'providers'                        => array(
                'class-wp-sitemaps-posts.php'      => array(),
                'class-wp-sitemaps-taxonomies.php' => array(),
                'class-wp-sitemaps-users.php'      => array()
            )
        ),
        'js'                                             => array(
            'hoverIntent.js'                     => array(),
            'wp-a11y.min.js'                     => array(),
            'media-audiovideo.js'                => array(),
            'zxcvbn-async.js'                    => array(),
            'media-models.js'                    => array(),
            'twemoji.js'                         => array(),
            'wp-pointer.js'                      => array(),
            'customize-preview-nav-menus.min.js' => array(),
            'wp-pointer.min.js'                  => array(),
            'json2.min.js'                       => array(),
            'backbone.js'                        => array(),
            'swfupload'                          => array(
                'handlers.js'     => array(),
                'license.txt'     => array(),
                'handlers.min.js' => array(),
                'swfupload.js'    => array(),
                'plugins'         => array(
                    'swfupload.swfobject.js' => array(),
                    'swfupload.cookies.js'   => array(),
                    'swfupload.queue.js'     => array(),
                    'swfupload.speed.js'     => array()
                ),
                'swfupload.swf'   => array()
            ),
            'twemoji.min.js'                     => array(),
            'mce-view.min.js'                    => array(),
            'swfobject.js'                       => array(),
            'colorpicker.min.js'                 => array(),
            'wp-emoji.js'                        => array(),
            'customize-preview-widgets.min.js'   => array(),
            'zxcvbn.min.js'                      => array(),
            'wp-ajax-response.js'                => array(),
            'wp-util.js'                         => array(),
            'underscore.js'                      => array(),
            'wp-emoji.min.js'                    => array(),
            'customize-preview-nav-menus.js'     => array(),
            'underscore.min.js'                  => array(),
            'admin-bar.min.js'                   => array(),
            'wp-sanitize.js'                     => array(),
            'imagesloaded.min.js'                => array(),
            'thickbox'                           => array(
                'loadingAnimation.gif' => array(),
                'thickbox.css'         => array(),
                'thickbox.js'          => array(),
                'macFFBgHack.png'      => array()
            ),
            'wplink.min.js'                      => array(),
            'tinymce'                            => array(
                'wp-mce-help.php'   => array(),
                'themes'            => array(
                    'modern' => array(
                        'theme.js'     => array(),
                        'theme.min.js' => array()
                    ),
                    'inlite' => array(
                        'theme.js'     => array(),
                        'theme.min.js' => array()
                    )
                ),
                'wp-tinymce.js'     => array(),
                'langs'             => array(
                    'wp-langs-en.js' => array()
                ),
                'wp-tinymce.js.gz'  => array(),
                'license.txt'       => array(),
                'utils'             => array(
                    'mctabs.js'           => array(),
                    'form_utils.js'       => array(),
                    'editable_selects.js' => array(),
                    'validate.js'         => array()
                ),
                'plugins'           => array(
                    'wordpress'      => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'directionality' => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'image'          => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wpview'         => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wpeditimage'    => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'hr'             => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'lists'          => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wpfullscreen'   => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wptextpattern'  => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'link'           => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'fullscreen'     => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wpembed'        => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wplink'         => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wpdialogs'      => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'textcolor'      => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wpemoji'        => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'colorpicker'    => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'paste'          => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'compat3x'       => array(
                        'css'           => array(
                            'dialog.css' => array()
                        ),
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'charmap'        => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'tabfocus'       => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'wpgallery'      => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    ),
                    'media'          => array(
                        'plugin.js'       => array(),
                        'moxieplayer.swf' => array(),
                        'plugin.min.js'   => array()
                    ),
                    'wpautoresize'   => array(
                        'plugin.js'     => array(),
                        'plugin.min.js' => array()
                    )
                ),
                'wp-tinymce.php'    => array(),
                'tiny_mce_popup.js' => array(),
                'skins'             => array(
                    'wordpress' => array(
                        'wp-content.css' => array(),
                        'images'         => array(
                            'gallery-2x.png'      => array(),
                            'playlist-video.png'  => array(),
                            'more-2x.png'         => array(),
                            'pagebreak.png'       => array(),
                            'audio.png'           => array(),
                            'playlist-audio.png'  => array(),
                            'dashicon-no-alt.png' => array(),
                            'dashicon-no.png'     => array(),
                            'dashicon-edit.png'   => array(),
                            'embedded.png'        => array(),
                            'video.png'           => array(),
                            'pagebreak-2x.png'    => array(),
                            'gallery.png'         => array(),
                            'more.png'            => array()
                        )
                    ),
                    'lightgray' => array(
                        'content.inline.min.css' => array(),
                        'content.min.css'        => array(),
                        'skin.ie7.min.css'       => array(),
                        'fonts'                  => array(
                            'tinymce-small.json' => array(),
                            'tinymce.ttf'        => array(),
                            'tinymce-small.svg'  => array(),
                            'tinymce-small.woff' => array(),
                            'tinymce.json'       => array(),
                            'readme.md'          => array(),
                            'tinymce.svg'        => array(),
                            'tinymce.woff'       => array(),
                            'tinymce-small.ttf'  => array(),
                            'tinymce-small.eot'  => array(),
                            'tinymce.eot'        => array()
                        ),
                        'img'                    => array(
                            'loader.gif' => array(),
                            'object.gif' => array(),
                            'trans.gif'  => array(),
                            'anchor.gif' => array()
                        ),
                        'skin.min.css'           => array()
                    )
                ),
                'tinymce.min.js'    => array()
            ),
            'wp-emoji-release.min.js'            => array(),
            'wp-emoji-loader.min.js'             => array(),
            'wp-list-revisions.min.js'           => array(),
            'wp-auth-check.js'                   => array(),
            'api-request.min.js'                 => array(),
            'customize-models.js'                => array(),
            'clipboard.min.js'                   => array(),
            'customize-preview.min.js'           => array(),
            'quicktags.js'                       => array(),
            'wp-list-revisions.js'               => array(),
            'customize-models.min.js'            => array(),
            'wp-util.min.js'                     => array(),
            'customize-preview-widgets.js'       => array(),
            'admin-bar.js'                       => array(),
            'wpdialog.min.js'                    => array(),
            'wp-lists.min.js'                    => array(),
            'wp-emoji-loader.js'                 => array(),
            'clipboard.js'                       => array(),
            'autosave.min.js'                    => array(),
            'quicktags.min.js'                   => array(),
            'customize-selective-refresh.js'     => array(),
            'jcrop'                              => array(
                'Jcrop.gif'            => array(),
                'jquery.Jcrop.min.js'  => array(),
                'jquery.Jcrop.min.css' => array()
            ),
            'wp-backbone.js'                     => array(),
            'media-editor.js'                    => array(),
            'media-editor.min.js'                => array(),
            'plupload'                           => array(
                'handlers.js'              => array(),
                'moxie.js'                 => array(),
                'moxie.min.js'             => array(),
                'license.txt'              => array(),
                'plupload.flash.swf'       => array(),
                'wp-plupload.min.js'       => array(),
                'handlers.min.js'          => array(),
                'plupload.full.min.js'     => array(),
                'wp-plupload.js'           => array(),
                'plupload.silverlight.xap' => array(),
                'plupload.js'              => array(),
                'plupload.min.js'          => array()
            ),
            'media-grid.js'                      => array(),
            'hoverintent-js.min.js'              => array(),
            'media-views.min.js'                 => array(),
            'wp-embed.js'                        => array(),
            'heartbeat.min.js'                   => array(),
            'wp-api.min.js'                      => array(),
            'customize-views.js'                 => array(),
            'customize-loader.js'                => array(),
            'autosave.js'                        => array(),
            'crop'                               => array(
                'cropper.js'       => array(),
                'cropper.css'      => array(),
                'marqueeHoriz.gif' => array(),
                'marqueeVert.gif'  => array()
            ),
            'wp-auth-check.min.js'               => array(),
            'jquery'                             => array(
                'jquery.js'                   => array(),
                'jquery.form.min.js'          => array(),
                'jquery.ui.touch-punch.js'    => array(),
                'jquery.table-hotkeys.js'     => array(),
                'jquery.query.js'             => array(),
                'jquery.hotkeys.min.js'       => array(),
                'jquery-migrate.min.js'       => array(),
                'jquery.schedule.js'          => array(),
                'jquery.hotkeys.js'           => array(),
                'suggest.js'                  => array(),
                'jquery-migrate.js'           => array(),
                'jquery.form.js'              => array(),
                'ui'                          => array(
                    'jquery.ui.dialog.min.js'           => array(),
                    'jquery.ui.menu.min.js'             => array(),
                    'progressbar.min.js'                => array(),
                    'jquery.ui.core.min.js'             => array(),
                    'spinner.min.js'                    => array(),
                    'dialog.min.js'                     => array(),
                    'jquery.ui.position.min.js'         => array(),
                    'jquery.ui.effect-drop.min.js'      => array(),
                    'accordion.min.js'                  => array(),
                    'effect-clip.min.js'                => array(),
                    'jquery.ui.sortable.min.js'         => array(),
                    'jquery.ui.effect.min.js'           => array(),
                    'effect-explode.min.js'             => array(),
                    'jquery.ui.effect-transfer.min.js'  => array(),
                    'jquery.ui.draggable.min.js'        => array(),
                    'draggable.min.js'                  => array(),
                    'effect-fold.min.js'                => array(),
                    'jquery.ui.spinner.min.js'          => array(),
                    'effect-fade.min.js'                => array(),
                    'droppable.min.js'                  => array(),
                    'effect.min.js'                     => array(),
                    'effect-drop.min.js'                => array(),
                    'jquery.ui.effect-slide.min.js'     => array(),
                    'selectable.min.js'                 => array(),
                    'tooltip.min.js'                    => array(),
                    'effect-shake.min.js'               => array(),
                    'effect-highlight.min.js'           => array(),
                    'jquery.ui.datepicker.min.js'       => array(),
                    'effect-blind.min.js'               => array(),
                    'sortable.min.js'                   => array(),
                    'position.min.js'                   => array(),
                    'jquery.ui.effect-pulsate.min.js'   => array(),
                    'jquery.ui.mouse.min.js'            => array(),
                    'jquery.ui.effect-explode.min.js'   => array(),
                    'jquery.ui.autocomplete.min.js'     => array(),
                    'effect-size.min.js'                => array(),
                    'jquery.ui.effect-bounce.min.js'    => array(),
                    'core.min.js'                       => array(),
                    'jquery.ui.progressbar.min.js'      => array(),
                    'effect-puff.min.js'                => array(),
                    'jquery.ui.selectable.min.js'       => array(),
                    'effect-transfer.min.js'            => array(),
                    'menu.min.js'                       => array(),
                    'jquery.ui.tabs.min.js'             => array(),
                    'resizable.min.js'                  => array(),
                    'jquery.ui.effect-highlight.min.js' => array(),
                    'jquery.ui.tooltip.min.js'          => array(),
                    'jquery.ui.droppable.min.js'        => array(),
                    'mouse.min.js'                      => array(),
                    'jquery.ui.effect-fade.min.js'      => array(),
                    'jquery.ui.effect-clip.min.js'      => array(),
                    'jquery.ui.accordion.min.js'        => array(),
                    'jquery.ui.resizable.min.js'        => array(),
                    'effect-pulsate.min.js'             => array(),
                    'effect-bounce.min.js'              => array(),
                    'widget.min.js'                     => array(),
                    'jquery.ui.effect-blind.min.js'     => array(),
                    'tabs.min.js'                       => array(),
                    'datepicker.min.js'                 => array(),
                    'button.min.js'                     => array(),
                    'selectmenu.min.js'                 => array(),
                    'jquery.ui.effect-shake.min.js'     => array(),
                    'slider.min.js'                     => array(),
                    'effect-scale.min.js'               => array(),
                    'jquery.ui.slider.min.js'           => array(),
                    'jquery.ui.effect-scale.min.js'     => array(),
                    'jquery.ui.button.min.js'           => array(),
                    'effect-slide.min.js'               => array(),
                    'jquery.ui.widget.min.js'           => array(),
                    'autocomplete.min.js'               => array(),
                    'jquery.ui.effect-fold.min.js'      => array()
                ),
                'jquery.table-hotkeys.min.js' => array(),
                'suggest.min.js'              => array(),
                'jquery.serialize-object.js'  => array(),
                'jquery.masonry.min.js'       => array(),
                'jquery.color.min.js'         => array()
            ),
            'wpdialog.js'                        => array(),
            'shortcode.js'                       => array(),
            'colorpicker.js'                     => array(),
            'tw-sack.min.js'                     => array(),
            'heartbeat.js'                       => array(),
            'wp-api.js'                          => array(),
            'customize-base.js'                  => array(),
            'media-models.min.js'                => array(),
            'wp-custom-header.js'                => array(),
            'media-audiovideo.min.js'            => array(),
            'mce-view.js'                        => array(),
            'media-views.js'                     => array(),
            'wp-embed-template.js'               => array(),
            'hoverIntent.min.js'                 => array(),
            'wp-embed.min.js'                    => array(),
            'utils.min.js'                       => array(),
            'customize-views.min.js'             => array(),
            'customize-base.min.js'              => array(),
            'customize-selective-refresh.min.js' => array(),
            'wp-ajax-response.min.js'            => array(),
            'zxcvbn-async.min.js'                => array(),
            'wp-lists.js'                        => array(),
            'comment-reply.min.js'               => array(),
            'wp-embed-template.min.js'           => array(),
            'wp-backbone.min.js'                 => array(),
            'wp-a11y.js'                         => array(),
            'backbone.min.js'                    => array(),
            'dist'                               => array(
                'api-fetch.js'                              => array(),
                'notices.min.js'                            => array(),
                'data-controls.min.js'                      => array(),
                'wordcount.min.js'                          => array(),
                'editor.min.js'                             => array(),
                'rich-text.js'                              => array(),
                'dom.js'                                    => array(),
                'element.js'                                => array(),
                'blocks.min.js'                             => array(),
                'components.min.js'                         => array(),
                'editor.js'                                 => array(),
                'blob.min.js'                               => array(),
                'components.js'                             => array(),
                'url.js'                                    => array(),
                'i18n.min.js'                               => array(),
                'data-controls.js'                          => array(),
                'deprecated.js'                             => array(),
                'priority-queue.js'                         => array(),
                'token-list.min.js'                         => array(),
                'dom-ready.js'                              => array(),
                'a11y.min.js'                               => array(),
                'element.min.js'                            => array(),
                'keycodes.js'                               => array(),
                'list-reusable-blocks.js'                   => array(),
                'autop.js'                                  => array(),
                'warning.js'                                => array(),
                'escape-html.js'                            => array(),
                'blob.js'                                   => array(),
                'block-directory.min.js'                    => array(),
                'dom-ready.min.js'                          => array(),
                'annotations.js'                            => array(),
                'viewport.js'                               => array(),
                'viewport.min.js'                           => array(),
                'server-side-render.js'                     => array(),
                'autop.min.js'                              => array(),
                'compose.js'                                => array(),
                'plugins.js'                                => array(),
                'block-directory.js'                        => array(),
                'primitives.js'                             => array(),
                'block-editor.min.js'                       => array(),
                'primitives.min.js'                         => array(),
                'keyboard-shortcuts.js'                     => array(),
                'html-entities.min.js'                      => array(),
                'notices.js'                                => array(),
                'wordcount.js'                              => array(),
                'core-data.js'                              => array(),
                'compose.min.js'                            => array(),
                'warning.min.js'                            => array(),
                'url.min.js'                                => array(),
                'block-serialization-default-parser.js'     => array(),
                'data.min.js'                               => array(),
                'edit-post.js'                              => array(),
                'server-side-render.min.js'                 => array(),
                'redux-routine.min.js'                      => array(),
                'i18n.js'                                   => array(),
                'redux-routine.js'                          => array(),
                'escape-html.min.js'                        => array(),
                'edit-post.min.js'                          => array(),
                'shortcode.js'                              => array(),
                'token-list.js'                             => array(),
                'date.min.js'                               => array(),
                'hooks.min.js'                              => array(),
                'html-entities.js'                          => array(),
                'core-data.min.js'                          => array(),
                'keycodes.min.js'                           => array(),
                'priority-queue.min.js'                     => array(),
                'blocks.js'                                 => array(),
                'format-library.min.js'                     => array(),
                'is-shallow-equal.min.js'                   => array(),
                'date.js'                                   => array(),
                'list-reusable-blocks.min.js'               => array(),
                'block-library.js'                          => array(),
                'plugins.min.js'                            => array(),
                'nux.min.js'                                => array(),
                'media-utils.js'                            => array(),
                'is-shallow-equal.js'                       => array(),
                'media-utils.min.js'                        => array(),
                'dom.min.js'                                => array(),
                'vendor'                                    => array(
                    'moment.min.js'                      => array(),
                    'wp-polyfill-element-closest.min.js' => array(),
                    'wp-polyfill-fetch.js'               => array(),
                    'wp-polyfill-node-contains.js'       => array(),
                    'moment.js'                          => array(),
                    'wp-polyfill-url.js'                 => array(),
                    'react.js'                           => array(),
                    'wp-polyfill.min.js'                 => array(),
                    'wp-polyfill-formdata.js'            => array(),
                    'wp-polyfill-element-closest.js'     => array(),
                    'wp-polyfill-dom-rect.min.js'        => array(),
                    'react.min.js'                       => array(),
                    'wp-polyfill-dom-rect.js'            => array(),
                    'lodash.min.js'                      => array(),
                    'wp-polyfill-fetch.min.js'           => array(),
                    'react-dom.min.js'                   => array(),
                    'wp-polyfill-formdata.min.js'        => array(),
                    'wp-polyfill-node-contains.min.js'   => array(),
                    'react-dom.js'                       => array(),
                    'wp-polyfill-url.min.js'             => array(),
                    'wp-polyfill.js'                     => array(),
                    'lodash.js'                          => array()
                ),
                'annotations.min.js'                        => array(),
                'block-editor.js'                           => array(),
                'data.js'                                   => array(),
                'rich-text.min.js'                          => array(),
                'hooks.js'                                  => array(),
                'api-fetch.min.js'                          => array(),
                'a11y.js'                                   => array(),
                'block-serialization-default-parser.min.js' => array(),
                'shortcode.min.js'                          => array(),
                'format-library.js'                         => array(),
                'block-library.min.js'                      => array(),
                'deprecated.min.js'                         => array(),
                'nux.js'                                    => array(),
                'keyboard-shortcuts.min.js'                 => array()
            ),
            'api-request.js'                     => array(),
            'customize-loader.min.js'            => array(),
            'imgareaselect'                      => array(
                'jquery.imgareaselect.js'     => array(),
                'jquery.imgareaselect.min.js' => array(),
                'border-anim-v.gif'           => array(),
                'border-anim-h.gif'           => array(),
                'imgareaselect.css'           => array()
            ),
            'customize-preview.js'               => array(),
            'utils.js'                           => array(),
            'wplink.js'                          => array(),
            'comment-reply.js'                   => array(),
            'mediaelement'                       => array(
                'controls.png'                      => array(),
                'mediaelement-migrate.js'           => array(),
                'renderers'                         => array(
                    'vimeo.js'     => array(),
                    'vimeo.min.js' => array()
                ),
                'mediaelement-migrate.min.js'       => array(),
                'mediaelementplayer-legacy.min.css' => array(),
                'jumpforward.png'                   => array(),
                'skipback.png'                      => array(),
                'wp-mediaelement.css'               => array(),
                'background.png'                    => array(),
                'mediaelement-and-player.min.js'    => array(),
                'mediaelement.min.js'               => array(),
                'mejs-controls.svg'                 => array(),
                'mediaelementplayer.min.css'        => array(),
                'bigplay.png'                       => array(),
                'controls.svg'                      => array(),
                'wp-mediaelement.js'                => array(),
                'mediaelement.js'                   => array(),
                'mediaelementplayer-legacy.css'     => array(),
                'mejs-controls.png'                 => array(),
                'mediaelement-and-player.js'        => array(),
                'wp-mediaelement.min.js'            => array(),
                'wp-playlist.js'                    => array(),
                'bigplay.svg'                       => array(),
                'wp-mediaelement.min.css'           => array(),
                'mediaelementplayer.css'            => array(),
                'wp-playlist.min.js'                => array(),
                'loading.gif'                       => array(),
                'froogaloop.min.js'                 => array()
            ),
            'media-grid.min.js'                  => array(),
            'wp-custom-header.min.js'            => array(),
            'masonry.min.js'                     => array(),
            'shortcode.min.js'                   => array(),
            'wp-sanitize.min.js'                 => array(),
            'tw-sack.js'                         => array(),
            'json2.js'                           => array(),
            'codemirror'                         => array(
                'esprima.js'         => array(),
                'htmlhint-kses.js'   => array(),
                'csslint.js'         => array(),
                'jsonlint.js'        => array(),
                'codemirror.min.css' => array(),
                'codemirror.min.js'  => array(),
                'fakejshint.js'      => array(),
                'htmlhint.js'        => array(),
                'jshint.js'          => array()
            )
        ),
        'css'                                            => array(
            'wp-embed-template.min.css'     => array(),
            'admin-bar-rtl.css'             => array(),
            'wp-auth-check.min.css'         => array(),
            'buttons.min.css'               => array(),
            'wp-embed-template-ie.min.css'  => array(),
            'dashicons.css'                 => array(),
            'buttons.css'                   => array(),
            'editor.min.css'                => array(),
            'buttons-rtl.css'               => array(),
            'jquery-ui-dialog.css'          => array(),
            'dashicons.min.css'             => array(),
            'jquery-ui-dialog-rtl.min.css'  => array(),
            'wp-embed-template-ie.css'      => array(),
            'customize-preview.css'         => array(),
            'editor.css'                    => array(),
            'editor-rtl.css'                => array(),
            'admin-bar.min.css'             => array(),
            'wp-auth-check-rtl.min.css'     => array(),
            'admin-bar-rtl.min.css'         => array(),
            'wp-pointer.min.css'            => array(),
            'wp-pointer-rtl.css'            => array(),
            'admin-bar.css'                 => array(),
            'customize-preview-rtl.min.css' => array(),
            'jquery-ui-dialog.min.css'      => array(),
            'wp-pointer-rtl.min.css'        => array(),
            'wp-pointer.css'                => array(),
            'editor-rtl.min.css'            => array(),
            'media-views.min.css'           => array(),
            'customize-preview-rtl.css'     => array(),
            'media-views-rtl.min.css'       => array(),
            'buttons-rtl.min.css'           => array(),
            'jquery-ui-dialog-rtl.css'      => array(),
            'wp-embed-template.css'         => array(),
            'dist'                          => array(
                'list-reusable-blocks' => array(
                    'style-rtl.min.css' => array(),
                    'style.css'         => array(),
                    'style-rtl.css'     => array(),
                    'style.min.css'     => array()
                ),
                'format-library'       => array(
                    'style-rtl.min.css' => array(),
                    'style.css'         => array(),
                    'style-rtl.css'     => array(),
                    'style.min.css'     => array()
                ),
                'nux'                  => array(
                    'style-rtl.min.css' => array(),
                    'style.css'         => array(),
                    'style-rtl.css'     => array(),
                    'style.min.css'     => array()
                ),
                'edit-post'            => array(
                    'style-rtl.min.css' => array(),
                    'style.css'         => array(),
                    'style-rtl.css'     => array(),
                    'style.min.css'     => array()
                ),
                'block-directory'      => array(
                    'style-rtl.min.css' => array(),
                    'style.css'         => array(),
                    'style-rtl.css'     => array(),
                    'style.min.css'     => array()
                ),
                'editor'               => array(
                    'style-rtl.min.css'         => array(),
                    'editor-styles-rtl.css'     => array(),
                    'editor-styles-rtl.min.css' => array(),
                    'editor-styles.min.css'     => array(),
                    'style.css'                 => array(),
                    'style-rtl.css'             => array(),
                    'editor-styles.css'         => array(),
                    'style.min.css'             => array()
                ),
                'block-library'        => array(
                    'style-rtl.min.css'  => array(),
                    'editor.min.css'     => array(),
                    'editor.css'         => array(),
                    'theme-rtl.css'      => array(),
                    'editor-rtl.css'     => array(),
                    'theme-rtl.min.css'  => array(),
                    'editor-rtl.min.css' => array(),
                    'theme.css'          => array(),
                    'style.css'          => array(),
                    'style-rtl.css'      => array(),
                    'theme.min.css'      => array(),
                    'style.min.css'      => array()
                ),
                'block-editor'         => array(
                    'style-rtl.min.css' => array(),
                    'style.css'         => array(),
                    'style-rtl.css'     => array(),
                    'style.min.css'     => array()
                ),
                'components'           => array(
                    'style-rtl.min.css' => array(),
                    'style.css'         => array(),
                    'style-rtl.css'     => array(),
                    'style.min.css'     => array()
                )
            ),
            'media-views-rtl.css'           => array(),
            'customize-preview.min.css'     => array(),
            'wp-auth-check.css'             => array(),
            'media-views.css'               => array(),
            'wp-auth-check-rtl.css'         => array()
        ),
        'bookmark-template.php'                          => array(),
        'rest-api.php'                                   => array(),
        'class-http.php'                                 => array(),
        'post-template.php'                              => array(),
        'user.php'                                       => array(),
        'class-wp-comment.php'                           => array(),
        'class-wp-customize-section.php'                 => array(),
        'registration.php'                               => array(),
        'Text'                                           => array(
            'Diff.php' => array(),
            'Diff'     => array(
                'Engine'       => array(
                    'string.php' => array(),
                    'xdiff.php'  => array(),
                    'native.php' => array(),
                    'shell.php'  => array()
                ),
                'Renderer.php' => array(),
                'Renderer'     => array(
                    'inline.php' => array()
                )
            )
        ),
        'class-json.php'                                 => array(),
        'shortcodes.php'                                 => array(),
        'vars.php'                                       => array(),
        'spl-autoload-compat.php'                        => array(),
        'class-wp-taxonomy.php'                          => array(),
        'class-wp-site.php'                              => array(),
        'post.php'                                       => array(),
        'version.php'                                    => array(),
        'ms-files.php'                                   => array(),
        'certificates'                                   => array(
            'ca-bundle.crt' => array()
        ),
        'admin-bar.php'                                  => array(),
        'class-wp-meta-query.php'                        => array(),
        'link-template.php'                              => array(),
        'class-snoopy.php'                               => array(),
        'class-wp-image-editor.php'                      => array(),
        'class-wp-widget.php'                            => array(),
        'feed-atom-comments.php'                         => array(),
        'class-wp-http-streams.php'                      => array(),
        'functions.wp-scripts.php'                       => array(),
        'rss.php'                                        => array(),
        'PHPMailer'                                      => array(
            'PHPMailer.php' => array(),
            'Exception.php' => array(),
            'SMTP.php'      => array()
        ),
        'class-wp-feed-cache-transient.php'              => array(),
        'class-wp-user.php'                              => array(),
        'post-thumbnail-template.php'                    => array(),
        'class-wp-recovery-mode-link-service.php'        => array(),
        'class-IXR.php'                                  => array(),
        'general-template.php'                           => array(),
        'ms-site.php'                                    => array(),
        'wlwmanifest.xml'                                => array(),
        'class-wp-session-tokens.php'                    => array(),
        'rest-api'                                       => array(
            'class-wp-rest-response.php' => array(),
            'fields'                     => array(
                'class-wp-rest-term-meta-fields.php'    => array(),
                'class-wp-rest-post-meta-fields.php'    => array(),
                'class-wp-rest-meta-fields.php'         => array(),
                'class-wp-rest-user-meta-fields.php'    => array(),
                'class-wp-rest-comment-meta-fields.php' => array()
            ),
            'endpoints'                  => array(
                'class-wp-rest-block-renderer-controller.php'  => array(),
                'class-wp-rest-block-types-controller.php'     => array(),
                'class-wp-rest-taxonomies-controller.php'      => array(),
                'class-wp-rest-search-controller.php'          => array(),
                'class-wp-rest-terms-controller.php'           => array(),
                'class-wp-rest-autosaves-controller.php'       => array(),
                'class-wp-rest-posts-controller.php'           => array(),
                'class-wp-rest-blocks-controller.php'          => array(),
                'class-wp-rest-block-directory-controller.php' => array(),
                'class-wp-rest-settings-controller.php'        => array(),
                'class-wp-rest-post-statuses-controller.php'   => array(),
                'class-wp-rest-post-types-controller.php'      => array(),
                'class-wp-rest-comments-controller.php'        => array(),
                'class-wp-rest-themes-controller.php'          => array(),
                'class-wp-rest-plugins-controller.php'         => array(),
                'class-wp-rest-attachments-controller.php'     => array(),
                'class-wp-rest-revisions-controller.php'       => array(),
                'class-wp-rest-users-controller.php'           => array(),
                'class-wp-rest-controller.php'                 => array()
            ),
            'search'                     => array(
                'class-wp-rest-search-handler.php'      => array(),
                'class-wp-rest-post-search-handler.php' => array()
            ),
            'class-wp-rest-server.php'   => array(),
            'class-wp-rest-request.php'  => array()
        ),
        'media-template.php'                             => array(),
        'class-wp.php'                                   => array(),
        'images'                                         => array(
            'blank.gif'                 => array(),
            'wpicons-2x.png'            => array(),
            'toggle-arrow.png'          => array(),
            'rss.png'                   => array(),
            'w-logo-blue-white-bg.png'  => array(),
            'xit-2x.gif'                => array(),
            'uploader-icons-2x.png'     => array(),
            'wlw'                       => array(
                'wp-comments.png'  => array(),
                'wp-watermark.png' => array(),
                'wp-icon.png'      => array()
            ),
            'arrow-pointer-blue.png'    => array(),
            'down_arrow.gif'            => array(),
            'admin-bar-sprite-2x.png'   => array(),
            'crystal'                   => array(
                'document.png'    => array(),
                'audio.png'       => array(),
                'license.txt'     => array(),
                'default.png'     => array(),
                'text.png'        => array(),
                'interactive.png' => array(),
                'spreadsheet.png' => array(),
                'archive.png'     => array(),
                'video.png'       => array(),
                'code.png'        => array()
            ),
            'uploader-icons.png'        => array(),
            'w-logo-blue.png'           => array(),
            'down_arrow-2x.gif'         => array(),
            'xit.gif'                   => array(),
            'wpspin-2x.gif'             => array(),
            'wpicons.png'               => array(),
            'arrow-pointer-blue-2x.png' => array(),
            'toggle-arrow-2x.png'       => array(),
            'rss-2x.png'                => array(),
            'media'                     => array(
                'document.png'    => array(),
                'audio.png'       => array(),
                'default.png'     => array(),
                'text.png'        => array(),
                'interactive.png' => array(),
                'spreadsheet.png' => array(),
                'archive.png'     => array(),
                'video.png'       => array(),
                'code.png'        => array()
            ),
            'spinner-2x.gif'            => array(),
            'smilies'                   => array(
                'icon_sad.gif'       => array(),
                'icon_question.gif'  => array(),
                'mrgreen.png'        => array(),
                'icon_mrgreen.gif'   => array(),
                'icon_surprised.gif' => array(),
                'frownie.png'        => array(),
                'icon_razz.gif'      => array(),
                'simple-smile.png'   => array(),
                'icon_neutral.gif'   => array(),
                'icon_eek.gif'       => array(),
                'icon_confused.gif'  => array(),
                'icon_biggrin.gif'   => array(),
                'icon_exclaim.gif'   => array(),
                'icon_idea.gif'      => array(),
                'icon_mad.gif'       => array(),
                'icon_cool.gif'      => array(),
                'icon_rolleyes.gif'  => array(),
                'rolleyes.png'       => array(),
                'icon_redface.gif'   => array(),
                'icon_wink.gif'      => array(),
                'icon_lol.gif'       => array(),
                'icon_arrow.gif'     => array(),
                'icon_evil.gif'      => array(),
                'icon_cry.gif'       => array(),
                'icon_smile.gif'     => array(),
                'icon_twisted.gif'   => array()
            ),
            'spinner.gif'               => array(),
            'admin-bar-sprite.png'      => array(),
            'icon-pointer-flag.png'     => array(),
            'icon-pointer-flag-2x.png'  => array(),
            'wpspin.gif'                => array()
        ),
        'template-loader.php'                            => array(),
        'class-wp-embed.php'                             => array(),
        'rss-functions.php'                              => array(),
        'class-wp-http-requests-response.php'            => array(),
        'class-wp-ajax-response.php'                     => array(),
        'date.php'                                       => array(),
        'class-wp-simplepie-file.php'                    => array(),
        'meta.php'                                       => array(),
        'kses.php'                                       => array(),
        'class-wp-tax-query.php'                         => array(),
        'class-wp-network-query.php'                     => array(),
        'class-wp-hook.php'                              => array(),
        'ms-deprecated.php'                              => array(),
        'class-walker-category-dropdown.php'             => array(),
        'class-wp-rewrite.php'                           => array(),
        'class-simplepie.php'                            => array(),
        'class.wp-styles.php'                            => array(),
        'comment.php'                                    => array(),
        'sitemaps.php'                                   => array(),
        'pomo'                                           => array(
            'entry.php'        => array(),
            'mo.php'           => array(),
            'translations.php' => array(),
            'streams.php'      => array(),
            'po.php'           => array(),
            'plural-forms.php' => array()
        ),
        'class-wp-customize-panel.php'                   => array(),
        'class-wp-http-cookie.php'                       => array(),
        'ms-default-filters.php'                         => array(),
        'class-walker-page.php'                          => array(),
        'bookmark.php'                                   => array(),
        'customize'                                      => array(
            'class-wp-customize-background-image-setting.php'    => array(),
            'class-wp-customize-nav-menu-setting.php'            => array(),
            'class-wp-customize-filter-setting.php'              => array(),
            'class-wp-customize-date-time-control.php'           => array(),
            'class-wp-customize-header-image-control.php'        => array(),
            'class-wp-customize-nav-menus-panel.php'             => array(),
            'class-wp-customize-nav-menu-item-control.php'       => array(),
            'class-wp-customize-nav-menu-control.php'            => array(),
            'class-wp-customize-custom-css-setting.php'          => array(),
            'class-wp-widget-form-customize-control.php'         => array(),
            'class-wp-customize-code-editor-control.php'         => array(),
            'class-wp-widget-area-customize-control.php'         => array(),
            'class-wp-customize-new-menu-control.php'            => array(),
            'class-wp-customize-theme-control.php'               => array(),
            'class-wp-customize-new-menu-section.php'            => array(),
            'class-wp-customize-site-icon-control.php'           => array(),
            'class-wp-customize-cropped-image-control.php'       => array(),
            'class-wp-customize-upload-control.php'              => array(),
            'class-wp-customize-image-control.php'               => array(),
            'class-wp-customize-nav-menu-section.php'            => array(),
            'class-wp-customize-background-image-control.php'    => array(),
            'class-wp-customize-header-image-setting.php'        => array(),
            'class-wp-customize-nav-menu-location-control.php'   => array(),
            'class-wp-customize-partial.php'                     => array(),
            'class-wp-customize-nav-menu-auto-add-control.php'   => array(),
            'class-wp-customize-sidebar-section.php'             => array(),
            'class-wp-customize-themes-section.php'              => array(),
            'class-wp-customize-themes-panel.php'                => array(),
            'class-wp-customize-nav-menu-item-setting.php'       => array(),
            'class-wp-customize-nav-menu-name-control.php'       => array(),
            'class-wp-customize-nav-menu-locations-control.php'  => array(),
            'class-wp-customize-background-position-control.php' => array(),
            'class-wp-customize-color-control.php'               => array(),
            'class-wp-customize-media-control.php'               => array(),
            'class-wp-customize-selective-refresh.php'           => array()
        ),
        'class-wp-customize-control.php'                 => array(),
        'class-wp-locale.php'                            => array(),
        'theme.php'                                      => array(),
        'class-wp-user-query.php'                        => array(),
        'class-wp-http-ixr-client.php'                   => array(),
        'ms-functions.php'                               => array(),
        'SimplePie'                                      => array(
            'Locator.php'     => array(),
            'Author.php'      => array(),
            'Sanitize.php'    => array(),
            'Registry.php'    => array(),
            'Caption.php'     => array(),
            'HTTP'            => array(
                'Parser.php' => array()
            ),
            'Item.php'        => array(),
            'Exception.php'   => array(),
            'File.php'        => array(),
            'Rating.php'      => array(),
            'Restriction.php' => array(),
            'IRI.php'         => array(),
            'Parser.php'      => array(),
            'Enclosure.php'   => array(),
            'Cache.php'       => array(),
            'XML'             => array(
                'Declaration' => array(
                    'Parser.php' => array()
                )
            ),
            'Decode'          => array(
                'HTML' => array(
                    'Entities.php' => array()
                )
            ),
            'Misc.php'        => array(),
            'Copyright.php'   => array(),
            'Parse'           => array(
                'Date.php' => array()
            ),
            'Content'         => array(
                'Type' => array(
                    'Sniffer.php' => array()
                )
            ),
            'Source.php'      => array(),
            'Net'             => array(
                'IPv6.php' => array()
            ),
            'Credit.php'      => array(),
            'Cache'           => array(
                'DB.php'        => array(),
                'Memcache.php'  => array(),
                'MySQL.php'     => array(),
                'Redis.php'     => array(),
                'File.php'      => array(),
                'Base.php'      => array(),
                'Memcached.php' => array()
            ),
            'Core.php'        => array(),
            'gzdecode.php'    => array(),
            'Category.php'    => array()
        ),
        'class-oembed.php'                               => array(),
        'class-wp-object-cache.php'                      => array(),
        'assets'                                         => array(
            'script-loader-packages.php' => array()
        ),
        'class-feed.php'                                 => array(),
        'class-wp-term-query.php'                        => array(),
        'class-wp-fatal-error-handler.php'               => array(),
        'ms-default-constants.php'                       => array(),
        'feed-rss2.php'                                  => array(),
        'locale.php'                                     => array(),
        'class-wp-list-util.php'                         => array(),
        'embed.php'                                      => array(),
        'class-wp-customize-widgets.php'                 => array(),
        'feed-rss2-comments.php'                         => array(),
        'default-widgets.php'                            => array(),
        'class-wp-block-parser.php'                      => array(),
        'error-protection.php'                           => array(),
        'ID3'                                            => array(
            'getid3.lib.php'                   => array(),
            'module.tag.lyrics3.php'           => array(),
            'license.commercial.txt'           => array(),
            'module.audio.dts.php'             => array(),
            'license.txt'                      => array(),
            'getid3.php'                       => array(),
            'module.audio.ac3.php'             => array(),
            'module.audio.flac.php'            => array(),
            'module.tag.apetag.php'            => array(),
            'module.audio-video.matroska.php'  => array(),
            'module.audio-video.quicktime.php' => array(),
            'module.audio.ogg.php'             => array(),
            'module.audio.mp3.php'             => array(),
            'module.audio-video.flv.php'       => array(),
            'readme.txt'                       => array(),
            'module.tag.id3v2.php'             => array(),
            'module.audio-video.riff.php'      => array(),
            'module.audio-video.asf.php'       => array(),
            'module.tag.id3v1.php'             => array()
        ),
        'embed-template.php'                             => array(),
        'update.php'                                     => array(),
        'comment-template.php'                           => array(),
        'nav-menu.php'                                   => array(),
        'class-wp-query.php'                             => array(),
        'widgets.php'                                    => array(),
        'formatting.php'                                 => array(),
        'http.php'                                       => array(),
        'class-wp-http-curl.php'                         => array(),
        'class-wp-block-pattern-categories-registry.php' => array(),
        'cache-compat.php'                               => array(),
        'feed-atom.php'                                  => array(),
        'feed.php'                                       => array(),
        'class-wp-block-list.php'                        => array(),
        'class-wp-customize-nav-menus.php'               => array(),
        'class-wp-http-encoding.php'                     => array(),
        'class-wp-theme.php'                             => array(),
        'canonical.php'                                  => array(),
        'sodium_compat'                                  => array(
            'lib'           => array(
                'namespaced.php'        => array(),
                'constants.php'         => array(),
                'php72compat_const.php' => array(),
                'sodium_compat.php'     => array(),
                'php72compat.php'       => array()
            ),
            'src'           => array(
                'Core32'              => array(
                    'Salsa20.php'    => array(),
                    'Util.php'       => array(),
                    'BLAKE2b.php'    => array(),
                    'HSalsa20.php'   => array(),
                    'SipHash.php'    => array(),
                    'Poly1305'       => array(
                        'State.php' => array()
                    ),
                    'XSalsa20.php'   => array(),
                    'Poly1305.php'   => array(),
                    'X25519.php'     => array(),
                    'Int64.php'      => array(),
                    'Curve25519.php' => array(),
                    'Int32.php'      => array(),
                    'HChaCha20.php'  => array(),
                    'Curve25519'     => array(
                        'Fe.php'    => array(),
                        'H.php'     => array(),
                        'Ge'        => array(
                            'Precomp.php' => array(),
                            'P2.php'      => array(),
                            'P1p1.php'    => array(),
                            'Cached.php'  => array(),
                            'P3.php'      => array()
                        ),
                        'README.md' => array()
                    ),
                    'ChaCha20.php'   => array(),
                    'XChaCha20.php'  => array(),
                    'Ed25519.php'    => array(),
                    'ChaCha20'       => array(
                        'Ctx.php'     => array(),
                        'IetfCtx.php' => array()
                    ),
                    'SecretStream'   => array(
                        'State.php' => array()
                    )
                ),
                'Compat.php'          => array(),
                'Crypto32.php'        => array(),
                'File.php'            => array(),
                'Core'                => array(
                    'Salsa20.php'    => array(),
                    'Util.php'       => array(),
                    'BLAKE2b.php'    => array(),
                    'HSalsa20.php'   => array(),
                    'SipHash.php'    => array(),
                    'Base64'         => array(
                        'UrlSafe.php'  => array(),
                        'Original.php' => array(),
                        'Common.php'   => array()
                    ),
                    'Poly1305'       => array(
                        'State.php' => array()
                    ),
                    'XSalsa20.php'   => array(),
                    'Poly1305.php'   => array(),
                    'X25519.php'     => array(),
                    'Curve25519.php' => array(),
                    'HChaCha20.php'  => array(),
                    'Curve25519'     => array(
                        'Fe.php'    => array(),
                        'H.php'     => array(),
                        'Ge'        => array(
                            'Precomp.php' => array(),
                            'P2.php'      => array(),
                            'P1p1.php'    => array(),
                            'Cached.php'  => array(),
                            'P3.php'      => array()
                        ),
                        'README.md' => array()
                    ),
                    'ChaCha20.php'   => array(),
                    'XChaCha20.php'  => array(),
                    'Ed25519.php'    => array(),
                    'ChaCha20'       => array(
                        'Ctx.php'     => array(),
                        'IetfCtx.php' => array()
                    ),
                    'SecretStream'   => array(
                        'State.php' => array()
                    )
                ),
                'Crypto.php'          => array(),
                'SodiumException.php' => array(),
                'PHP52'               => array(
                    'SplFixedArray.php' => array()
                )
            ),
            'composer.json' => array(),
            'namespaced'    => array(
                'Compat.php' => array(),
                'File.php'   => array(),
                'Core'       => array(
                    'Salsa20.php'    => array(),
                    'Util.php'       => array(),
                    'BLAKE2b.php'    => array(),
                    'HSalsa20.php'   => array(),
                    'SipHash.php'    => array(),
                    'Poly1305'       => array(
                        'State.php' => array()
                    ),
                    'Poly1305.php'   => array(),
                    'X25519.php'     => array(),
                    'Curve25519.php' => array(),
                    'Xsalsa20.php'   => array(),
                    'HChaCha20.php'  => array(),
                    'Curve25519'     => array(
                        'Fe.php' => array(),
                        'H.php'  => array(),
                        'Ge'     => array(
                            'Precomp.php' => array(),
                            'P2.php'      => array(),
                            'P1p1.php'    => array(),
                            'Cached.php'  => array(),
                            'P3.php'      => array()
                        )
                    ),
                    'ChaCha20.php'   => array(),
                    'XChaCha20.php'  => array(),
                    'Ed25519.php'    => array(),
                    'ChaCha20'       => array(
                        'Ctx.php'     => array(),
                        'IetfCtx.php' => array()
                    )
                ),
                'Crypto.php' => array()
            ),
            'autoload.php'  => array(),
            'LICENSE'       => array()
        ),
        'class-wp-post.php'                              => array(),
        'random_compat'                                  => array(
            'random_bytes_dev_urandom.php'      => array(),
            'random_bytes_libsodium.php'        => array(),
            'random_bytes_libsodium_legacy.php' => array(),
            'error_polyfill.php'                => array(),
            'random_bytes_openssl.php'          => array(),
            'random.php'                        => array(),
            'random_bytes_mcrypt.php'           => array(),
            'cast_to_int.php'                   => array(),
            'random_int.php'                    => array(),
            'random_bytes_com_dotnet.php'       => array(),
            'byte_safe_strings.php'             => array()
        ),
        'feed-rss.php'                                   => array(),
        'class-wp-date-query.php'                        => array(),
        'functions.wp-styles.php'                        => array(),
        'script-loader.php'                              => array(),
        'class-wp-image-editor-imagick.php'              => array(),
        'block-patterns'                                 => array(
            'quote.php'                        => array(),
            'heading-paragraph.php'            => array(),
            'text-two-columns.php'             => array(),
            'text-two-columns-with-images.php' => array(),
            'text-three-columns-buttons.php'   => array(),
            'three-buttons.php'                => array(),
            'large-header-button.php'          => array(),
            'two-buttons.php'                  => array(),
            'large-header.php'                 => array(),
            'two-images.php'                   => array()
        ),
        'class-wp-comment-query.php'                     => array(),
        'wp-db.php'                                      => array()
    ),
    'wp-cron.php'          => array(),
    'index.php'            => array(),
    'xmlrpc.php'           => array(),
    'wp-settings.php'      => array(),
    'wp-trackback.php'     => array(),
    'wp-admin'             => array(
        'export.php'               => array(),
        'media.php'                => array(),
        'media-new.php'            => array(),
        'freedoms.php'             => array(),
        'my-sites.php'             => array(),
        'edit-tags.php'            => array(),
        'erase-personal-data.php'  => array(),
        'edit-link-form.php'       => array(),
        'ms-users.php'             => array(),
        'customize.php'            => array(),
        'user-new.php'             => array(),
        'about.php'                => array(),
        'export-personal-data.php' => array(),
        'edit-form-blocks.php'     => array(),
        'load-scripts.php'         => array(),
        'theme-editor.php'         => array(),
        'load-styles.php'          => array(),
        'setup-config.php'         => array(),
        'upload.php'               => array(),
        'tools.php'                => array(),
        'upgrade.php'              => array(),
        'edit-form-comment.php'    => array(),
        'options-privacy.php'      => array(),
        'themes.php'               => array(),
        'users.php'                => array(),
        'edit.php'                 => array(),
        'options-writing.php'      => array(),
        'credits.php'              => array(),
        'includes'                 => array(
            'class-custom-image-header.php'                         => array(),
            'image-edit.php'                                        => array(),
            'export.php'                                            => array(),
            'ms.php'                                                => array(),
            'media.php'                                             => array(),
            'class-wp-theme-install-list-table.php'                 => array(),
            'class-bulk-upgrader-skin.php'                          => array(),
            'class-wp-ms-themes-list-table.php'                     => array(),
            'class-wp-plugins-list-table.php'                       => array(),
            'class-wp-upgrader-skins.php'                           => array(),
            'class-wp-links-list-table.php'                         => array(),
            'class-walker-nav-menu-checklist.php'                   => array(),
            'class-wp-ms-users-list-table.php'                      => array(),
            'class-wp-privacy-data-export-requests-list-table.php'  => array(),
            'class-bulk-theme-upgrader-skin.php'                    => array(),
            'template.php'                                          => array(),
            'class-wp-press-this.php'                               => array(),
            'class-wp-filesystem-ftpsockets.php'                    => array(),
            'class-wp-site-health-auto-updates.php'                 => array(),
            'class-wp-internal-pointers.php'                        => array(),
            'class-wp-site-health.php'                              => array(),
            'image.php'                                             => array(),
            'class-plugin-upgrader.php'                             => array(),
            'edit-tag-messages.php'                                 => array(),
            'class-wp-upgrader.php'                                 => array(),
            'class-theme-upgrader.php'                              => array(),
            'class-core-upgrader.php'                               => array(),
            'deprecated.php'                                        => array(),
            'class-wp-comments-list-table.php'                      => array(),
            'class-wp-privacy-requests-table.php'                   => array(),
            'dashboard.php'                                         => array(),
            'class-wp-themes-list-table.php'                        => array(),
            'plugin.php'                                            => array(),
            'class-wp-posts-list-table.php'                         => array(),
            'upgrade.php'                                           => array(),
            'class-file-upload-upgrader.php'                        => array(),
            'class-wp-filesystem-base.php'                          => array(),
            'class-wp-ajax-upgrader-skin.php'                       => array(),
            'class-wp-privacy-policy-content.php'                   => array(),
            'class-wp-media-list-table.php'                         => array(),
            'class-wp-filesystem-ftpext.php'                        => array(),
            'class-wp-ms-sites-list-table.php'                      => array(),
            'class-wp-users-list-table.php'                         => array(),
            'taxonomy.php'                                          => array(),
            'credits.php'                                           => array(),
            'class-wp-list-table.php'                               => array(),
            'noop.php'                                              => array(),
            'revision.php'                                          => array(),
            'class-language-pack-upgrader-skin.php'                 => array(),
            'class-wp-post-comments-list-table.php'                 => array(),
            'class-wp-privacy-data-removal-requests-list-table.php' => array(),
            'import.php'                                            => array(),
            'menu.php'                                              => array(),
            'class-wp-community-events.php'                         => array(),
            'class-pclzip.php'                                      => array(),
            'user.php'                                              => array(),
            'class-theme-installer-skin.php'                        => array(),
            'class-wp-filesystem-ssh2.php'                          => array(),
            'class-wp-upgrader-skin.php'                            => array(),
            'plugin-install.php'                                    => array(),
            'class-wp-screen.php'                                   => array(),
            'post.php'                                              => array(),
            'class-wp-importer.php'                                 => array(),
            'list-table.php'                                        => array(),
            'class-ftp-pure.php'                                    => array(),
            'class-bulk-plugin-upgrader-skin.php'                   => array(),
            'continents-cities.php'                                 => array(),
            'class-wp-site-icon.php'                                => array(),
            'theme-install.php'                                     => array(),
            'class-wp-plugin-install-list-table.php'                => array(),
            'admin.php'                                             => array(),
            'options.php'                                           => array(),
            'class-plugin-upgrader-skin.php'                        => array(),
            'class-language-pack-upgrader.php'                      => array(),
            'class-plugin-installer-skin.php'                       => array(),
            'translation-install.php'                               => array(),
            'misc.php'                                              => array(),
            'class-wp-terms-list-table.php'                         => array(),
            'class-wp-debug-data.php'                               => array(),
            'class-walker-category-checklist.php'                   => array(),
            'ms-deprecated.php'                                     => array(),
            'class-wp-automatic-updater.php'                        => array(),
            'comment.php'                                           => array(),
            'screen.php'                                            => array(),
            'bookmark.php'                                          => array(),
            'admin-filters.php'                                     => array(),
            'theme.php'                                             => array(),
            'class-wp-list-table-compat.php'                        => array(),
            'class-automatic-upgrader-skin.php'                     => array(),
            'privacy-tools.php'                                     => array(),
            'class-walker-nav-menu-edit.php'                        => array(),
            'class-custom-background.php'                           => array(),
            'network.php'                                           => array(),
            'class-ftp.php'                                         => array(),
            'update.php'                                            => array(),
            'nav-menu.php'                                          => array(),
            'widgets.php'                                           => array(),
            'class-wp-filesystem-direct.php'                        => array(),
            'schema.php'                                            => array(),
            'update-core.php'                                       => array(),
            'ms-admin-filters.php'                                  => array(),
            'class-theme-upgrader-skin.php'                         => array(),
            'ajax-actions.php'                                      => array(),
            'file.php'                                              => array(),
            'class-ftp-sockets.php'                                 => array(),
            'meta-boxes.php'                                        => array()
        ),
        'ms-options.php'           => array(),
        'link.php'                 => array(),
        'revision.php'             => array(),
        'privacy.php'              => array(),
        'js'                       => array(
            'xfn.min.js'                     => array(),
            'theme-plugin-editor.min.js'     => array(),
            'comment.min.js'                 => array(),
            'tags.min.js'                    => array(),
            'theme.js'                       => array(),
            'press-this.js'                  => array(),
            'privacy-tools.min.js'           => array(),
            'user-profile.min.js'            => array(),
            'media.js'                       => array(),
            'word-count.min.js'              => array(),
            'password-strength-meter.min.js' => array(),
            'editor.min.js'                  => array(),
            'site-health.js'                 => array(),
            'media-gallery.js'               => array(),
            'language-chooser.js'            => array(),
            'custom-background.js'           => array(),
            'widgets'                        => array(
                'media-image-widget.min.js'   => array(),
                'media-image-widget.js'       => array(),
                'text-widgets.min.js'         => array(),
                'media-gallery-widget.js'     => array(),
                'media-audio-widget.js'       => array(),
                'text-widgets.js'             => array(),
                'custom-html-widgets.min.js'  => array(),
                'media-gallery-widget.min.js' => array(),
                'media-widgets.min.js'        => array(),
                'media-video-widget.min.js'   => array(),
                'media-audio-widget.min.js'   => array(),
                'media-video-widget.js'       => array(),
                'custom-html-widgets.js'      => array(),
                'media-widgets.js'            => array()
            ),
            'widgets.js'                     => array(),
            'widgets.min.js'                 => array(),
            'accordion.min.js'               => array(),
            'wp-fullscreen-stub.min.js'      => array(),
            'editor.js'                      => array(),
            'inline-edit-tax.min.js'         => array(),
            'theme-plugin-editor.js'         => array(),
            'password-strength-meter.js'     => array(),
            'image-edit.min.js'              => array(),
            'editor-expand.min.js'           => array(),
            'inline-edit-post.js'            => array(),
            'color-picker.js'                => array(),
            'user-suggest.min.js'            => array(),
            'edit-comments.min.js'           => array(),
            'link.js'                        => array(),
            'plugin-install.min.js'          => array(),
            'xfn.js'                         => array(),
            'media.min.js'                   => array(),
            'revisions.min.js'               => array(),
            'accordion.js'                   => array(),
            'color-picker.min.js'            => array(),
            'common.js'                      => array(),
            'svg-painter.js'                 => array(),
            'wp-fullscreen.min.js'           => array(),
            'set-post-thumbnail.min.js'      => array(),
            'post.js'                        => array(),
            'farbtastic.js'                  => array(),
            'gallery.js'                     => array(),
            'image-edit.js'                  => array(),
            'site-health.min.js'             => array(),
            'link.min.js'                    => array(),
            'tags-box.js'                    => array(),
            'customize-nav-menus.js'         => array(),
            'nav-menu.js'                    => array(),
            'media-gallery.min.js'           => array(),
            'nav-menu.min.js'                => array(),
            'editor-expand.js'               => array(),
            'word-count.js'                  => array(),
            'privacy-tools.js'               => array(),
            'code-editor.js'                 => array(),
            'post.min.js'                    => array(),
            'press-this.min.js'              => array(),
            'customize-widgets.min.js'       => array(),
            'theme.min.js'                   => array(),
            'wp-fullscreen.js'               => array(),
            'edit-comments.js'               => array(),
            'inline-edit-tax.js'             => array(),
            'customize-controls.js'          => array(),
            'user-profile.js'                => array(),
            'media-upload.js'                => array(),
            'revisions.js'                   => array(),
            'dashboard.min.js'               => array(),
            'dashboard.js'                   => array(),
            'comment.js'                     => array(),
            'customize-controls.min.js'      => array(),
            'custom-header.js'               => array(),
            'inline-edit-post.min.js'        => array(),
            'set-post-thumbnail.js'          => array(),
            'wp-fullscreen-stub.js'          => array(),
            'updates.js'                     => array(),
            'code-editor.min.js'             => array(),
            'updates.min.js'                 => array(),
            'iris.min.js'                    => array(),
            'svg-painter.min.js'             => array(),
            'common.min.js'                  => array(),
            'customize-nav-menus.min.js'     => array(),
            'bookmarklet.min.js'             => array(),
            'tags.js'                        => array(),
            'customize-widgets.js'           => array(),
            'gallery.min.js'                 => array(),
            'bookmarklet.js'                 => array(),
            'postbox.js'                     => array(),
            'tags-suggest.min.js'            => array(),
            'postbox.min.js'                 => array(),
            'tags-box.min.js'                => array(),
            'tags-suggest.js'                => array(),
            'language-chooser.min.js'        => array(),
            'plugin-install.js'              => array(),
            'user-suggest.js'                => array(),
            'custom-background.min.js'       => array(),
            'media-upload.min.js'            => array()
        ),
        'css'                      => array(
            'forms-rtl.min.css'               => array(),
            'customize-controls-rtl.css'      => array(),
            'site-icon.min.css'               => array(),
            'themes-rtl.min.css'              => array(),
            'press-this-editor-rtl.css'       => array(),
            'revisions-rtl.min.css'           => array(),
            'press-this-rtl.css'              => array(),
            'wp-admin.css'                    => array(),
            'install-rtl.css'                 => array(),
            'code-editor-rtl.min.css'         => array(),
            'widgets.min.css'                 => array(),
            'themes-rtl.css'                  => array(),
            'list-tables-rtl.css'             => array(),
            'press-this-editor.min.css'       => array(),
            'forms.min.css'                   => array(),
            'customize-nav-menus-rtl.css'     => array(),
            'l10n.css'                        => array(),
            'list-tables.min.css'             => array(),
            'press-this.css'                  => array(),
            'media-rtl.css'                   => array(),
            'customize-nav-menus.css'         => array(),
            'admin-menu.css'                  => array(),
            'color-picker-rtl.min.css'        => array(),
            'login-rtl.min.css'               => array(),
            'press-this-editor.css'           => array(),
            'color-picker-rtl.css'            => array(),
            'nav-menus.css'                   => array(),
            'site-icon-rtl.css'               => array(),
            'ie.css'                          => array(),
            'edit.css'                        => array(),
            'edit.min.css'                    => array(),
            'media.min.css'                   => array(),
            'about-rtl.min.css'               => array(),
            'widgets-rtl.min.css'             => array(),
            'common.min.css'                  => array(),
            'customize-nav-menus.min.css'     => array(),
            'press-this-rtl.min.css'          => array(),
            'revisions-rtl.css'               => array(),
            'farbtastic.min.css'              => array(),
            'install-rtl.min.css'             => array(),
            'themes.css'                      => array(),
            'l10n-rtl.min.css'                => array(),
            'edit-rtl.min.css'                => array(),
            'nav-menus-rtl.min.css'           => array(),
            'site-icon-rtl.min.css'           => array(),
            'media-rtl.min.css'               => array(),
            'colors'                          => array(
                'sunrise'         => array(
                    'colors.min.css'     => array(),
                    'colors.scss'        => array(),
                    'colors-rtl.min.css' => array(),
                    'colors.css'         => array(),
                    'colors-rtl.css'     => array()
                ),
                'blue'            => array(
                    'colors.min.css'     => array(),
                    'colors.scss'        => array(),
                    'colors-rtl.min.css' => array(),
                    'colors.css'         => array(),
                    'colors-rtl.css'     => array()
                ),
                'ectoplasm'       => array(
                    'colors.min.css'     => array(),
                    'colors.scss'        => array(),
                    'colors-rtl.min.css' => array(),
                    'colors.css'         => array(),
                    'colors-rtl.css'     => array()
                ),
                'modern'          => array(
                    'colors.min.css'     => array(),
                    'colors.scss'        => array(),
                    'colors-rtl.min.css' => array(),
                    'colors.css'         => array(),
                    'colors-rtl.css'     => array()
                ),
                '_mixins.scss'    => array(),
                '_admin.scss'     => array(),
                'coffee'          => array(
                    'colors.min.css'     => array(),
                    'colors.scss'        => array(),
                    'colors-rtl.min.css' => array(),
                    'colors.css'         => array(),
                    'colors-rtl.css'     => array()
                ),
                'ocean'           => array(
                    'colors.min.css'     => array(),
                    'colors.scss'        => array(),
                    'colors-rtl.min.css' => array(),
                    'colors.css'         => array(),
                    'colors-rtl.css'     => array()
                ),
                'light'           => array(
                    'colors.min.css'     => array(),
                    'colors.scss'        => array(),
                    'colors-rtl.min.css' => array(),
                    'colors.css'         => array(),
                    'colors-rtl.css'     => array()
                ),
                'midnight'        => array(
                    'colors.min.css'     => array(),
                    'colors.scss'        => array(),
                    'colors-rtl.min.css' => array(),
                    'colors.css'         => array(),
                    'colors-rtl.css'     => array()
                ),
                '_variables.scss' => array()
            ),
            'revisions.min.css'               => array(),
            'about.min.css'                   => array(),
            'common-rtl.min.css'              => array(),
            'customize-nav-menus-rtl.min.css' => array(),
            'customize-controls-rtl.min.css'  => array(),
            'site-health.css'                 => array(),
            'code-editor-rtl.css'             => array(),
            'edit-rtl.css'                    => array(),
            'forms.css'                       => array(),
            'wp-admin-rtl.min.css'            => array(),
            'code-editor.css'                 => array(),
            'customize-widgets-rtl.min.css'   => array(),
            'color-picker.min.css'            => array(),
            'l10n-rtl.css'                    => array(),
            'site-icon.css'                   => array(),
            'customize-widgets.css'           => array(),
            'color-picker.css'                => array(),
            'dashboard.css'                   => array(),
            'deprecated-media-rtl.css'        => array(),
            'press-this-editor-rtl.min.css'   => array(),
            'deprecated-media.min.css'        => array(),
            'customize-widgets.min.css'       => array(),
            'admin-menu-rtl.min.css'          => array(),
            'widgets.css'                     => array(),
            'revisions.css'                   => array(),
            'dashboard-rtl.css'               => array(),
            'admin-menu-rtl.css'              => array(),
            'widgets-rtl.css'                 => array(),
            'login.min.css'                   => array(),
            'nav-menus-rtl.css'               => array(),
            'ie-rtl.min.css'                  => array(),
            'ie.min.css'                      => array(),
            'install.css'                     => array(),
            'press-this.min.css'              => array(),
            'about.css'                       => array(),
            'admin-menu.min.css'              => array(),
            'login-rtl.css'                   => array(),
            'farbtastic.css'                  => array(),
            'dashboard.min.css'               => array(),
            'forms-rtl.css'                   => array(),
            'l10n.min.css'                    => array(),
            'ie-rtl.css'                      => array(),
            'themes.min.css'                  => array(),
            'install.min.css'                 => array(),
            'site-health.min.css'             => array(),
            'customize-widgets-rtl.css'       => array(),
            'farbtastic-rtl.css'              => array(),
            'wp-admin-rtl.css'                => array(),
            'common.css'                      => array(),
            'list-tables.css'                 => array(),
            'customize-controls.css'          => array(),
            'common-rtl.css'                  => array(),
            'login.css'                       => array(),
            'dashboard-rtl.min.css'           => array(),
            'list-tables-rtl.min.css'         => array(),
            'nav-menus.min.css'               => array(),
            'deprecated-media.css'            => array(),
            'about-rtl.css'                   => array(),
            'customize-controls.min.css'      => array(),
            'site-health-rtl.css'             => array(),
            'site-health-rtl.min.css'         => array(),
            'media.css'                       => array(),
            'code-editor.min.css'             => array(),
            'deprecated-media-rtl.min.css'    => array(),
            'farbtastic-rtl.min.css'          => array(),
            'wp-admin.min.css'                => array()
        ),
        'site-health-info.php'     => array(),
        'user'                     => array(
            'freedoms.php'  => array(),
            'about.php'     => array(),
            'credits.php'   => array(),
            'privacy.php'   => array(),
            'menu.php'      => array(),
            'user-edit.php' => array(),
            'admin.php'     => array(),
            'profile.php'   => array(),
            'index.php'     => array()
        ),
        'options-permalink.php'    => array(),
        'import.php'               => array(),
        'edit-form-advanced.php'   => array(),
        'menu.php'                 => array(),
        'term.php'                 => array(),
        'custom-background.php'    => array(),
        'link-manager.php'         => array(),
        'network'                  => array(
            'freedoms.php'       => array(),
            'site-info.php'      => array(),
            'setup.php'          => array(),
            'user-new.php'       => array(),
            'about.php'          => array(),
            'theme-editor.php'   => array(),
            'upgrade.php'        => array(),
            'themes.php'         => array(),
            'users.php'          => array(),
            'edit.php'           => array(),
            'credits.php'        => array(),
            'privacy.php'        => array(),
            'site-themes.php'    => array(),
            'menu.php'           => array(),
            'site-settings.php'  => array(),
            'user-edit.php'      => array(),
            'plugin-install.php' => array(),
            'theme-install.php'  => array(),
            'settings.php'       => array(),
            'admin.php'          => array(),
            'profile.php'        => array(),
            'plugins.php'        => array(),
            'site-new.php'       => array(),
            'index.php'          => array(),
            'site-users.php'     => array(),
            'plugin-editor.php'  => array(),
            'sites.php'          => array(),
            'update.php'         => array(),
            'update-core.php'    => array()
        ),
        'install-helper.php'       => array(),
        'user-edit.php'            => array(),
        'async-upload.php'         => array(),
        'plugin-install.php'       => array(),
        'post.php'                 => array(),
        'options-discussion.php'   => array(),
        'theme-install.php'        => array(),
        'admin.php'                => array(),
        'options-reading.php'      => array(),
        'options.php'              => array(),
        'images'                   => array(
            'list.png'                   => array(),
            'icons32-vs-2x.png'          => array(),
            'resize-rtl.gif'             => array(),
            'media-button.png'           => array(),
            'comment-grey-bubble-2x.png' => array(),
            'menu-2x.png'                => array(),
            'xit-2x.gif'                 => array(),
            'sort-2x.gif'                => array(),
            'media-button-video.gif'     => array(),
            'icons32.png'                => array(),
            'bubble_bg.gif'              => array(),
            'media-button-other.gif'     => array(),
            'menu.png'                   => array(),
            'browser-rtl.png'            => array(),
            'align-left-2x.png'          => array(),
            'browser.png'                => array(),
            'sort.gif'                   => array(),
            'media-button-2x.png'        => array(),
            'post-formats.png'           => array(),
            'align-center.png'           => array(),
            'icons32-2x.png'             => array(),
            'resize-2x.gif'              => array(),
            'imgedit-icons.png'          => array(),
            'align-right-2x.png'         => array(),
            'wpspin_light.gif'           => array(),
            'wordpress-logo.svg'         => array(),
            'wheel.png'                  => array(),
            'list-2x.png'                => array(),
            'resize.gif'                 => array(),
            'w-logo-blue.png'            => array(),
            'xit.gif'                    => array(),
            'imgedit-icons-2x.png'       => array(),
            'stars.png'                  => array(),
            'arrows-2x.png'              => array(),
            'menu-vs.png'                => array(),
            'align-right.png'            => array(),
            'align-left.png'             => array(),
            'post-formats32.png'         => array(),
            'align-none-2x.png'          => array(),
            'wpspin_light-2x.gif'        => array(),
            'wordpress-logo-white.svg'   => array(),
            'resize-rtl-2x.gif'          => array(),
            'w-logo-white.png'           => array(),
            'se.png'                     => array(),
            'media-button-image.gif'     => array(),
            'yes.png'                    => array(),
            'wordpress-logo.png'         => array(),
            'generic.png'                => array(),
            'icons32-vs.png'             => array(),
            'menu-vs-2x.png'             => array(),
            'align-center-2x.png'        => array(),
            'media-button-music.gif'     => array(),
            'spinner-2x.gif'             => array(),
            'align-none.png'             => array(),
            'spinner.gif'                => array(),
            'comment-grey-bubble.png'    => array(),
            'arrows.png'                 => array(),
            'date-button-2x.gif'         => array(),
            'stars-2x.png'               => array(),
            'no.png'                     => array(),
            'date-button.gif'            => array(),
            'bubble_bg-2x.gif'           => array(),
            'post-formats-vs.png'        => array(),
            'post-formats32-vs.png'      => array(),
            'loading.gif'                => array(),
            'mask.png'                   => array(),
            'marker.png'                 => array()
        ),
        'profile.php'              => array(),
        'plugins.php'              => array(),
        'install.php'              => array(),
        'options-head.php'         => array(),
        'link-parse-opml.php'      => array(),
        'admin-functions.php'      => array(),
        'moderation.php'           => array(),
        'comment.php'              => array(),
        'index.php'                => array(),
        'ms-sites.php'             => array(),
        'site-health.php'          => array(),
        'link-add.php'             => array(),
        'edit-comments.php'        => array(),
        'plugin-editor.php'        => array(),
        'maint'                    => array(
            'repair.php' => array()
        ),
        'nav-menus.php'            => array(),
        'privacy-policy-guide.php' => array(),
        'network.php'              => array(),
        'custom-header.php'        => array(),
        'options-general.php'      => array(),
        'options-media.php'        => array(),
        'post-new.php'             => array(),
        'update.php'               => array(),
        'widgets.php'              => array(),
        'ms-upgrade-network.php'   => array(),
        'media-upload.php'         => array(),
        'admin-header.php'         => array(),
        'update-core.php'          => array(),
        'ms-themes.php'            => array(),
        'ms-delete-site.php'       => array(),
        'upgrade-functions.php'    => array(),
        'menu-header.php'          => array(),
        'ms-admin.php'             => array(),
        'admin-footer.php'         => array(),
        'ms-edit.php'              => array(),
        'press-this.php'           => array(),
        'admin-ajax.php'           => array(),
        'admin-post.php'           => array(),
        'edit-tag-form.php'        => array()
    )
);
lib/snaplib/class.snaplib.logger.php000064400000010543151336065400013473 0ustar00<?php
/**
 * Snap Logger utils
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibLogger', false)) {

    class DupLiteSnapLibLogger
    {

        public static $logFilepath = null;
        public static $logHandle   = null;

        public static function init($logFilepath)
        {
            self::$logFilepath = $logFilepath;
        }

        public static function clearLog()
        {
            if (file_exists(self::$logFilepath)) {
                if (self::$logHandle !== null) {
                    fflush(self::$logHandle);
                    fclose(self::$logHandle);
                    self::$logHandle = null;
                }
                @unlink(self::$logFilepath);
            }
        }

        public static function logObject($s, $o, $flush = false)
        {
            self::log($s, $flush);
            self::log(print_r($o, true), $flush);
        }

        public static function log($s, $flush = false, $callingFunctionOverride = null)
        {
            //   echo "{$s}<br/>";
            $lfp = self::$logFilepath;
            //  echo "logging $s to {$lfp}<br/>";
            if (self::$logFilepath === null) {
                throw new Exception('Logging not initialized');
            }

            if (isset($_SERVER['REQUEST_TIME_FLOAT'])) {
                $timepart = $_SERVER['REQUEST_TIME_FLOAT'];
            } else {
                $timepart = $_SERVER['REQUEST_TIME'];
            }

            $thread_id = sprintf("%08x", abs(crc32($_SERVER['REMOTE_ADDR'].$timepart.$_SERVER['REMOTE_PORT'])));

            $s = $thread_id.' '.date('h:i:s').":$s";

            if (self::$logHandle === null) {

                self::$logHandle = fopen(self::$logFilepath, 'a');
            }

            fwrite(self::$logHandle, "$s\n");

            if ($flush) {
                fflush(self::$logHandle);

                fclose(self::$logHandle);

                self::$logHandle = fopen(self::$logFilepath, 'a');
            }
        }
        private static $profileLogArray = null;
        private static $prevTS          = -1;

        public static function initProfiling()
        {
            self::$profileLogArray = array();
        }

        public static function writeToPLog($s)
        {
            throw new exception('not implemented');
            $currentTime = microtime(true);

            if (array_key_exists($s, self::$profileLogArray)) {
                $dSame = $currentTime - self::$profileLogArray[$s];
                $dSame = number_format($dSame, 7);
            } else {
                $dSame = 'N/A';
            }

            if (self::$prevTS != -1) {
                $dPrev = $currentTime - self::$prevTS;
                $dPrev = number_format($dPrev, 7);
            } else {
                $dPrev = 'N/A';
            }

            self::$profileLogArray[$s] = $currentTime;
            self::$prevTS              = $currentTime;

            self::log("  {$dPrev}  :  {$dSame}  :  {$currentTime}  :     {$s}");
        }

        /**
         *
         * @param mixed $var
         * @param bool $checkCallable // if true check if var is callable and display it
         * @return string
         */
        public static function varToString($var, $checkCallable = false)
        {
            if ($checkCallable && is_callable($var)) {
                return '(callable) '.print_r($var, true);
            }
            switch (gettype($var)) {
                case "boolean":
                    return $var ? 'true' : 'false';
                case "integer":
                case "double":
                    return (string) $var;
                case "string":
                    return '"'.$var.'"';
                case "array":
                case "object":
                    return print_r($var, true);
                case "resource":
                case "resource (closed)":
                case "NULL":
                case "unknown type":
                default:
                    return gettype($var);
            }
        }
    }
}
lib/snaplib/class.snaplib.u.wp.php000064400000020567151336065400013114 0ustar00<?php
/**
 * Wordpress utility functions
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package snaplib
 * @subpackage classes/utilities
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibUtilWp', false)) {

    /**
     * Wordpress utility functions
     */
    class DupLiteSnapLibUtilWp
    {

        const PATH_FULL     = 0;
        const PATH_RELATIVE = 1;
        const PATH_AUTO     = 2;

        private static $corePathList = null;
        private static $safeAbsPath  = null;

        /**
         *
         * @var string if not empty alters isWpCore's operation 
         */
        private static $wpCoreRelativePath = '';

        /**
         * return safe ABSPATH without last /
         * perform safe function only one time
         *
         * @return string
         */
        public static function getSafeAbsPath()
        {
            if (is_null(self::$safeAbsPath)) {
                if (defined('ABSPATH')) {
                    self::$safeAbsPath = DupLiteSnapLibIOU::safePathUntrailingslashit(ABSPATH);
                } else {
                    self::$safeAbsPath = '';
                }
            }

            return self::$safeAbsPath;
        }

        /**
         * 
         * @param string $folder
         * @return boolean  // return true if folder is wordpress home folder
         * 
         */
        public static function isWpHomeFolder($folder)
        {
            $indexPhp = DupLiteSnapLibIOU::trailingslashit($folder).'index.php';
            if (!file_exists($indexPhp)) {
                return false;
            }

            if (($indexContent = file_get_contents($indexPhp)) === false) {
                return false;
            }

            return (preg_match('/require\s*[\s\(].*[\'"].*wp-blog-header.php[\'"]\s*\)?/', $indexContent) === 1);
        }

        /**
         * This function is the equivalent of the get_home_path function but with various fixes
         * 
         * @staticvar string $home_path
         * @return string
         */
        public static function getHomePath()
        {
            static $home_path = null;

            if (is_null($home_path)) {
                // outside wordpress this function makes no sense
                if (!defined('ABSPATH')) {
                    $home_path = false;
                    return $home_path;
                }

                if (isset($_SERVER['SCRIPT_FILENAME']) && is_readable($_SERVER['SCRIPT_FILENAME'])) {
                    $scriptFilename = $_SERVER['SCRIPT_FILENAME'];
                } else {
                    $files          = get_included_files();
                    $scriptFilename = array_shift($files);
                }

                $realScriptDirname = DupLiteSnapLibIOU::safePathTrailingslashit(dirname($scriptFilename), true);
                $realAbsPath       = DupLiteSnapLibIOU::safePathTrailingslashit(ABSPATH, true);

                if (strpos($realScriptDirname, $realAbsPath) === 0) {
                    // normalize URLs without www
                    $home    = DupLiteSnapLibURLU::wwwRemove(set_url_scheme(get_option('home'), 'http'));
                    $siteurl = DupLiteSnapLibURLU::wwwRemove(set_url_scheme(get_option('siteurl'), 'http'));

                    if (!empty($home) && 0 !== strcasecmp($home, $siteurl)) {
                        if (stripos($siteurl, $home) === 0) {
                            $wp_path_rel_to_home = str_ireplace($home, '', $siteurl); /* $siteurl - $home */
                            $pos                 = strripos(str_replace('\\', '/', $scriptFilename), DupLiteSnapLibIOU::trailingslashit($wp_path_rel_to_home));
                            $home_path           = substr($scriptFilename, 0, $pos);
                            $home_path           = DupLiteSnapLibIOU::trailingslashit($home_path);
                        } else {
                            $home_path = ABSPATH;
                        }
                    } else {
                        $home_path = ABSPATH;
                    }
                } else {
                    // On frontend the home path is the folder of index.php
                    $home_path = DupLiteSnapLibIOU::trailingslashit(dirname($scriptFilename));
                }

                // make sure the folder exists or consider ABSPATH
                if (!file_exists($home_path)) {
                    $home_path = ABSPATH;
                }

                $home_path = str_replace('\\', '/', $home_path);
            }
            return $home_path;
        }

        public static function setWpCoreRelativeAbsPath($string = '')
        {
            self::$wpCoreRelativePath = (string) $string;
        }

        /**
         * check if path is in wordpress core list
         *
         * @param string $path
         * @param int $fullPath // if PATH_AUTO check if is a full path or relative path
         *                         if PATH_FULL remove ABSPATH len without check
         *                         if PATH_RELATIVE consider path a relative path
         * @param bool $isSafe // if false call rtrim(DupLiteSnapLibIOU::safePath( PATH ), '/')
         *                        if true consider path a safe path without check
         *
         *  PATH_FULL and PATH_RELATIVE is better optimized and perform less operations
         *
         * @return boolean
         */
        public static function isWpCore($path, $fullPath = self::PATH_AUTO, $isSafe = false)
        {
            if ($isSafe == false) {
                $path = rtrim(DupLiteSnapLibIOU::safePath($path), '/');
            }

            switch ($fullPath) {
                case self::PATH_FULL:
                    $absPath = self::getSafeAbsPath();
                    if (strlen($path) < strlen($absPath)) {
                        return false;
                    }
                    $relPath = ltrim(substr($path, strlen($absPath)), '/');
                    break;
                case self::PATH_RELATIVE:
                    if (($relPath = DupLiteSnapLibIOU::getRelativePath($path, self::$wpCoreRelativePath)) === false) {
                        return false;
                    }
                    break;
                case self::PATH_AUTO:
                default:
                    $absPath = self::getSafeAbsPath();
                    if (strpos($path, $absPath) === 0) {
                        $relPath = ltrim(substr($path, strlen($absPath)), '/');
                    } else {
                        $relPath = ltrim($path, '/');
                    }
            }

            // if rel path is empty is consider root path so is a core folder.
            if (empty($relPath)) {
                return true;
            }

            $pExploded = explode('/', $relPath);
            $corePaths = self::getCorePathsList();

            foreach ($pExploded as $current) {
                if (!isset($corePaths[$current])) {
                    return false;
                }

                $corePaths = $corePaths[$current];
            }
            return true;
        }

        /**
         * get core path list from relative abs path
         * [
         *      'folder' => [
         *          's-folder1' => [
         *              file1 => [],
         *              file2 => [],
         *          ],
         *          's-folder2' => [],
         *          file1 => []
         *      ]
         * ]
         *
         * @return array
         */
        public static function getCorePathsList()
        {
            if (is_null(self::$corePathList)) {
                require_once(dirname(__FILE__).'/wordpress.core.files.php');
            }
            return self::$corePathList;
        }

        /**
         * return object list of sites
         * 
         * @return boolean
         */
        public static function getSites($args = array())
        {
            if (!function_exists('is_multisite') || !is_multisite()) {
                return false;
            }

            if (function_exists('get_sites')) {
                return get_sites($args);
            } else {
                $result = array();
                $blogs  = wp_get_sites($args);
                foreach ($blogs as $blog) {
                    $result[] = (object) $blog;
                }
                return $result;
            }
        }
    }
}
lib/snaplib/class.snaplib.u.orig.files.manager.php000064400000027146151336065400016140 0ustar00<?php
/**
 * Original installer files manager
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\U
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibOrigFileManager', false)) {

    /**
     * Original installer files manager
     *
     * This class saves a file or folder in the original files folder and saves the original location persistent.
     * By entry we mean a file or a folder but not the files contained within it.
     * In this way it is possible, for example, to move an entire plugin to restore it later.
     *
     */
    class DupLiteSnapLibOrigFileManager
    {

        const MODE_MOVE             = 'move';
        const MODE_COPY             = 'copy';
        const ORIG_FOLDER_PREFIX    = 'original_files_';
        const PERSISTANCE_FILE_NAME = 'entries_stored.json';

        /**
         *
         * @var string
         */
        protected $persistanceFile = null;

        /**
         *
         * @var string
         */
        protected $origFilesFolder = null;

        /**
         *
         * @var array 
         */
        protected $origFolderEntries = array();

        /**
         *
         * @var string 
         */
        protected $rootPath = null;

        public function __construct($root, $origFolderParentPath, $hash)
        {
            $this->rootPath        = DupLiteSnapLibIOU::safePathUntrailingslashit($root, true);
            $this->origFilesFolder = DupLiteSnapLibIOU::safePathTrailingslashit($origFolderParentPath, true).self::ORIG_FOLDER_PREFIX.$hash;
            $this->persistanceFile = $this->origFilesFolder.'/'.self::PERSISTANCE_FILE_NAME;
        }

        /**
         * create a main folder if don't exist and load the entries
         * 
         * @param boolen $reset
         */
        public function init($reset = false)
        {
            $this->createMainFolder($reset);
            $this->load();
        }

        /**
         * 
         * @param boolean $reset    // if true delete current folder
         * @return boolean          // return true if succeded
         * @throws Exception
         */
        public function createMainFolder($reset = false)
        {
            if ($reset) {
                $this->deleteMainFolder();
            }

            if (!file_exists($this->origFilesFolder)) {
                if (!DupLiteSnapLibIOU::mkdir($this->origFilesFolder, 'u+rwx')) {
                    throw new Exception('Can\'t create the original files folder '.DupLiteSnapLibLogger::varToString($this->origFilesFolder));
                }
            }

            $htaccessFile = $this->origFilesFolder.'/.htaccess';
            if (!file_exists($htaccessFile)) {
                $htfile = @fopen($htaccessFile, 'w');
                $content      = <<<HTACCESS
Order Allow,Deny
Deny from All
HTACCESS;
                @fwrite($htfile, $content);
                @fclose($htfile);
            }

            if (!file_exists($this->persistanceFile)) {
                $this->save();
            }

            return true;
        }

        /**
         * @return string Main folder path
         * @throws Exception
         */
        public function getMainFolder()
        {
            if (!file_exists($this->origFilesFolder)) {
                throw new Exception('Can\'t get the original files folder '.DupLiteSnapLibLogger::varToString($this->origFilesFolder));
            }

            return $this->origFilesFolder;
        }

        /**
         * delete origianl files folder
         * 
         * @return boolean
         * @throws Exception
         */
        public function deleteMainFolder()
        {
            if (file_exists($this->origFilesFolder) && !DupLiteSnapLibIOU::rrmdir($this->origFilesFolder)) {
                throw new Exception('Can\'t delete the original files folder '.DupLiteSnapLibLogger::varToString($this->origFilesFolder));
            }
            $this->origFolderEntries = array();

            return true;
        }

        /**
         * add a entry on original folder.
         * 
         * @param string $identifier    // entry identifier
         * @param string $path          // entry path. can be a file or a folder
         * @param string $mode          // MODE_MOVE move the item in original folder
         *                                 MODE_COPY copy the item in original folder
         * @param bool|string $rename   // if rename is a string the item is renamed in original folder.
         * @return boolean              // true if succeded
         * @throws Exception
         */
        public function addEntry($identifier, $path, $mode = self::MODE_MOVE, $rename = false)
        {
            if (!file_exists($path)) {
                return false;
            }

            $baseName = empty($rename) ? basename($path) : $rename;

            if (($relativePath = DupLiteSnapLibIOU::getRelativePath($path, $this->rootPath)) === false) {
                $isRelative = false;
            } else {
                $isRelative = true;
            }
            $parentFolder = $isRelative ? dirname($relativePath) : DupLiteSnapLibIOU::removeRootPath(dirname($path));
            if (empty($parentFolder) || $parentFolder === '.') {
                $parentFolder = '';
            } else {
                $parentFolder .= '/';
            }
            $targetFolder = $this->origFilesFolder.'/'.$parentFolder;
            if (!file_exists($targetFolder)) {
                DupLiteSnapLibIOU::mkdir_p($targetFolder);
            }
            $dest = $targetFolder.$baseName;

            switch ($mode) {
                case self::MODE_MOVE:
                    if (!DupLiteSnapLibIOU::rename($path, $dest)) {
                        throw new Exception('Can\'t move the original file  '.DupLiteSnapLibLogger::varToString($path));
                    }
                    break;
                case self::MODE_COPY:
                    if (!DupLiteSnapLibIOU::rcopy($path, $dest)) {
                        throw new Exception('Can\'t copy the original file  '.DupLiteSnapLibLogger::varToString($path));
                    }
                    break;
                default:
                    throw new Exception('invalid mode addEntry');
            }

            $this->origFolderEntries[$identifier] = array(
                'baseName'   => $baseName,
                'source'     => $isRelative ? $relativePath : $path,
                'stored'     => $parentFolder.$baseName,
                'mode'       => $mode,
                'isRelative' => $isRelative
            );

            $this->save();
            return true;
        }

        /**
         * get entry info from itendifier
         * 
         * @param string $identifier
         * @return boolean  // false if entry don't exists
         */
        public function getEntry($identifier)
        {
            if (isset($this->origFolderEntries[$identifier])) {
                return $this->origFolderEntries[$identifier];
            } else {
                return false;
            }
        }

        /**
         * get entry stored path in original folder
         * 
         * @param string $identifier
         * @return boolean  // false if entry don't exists
         */
        public function getEntryStoredPath($identifier)
        {
            if (isset($this->origFolderEntries[$identifier])) {
                return $this->origFilesFolder.'/'.$this->origFolderEntries[$identifier]['stored'];
            } else {
                return false;
            }
        }

        public function isRelative($identifier)
        {
            if (isset($this->origFolderEntries[$identifier])) {
                $this->origFolderEntries[$identifier]['isRelative'];
            } else {
                return false;
            }
        }

        /**
         * get entry target restore path
         * 
         * @param string $identifier
         * @param type $defaultIfIsAbsolute
         * @return boolean  // false if entry don't exists
         */
        public function getEntryTargetPath($identifier, $defaultIfIsAbsolute = null)
        {
            if (isset($this->origFolderEntries[$identifier])) {
                if ($this->origFolderEntries[$identifier]['isRelative']) {
                    return $this->rootPath.'/'.$this->origFolderEntries[$identifier]['source'];
                } else {
                    if (is_null($defaultIfIsAbsolute)) {
                        return $this->origFolderEntries[$identifier]['source'];
                    } else {
                        return $defaultIfIsAbsolute;
                    }
                }
            } else {
                return false;
            }
        }

        /**
         * this function restore current entry in original position.
         * If mode is copy it simply delete the entry else move the entry in original position
         * 
         * @param string $identifier    // identified of current entrye
         * @param boolean $save         // update saved entries
         * @return boolean              // true if succeded
         * @throws Exception
         */
        public function restoreEntry($identifier, $save = true, $defaultIfIsntRelative = null)
        {
            if (!isset($this->origFolderEntries[$identifier])) {
                return false;
            }

            $stored   = $this->getEntryStoredPath($identifier);
            if (($original = $this->getEntryTargetPath($identifier, $defaultIfIsntRelative)) === false) {
                return false;
            }

            switch ($this->origFolderEntries[$identifier]['mode']) {
                case self::MODE_MOVE:
                    if (!DupLiteSnapLibIOU::rename($stored, $original)) {
                        throw new Exception('Can\'t move the original file  '.DupLiteSnapLibLogger::varToString($stored));
                    }
                    break;
                case self::MODE_COPY:
                    if (!DupLiteSnapLibIOU::rrmdir($stored)) {
                        throw new Exception('Can\'t delete entry '.DupLiteSnapLibLogger::varToString($stored));
                    }
                    break;
                default:
                    throw new Exception('invalid mode addEntry');
            }

            unset($this->origFolderEntries[$identifier]);
            if ($save) {
                $this->save();
            }
            return true;
        }

        /**
         * put all entries on original position and empty original folder
         * 
         * @return boolean
         */
        public function restoreAll($exclude = array())
        {
            foreach (array_keys($this->origFolderEntries) as $ident) {
                if (in_array($ident, $exclude)) {
                    continue;
                }
                $this->restoreEntry($ident, false);
            }
            $this->save();
            return true;
        }

        /**
         * save notices from json file
         */
        public function save()
        {
            if (!file_put_contents($this->persistanceFile, DupLiteSnapJsonU::wp_json_encode_pprint($this->origFolderEntries))) {
                throw new Exception('Can\'t write persistence file');
            }
            return true;
        }

        /**
         * load notice from json file
         */
        private function load()
        {
            if (file_exists($this->persistanceFile)) {
                $json                    = file_get_contents($this->persistanceFile);
                $this->origFolderEntries = json_decode($json, true);
            } else {
                $this->origFolderEntries = array();
            }
            return true;
        }
    }
}
lib/snaplib/class.snaplib.u.ui.php000064400000002323151336065400013071 0ustar00<?php
/**
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibUIU', false)) {

    class DupLiteSnapLibUIU
    {

        public static function echoBoolean($val)
        {
            echo $val ? 'true' : 'false';
        }

        public static function echoChecked($val)
        {
            // filter_var is available in >= php 5.2
            if (function_exists('filter_var') && defined('FILTER_VALIDATE_BOOLEAN')) {
                echo filter_var($val, FILTER_VALIDATE_BOOLEAN) ? 'checked' : '';
            } else {
                echo $val ? 'checked' : '';
            }
        }

        public static function echoDisabled($val)
        {
            echo $val ? 'disabled' : '';
        }

        public static function echoSelected($val)
        {
            echo $val ? 'selected' : '';
        }

        public static function getSelected($val)
        {
            return ($val ? 'selected' : '');
        }
    }
}lib/snaplib/class.snaplib.u.io.php000064400000136455151336065400013101 0ustar00<?php
/**
 * Snap I/O utils
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package DupLiteSnapLib
 * @copyright (c) 2017, Snapcreek LLC
 * @license	https://opensource.org/licenses/GPL-3.0 GNU Public License
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteSnapLibIOU', false)) {

    require_once(dirname(__FILE__).'/class.snaplib.u.string.php');
    require_once(dirname(__FILE__).'/class.snaplib.u.os.php');

    class DupLiteSnapLibIOU
    {

        // Real upper bound of a signed int is 214748364.
        // The value chosen below, makes sure we have a buffer of ~4.7 million.
        const FileSizeLimit32BitPHP = 1900000000;
        const FWRITE_CHUNK_SIZE     = 4096; // bytes

        public static function rmPattern($filePathPattern)
        {
            @array_map('unlink', glob($filePathPattern));
        }

        /**
         * 
         * @param string $path
         * @param array $args    // array key / val where key is the var name in include
         * @param bool $required
         * @return string
         * @throws Exception // thorw exception if is $required and file can't be read
         */
        public static function getInclude($path, $args = array(), $required = true)
        {
            if (!is_readable($path)) {
                if ($required) {
                    throw new Exception('Can\'t read required file '.$path);
                } else {
                    return '';
                }
            }

            foreach ($args as $var => $value) {
                ${$var} = $value;
            }

            ob_start();
            if ($required) {
                require ($path);
            } else {
                include ($path);
            }
            return ob_get_clean();
        }

        public static function chmodPattern($filePathPattern, $mode)
        {
            $filePaths = glob($filePathPattern);

            $modes = array();

            foreach ($filePaths as $filePath) {
                $modes[] = $mode;
            }
            array_map(array(__CLASS__, 'chmod'), $filePaths, $modes);
        }

        public static function copy($source, $dest, $overwriteIfExists = true)
        {
            if (file_exists($dest)) {
                if ($overwriteIfExists) {
                    self::rm($dest);
                } else {
                    return false;
                }
            }
            return copy($source, $dest);
        }

        /**
         * 
         * @param string $source
         * @param string $dest
         * @return boolean false if fail
         */
        public static function rcopy($source, $dest)
        {
            if (!is_readable($source)) {
                return false;
            }

            if (is_dir($source)) {
                if (!file_exists($dest)) {
                    if (!self::mkdir($dest)) {
                        return false;
                    }
                }

                if (($handle = opendir($source)) != false) {
                    return false;
                }

                while ($file = readdir($handle)) {
                    if ($file == "." && $file == "..") {
                        continue;
                    }

                    if (is_dir($source.'/'.$file)) {
                        if (!self::rcopy($source.'/'.$file, $dest.'/'.$file)) {
                            return false;
                        }
                    } else {
                        if (!self::copy($source.'/'.$file, $dest.'/'.$file)) {
                            return false;
                        }
                    }
                }
                closedir($handle);
                return true;
            } else {
                return self::copy($source, $dest);
            }
        }

        public static function untrailingslashit($path)
        {
            return rtrim($path, '/\\');
        }

        public static function trailingslashit($path)
        {
            return self::untrailingslashit($path).'/';
        }

        public static function safePath($path, $real = false)
        {
            if ($real) {
                $res = realpath($path);
            } else {
                $res = $path;
            }
            return self::normalize_path($path);
        }

        public static function safePathUntrailingslashit($path, $real = false)
        {
            if ($real) {
                $res = realpath($path);
            } else {
                $res = $path;
            }
            return rtrim(self::normalize_path($res), '/');
        }

        public static function safePathTrailingslashit($path, $real = false)
        {
            return self::safePathUntrailingslashit($path, $real).'/';
        }

        /**
         * 
         * @param string $sourceFolder
         * @param string $destFolder
         * @param bool $skipIfExists
         * @return boolean
         */
        public static function moveContentDirToTarget($sourceFolder, $destFolder, $skipIfExists = false)
        {
            if (!is_dir($sourceFolder) || !is_readable($sourceFolder)) {
                return false;
            }

            if (!is_dir($destFolder) || !is_writable($destFolder)) {
                return false;
            }

            $sourceIterator = new DirectoryIterator($sourceFolder);
            foreach ($sourceIterator as $fileinfo) {
                if ($fileinfo->isDot()) {
                    continue;
                }
                $destPath = $destFolder.'/'.$fileinfo->getBasename();

                if (file_exists($destPath)) {
                    if ($skipIfExists) {
                        continue;
                    } else {
                        return false;
                    }
                }

                if (self::rename($fileinfo->getPathname(), $destPath) == false) {
                    return false;
                }
            }

            return true;
        }

        public static function massMove($fileSystemObjects, $destination, $exclusions = null, $exceptionOnError = true)
        {
            $failures = array();

            $destination = rtrim($destination, '/\\');

            if (!file_exists($destination) || !is_writeable($destination)) {
                self::mkdir($destination, 'u+rwx');
            }

            foreach ($fileSystemObjects as $fileSystemObject) {
                $shouldMove = true;

                if ($exclusions != null) {

                    foreach ($exclusions as $exclusion) {
                        if (preg_match($exclusion, $fileSystemObject) === 1) {
                            $shouldMove = false;
                            break;
                        }
                    }
                }

                if ($shouldMove) {

                    $newName = $destination.'/'.basename($fileSystemObject);

                    if (!file_exists($fileSystemObject)) {
                        $failures[] = "Tried to move {$fileSystemObject} to {$newName} but it didn't exist!";
                    } else if (!@rename($fileSystemObject, $newName)) {
                        $failures[] = "Couldn't move {$fileSystemObject} to {$newName}";
                    }
                }
            }

            if ($exceptionOnError && count($failures) > 0) {
                throw new Exception(implode(',', $failures));
            }

            return $failures;
        }

        /**
         * Remove file path
         *
         * @param string $file path
         *
         * @return bool <p>Returns <b><code>TRUE</code></b> on success or <b><code>FALSE</code></b> on failure.</p>
         */
        public static function unlink($file)
        {
            try {
                if (!file_exists($file)) {
                    return true;
                }
                if (!function_exists('unlink') || is_dir($file)) {
                    return false;
                }
                self::chmod($file, 'u+rw');
                return @unlink($file);
            } catch (Exception $e) {
                return false;
            } catch (Error $e) {
                return false;
            }
        }

        /**
         * Rename file from old name to new name
         *
         * @param string $oldname        path
         * @param string $newname        path
         * @param bool   $removeIfExists if true remove exists file
         *
         * @return bool <p>Returns <b><code>TRUE</code></b> on success or <b><code>FALSE</code></b> on failure.</p>
         */
        public static function rename($oldname, $newname, $removeIfExists = false)
        {
            try {
                if (!file_exists($oldname) || !function_exists('rename')) {
                    return false;
                }

                if ($removeIfExists && file_exists($newname)) {
                    if (!self::rrmdir($newname)) {
                        return false;
                    }
                }
                return @rename($oldname, $newname);
            } catch (Exception $e) {
                return false;
            } catch (Error $e) {
                return false;
            }
        }

        public static function fopen($filepath, $mode, $throwOnError = true)
        {
            if (strlen($filepath) > DupLiteSnapLibOSU::maxPathLen()) {
                throw new Exception('Skipping a file that exceeds allowed max path length ['.DupLiteSnapLibOSU::maxPathLen().']. File: '.$filepath);
            }

            if (DupLiteSnapLibStringU::startsWith($mode, 'w') || DupLiteSnapLibStringU::startsWith($mode, 'c') || file_exists($filepath)) {
                $file_handle = @fopen($filepath, $mode);
            } else {
                if ($throwOnError) {
                    throw new Exception("$filepath doesn't exist");
                } else {
                    return false;
                }
            }

            if (!is_resource($file_handle)) {
                if ($throwOnError) {
                    throw new Exception("Error opening $filepath");
                } else {
                    return false;
                }
            } else {
                return $file_handle;
            }
        }

        public static function touch($filepath, $time = null)
        {
            if (!function_exists('touch')) {
                return false;
            }
            
            if ($time === null) {
                $time = time();
            }
            return @touch($filepath, $time);
        }

        public static function rmdir($dirname, $mustExist = false)
        {
            if (file_exists($dirname)) {
                self::chmod($dirname, 'u+rwx');
                if (self::rrmdir($dirname) === false) {
                    throw new Exception("Couldn't remove {$dirname}");
                }
            } else if ($mustExist) {
                throw new Exception("{$dirname} doesn't exist");
            }
        }

        public static function rm($filepath, $mustExist = false)
        {
            if (file_exists($filepath)) {
                self::chmod($filepath, 'u+rw');
                if (@unlink($filepath) === false) {
                    throw new Exception("Couldn't remove {$filepath}");
                }
            } else if ($mustExist) {
                throw new Exception("{$filepath} doesn't exist");
            }
        }

        /**
         * 
         * @param resource $handle
         * @param srtring $string
         * @return int
         * @throws Exception
         */
        public static function fwrite($handle, $string)
        {
            $bytes_written = @fwrite($handle, $string);

            if ($bytes_written != strlen($string)) {
                throw new Exception('Error writing to file.');
            } else {
                return $bytes_written;
            }
        }

        /**
         * wrinte file in chunk mode. For big data.
         * @param resource $handle
         * @param string $content
         * @return int
         * @throws Exception
         */
        public static function fwriteChunked($handle, $content)
        {
            $pieces  = str_split($content, self::FWRITE_CHUNK_SIZE);
            $written = 0;

            foreach ($pieces as $piece) {
                if (($fwResult = @fwrite($handle, $piece, self::FWRITE_CHUNK_SIZE)) === false) {
                    throw new Exception('Error writing to file.');
                }
                $written += $fwResult;
            }

            if ($written != strlen($content)) {
                throw new Exception('Error writing to file.');
            }

            return $written;
        }

        public static function fgets($handle, $length)
        {
            $line = fgets($handle, $length);

            if ($line === false) {
                throw new Exception('Error reading line.');
            }

            return $line;
        }

        public static function fclose($handle, $exception_on_fail = true)
        {
            if ((@fclose($handle) === false) && $exception_on_fail) {
                throw new Exception("Error closing file");
            }
        }

        public static function flock($handle, $operation)
        {
            if (@flock($handle, $operation) === false) {
                throw new Exception("Error locking file");
            }
        }

        public static function ftell($file_handle)
        {
            $position = @ftell($file_handle);

            if ($position === false) {
                throw new Exception("Couldn't retrieve file offset.");
            } else {
                return $position;
            }
        }

        /**
         * Safely remove a directory and recursively files and directory upto multiple sublevels
         *
         * @param path $dir The full path to the directory to remove
         *
         * @return bool Returns true if all content was removed
         */
        public static function rrmdir($path)
        {
            if (is_dir($path)) {
                if (($dh = opendir($path)) === false) {
                    return false;
                }
                while (($object = readdir($dh)) !== false) {
                    if ($object == "." || $object == "..") {
                        continue;
                    }
                    if (!self::rrmdir($path."/".$object)) {
                        closedir($dh);
                        return false;
                    }
                }
                closedir($dh);
                return @rmdir($path);
            } else {
                if (is_writable($path)) {
                    return @unlink($path);
                } else {
                    return false;
                }
            }
        }

        public static function filesize($filename)
        {
            $file_size = @filesize($filename);

            if ($file_size === false) {
                throw new Exception("Error retrieving file size of $filename");
            }

            return $file_size;
        }

        public static function fseek($handle, $offset, $whence = SEEK_SET)
        {
            $ret_val = @fseek($handle, $offset, $whence);

            if ($ret_val !== 0) {
                $filepath = stream_get_meta_data($handle);
                $filepath = $filepath["uri"];
                $filesize = self::filesize($filepath);
                // For future debug
                /*
                  error_log('$offset: '.$offset);
                  error_log('$filesize: '.$filesize);
                  error_log($whence. ' == '. SEEK_SET);
                 */
                if ($ret_val === false) {
                    throw new Exception("Trying to fseek($offset, $whence) and came back false");
                }
                //This check is not strict, but in most cases 32 Bit PHP will be the issue
                else if (abs($offset) > self::FileSizeLimit32BitPHP || $filesize > self::FileSizeLimit32BitPHP || ($offset <= 0 && ($whence == SEEK_SET || $whence == SEEK_END))) {
                    throw new DupLiteSnapLib_32BitSizeLimitException("Trying to seek on a file beyond the capability of 32 bit PHP. offset=$offset filesize=$filesize");
                } else {
                    throw new Exception("Error seeking to file offset $offset. Retval = $ret_val");
                }
            }
        }

        public static function filemtime($filename)
        {
            $mtime = filemtime($filename);

            if ($mtime === E_WARNING) {
                throw new Exception("Cannot retrieve last modified time of $filename");
            }

            return $mtime;
        }

        /**
         * exetute a file put contents after some checks. throw exception if fail.
         * 
         * @param string $filename
         * @param mixed $data
         * @return boolean
         * @throws Exception if putcontents fails
         */
        public static function filePutContents($filename, $data)
        {
            if (($dirFile = realpath(dirname($filename))) === false) {
                throw new Exception('FILE ERROR: put_content for file '.$filename.' failed [realpath fail]');
            }
            if (!is_dir($dirFile)) {
                throw new Exception('FILE ERROR: put_content for file '.$filename.' failed [dir '.$dirFile.' don\'t exists]');
            }
            if (!is_writable($dirFile)) {
                throw new Exception('FILE ERROR: put_content for file '.$filename.' failed [dir '.$dirFile.' exists but isn\'t writable]');
            }
            $realFileName = $dirFile.basename($filename);
            if (file_exists($realFileName) && !is_writable($realFileName)) {
                throw new Exception('FILE ERROR: put_content for file '.$filename.' failed [file exist '.$realFileName.' but isn\'t writable');
            }
            if (file_put_contents($filename, $data) === false) {
                throw new Exception('FILE ERROR: put_content for file '.$filename.' failed [Couldn\'t write data to '.$realFileName.']');
            }
            return true;
        }

        public static function getFileName($file_path)
        {
            $info = new SplFileInfo($file_path);
            return $info->getFilename();
        }

        public static function getPath($file_path)
        {
            $info = new SplFileInfo($file_path);
            return $info->getPath();
        }

        /**
         * this function make a chmod only if the are different from perms input and if chmod function is enabled
         *
         * this function handles the variable MODE in a way similar to the chmod of lunux
         * So the MODE variable can be
         * 1) an octal number (0755)
         * 2) a string that defines an octal number ("644")
         * 3) a string with the following format [ugoa]*([-+=]([rwx]*)+
         *
         * examples
         * u+rw         add read and write at the user
         * u+rw,uo-wx   add read and write ad the user and remove wx at groupd and other
         * a=rw         is equal at 666
         * u=rwx,go-rwx is equal at 700
         *
         * @param string $file
         * @param int|string $mode
         * @return boolean
         */
        public static function chmod($file, $mode)
        {
            if (!file_exists($file)) {
                return false;
            }

            $octalMode = 0;

            if (is_int($mode)) {
                $octalMode = $mode;
            } else if (is_numeric($mode)) {
                $octalMode = intval((($mode[0] === '0' ? '' : '0').$mode), 8);
            } else if (is_string($mode) && preg_match_all('/(a|[ugo]{1,3})([-=+])([rwx]{1,3})/', $mode, $gMatch, PREG_SET_ORDER)) {
                if (!function_exists('fileperms')) {
                    return false;
                }

                // start by file permission
                $octalMode = (fileperms($file) & 0777);

                foreach ($gMatch as $matches) {
                    // [ugo] or a = ugo
                    $group = $matches[1];
                    if ($group === 'a') {
                        $group = 'ugo';
                    }
                    // can be + - =
                    $action = $matches[2];
                    // [rwx]
                    $gPerms = $matches[3];

                    // reset octal group perms
                    $octalGroupMode = 0;

                    // Init sub perms
                    $subPerm = 0;
                    $subPerm += strpos($gPerms, 'x') !== false ? 1 : 0; // mask 001
                    $subPerm += strpos($gPerms, 'w') !== false ? 2 : 0; // mask 010
                    $subPerm += strpos($gPerms, 'r') !== false ? 4 : 0; // mask 100

                    $ugoLen = strlen($group);

                    if ($action === '=') {
                        // generate octal group permsissions and ugo mask invert
                        $ugoMaskInvert = 0777;
                        for ($i = 0; $i < $ugoLen; $i++) {
                            switch ($group[$i]) {
                                case 'u':
                                    $octalGroupMode = $octalGroupMode | $subPerm << 6; // mask xxx000000
                                    $ugoMaskInvert  = $ugoMaskInvert & 077;
                                    break;
                                case 'g':
                                    $octalGroupMode = $octalGroupMode | $subPerm << 3; // mask 000xxx000
                                    $ugoMaskInvert  = $ugoMaskInvert & 0707;
                                    break;
                                case 'o':
                                    $octalGroupMode = $octalGroupMode | $subPerm; // mask 000000xxx
                                    $ugoMaskInvert  = $ugoMaskInvert & 0770;
                                    break;
                            }
                        }
                        // apply = action
                        $octalMode = $octalMode & ($ugoMaskInvert | $octalGroupMode);
                    } else {
                        // generate octal group permsissions
                        for ($i = 0; $i < $ugoLen; $i++) {
                            switch ($group[$i]) {
                                case 'u':
                                    $octalGroupMode = $octalGroupMode | $subPerm << 6; // mask xxx000000
                                    break;
                                case 'g':
                                    $octalGroupMode = $octalGroupMode | $subPerm << 3; // mask 000xxx000
                                    break;
                                case 'o':
                                    $octalGroupMode = $octalGroupMode | $subPerm; // mask 000000xxx
                                    break;
                            }
                        }
                        // apply + or - action
                        switch ($action) {
                            case '+':
                                $octalMode = $octalMode | $octalGroupMode;
                                break;
                            case '-':
                                $octalMode = $octalMode & ~$octalGroupMode;
                                break;
                        }
                    }
                }
            } else {
                return true;
            }

            // if input permissions are equal at file permissions return true without performing chmod
            if (function_exists('fileperms') && $octalMode === (fileperms($file) & 0777)) {
                return true;
            }

            if (!function_exists('chmod')) {
                return false;
            }

            return @chmod($file, $octalMode);
        }

        /**
         * return file perms in string 
         * 
         * @param int|string $perms
         * @return string|bool // false if fail
         */
        public static function permsToString($perms)
        {
            if (is_int($perms)) {
                return decoct($perms);
            } else if (is_numeric($perms)) {
                return ($perms[0] === '0' ? '' : '0').$perms;
            } else if (is_string($perms)) {
                return $perms;
            } else {
                false;
            }
        }

        /**
         * this function creates a folder if it does not exist and performs a chmod.
         * it is different from the normal mkdir function to which an umask is applied to the input permissions.
         *
         * this function handles the variable MODE in a way similar to the chmod of lunux
         * So the MODE variable can be
         * 1) an octal number (0755)
         * 2) a string that defines an octal number ("644")
         * 3) a string with the following format [ugoa]*([-+=]([rwx]*)+
         *
         * @param string $path
         * @param int|string $mode
         * @param bool $recursive
         * @param resource $context // not used fo windows bug
         * @return boolean bool TRUE on success or FALSE on failure.
         *
         * @todo check recursive true and multiple chmod
         */
        public static function mkdir($path, $mode = 0777, $recursive = false, $context = null)
        {
            if (strlen($path) > DupLiteSnapLibOSU::maxPathLen()) {
                throw new Exception('Skipping a file that exceeds allowed max path length ['.DupLiteSnapLibOSU::maxPathLen().']. File: '.$path);
            }

            if (!file_exists($path)) {
                if (!function_exists('mkdir')) {
                    return false;
                }
                if (!@mkdir($path, 0777, $recursive)) {
                    return false;
                }
            }

            return self::chmod($path, $mode);
        }

        /**
         * this function call snap mkdir if te folder don't exists od don't have write or exec permissions
         *
         * this function handles the variable MODE in a way similar to the chmod of lunux
         * The mode variable can be set to have more flexibility but not giving the user write and read and exec permissions doesn't make much sense
         *
         * @param string $path
         * @param int|string $mode
         * @param bool $recursive
         * @param resource $context
         * @return boolean
         */
        public static function dirWriteCheckOrMkdir($path, $mode = 'u+rwx', $recursive = false, $context = null)
        {
            if (!file_exists($path)) {
                return self::mkdir($path, $mode, $recursive, $context);
            } else if (!is_writable($path) || !is_executable($path)) {
                return self::chmod($path, $mode);
            } else {
                return true;
            }
        }

        /**
         * from wordpress function wp_is_stream 
         *
         * @param string $path The resource path or URL.
         * @return bool True if the path is a stream URL.
         */
        public static function is_stream($path)
        {
            $scheme_separator = strpos($path, '://');

            if (false === $scheme_separator) {
                // $path isn't a stream
                return false;
            }

            $stream = substr($path, 0, $scheme_separator);

            return in_array($stream, stream_get_wrappers(), true);
        }

        /**
         * From Wordpress function: wp_mkdir_p
         * 
         * Recursive directory creation based on full path.
         *
         * Will attempt to set permissions on folders.
         *
         * @param string $target Full path to attempt to create.
         * @return bool Whether the path was created. True if path already exists.
         */
        public static function mkdir_p($target)
        {
            $wrapper = null;

            // Strip the protocol.
            if (self::is_stream($target)) {
                list( $wrapper, $target ) = explode('://', $target, 2);
            }

            // From php.net/mkdir user contributed notes.
            $target = str_replace('//', '/', $target);

            // Put the wrapper back on the target.
            if ($wrapper !== null) {
                $target = $wrapper.'://'.$target;
            }

            /*
             * Safe mode fails with a trailing slash under certain PHP versions.
             * Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
             */
            $target = rtrim($target, '/');
            if (empty($target)) {
                $target = '/';
            }

            if (file_exists($target)) {
                return @is_dir($target);
            }

            // We need to find the permissions of the parent folder that exists and inherit that.
            $target_parent = dirname($target);
            while ('.' != $target_parent && !is_dir($target_parent) && dirname($target_parent) !== $target_parent) {
                $target_parent = dirname($target_parent);
            }

            // Get the permission bits.
            if ($stat = @stat($target_parent)) {
                $dir_perms = $stat['mode'] & 0007777;
            } else {
                $dir_perms = 0777;
            }

            if (@mkdir($target, $dir_perms, true)) {

                /*
                 * If a umask is set that modifies $dir_perms, we'll have to re-set
                 * the $dir_perms correctly with chmod()
                 */
                if ($dir_perms != ( $dir_perms & ~umask() )) {
                    $folder_parts = explode('/', substr($target, strlen($target_parent) + 1));
                    for ($i = 1, $c = count($folder_parts); $i <= $c; $i++) {
                        @chmod($target_parent.'/'.implode('/', array_slice($folder_parts, 0, $i)), $dir_perms);
                    }
                }

                return true;
            }

            return false;
        }

        /**
         * 
         * @param string|bool $path     // return false if path isn't a sub path of main path or return the relative path
         */
        public static function getRelativePath($path, $mainPath)
        {
            if (strlen($mainPath) == 0) {
                return ltrim(self::safePathUntrailingslashit($path), '/');
            }

            $safePath     = self::safePathUntrailingslashit($path);
            $safeMainPath = self::safePathUntrailingslashit($mainPath);

            if ($safePath === $safeMainPath) {
                return '';
            } else if (strpos($safePath, self::trailingslashit($safeMainPath)) === 0) {
                return ltrim(substr($safePath, strlen($safeMainPath)), '/');
            } else {
                return false;
            }
        }

        /**
         * from wp_normalize_path
         *
         * @param string $path Path to normalize.
         * @return string Normalized path.
         */
        public static function normalize_path($path)
        {
            $wrapper = '';
            if (self::is_stream($path)) {
                list( $wrapper, $path ) = explode('://', $path, 2);
                $wrapper .= '://';
            }

            // Standardise all paths to use /
            $path = str_replace('\\', '/', $path);

            // Replace multiple slashes down to a singular, allowing for network shares having two slashes.
            $path = preg_replace('|(?<=.)/+|', '/', $path);
            if (strpos($path, '//') === 0) {
                $path = substr($path, 1);
            }

            // Windows paths should uppercase the drive letter
            if (':' === substr($path, 1, 1)) {
                $path = ucfirst($path);
            }

            return $wrapper.$path;
        }

        /**
         * Get common parent path from given paths
         * 
         * @param array $paths - array of paths
         * @return common parent path
         */
        public static function getCommonPath($paths = array())
        {
            if (empty($paths)) {
                return '';
            } if (!is_array($paths)) {
                $paths = array($paths);
            } else {
                $paths = array_values($paths);
            }

            $pathAssoc    = array();
            $numPaths     = count($paths);
            $minPathCouts = PHP_INT_MAX;

            for ($i = 0; $i < $numPaths; $i++) {
                $pathAssoc[$i] = explode('/', self::safePathUntrailingslashit($paths[$i]));
                $pathCount     = count($pathAssoc[$i]);
                if ($minPathCouts > $pathCount) {
                    $minPathCouts = $pathCount;
                }
            }

            for ($partIndex = 0; $partIndex < $minPathCouts; $partIndex++) {
                $currentPart = $pathAssoc[0][$partIndex];
                for ($currentPath = 1; $currentPath < $numPaths; $currentPath++) {
                    if ($pathAssoc[$currentPath][$partIndex] != $currentPart) {
                        break 2;
                    }
                }
            }

            $resultParts = array_slice($pathAssoc[0], 0, $partIndex);

            return implode('/', $resultParts);
        }

        /**
         * remove root path transforming the current path into a relative path
         * 
         * ex. /aaa/bbb  become aaa/bbb
         * ex. C:\aaa\bbb become aaa\bbb
         * 
         * @param string $path
         * @return string
         */
        public static function removeRootPath($path)
        {
            return preg_replace('/^(?:[A-Za-z]:)?[\/](.*)/', '$1', $path);
        }

        /**
         * Returns the last N lines of a file. Simular to tail command
         *
         * @param string $filepath The full path to the file to be tailed
         * @param int $lines The number of lines to return with each tail call
         *
         * @return string The last N parts of the file
         */
        public static function tailFile($filepath, $lines = 2)
        {
            // Open file
            $f = @fopen($filepath, "rb");
            if ($f === false)
                return false;

            // Sets buffer size
            $buffer = 256;

            // Jump to last character
            fseek($f, -1, SEEK_END);

            // Read it and adjust line number if necessary
            // (Otherwise the result would be wrong if file doesn't end with a blank line)
            if (fread($f, 1) != "\n")
                $lines -= 1;

            // Start reading
            $output = '';
            $chunk  = '';

            // While we would like more
            while (ftell($f) > 0 && $lines >= 0) {
                // Figure out how far back we should jump
                $seek   = min(ftell($f), $buffer);
                // Do the jump (backwards, relative to where we are)
                fseek($f, -$seek, SEEK_CUR);
                // Read a chunk and prepend it to our output
                $output = ($chunk  = fread($f, $seek)).$output;
                // Jump back to where we started reading
                fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR);
                // Decrease our line counter
                $lines  -= substr_count($chunk, "\n");
            }

            // While we have too many lines
            // (Because of buffer size we might have read too many)
            while ($lines++ < 0) {
                // Find first newline and remove all text before that
                $output = substr($output, strpos($output, "\n") + 1);
            }
            fclose($f);
            return trim($output);
        }

        /**
         * @param string $path Path to the file
         * @param int $n Number of lines to get
         * @param int $charLimit Number of chars to include in each line
         * @return bool|array Last $n lines of file
         * @throws Exception
         */
        public static function getLastLinesOfFile($path, $n, $charLimit = null)
        {
            if (!is_readable($path)) {
                return false;
            }

            if (($handle = self::fopen($path, 'r', false)) === false) {
                return false;
            }

            $result      = array();
            $pos         = -1;
            $currentLine = '';
            $counter     = 0;

            while ($counter < $n && -1 !== fseek($handle, $pos, SEEK_END)) {
                $char = fgetc($handle);
                if (PHP_EOL == $char) {
                    $trimmedValue = trim($currentLine);
                    if (is_null($charLimit)) {
                        $currentLine = substr($currentLine, 0);
                    } else {
                        $currentLine = substr($currentLine, 0, (int) $charLimit);
                        if (strlen($currentLine) == $charLimit) {
                            $currentLine .= '...';
                        }
                    }

                    if (!empty($trimmedValue)) {
                        $result[] = $currentLine;
                        $counter++;
                    }
                    $currentLine = '';
                } else {
                    $currentLine = $char.$currentLine;
                }
                $pos--;
            }
            self::fclose($handle, false);

            return array_reverse($result);
        }

        /**
         * return a list of paths
         * 
         * @param string $dir
         * @param callable $callback
         * @param array $options // array(
         *                              'regexFile'     => [bool|string|array], // if is bool alrays or never match, if is string o array of string check if rexeses match file name
         *                              'regexFolder'   => [bool|string|array], // if is bool alrays or never match, if is string o array of string check if rexeses match file name
         *                              'checkFullPath' => bool,                // if false only current file/folder name is passed at regex if true is passed the full path
         *                              'recursive'     => bool,                // if false check only passed folder or all sub folder recursively
         *                              'invert'        => bool,                // if false pass invert the result
         *                              'childFirst'    => bool                 // if false is parsed parent folters first or child folders first
         *                          )
         *                          
         * @return boolean
         */
        public static function regexGlob($dir, $options)
        {
            $result = array();

            self::regexGlobCallback($dir, function ($path) use (&$result) {
                $result[] = $path;
            }, $options);

            return $result;
        }

        /**
         * execute the callback function foreach right element, private function for optimization
         * 
         * @param string $dir
         * @param callable $callback
         * @param array $options // array(
         *                              'regexFile'     => [bool|string|array], // if is bool alrays or never match, if is string o array of string check if rexeses match file name
         *                              'regexFolder'   => [bool|string|array], // if is bool alrays or never match, if is string o array of string check if rexeses match file name
         *                              'checkFullPath' => bool,                // if false only current file/folder name is passed at regex if true is passed the full path
         *                              'recursive'     => bool,                // if false check only passed folder or all sub folder recursively
         *                              'invert'        => bool,                // if false pass invert the result
         *                              'childFirst'    => bool                 // if false is parsed parent folters first or child folders first
         *                          )
         *                          
         * @return boolean
         */
        protected static function regexGlobCallbackPrivate($dir, $callback, $options)
        {
            if (!is_dir($dir) || !is_readable($dir)) {
                return false;
            }

            if (($dh = opendir($dir)) == false) {
                return false;
            }

            $trailingslashitDir = self::trailingslashit($dir);

            while (($elem = readdir($dh)) !== false) {
                if ($elem === '.' || $elem === '..') {
                    continue;
                }

                $fullPath  = $trailingslashitDir.$elem;
                $regex     = is_dir($fullPath) ? $options['regexFolder'] : $options['regexFile'];
                $pathCheck = $options['checkFullPath'] ? $fullPath : $elem;

                if (is_bool($regex)) {
                    $match = ($regex xor $options['invert']);
                } else {
                    $match = false;
                    foreach ($regex as $currentRegex) {
                        if (preg_match($currentRegex, $pathCheck) === 1) {
                            $match = true;
                            break;
                        }
                    }

                    if ($options['invert']) {
                        $match = !$match;
                    }
                }

                if ($match) {
                    if ($options['recursive'] && $options['childFirst'] === true && is_dir($fullPath)) {
                        self::regexGlobCallbackPrivate($fullPath, $callback, $options);
                    }

                    call_user_func($callback, $fullPath);

                    if ($options['recursive'] && $options['childFirst'] === false && is_dir($fullPath)) {
                        self::regexGlobCallbackPrivate($fullPath, $callback, $options);
                    }
                }
            }
            closedir($dh);

            return true;
        }

        /**
         * execute the callback function foreach right element (folder or files)
         * 
         * @param string $dir
         * @param callable $callback
         * @param array $options // array(
         *                              'regexFile'     => [bool|string|array], // if is bool alrays or never match, if is string o array of string check if rexeses match file name
         *                              'regexFolder'   => [bool|string|array], // if is bool alrays or never match, if is string o array of string check if rexeses match file name
         *                              'checkFullPath' => bool,                // if false only current file/folder name is passed at regex if true is passed the full path
         *                              'recursive'     => bool,                // if false check only passed folder or all sub folder recursively
         *                              'invert'        => bool,                // if false pass invert the result
         *                              'childFirst'    => bool                 // if false is parsed parent folters first or child folders first
         *                          )
         *                          
         * @return boolean
         */
        public static function regexGlobCallback($dir, $callback, $options = array())
        {
            if (!is_callable($callback)) {
                return false;
            }

            $options = array_merge(array(
                'regexFile'     => true,
                'regexFolder'   => true,
                'checkFullPath' => false,
                'recursive'     => false,
                'invert'        => false,
                'childFirst'    => false
                ), (array) $options);

            if (is_scalar($options['regexFile']) && !is_bool($options['regexFile'])) {
                $options['regexFile'] = array($options['regexFile']);
            }

            if (is_scalar($options['regexFolder']) && !is_bool($options['regexFolder'])) {
                $options['regexFolder'] = array($options['regexFolder']);
            }

            return self::regexGlobCallbackPrivate(self::safePath($dir), $callback, $options);
        }

        public static function emptyDir($dir)
        {
            $dir = self::safePathTrailingslashit($dir);
            if (!is_dir($dir) || !is_readable($dir)) {
                return false;
            }

            if (($dh = opendir($dir)) == false) {
                return false;
            }

            $listToDelete = array();

            while (($elem = readdir($dh)) !== false) {
                if ($elem === '.' || $elem === '..') {
                    continue;
                }

                $fullPath = $dir.$elem;
                if (is_writable($fullPath)) {
                    $listToDelete[] = $fullPath;
                }
            }
            closedir($dh);

            foreach ($listToDelete as $path) {
                self::rrmdir($path);
            }
            return true;
        }

        /**
         * Returns a path to the base root folder of path taking into account the
         * open_basedir setting.
         *
         * @param $path
         * @return bool|string Base root path of $path if it's accessible, otherwise false;
         */
        public static function getMaxAllowedRootOfPath($path)
        {
            $path = self::safePathUntrailingslashit($path, true);

            if (!self::isOpenBaseDirEnabled()) {
                $parts = explode("/", $path);
                return $parts[0]."/";
            } else {
                return self::getOpenBaseDirRootOfPath($path);
            }
        }

        /**
         * @return bool true if open_basedir is set
         */
        public static function isOpenBaseDirEnabled()
        {
            $iniVar = ini_get("open_basedir");
            return !empty($iniVar);
        }

        /**
         * @return array Paths contained in the open_basedir setting. Empty array if the setting
         *               is not enabled.
         */
        public static function getOpenBaseDirPaths()
        {
            if (!($openBase = ini_get("open_basedir"))) {
                return array();
            }
            return explode(PATH_SEPARATOR, $openBase);
        }

        /**
         * @param $path
         * @return bool|mixed|string Path to the base dir of $path if it exists, otherwise false
         */
        public static function getOpenBaseDirRootOfPath($path)
        {
            foreach (self::getOpenBaseDirPaths() as $allowedPath) {
                $allowedPath = $allowedPath !== "/" ? self::safePathUntrailingslashit($allowedPath) : "/";
                if (strpos($path, $allowedPath) === 0) {
                    return $allowedPath;
                }
            }

            return false;
        }
    }
}
lib/config/class.wp.config.tranformer.php000064400000033445151336065400014460 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteWPConfigTransformer')):
/**
 * Transforms a wp-config.php file.
 */
class DupLiteWPConfigTransformer {

    const REPLACE_TEMP_STIRNG = '_1_2_RePlAcE_3_4_TeMp_5_6_StRiNg_7_8_';

	/**
	 * Path to the wp-config.php file.
	 *
	 * @var string
	 */
	protected $wp_config_path;

	/**
	 * Original source of the wp-config.php file.
	 *
	 * @var string
	 */
	protected $wp_config_src;

	/**
	 * Array of parsed configs.
	 *
	 * @var array
	 */
	protected $wp_configs = array();

	/**
	 * Instantiates the class with a valid wp-config.php.
	 *
	 * @throws Exception If the wp-config.php file is missing.
	 * @throws Exception If the wp-config.php file is not writable.
	 *
	 * @param string $wp_config_path Path to a wp-config.php file.
	 */
	public function __construct( $wp_config_path ) {
		if ( ! file_exists( $wp_config_path ) ) {
			throw new Exception( 'wp-config.php file does not exist.' );
		}
		// Duplicator Extra
		/*
		if ( ! is_writable( $wp_config_path ) ) {
			throw new Exception( 'wp-config.php file is not writable.' );
		}
		*/

		$this->wp_config_path = $wp_config_path;
	}

	/**
	 * Checks if a config exists in the wp-config.php file.
	 *
	 * @throws Exception If the wp-config.php file is empty.
	 * @throws Exception If the requested config type is invalid.
	 *
	 * @param string $type Config type (constant or variable).
	 * @param string $name Config name.
	 *
	 * @return bool
	 */
	public function exists( $type, $name ) {
		$wp_config_src = file_get_contents( $this->wp_config_path );

		if ( ! trim( $wp_config_src ) ) {
			throw new Exception( 'wp-config.php file is empty.' );
		}

		// SnapCreek custom change
		// Normalize the newline to prevent an issue coming from OSX
		$wp_config_src = str_replace(array("\n\r", "\r"), array("\n", "\n"), $wp_config_src);

		$this->wp_config_src = $wp_config_src;
		$this->wp_configs    = $this->parse_wp_config( $this->wp_config_src );

		if ( ! isset( $this->wp_configs[ $type ] ) ) {
			throw new Exception( "Config type '{$type}' does not exist." );
		}

		return isset( $this->wp_configs[ $type ][ $name ] );
	}

	/**
	 * Get the value of a config in the wp-config.php file.
	 *
	 * @throws Exception If the wp-config.php file is empty.
	 * @throws Exception If the requested config type is invalid.
	 *
	 * @param string $type Config type (constant or variable).
	 * @param string $name Config name.
	 *
	 * @return array
	 */
	public function get_value( $type, $name, $get_real_value = true) {
		$wp_config_src = file_get_contents( $this->wp_config_path );
		if ( ! trim( $wp_config_src ) ) {
			throw new Exception( 'wp-config.php file is empty.' );
		}

		// SnapCreek custom change
		// Normalize the newline to prevent an issue coming from OSX
		$wp_config_src = str_replace(array("\n\r", "\r"), array("\n", "\n"), $wp_config_src);


		$this->wp_config_src = $wp_config_src;
		$this->wp_configs    = $this->parse_wp_config( $this->wp_config_src );

		if ( ! isset( $this->wp_configs[ $type ] ) ) {
			throw new Exception( "Config type '{$type}' does not exist." );
		}

		// Duplicator Extra
		$val = $this->wp_configs[ $type ][ $name ]['value'];
        if ($get_real_value) {
            return self::getRealValFromVal($val);
        } else {
            return $val;
        }

		return $val;
	}

    public static function getRealValFromVal($val)
    {
        if ($val[0] === '\'') {
            // string with '
            $result = substr($val, 1, strlen($val) - 2);
            return str_replace(array('\\\'', '\\\\'), array('\'', '\\'), $result);
        } else if ($val[0] === '"') {
            // string with "
            return json_decode(str_replace('\\$', '$', $val));
        } else if (strcasecmp($val, 'true') === 0) {
            return true;
        } else if (strcasecmp($val, 'false') === 0) {
            return false;
        } else if (strcasecmp($val, 'null') === 0) {
            return null;
        } else if (preg_match('/^[-+]?[0-9]+$/', $val)) {
            return (int) $val;
        } else if (preg_match('/^[-+]?[0-9]+\.[0-9]+$/', $val)) {
            return (float) $val;
        } else {
            return $val;
        }
    }

        /**
	 * Adds a config to the wp-config.php file.
	 *
	 * @throws Exception If the config value provided is not a string.
	 * @throws Exception If the config placement anchor could not be located.
	 *
	 * @param string $type    Config type (constant or variable).
	 * @param string $name    Config name.
	 * @param string $value   Config value.
	 * @param array  $options (optional) Array of special behavior options.
	 *
	 * @return bool
	 */
	public function add( $type, $name, $value, array $options = array() ) {
		if ( ! is_string( $value ) ) {
			throw new Exception( 'Config value must be a string.' );
		}

		if ( $this->exists( $type, $name ) ) {
			return false;
		}

		$defaults = array(
			'raw'       => false, // Display value in raw format without quotes.
			'anchor'    => "/* That's all, stop editing!", // Config placement anchor string.
			'separator' => PHP_EOL, // Separator between config definition and anchor string.
			'placement' => 'before', // Config placement direction (insert before or after).
		);

		list( $raw, $anchor, $separator, $placement ) = array_values( array_merge( $defaults, $options ) );

		$raw       = (bool) $raw;
		$anchor    = (string) $anchor;
		$separator = (string) $separator;
		$placement = (string) $placement;

		// Custom code by the SnapCreek Team
		if ( false === strpos( $this->wp_config_src, $anchor ) ) {
			$other_anchor_points = array(
				'/** Absolute path to the WordPress directory',
				// ABSPATH defined check with single quote
				"if ( !defined('ABSPATH') )",
				"if ( ! defined( 'ABSPATH' ) )",
				"if (!defined('ABSPATH') )",
				"if(!defined('ABSPATH') )",
				"if(!defined('ABSPATH'))",
				"if ( ! defined( 'ABSPATH' ))",
				"if ( ! defined( 'ABSPATH') )",
				"if ( ! defined('ABSPATH' ) )",
				"if (! defined( 'ABSPATH' ))",
				"if (! defined( 'ABSPATH') )",
				"if (! defined('ABSPATH' ) )",
				"if ( !defined( 'ABSPATH' ))",
				"if ( !defined( 'ABSPATH') )",
				"if ( !defined('ABSPATH' ) )",
				"if( !defined( 'ABSPATH' ))",
				"if( !defined( 'ABSPATH') )",
				"if( !defined('ABSPATH' ) )",
				// ABSPATH defined check with double quote
				'if ( !defined("ABSPATH") )',
				'if ( ! defined( "ABSPATH" ) )',
				'if (!defined("ABSPATH") )',
				'if(!defined("ABSPATH") )',
				'if(!defined("ABSPATH"))',
				'if ( ! defined( "ABSPATH" ))',
				'if ( ! defined( "ABSPATH") )',
				'if ( ! defined("ABSPATH" ) )',
				'if (! defined( "ABSPATH" ))',
				'if (! defined( "ABSPATH") )',
				'if (! defined("ABSPATH" ) )',
				'if ( !defined( "ABSPATH" ))',
				'if ( !defined( "ABSPATH") )',
				'if ( !defined("ABSPATH" ) )',
				'if( !defined( "ABSPATH" ))',
				'if( !defined( "ABSPATH") )',
				'if( !defined("ABSPATH" ) )',

				'/** Sets up WordPress vars and included files',
				'require_once(ABSPATH',
				'require_once ABSPATH',
				'require_once( ABSPATH',
				'require_once',
				"define( 'DB_NAME'",
				'define( "DB_NAME"',
				"define('DB_NAME'",
				'define("DB_NAME"',
				'require',
				'include_once',
			);
			foreach ($other_anchor_points as $anchor_point) {
				$anchor_point    = (string) $anchor_point;
				if ( false !== strpos( $this->wp_config_src, $anchor_point ) ) {
					$anchor = $anchor_point;
					break;
				}
			}
		}

		if ( false === strpos( $this->wp_config_src, $anchor ) ) {
			throw new Exception( 'Unable to locate placement anchor.' );
		}

		$new_src  = $this->normalize( $type, $name, $this->format_value( $value, $raw ) );
		$new_src  = ( 'after' === $placement ) ? $anchor . $separator . $new_src : $new_src . $separator . $anchor;
		$contents = str_replace( $anchor, $new_src, $this->wp_config_src );

		return $this->save( $contents );
	}

	/**
	 * Updates an existing config in the wp-config.php file.
	 *
	 * @throws Exception If the config value provided is not a string.
	 *
	 * @param string $type    Config type (constant or variable).
	 * @param string $name    Config name.
	 * @param string $value   Config value.
	 * @param array  $options (optional) Array of special behavior options.
	 *
	 * @return bool
	 */
	public function update( $type, $name, $value, array $options = array() ) {
		if ( ! is_string( $value ) ) {
			throw new Exception( 'Config value must be a string.' );
		}

		$defaults = array(
			'add'       => true, // Add the config if missing.
			'raw'       => false, // Display value in raw format without quotes.
			'normalize' => false, // Normalize config output using WP Coding Standards.
		);

		list( $add, $raw, $normalize ) = array_values( array_merge( $defaults, $options ) );

		$add       = (bool) $add;
		$raw       = (bool) $raw;
		$normalize = (bool) $normalize;

		if ( ! $this->exists( $type, $name ) ) {
			return ( $add ) ? $this->add( $type, $name, $value, $options ) : false;
		}

		$old_src   = $this->wp_configs[ $type ][ $name ]['src'];
		$old_value = $this->wp_configs[ $type ][ $name ]['value'];
		$new_value = $this->format_value( $value, $raw );

		if ( $normalize ) {
			$new_src = $this->normalize( $type, $name, $new_value );
		} else {
			$new_parts    = $this->wp_configs[ $type ][ $name ]['parts'];
			$new_parts[1] = str_replace( $old_value, $new_value, $new_parts[1] ); // Only edit the value part.
			$new_src      = implode( '', $new_parts );
		}

        $contents = preg_replace(
			sprintf( '/(?<=^|;|<\?php\s|<\?\s)(\s*?)%s/m', preg_quote( trim( $old_src ), '/' ) ),
			'$1' . self::REPLACE_TEMP_STIRNG ,
			$this->wp_config_src
		);
        $contents = str_replace(self::REPLACE_TEMP_STIRNG, trim($new_src), $contents);
		return $this->save( $contents );
	}

	/**
	 * Removes a config from the wp-config.php file.
	 *
	 * @param string $type Config type (constant or variable).
	 * @param string $name Config name.
	 *
	 * @return bool
	 */
	public function remove( $type, $name ) {
		if ( ! $this->exists( $type, $name ) ) {
			return false;
		}

		$pattern  = sprintf( '/(?<=^|;|<\?php\s|<\?\s)%s\s*(\S|$)/m', preg_quote( $this->wp_configs[ $type ][ $name ]['src'], '/' ) );
		$contents = preg_replace( $pattern, '$1', $this->wp_config_src );

		return $this->save( $contents );
	}

	/**
	 * Applies formatting to a config value.
	 *
	 * @throws Exception When a raw value is requested for an empty string.
	 *
	 * @param string $value Config value.
	 * @param bool   $raw   Display value in raw format without quotes.
	 *
	 * @return mixed
	 */
	protected function format_value( $value, $raw ) {
		if ( $raw && '' === trim( $value ) ) {
			throw new Exception( 'Raw value for empty string not supported.' );
		}

		return ( $raw ) ? $value : var_export( $value, true );
	}

	/**
	 * Normalizes the source output for a name/value pair.
	 *
	 * @throws Exception If the requested config type does not support normalization.
	 *
	 * @param string $type  Config type (constant or variable).
	 * @param string $name  Config name.
	 * @param mixed  $value Config value.
	 *
	 * @return string
	 */
	protected function normalize( $type, $name, $value ) {
		if ( 'constant' === $type ) {
			$placeholder = "define( '%s', %s );";
		} elseif ( 'variable' === $type ) {
			$placeholder = '$%s = %s;';
		} else {
			throw new Exception( "Unable to normalize config type '{$type}'." );
		}

		return sprintf( $placeholder, $name, $value );
	}

	/**
	 * Parses the source of a wp-config.php file.
	 *
	 * @param string $src Config file source.
	 *
	 * @return array
	 */
	protected function parse_wp_config( $src ) {
		$configs             = array();
		$configs['constant'] = array();
		$configs['variable'] = array();

		// Strip comments.
		foreach ( token_get_all( $src ) as $token ) {
			if ( in_array( $token[0], array( T_COMMENT, T_DOC_COMMENT ), true ) ) {
				$src = str_replace( $token[1], '', $src );
			}
		}

		preg_match_all( '/(?<=^|;|<\?php\s|<\?\s)(\h*define\s*\(\s*[\'"](\w*?)[\'"]\s*)(,\s*(\'\'|""|\'.*?[^\\\\]\'|".*?[^\\\\]"|.*?)\s*)((?:,\s*(?:true|false)\s*)?\)\s*;)/ims', $src, $constants );
        preg_match_all( '/(?<=^|;|<\?php\s|<\?\s)(\h*\$(\w+)\s*=)(\s*(\'\'|""|\'.*?[^\\\\]\'|".*?[^\\\\]"|.*?)\s*;)/ims', $src, $variables );


		if ( ! empty( $constants[0] ) && ! empty( $constants[1] ) && ! empty( $constants[2] ) && ! empty( $constants[3] ) && ! empty( $constants[4] ) && ! empty( $constants[5] ) ) {
			foreach ( $constants[2] as $index => $name ) {
				$configs['constant'][ $name ] = array(
					'src'   => $constants[0][ $index ],
					'value' => $constants[4][ $index ],
					'parts' => array(
						$constants[1][ $index ],
						$constants[3][ $index ],
						$constants[5][ $index ],
					),
				);
			}
		}

		if ( ! empty( $variables[0] ) && ! empty( $variables[1] ) && ! empty( $variables[2] ) && ! empty( $variables[3] ) && ! empty( $variables[4] ) ) {
			// Remove duplicate(s), last definition wins.
			$variables[2] = array_reverse( array_unique( array_reverse( $variables[2], true ) ), true );
			foreach ( $variables[2] as $index => $name ) {
				$configs['variable'][ $name ] = array(
					'src'   => $variables[0][ $index ],
					'value' => $variables[4][ $index ],
					'parts' => array(
						$variables[1][ $index ],
						$variables[3][ $index ],
					),
				);
			}
		}

		return $configs;
	}

	/**
	 * Saves new contents to the wp-config.php file.
	 *
	 * @throws Exception If the config file content provided is empty.
	 * @throws Exception If there is a failure when saving the wp-config.php file.
	 *
	 * @param string $contents New config contents.
	 *
	 * @return bool
	 */
	protected function save( $contents ) {
		if ( ! trim( $contents ) ) {
			throw new Exception( 'Cannot save the wp-config.php file with empty contents.' );
		}

		if ( $contents === $this->wp_config_src ) {
			return false;
		}

		$result = file_put_contents( $this->wp_config_path, $contents, LOCK_EX );

		if ( false === $result ) {
			throw new Exception( 'Failed to update the wp-config.php file.' );
		}

		return true;
	}

}

endif;
lib/config/class.wp.config.tranformer.src.php000064400000005245151336065400015243 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (!class_exists('DupLiteWPConfigTransformer')) {
    require_once(dirname(__FILE__).'/class.wp.config.tranformer.php');
}

if (!class_exists('DupLiteWPConfigTransformerSrc')):

    /**
     * Transforms a wp-config.php file.
     */
    class DupLiteWPConfigTransformerSrc extends DupLiteWPConfigTransformer
    {

        /**
         * Instantiates the class with a valid wp-config.php scr text
         *
         * @param string $wp_config_path Path to a wp-config.php file.
         */
        public function __construct($wp_config_src)
        {
            // Normalize the newline to prevent an issue coming from OSX
            $this->wp_config_src = str_replace(array("\n\r", "\r"), array("\n", "\n"), $wp_config_src);
        }

        public function getSrc()
        {
            return $this->wp_config_src;
        }

        /**
         * Checks if a config exists in the wp-config.php src
         *
         * @throws Exception If the wp-config.php file is empty.
         * @throws Exception If the requested config type is invalid.
         *
         * @param string $type Config type (constant or variable).
         * @param string $name Config name.
         *
         * @return bool
         */
        public function exists($type, $name)
        {
            $this->wp_configs = $this->parse_wp_config($this->wp_config_src);

            if (!isset($this->wp_configs[$type])) {
                throw new Exception("Config type '{$type}' does not exist.");
            }

            return isset($this->wp_configs[$type][$name]);
        }

        /**
         * Get the value of a config in the wp-config.php src
         *
         * @param string $type Config type (constant or variable).
         * @param string $name Config name.
         *
         * @return array
         */
        public function get_value($type, $name, $get_real_value = true)
        {
            $this->wp_configs = $this->parse_wp_config($this->wp_config_src);

            if (!isset($this->wp_configs[$type])) {
                throw new Exception("Config type '{$type}' does not exist.");
            }

            // Duplicator Extra
            $val = $this->wp_configs[$type][$name]['value'];
            if ($get_real_value) {
                return self::getRealValFromVal($val);
            } else {
                return $val;
            }
        }

        /**
         * update wp_config_src
         *
         * @param string $contents
         * @return boolean
         */
        protected function save($contents)
        {
            $this->wp_config_src = $contents;
            return true;
        }
    }
    
endif;
lib/index.php000064400000000034151336065400007132 0ustar00<?php
// Silence is golden.
lib/fileops/class.fileops.u.delete.php000064400000002221151336065400013735 0ustar00<?php
if (!defined("ABSPATH") && !defined("DUPXABSPATH"))
	die("");
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

class FileOpsDeleteConfig
{
	public $workerTime;
	public $directories;
	public $throttleDelayInUs;
	public $excludedDirectories;
	public $excludedFiles;
	public $fileLock;

}

class FileOpsDeleteU
{

	// Move $directories, $files, $excludedFiles to $destination directory. Throws exception if it can't do something and $exceptionOnFaiure is true
	// $exludedFiles can include * wildcard
	// returns: array with list of failures
	public static function delete($currentDirectory, &$deleteConfig)
	{
		$timedOut = false;
		
		if (is_dir($currentDirectory)) {
			$objects = scandir($currentDirectory);
			foreach ($objects as $object) {
				if ($object != "." && $object != "..") {
					if (is_dir($currentDirectory."/".$object)) {
						self::delete($currentDirectory."/".$object, $deleteConfig);
					}
					else {
						@unlink($currentDirectory."/".$object);
					}
				}
			}
			@rmdir($currentDirectory);
		}
	}
}lib/fileops/class.fileops.u.move.php000064400000002436151336065400013451 0ustar00<?php
if (!defined("ABSPATH") && !defined("DUPXABSPATH"))
    die("");
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

class FileOpsMoveU
{
    // Move $directories, $files, $excludedFiles to $destination directory. Throws exception if it can't do something and $exceptionOnFaiure is true
    // $exludedFiles can include * wildcard
    // returns: array with list of failures
    public static function move($directories, $files, $excludedFiles, $destination)
    {
        DupLiteSnapLibLogger::logObject('directories', $directories);
        DupLiteSnapLibLogger::logObject('files', $files);
        DupLiteSnapLibLogger::logObject('excludedFiles', $excludedFiles);
        DupLiteSnapLibLogger::logObject('destination', $destination);

        $failures = array();


        $directoryFailures = DupLiteSnapLibIOU::massMove($directories, $destination, null, false);
        DupLiteSnapLibLogger::log('done directories');
        $fileFailures = DupLiteSnapLibIOU::massMove($files, $destination, $excludedFiles, false);
        DupLiteSnapLibLogger::log('done files');
        return array_merge($directoryFailures, $fileFailures);
    }
}lib/fileops/class.fileops.state.php000064400000005211151336065400013352 0ustar00<?php
if (!defined("ABSPATH") && !defined("DUPXABSPATH"))
    die("");
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

class FileOpsState
{
    public static $instance = null;

    private $workerTime;
    private $directories;
    private $throttleDelay;
    private $excludedDirectories;
    private $excludedFiles;
    private $working = false;

    const StateFilename = 'state.json';

    public static function getInstance($reset = false)
    {
        if ((self::$instance == null) && (!$reset)) {
            $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

            self::$instance = new FileOpsState();

            if (file_exists($stateFilepath)) {
                $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'rb');

                DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

                $stateString = fread($stateHandle, filesize($stateFilepath));

                $data = json_decode($stateString);

                self::$instance->setFromData($data);

              //  self::$instance->fileRenames = (array)(self::$instance->fileRenames);

                DupLiteSnapLibIOU::flock($stateHandle, LOCK_UN);

                DupLiteSnapLibIOU::fclose($stateHandle);
            } else {
                $reset = true;
            }
        }

        if ($reset) {
            self::$instance = new FileOpsState();

            self::$instance->reset();
        }

        return self::$instance;
    }

    private function setFromData($data)
    {
   //     $this->currentFileHeader     = $data->currentFileHeader;
    }

    public function reset()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'w');

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

        $this->initMembers();

        DupLiteSnapLibIOU::fwrite($stateHandle, json_encode($this));

        DupLiteSnapLibIOU::fclose($stateHandle);
    }

    public function save()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'w');

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

        DupArchiveUtil::tlog("saving state");
        DupLiteSnapLibIOU::fwrite($stateHandle, json_encode($this));

        DupLiteSnapLibIOU::fclose($stateHandle);
    }

    private function initMembers()
    {
    //    $this->currentFileHeader = null;

    }
}lib/fileops/class.fileops.constants.php000064400000001745151336065400014256 0ustar00<?php
if (!defined("ABSPATH") && !defined("DUPXABSPATH"))
    die("");
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

class FileOpsConstants
{
    public static $FILEOPS_ROOT;
    
    public static $DEFAULT_WORKER_TIME = 18;

    public static $LIB_DIR;

    public static $PROCESS_LOCK_FILEPATH;
    public static $PROCESS_CANCEL_FILEPATH;
    public static $KEY_FILEPATH;

    public static $LOG_FILEPATH;
          
    public static function init() {

        self::$FILEOPS_ROOT = dirname(__FILE__);

        self::$LIB_DIR = self::$FILEOPS_ROOT.'/..';

        self::$PROCESS_LOCK_FILEPATH = self::$FILEOPS_ROOT.'/fileops_lock.bin';
        self::$PROCESS_CANCEL_FILEPATH = self::$FILEOPS_ROOT.'/fileops_cancel.bin';
        self::$LOG_FILEPATH = dirname(__FILE__).'/fileops.log';
    }
}

FileOpsConstants::init();lib/fileops/index.php000064400000000017151336065400010574 0ustar00<?php
//silentlib/fileops/fileops.php000064400000013305151336065400011132 0ustar00<?php
/** Absolute path to the DAWS directory. - necessary for php protection */
if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/');
if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('display_errors'))
    @ini_set('display_errors', 1);
error_reporting(E_ALL);
set_error_handler("terminate_missing_variables");


require_once(dirname(__FILE__) . '/class.fileops.constants.php');
require_once(dirname(__FILE__) . '/class.fileops.u.move.php');

require_once(FileOpsConstants::$LIB_DIR . '/snaplib/snaplib.all.php');


class FileOps
{
    private $lock_handle = null;

    function __construct()
    {
        date_default_timezone_set('UTC'); // Some machines don’t have this set so just do it here.

        DupLiteSnapLibLogger::init(FileOpsConstants::$LOG_FILEPATH);
    }

    public function processRequest()
    {
        try {
            DupLiteSnapLibLogger::clearLog();
            /* @var $state FileOpsState */
			DupLiteSnapLibLogger::log('process request');
            $retVal = new StdClass();

            $retVal->pass = false;


           if (isset($_REQUEST['action'])) {
                //$params = $_REQUEST;
                $params = array();
                DupLiteSnapLibLogger::logObject('REQUEST', $_REQUEST);
                
                foreach($_REQUEST as $key => $value) 
                {
                    $params[$key] = json_decode($value, true);    
                }

            } else {
                $json = file_get_contents('php://input');
                DupLiteSnapLibLogger::logObject('json1', $json);
                $params = json_decode($json, true);
                DupLiteSnapLibLogger::logObject('json2', $json);
           }

            DupLiteSnapLibLogger::logObject('params', $params);
            DupLiteSnapLibLogger::logObject('keys', array_keys($params));

            $action = $params['action'];
            
            if ($action == 'deltree') {

				DupLiteSnapLibLogger::log('deltree');



				$config = DeleteConfig();

				$config->workerTime = DupLiteSnapLibUtil::GetArrayValue($params, 'worker_time');
				$config->directories = DupLiteSnapLibUtil::getArrayValue($params, 'directories');
				$config->throttleDelayInUs = DupLiteSnapLibUtil::getArrayValue($params, 'throttleDelay', false, 0) * 1000000;
				$config->excludedDirectories = DupLiteSnapLibUtil::getArrayValue($params, 'excluded_directories', false, array());
				$config->excludedFiles = DupLiteSnapLibUtil::getArrayValue($params, 'excluded_files', false, array());
				$config->fileLock = DupLiteSnapLibUtil::GetArrayValue($params, 'fileLock');

				DupLiteSnapLibLogger::logObject('Config', $config);



				// TODO use appropriate lock type
				DupLiteSnapLibIOU::flock($this->lock_handle, LOCK_EX);

                $this->lock_handle = DupLiteSnapLibIOU::fopen(FileOpsConstants::$PROCESS_LOCK_FILEPATH, 'c+');
				




                DupLiteSnapLibIOU::flock($this->lock_handle, LOCK_UN);

                $retVal->pass = true;
                $retVal->status = new stdClass;
				//todo $retVal->status->errors = $moveErrors;  // RSR TODO ensure putting right thing in here

            } else if($action === 'move_files') {

                $directories = DupLiteSnapLibUtil::getArrayValue($params, 'directories', false, array());
                $files =  DupLiteSnapLibUtil::getArrayValue($params, 'files', false, array());
                $excludedFiles =  DupLiteSnapLibUtil::getArrayValue($params, 'excluded_files', false, array());
                $destination = DupLiteSnapLibUtil::getArrayValue($params, 'destination');                    

                DupLiteSnapLibLogger::log('before move');
                $moveErrors = FileOpsMoveU::move($directories, $files, $excludedFiles, $destination);

                DupLiteSnapLibLogger::log('after move');

                $retVal->pass = true;
                $retVal->status = new stdClass();
                $retVal->status->errors = $moveErrors;  // RSR TODO ensure putting right thing in here
            }
            else {

                throw new Exception('Unknown command.');
            }

            session_write_close();

        } catch (Exception $ex) {
            $error_message = "Error Encountered:" . $ex->getMessage() . '<br/>' . $ex->getTraceAsString();

            DupLiteSnapLibLogger::log($error_message);

            $retVal->pass = false;
            $retVal->error = $error_message;
        }

		DupLiteSnapLibLogger::logObject("before json encode retval", $retVal);

		$jsonRetVal = json_encode($retVal);
		DupLiteSnapLibLogger::logObject("json encoded retval", $jsonRetVal);
        echo $jsonRetVal;
    }
}

function generateCallTrace()
{
    $e = new Exception();
    $trace = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();

    for ($i = 0; $i < $length; $i++) {
        $result[] = ($i + 1) . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }

    return "\t" . implode("\n\t", $result);
}

function terminate_missing_variables($errno, $errstr, $errfile, $errline)
{
//    echo "<br/>ERROR: $errstr $errfile $errline<br/>";
    //  if (($errno == E_NOTICE) and ( strstr($errstr, "Undefined variable"))) die("$errstr in $errfile line $errline");


    DupLiteSnapLibLogger::log("ERROR $errno, $errstr, {$errfile}:{$errline}");
    DupLiteSnapLibLogger::log(generateCallTrace());
    //  DaTesterLogging::clearLog();

   // exit(1);
    //return false; // Let the PHP error handler handle all the rest
}

$fileOps = new FileOps();

$fileOps->processRequest();lib/dup_archive/classes/util/class.duparchive.util.scan.php000064400000004411151336065400020066 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(dirname(__FILE__).'/class.duparchive.u.json.php');

if(!class_exists('DupArchiveScanUtil')) {
/**
 * Description of class
 *
 * @author Robert
 */
class DupArchiveScanUtil
{

    public static function getScan($scanFilepath)
//put your code here private function get_scan()
    {
        DupArchiveUtil::tlog("Getting scen");
        $scan_handle = fopen($scanFilepath, 'r');

        if ($scan_handle === false) {
            throw new Exception("Can't open {$scanFilepath}");
        }

        $scan_file = fread($scan_handle, filesize($scanFilepath));

        if ($scan_file === false) {
            throw new Exception("Can't read from {$scanFilepath}");
        }

        // $scan = json_decode($scan_file);
        $scan = DupArchiveJsonU::decode($scan_file);
        if ($scan == null) {
            throw new Exception("Error decoding scan file");
        }

        fclose($scan_handle);

        return $scan;
    }

    public static function createScanObject($sourceDirectory)
    {
        $scan = new stdClass();

        $scan->Dirs  = DupArchiveUtil::expandDirectories($sourceDirectory, true);
        $scan->Files = DupArchiveUtil::expandFiles($sourceDirectory, true);

        return $scan;
    }

    public static function createScan($scanFilepath, $sourceDirectory)
    {
        DupArchiveUtil::tlog("Creating scan");
//        $scan = new stdClass();
//
//        $scan->Dirs  = DupArchiveUtil::expandDirectories($sourceDirectory, true);
//        $scan->Files = DupArchiveUtil::expandFiles($sourceDirectory, true);
////$scan->Files = array();

        $scan = self::createScanObject($sourceDirectory);

        $scan_handle = fopen($scanFilepath, 'w');

        if ($scan_handle === false) {
            echo "Couldn't create scan file";
            die();
        }

        $jsn = DupArchiveJsonU::customEncode($scan);

        fwrite($scan_handle, $jsn);

        //  DupArchiveUtil::tlogObject('jsn', $jsn);

        return $scan;
    }
}
}lib/dup_archive/classes/util/index.php000064400000000017151336065400014036 0ustar00<?php
//silentlib/dup_archive/classes/util/class.duparchive.u.json.php000064400000012522151336065400017404 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
if(!class_exists('DupArchiveJsonU')) {
class DupArchiveJsonU
{
    protected static $_messages = array(
        JSON_ERROR_NONE => 'No error has occurred',
        JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
        JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
        JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
        JSON_ERROR_SYNTAX => 'Syntax error',
        JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded. To resolve see https://snapcreek.com/duplicator/docs/faqs-tech/#faq-package-170-q'
    );

    public static function customEncode($value, $iteration = 1)
    {
        $encoded = DupLiteSnapJsonU::wp_json_encode($value);
    
        switch (json_last_error()) {
            case JSON_ERROR_NONE:
                return $encoded;
            case JSON_ERROR_DEPTH:
                throw new RuntimeException('Maximum stack depth exceeded'); // or trigger_error() or throw new Exception()
            case JSON_ERROR_STATE_MISMATCH:
                throw new RuntimeException('Underflow or the modes mismatch'); // or trigger_error() or throw new Exception()
            case JSON_ERROR_CTRL_CHAR:
                throw new RuntimeException('Unexpected control character found');
            case JSON_ERROR_SYNTAX:
                throw new RuntimeException('Syntax error, malformed JSON'); // or trigger_error() or throw new Exception()
            case JSON_ERROR_UTF8:
                if ($iteration == 1) {
                    $clean = self::makeUTF8($value);
                    return self::customEncode($clean, $iteration + 1);
                } else {
                    throw new RuntimeException('UTF-8 error loop');
                }
            default:
                throw new RuntimeException('Unknown error'); // or trigger_error() or throw new Exception()
        }
    }

    public static function encode($value, $options = 0)
    {
        $result = DupLiteSnapJsonU::wp_json_encode($value, $options);

        if ($result !== FALSE) {

            return $result;
        }

        if (function_exists('json_last_error')) {
            $message = self::$_messages[json_last_error()];
        } else {
            $message = 'One or more filenames isn\'t compatible with JSON encoding';
        }

        throw new RuntimeException($message);
    }

    public static function decode($json, $assoc = false)
    {
        $result = json_decode($json, $assoc);

        if ($result) {
            return $result;
        }

        throw new RuntimeException(self::$_messages[json_last_error()]);
    }


    /** ========================================================
	 * PRIVATE METHODS
     * =====================================================  */


    private static function makeUTF8($mixed)
    {
        if (is_array($mixed)) {
            foreach ($mixed as $key => $value) {
                $mixed[$key] = self::makeUTF8($value);
            }
        } else if (is_string($mixed)) {
            return utf8_encode($mixed);
        }
        return $mixed;
    }

    private static function escapeString($str)
    {
        return addcslashes($str, "\v\t\n\r\f\"\\/");
    }

    private static function oldCustomEncode($in)
    {
        $out = "";

        if (is_object($in)) {
            //$class_vars = get_object_vars(($in));
            //$arr = array();
            //foreach ($class_vars as $key => $val)
            //{
            $arr[$key] = "\"".self::escapeString($key)."\":\"{$val}\"";
            //}
            //$val = implode(',', $arr);
            //$out .= "{{$val}}";
            $in = get_object_vars($in);
        }
        //else
        if (is_array($in)) {
            $obj = false;
            $arr = array();

            foreach ($in AS $key => $val) {
                if (!is_numeric($key)) {
                    $obj = true;
                }
                $arr[$key] = self::oldCustomEncode($val);
            }

            if ($obj) {
                foreach ($arr AS $key => $val) {
                    $arr[$key] = "\"".self::escapeString($key)."\":{$val}";
                }
                $val = implode(',', $arr);
                $out .= "{{$val}}";
            } else {
                $val = implode(',', $arr);
                $out .= "[{$val}]";
            }
        } elseif (is_bool($in)) {
            $out .= $in ? 'true' : 'false';
        } elseif (is_null($in)) {
            $out .= 'null';
        } elseif (is_string($in)) {
            $out .= "\"".self::escapeString($in)."\"";
        } else {
            $out .= $in;
        }

        return "{$out}";
    }

    private static function oldMakeUTF8($val)
    {
        if (is_array($val)) {
            foreach ($val as $k => $v) {
                $val[$k] = self::oldMakeUTF8($v);
            }
        } else if (is_object($val)) {
            foreach ($val as $k => $v) {
                $val->$k = self::oldMakeUTF8($v);
            }
        } else {
            if (mb_detect_encoding($val, 'UTF-8', true)) {
                return $val;
            } else {
                return utf8_encode($val);
            }
        }

        return $val;
    }
}
}lib/dup_archive/classes/util/class.duparchive.util.php000064400000012566151336065400017155 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Util
 *
 * @author Bob
 */

require_once(dirname(__FILE__).'/../class.duparchive.constants.php');
require_once(DupArchiveConstants::$LibRoot.'/snaplib/class.snaplib.u.util.php');

if(!class_exists('DupArchiveUtil')) {
class DupArchiveUtil
{
    public static $TRACE_ON = false;    //rodo rework this
    public static $logger = null;
    public static $profilingFunction = null;

    public static function boolToString($b)
    {
        return ($b ? 'true' : 'false');
    }

    public static function expandFiles($base_dir, $recurse)
    {
        $files = array();

        foreach (scandir($base_dir) as $file) {
            if (($file == '.') || ($file == '..')) {
                continue;
            }

            $file = "{$base_dir}/{$file}";

            if (is_file($file)) {
                $files [] = $file;
            } else if (is_dir($file) && $recurse) {
                $files = array_merge($files, self::expandFiles($file, $recurse));
            }
        }

        return $files;
    }

    public static function expandDirectories($base_dir, $recurse)
    {
        $directories = array();

        foreach (scandir($base_dir) as $candidate) {

            if (($candidate == '.') || ($candidate == '..')) {
                continue;
            }

            $candidate = "{$base_dir}/{$candidate}";

            // if (is_file($file)) {
            //     $directories [] = $file;
            if (is_dir($candidate)) {

                $directories[] = $candidate;

                if ($recurse) {

                    $directories = array_merge($directories, self::expandDirectories($candidate, $recurse));
                }
            }
        }

        return $directories;
    }

    public static function getRelativePath($from, $to, $newBasePath = null)
    {
        // some compatibility fixes for Windows paths
        $from = is_dir($from) ? rtrim($from, '\/').'/' : $from;
        $to   = is_dir($to) ? rtrim($to, '\/').'/' : $to;
        $from = str_replace('\\', '/', $from);
        $to   = str_replace('\\', '/', $to);

        $from    = explode('/', $from);
        $to      = explode('/', $to);
        $relPath = $to;

        foreach ($from as $depth => $dir) {
            // find first non-matching dir
            if ($dir === $to[$depth]) {
                // ignore this directory
                array_shift($relPath);
            } else {
                // get number of remaining dirs to $from
                $remaining = count($from) - $depth;
                if ($remaining > 1) {
                    // add traversals up to first matching dir
                    $padLength = (count($relPath) + $remaining - 1) * -1;
                    $relPath   = array_pad($relPath, $padLength, '..');
                    break;
                } else {
                    //$relPath[0] = './' . $relPath[0];
                }
            }
        }
        
        $r = implode('/', $relPath);

        if($newBasePath != null) {
            $r = $newBasePath . $r;
        }

        return $r;
    }

    public static function log($s, $flush = false, $callingFunctionName = null)
    {
        if(self::$logger != null)
        {
            if($callingFunctionName === null)
            {
                $callingFunctionName = DupLiteSnapLibUtil::getCallingFunctionName();
            }

            self::$logger->log($s, $flush, $callingFunctionName);
        }
        else
        {
         //   throw new Exception('Logging object not initialized');
        }
    }

    // rodo fold into log
    public static function tlog($s, $flush = false, $callingFunctionName = null)
    {
        if (self::$TRACE_ON) {

            if($callingFunctionName === null)
            {
                $callingFunctionName = DupLiteSnapLibUtil::getCallingFunctionName();
            }

            self::log("####{$s}", $flush, $callingFunctionName);
        }
    }

    public static function profileEvent($s, $start)
    {
        if(self::$profilingFunction != null)
        {
            call_user_func(self::$profilingFunction, $s, $start);
        }
    }

    // rodo fold into logObject
    public static function tlogObject($s, $o, $flush = false, $callingFunctionName = null)
    {
        if(is_object($o))
        {
            $o = get_object_vars($o);
        }

        $ostring = print_r($o, true);

        if($callingFunctionName === null)
        {
            $callingFunctionName = DupLiteSnapLibUtil::getCallingFunctionName();
        }

        self::tlog($s, $flush, $callingFunctionName);
        self::tlog($ostring, $flush, $callingFunctionName);
    }

    public static function logObject($s, $o, $flush = false, $callingFunctionName = null)
    {
        $ostring = print_r($o, true);

        if($callingFunctionName === null)
        {
            $callingFunctionName = DupLiteSnapLibUtil::getCallingFunctionName();
        }

        self::log($s, $flush, $callingFunctionName);
        self::log($ostring, $flush, $callingFunctionName);
    }
}
}lib/dup_archive/classes/class.duparchive.engine.php000064400000071654151336065400016473 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
require_once(dirname(__FILE__) . '/class.duparchive.constants.php');

require_once(DupArchiveConstants::$LibRoot . '/snaplib/class.snaplib.u.io.php');
require_once(DupArchiveConstants::$LibRoot . '/snaplib/class.snaplib.u.stream.php');

require_once(dirname(__FILE__) . '/headers/class.duparchive.header.php');
require_once(dirname(__FILE__) . '/states/class.duparchive.state.create.php');
require_once(dirname(__FILE__) . '/states/class.duparchive.state.simplecreate.php');
require_once(dirname(__FILE__) . '/states/class.duparchive.state.simpleexpand.php');
require_once(dirname(__FILE__) . '/states/class.duparchive.state.expand.php');
require_once(dirname(__FILE__) . '/processors/class.duparchive.processor.file.php');
require_once(dirname(__FILE__) . '/processors/class.duparchive.processor.directory.php');
require_once(dirname(__FILE__) . '/class.duparchive.processing.failure.php');
require_once(dirname(__FILE__) . '/util/class.duparchive.util.php');
require_once(dirname(__FILE__) . '/util/class.duparchive.util.scan.php');

if(!class_exists('DupArchiveInfo')) {
class DupArchiveInfo
{

    public $archiveHeader;
    public $fileHeaders;
    public $directoryHeaders;

    public function __construct()
    {
        $this->fileHeaders = array();
        $this->directoryHeaders = array();
    }
}
}

if(!class_exists('DupArchiveItemAlias')) {
class DupArchiveItemAlias
{

    public $oldName;
    public $newName;

}
}

if(!class_exists('DupArchiveItemHeaderType')) {
class DupArchiveItemHeaderType
{

    const None = 0;
    const File = 1;
    const Directory = 2;
    const Glob = 3;

}
}

if(!class_exists('DupArchiveEngine')) {
class DupArchiveEngine
{

    public static $archive;
    public static function init($logger, $profilingFunction = null, $archive = null)
    {
        DupArchiveUtil::$logger = $logger;
        DupArchiveUtil::$profilingFunction = $profilingFunction;
        self::$archive = $archive;
    }

    public static function getNextHeaderType($archiveHandle)
    {
        $retVal = DupArchiveItemHeaderType::None;
        $marker = fgets($archiveHandle, 4);

        if (feof($archiveHandle) === false) {
            switch ($marker) {
                case '<D>':
                    $retVal = DupArchiveItemHeaderType::Directory;
                    break;

                case '<F>':
                    $retVal = DupArchiveItemHeaderType::File;
                    break;

                case '<G>':
                    $retVal = DupArchiveItemHeaderType::Glob;
                    break;

                default:
                    throw new Exception("Invalid header marker {$marker}. Location:" . ftell($archiveHandle));
            }
        }

        return $retVal;
    }

    public static function getArchiveInfo($filepath)
    {
        $archiveInfo = new DupArchiveInfo();

        DupArchiveUtil::log("archive size=" . filesize($filepath));
        $archiveHandle = DupLiteSnapLibIOU::fopen($filepath, 'rb');
        $moreFiles = true;

        $archiveInfo->archiveHeader = DupArchiveHeader::readFromArchive($archiveHandle);

        $moreToRead = true;

        while ($moreToRead) {

            $headerType = self::getNextHeaderType($archiveHandle);

            // DupArchiveUtil::log("next header type=$headerType: " . ftell($archiveHandle));

            switch ($headerType) {
                case DupArchiveItemHeaderType::File:

                    $fileHeader = DupArchiveFileHeader::readFromArchive($archiveHandle, true, true);
                    $archiveInfo->fileHeaders[] = $fileHeader;
                    DupArchiveUtil::log("file" . $fileHeader->relativePath);
                    break;

                case DupArchiveItemHeaderType::Directory:
                    $directoryHeader = DupArchiveDirectoryHeader::readFromArchive($archiveHandle, true);

                    $archiveInfo->directoryHeaders[] = $directoryHeader;
                    break;

                case DupArchiveItemHeaderType::None:
                    $moreToRead = false;
            }
        }

        return $archiveInfo;
    }

    // can't span requests since create state can't store list of files
    public static function addDirectoryToArchiveST($archiveFilepath, $directory, $basepath, $includeFiles = false, $newBasepath = null, $globSize = DupArchiveCreateState::DEFAULT_GLOB_SIZE)
    {
        if ($includeFiles) {
            $scan = DupArchiveScanUtil::createScanObject($directory);
        } else {
            $scan->Files = array();
            $scan->Dirs = array();
        }

        $createState = new DupArchiveSimpleCreateState();

        $createState->archiveOffset = filesize($archiveFilepath);
        $createState->archivePath = $archiveFilepath;
        $createState->basePath = $basepath;
        $createState->timerEnabled = false;
        $createState->globSize = $globSize;
        $createState->newBasePath = $newBasepath;

        self::addItemsToArchive($createState, $scan);

        $retVal = new stdClass();
        $retVal->numDirsAdded = $createState->currentDirectoryIndex;
        $retVal->numFilesAdded = $createState->currentFileIndex;

        if($createState->skippedFileCount > 0) {

            throw new Exception("One or more files were were not able to be added when adding {$directory} to {$archiveFilepath}");
        }
        else if($createState->skippedDirectoryCount > 0) {
            
            throw new Exception("One or more directories were not able to be added when adding {$directory} to {$archiveFilepath}");
        }

        return $retVal;
    }

    public static function addRelativeFileToArchiveST($archiveFilepath, $filepath, $relativePath, $globSize = DupArchiveCreateState::DEFAULT_GLOB_SIZE)
    {
        $createState = new DupArchiveSimpleCreateState();

        $createState->archiveOffset = filesize($archiveFilepath);
        $createState->archivePath = $archiveFilepath;
        $createState->basePath = null;
        $createState->timerEnabled = false;
        $createState->globSize = $globSize;

        $scan = new stdClass();

        $scan->Files = array();
        $scan->Dirs = array();

        $scan->Files[] = $filepath;

        if ($relativePath != null) {

            $scan->FileAliases = array();
            $scan->FileAliases[$filepath] = $relativePath;
        }

        self::addItemsToArchive($createState, $scan);
    }

    public static function addFileToArchiveUsingBaseDirST($archiveFilepath, $basePath, $filepath, $globSize = DupArchiveCreateState::DEFAULT_GLOB_SIZE)
    {
        $createState = new DupArchiveSimpleCreateState();

        $createState->archiveOffset = filesize($archiveFilepath);
        $createState->archivePath = $archiveFilepath;
        $createState->basePath = $basePath;
        $createState->timerEnabled = false;
        $createState->globSize = $globSize;

        $scan = new stdClass();

        $scan->Files = array();
        $scan->Dirs = array();

        $scan->Files[] = $filepath;

        self::addItemsToArchive($createState, $scan);
    }

    public static function createArchive($archivePath, $isCompressed)
    {
        $archiveHandle = DupLiteSnapLibIOU::fopen($archivePath, 'w+b');

        /* @var $archiveHeader DupArchiveHeader */
        $archiveHeader = DupArchiveHeader::create($isCompressed);

        $archiveHeader->writeToArchive($archiveHandle);

        // Intentionally do not write build state since if something goes wrong we went it to start over on the archive

        DupLiteSnapLibIOU::fclose($archiveHandle);
    }

    public static function addItemsToArchive($createState, $scanFSInfo)
    {
        if ($createState->globSize == -1) {

            $createState->globSize = DupArchiveCreateState::DEFAULT_GLOB_SIZE;
        }
        /* @var $createState DupArchiveCreateState */
        DupArchiveUtil::tlogObject("addItemsToArchive start", $createState);

        $directoryCount = count($scanFSInfo->Dirs);
        $fileCount = count($scanFSInfo->Files);

        $createState->startTimer();

        /* @var $createState DupArchiveCreateState */
        $basepathLength = strlen($createState->basePath);

        $archiveHandle = DupLiteSnapLibIOU::fopen($createState->archivePath, 'r+b');

        DupArchiveUtil::tlog("Archive size=", filesize($createState->archivePath));
        DupArchiveUtil::tlog("Archive location is now " . DupLiteSnapLibIOU::ftell($archiveHandle));

        $archiveHeader = DupArchiveHeader::readFromArchive($archiveHandle);

        $createState->isCompressed = $archiveHeader->isCompressed;

        if ($createState->archiveOffset == filesize($createState->archivePath)) {
            DupArchiveUtil::tlog("Seeking to end of archive location because of offset {$createState->archiveOffset} for file size " . filesize($createState->archivePath));
            DupLiteSnapLibIOU::fseek($archiveHandle, 0, SEEK_END);
        } else {
            DupArchiveUtil::tlog("Seeking archive offset {$createState->archiveOffset} for file size " . filesize($createState->archivePath));
            DupLiteSnapLibIOU::fseek($archiveHandle, $createState->archiveOffset);
        }

        while (($createState->currentDirectoryIndex < $directoryCount) && (!$createState->timedOut())) {

            if ($createState->throttleDelayInUs !== 0) {
                usleep($createState->throttleDelayInUs);
            }

            $directory = $scanFSInfo->Dirs[$createState->currentDirectoryIndex];

            try {
                $relativeDirectoryPath = null;

                if (isset($scanFSInfo->DirectoryAliases) && array_key_exists($directory, $scanFSInfo->DirectoryAliases)) {
                    $relativeDirectoryPath = $scanFSInfo->DirectoryAliases[$directory];
                } else {
                    if (null === self::$archive) {
                        $relativeDirectoryPath = substr($directory, $basepathLength);
                        $relativeDirectoryPath = ltrim($relativeDirectoryPath, '/');
                        if ($createState->newBasePath !== null) {
                            $relativeDirectoryPath = $createState->newBasePath . $relativeDirectoryPath;
                        }
                    } else {
                        $relativeDirectoryPath = self::$archive->getLocalDirPath($directory, $createState->newBasePath);
                    }
                }

                if($relativeDirectoryPath !== '') {
                    DupArchiveDirectoryProcessor::writeDirectoryToArchive($createState, $archiveHandle, $directory, $relativeDirectoryPath);
                } else {
                    $createState->skippedDirectoryCount++;
                    $createState->currentDirectoryIndex++;
                }
            } catch (Exception $ex) {
                DupArchiveUtil::log("Failed to add {$directory} to archive. Error: " . $ex->getMessage(), true);

                $createState->addFailure(DupArchiveFailureTypes::Directory, $directory, $ex->getMessage(), false);
                $createState->currentDirectoryIndex++;
                $createState->skippedDirectoryCount++;
                $createState->save();
            }
        }

        $createState->archiveOffset = DupLiteSnapLibIOU::ftell($archiveHandle);

        $workTimestamp = time();
        while (($createState->currentFileIndex < $fileCount) && (!$createState->timedOut())) {

            $filepath = $scanFSInfo->Files[$createState->currentFileIndex];

            try {

                $relativeFilePath = null;

                if (isset($scanFSInfo->FileAliases) && array_key_exists($filepath, $scanFSInfo->FileAliases)) {
                    $relativeFilePath = $scanFSInfo->FileAliases[$filepath];
                } else {
                    if (null === self::$archive) {
                        $relativeFilePath = substr($filepath, $basepathLength);
                        $relativeFilePath = ltrim($relativeFilePath, '/');
                        if ($createState->newBasePath !== null) {
                            $relativeFilePath = $createState->newBasePath . $relativeFilePath;
                        }
                    } else {
                        $relativeFilePath = self::$archive->getLocalFilePath($filepath, $createState->newBasePath);
                    }
                }

                // Uncomment when testing error handling
//                   if((strpos($relativeFilePath, 'dup-installer') !== false) || (strpos($relativeFilePath, 'lib') !== false)) {
//                       Dup_Log::Trace("Was going to do intentional error to {$relativeFilePath} but skipping");
//                   } else {
//                        throw new Exception("#### intentional file error when writing " . $relativeFilePath);
//                   }
//                }

                DupArchiveFileProcessor::writeFilePortionToArchive($createState, $archiveHandle, $filepath, $relativeFilePath);

                if(($createState->isRobust) && (time() - $workTimestamp >= 1)){
                    DupArchiveUtil::log("Robust mode create state save");

                    // When in robustness mode save the state every second
                    $workTimestamp = time();
                    $createState->working = ($createState->currentDirectoryIndex < $directoryCount) || ($createState->currentFileIndex < $fileCount);
                    $createState->save();
                }
            } catch (Exception $ex) {
                DupArchiveUtil::log("Failed to add {$filepath} to archive. Error: " . $ex->getMessage() . $ex->getTraceAsString(), true);
                $createState->currentFileIndex++;
                $createState->skippedFileCount++;
                $createState->addFailure(DupArchiveFailureTypes::File, $filepath, $ex->getMessage(), ($ex->getCode() === DupArchiveExceptionCodes::Fatal));
                $createState->save();
            }
        }

        $createState->working = ($createState->currentDirectoryIndex < $directoryCount) || ($createState->currentFileIndex < $fileCount);
        $createState->save();

        DupLiteSnapLibIOU::fclose($archiveHandle);

        if (!$createState->working) {
            DupArchiveUtil::log("compress done");
        } else {
            DupArchiveUtil::tlog("compress not done so continuing later");
        }
    }
    public static function expandDirectory($archivePath, $relativePath, $destPath)
    {
        self::expandItems($archivePath, $relativePath, $destPath);
    }

    public static function expandArchive($expandState)
    {
        /* @var $expandState DupArchiveExpandState */
        $expandState->startTimer();

        $archiveHandle = DupLiteSnapLibIOU::fopen($expandState->archivePath, 'rb');

        DupLiteSnapLibIOU::fseek($archiveHandle, $expandState->archiveOffset);

        if ($expandState->archiveOffset == 0) {

            DupArchiveUtil::log("#### seeking to start of archive");

            $expandState->archiveHeader = DupArchiveHeader::readFromArchive($archiveHandle);
            $expandState->isCompressed = $expandState->archiveHeader->isCompressed;
            $expandState->archiveOffset = DupLiteSnapLibIOU::ftell($archiveHandle);

            $expandState->save();
        } else {

            DupArchiveUtil::log("#### seeking archive offset {$expandState->archiveOffset}");
        }

        if ((!$expandState->validateOnly) || ($expandState->validationType == DupArchiveValidationTypes::Full)) {
            $moreItems = self::expandItems($expandState, $archiveHandle);
        } else {
            // profile ok
            $moreItems = self::standardValidateItems($expandState, $archiveHandle);
            // end profile ok
        }

        $expandState->working = $moreItems;
        $expandState->save();

        DupLiteSnapLibIOU::fclose($archiveHandle, false);

        if (!$expandState->working) {

            DupArchiveUtil::log("expand done");
            DupArchiveUtil::logObject('expandstate', $expandState);

            if (($expandState->expectedFileCount != -1) && ($expandState->expectedFileCount != $expandState->fileWriteCount)) {

                $expandState->addFailure(DupArchiveFailureTypes::File, 'Archive', "Number of files expected ({$expandState->expectedFileCount}) doesn't equal number written ({$expandState->fileWriteCount}).");
            }

            if (($expandState->expectedDirectoryCount != -1) && ($expandState->expectedDirectoryCount != $expandState->directoryWriteCount)) {
                $expandState->addFailure(DupArchiveFailureTypes::Directory, 'Archive', "Number of directories expected ({$expandState->expectedDirectoryCount}) doesn't equal number written ({$expandState->directoryWriteCount}).");
            }
        } else {
            DupArchiveUtil::tlogObject("expand not done so continuing later", $expandState);
        }
    }

    private static function skipFileInArchive($archiveHandle, $fileHeader)
    {
        if ($fileHeader->fileSize > 0) {

            $dataSize = 0;

            do {
                $globHeader = DupArchiveGlobHeader::readFromArchive($archiveHandle, true);

                $dataSize += $globHeader->originalSize;

                $moreGlobs = ($dataSize < $fileHeader->fileSize);
            } while ($moreGlobs);
        }
    }

    // Assumes we are on one header and just need to get to the next
    private static function skipToNextHeader($archiveHandle)
    {
        $headerType = self::getNextHeaderType($archiveHandle);

        switch ($headerType) {
            case DupArchiveItemHeaderType::File:
                $fileHeader = DupArchiveFileHeader::readFromArchive($archiveHandle, false, true);

                self::skipFileInArchive($archiveHandle, $fileHeader);

                break;

            case DupArchiveItemHeaderType::Directory:

                $directoryHeader = DupArchiveDirectoryHeader::readFromArchive($archiveHandle, true);

                break;

            case DupArchiveItemHeaderType::None:
                $moreToRead = false;
        }
    }

    // Single-threaded file expansion
    public static function expandFiles($archiveFilePath, $relativeFilePaths, $destPath)
    {
        // Not setting timeout timestamp so it will never timeout
        DupArchiveUtil::tlog("opening archive {$archiveFilePath}");

        $archiveHandle = DupLiteSnapLibIOU::fopen($archiveFilePath, 'r');

        /* @var $expandState DupArchiveSimpleExpandState */
        $expandState = new DupArchiveSimpleExpandState();

        $expandState->archiveHeader = DupArchiveHeader::readFromArchive($archiveHandle);
        $expandState->isCompressed  = $expandState->archiveHeader->isCompressed;
        $expandState->archiveOffset = DupLiteSnapLibIOU::ftell($archiveHandle);
        $expandState->includedFiles = $relativeFilePaths;
        $expandState->filteredDirectories = array('*');
        $expandState->filteredFiles = array('*');
//        $expandState->basePath    = $destPath . '/tempExtract';   // RSR remove once extract works
        $expandState->basePath      = $destPath;   // RSR remove once extract works
        
        // TODO: Filter out all directories/files except those in the list
        self::expandItems($expandState, $archiveHandle);

    }

    private static function expandItems(&$expandState, $archiveHandle)
    {
        /* @var $expandState DupArchiveExpandState */

        $moreToRead = true;

        $workTimestamp = time();

        while ($moreToRead && (!$expandState->timedOut())) {

            if ($expandState->throttleDelayInUs !== 0) {
                usleep($expandState->throttleDelayInUs);
            }

            if ($expandState->currentFileHeader != null) {

                DupArchiveUtil::tlog("Writing file {$expandState->currentFileHeader->relativePath}");

                if (self::filePassesFilters($expandState->filteredDirectories, $expandState->filteredFiles, $expandState->includedFiles, $expandState->currentFileHeader->relativePath)) {
                    try {
                        $fileCompleted = DupArchiveFileProcessor::writeToFile($expandState, $archiveHandle);
                    } catch (Exception $ex) {
                        DupArchiveUtil::log("Failed to write to {$expandState->currentFileHeader->relativePath}. Error: " . $ex->getMessage(), true);

                        // Reset things - skip over this file within the archive.

                        DupLiteSnapLibIOU::fseek($archiveHandle, $expandState->lastHeaderOffset);

                        self::skipToNextHeader($archiveHandle, $expandState->currentFileHeader);

                        $expandState->archiveOffset = ftell($archiveHandle);
                        
                        $expandState->addFailure(DupArchiveFailureTypes::File, $expandState->currentFileHeader->relativePath, $ex->getMessage(), false);

                        $expandState->resetForFile();

                        $expandState->lastHeaderOffset = -1;

                        $expandState->save();
                    }
                } else {
                    DupArchiveUtil::log("skipping {$expandState->currentFileHeader->relativePath} because its part of the exclusion filter");
                    self::skipFileInArchive($archiveHandle, $expandState->currentFileHeader);

                    $expandState->resetForFile();
                }
            } else {
                // Header is null so read in the next one

                $expandState->lastHeaderOffset = @ftell($archiveHandle);

                // profile ok
                $headerType = self::getNextHeaderType($archiveHandle);
                // end profile ok

                DupArchiveUtil::tlog('header type ' . $headerType);
                switch ($headerType) {
                    case DupArchiveItemHeaderType::File:
                        DupArchiveUtil::tlog('File header');
                        $expandState->currentFileHeader = DupArchiveFileHeader::readFromArchive($archiveHandle, false, true);

                        $expandState->archiveOffset = @ftell($archiveHandle);

                        DupArchiveUtil::tlog('Just read file header from archive');

                        break;

                    case DupArchiveItemHeaderType::Directory:
                        DupArchiveUtil::tlog('Directory Header');

                        $directoryHeader = DupArchiveDirectoryHeader::readFromArchive($archiveHandle, true);

                        if (self::passesDirectoryExclusion($expandState->filteredDirectories, $directoryHeader->relativePath)) {

                            $createdDirectory = true;

                            if (!$expandState->validateOnly) {
                                $directory = $expandState->basePath . '/' . $directoryHeader->relativePath;
                                $mode = 'u+rwx';
                                if ($expandState->directoryModeOverride != -1) {
                                    $mode = $expandState->directoryModeOverride;
                                }
                                $createdDirectory = DupLiteSnapLibIOU::dirWriteCheckOrMkdir($directory, $mode, true);
                            }

                            if ($createdDirectory) {
                                $expandState->directoryWriteCount++;
                            } else {
                                $expandState->addFailure(DupArchiveFailureTypes::Directory, $directory, "Unable to create directory $directory", false);
                            }
                        }
                        $expandState->archiveOffset = ftell($archiveHandle);

                        DupArchiveUtil::tlog('Just read directory header ' . $directoryHeader->relativePath . ' from archive');
                        break;

                    case DupArchiveItemHeaderType::None:
                        $moreToRead = false;
                }
            }

            if(($expandState->isRobust) && (time() - $workTimestamp >= 1)){

                DupArchiveUtil::log("Robust mode extract state save for standard validate");

                // When in robustness mode save the state every second
                $workTimestamp = time();
                $expandState->save();
            }
        }

        $expandState->save();

        return $moreToRead;
    }

    private static function passesDirectoryExclusion($directoryFilters, $candidate)
    {
        foreach ($directoryFilters as $directoryFilter) {

            if($directoryFilter === '*') {
                return false;
            }

            if (substr($candidate, 0, strlen($directoryFilter)) == $directoryFilter) {

                return false;
            }
        }

        return true;
    }

    private static function filePassesFilters($excludedDirectories, $excludedFiles, $includedFiles, $candidate)
    {
        $retVal = true;
        
        // Included files trumps all exclusion filters
        foreach($includedFiles as $includedFile) {
            if($includedFile === $candidate) {
                return true;
            }
        }

        if (self::passesDirectoryExclusion($excludedDirectories, $candidate)) {

            foreach ($excludedFiles as $fileFilter) {

                if($fileFilter === '*') {
                    return false;
                }

                if ($fileFilter === $candidate) {

                    $retVal = false;
                    break;
                }
            }
        } else {
            
            $retVal = false;;
        }

        return $retVal;
    }

    private static function standardValidateItems(&$expandState, $archiveHandle)
    {
        $moreToRead = true;

        // profile ok
        $to = $expandState->timedOut();
        // end profile ok

        $workTimestamp = time();
        
        while ($moreToRead && (!$to)) {

            if ($expandState->throttleDelayInUs !== 0) {
                usleep($expandState->throttleDelayInUs);
            }

            if ($expandState->currentFileHeader != null) {

                try {

                    $fileCompleted = DupArchiveFileProcessor::standardValidateFileEntry($expandState, $archiveHandle);

                    if ($fileCompleted) {
                        $expandState->resetForFile();
                    }

                    // Expand state taken care of within the write to file to ensure consistency
                } catch (Exception $ex) {

                    DupArchiveUtil::log("Failed validate file in archive. Error: " . $ex->getMessage(), true);
                    DupArchiveUtil::logObject("expand state", $expandState, true);
                    //   $expandState->currentFileIndex++;
                    // RSR TODO: Need way to skip past that file

                    $expandState->addFailure(DupArchiveFailureTypes::File, $expandState->currentFileHeader->relativePath, $ex->getMessage());
                    $expandState->save();

                    $moreToRead = false;
                }
            } else {

                // profile ok
                $headerType = self::getNextHeaderType($archiveHandle);

                switch ($headerType) {
                    case DupArchiveItemHeaderType::File:

                        // profile ok
                        $expandState->currentFileHeader = DupArchiveFileHeader::readFromArchive($archiveHandle, false, true);

                        $expandState->archiveOffset = ftell($archiveHandle);

                        // end profile ok

                        break;

                    case DupArchiveItemHeaderType::Directory:

                        // profile ok
                        $directoryHeader = DupArchiveDirectoryHeader::readFromArchive($archiveHandle, true);

                        $expandState->directoryWriteCount++;
                        $expandState->archiveOffset = ftell($archiveHandle);

                        break;

                    case DupArchiveItemHeaderType::None:
                        $moreToRead = false;
                }
            }

            if(($expandState->isRobust) && (time() - $workTimestamp >= 1)){

                DupArchiveUtil::log("Robust mdoe extract state save for standard validate");

                // When in robustness mode save the state every second
                $workTimestamp = time();
                $expandState->save();
            }

            // profile ok
            $to = $expandState->timedOut();
        }

        // profile ok
        $expandState->save();

        return $moreToRead;
    }
}
}
lib/dup_archive/classes/headers/index.php000064400000000017151336065400014474 0ustar00<?php
//silentlib/dup_archive/classes/headers/class.duparchive.header.file.php000064400000011643151336065400020777 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
require_once(dirname(__FILE__).'/../util/class.duparchive.util.php');
require_once(dirname(__FILE__).'/class.duparchive.header.u.php');

if(!class_exists('DupArchiveFileHeader')) {
// Format
class DupArchiveFileHeader// extends HeaderBase
{
    public $fileSize;
    public $mtime;
    public $permissions;
    public $hash;
    public $relativePathLength;
    public $relativePath;

    const MaxHeaderSize                = 8192;
    const MaxPathLength                = 4100;
//    const MaxStandardHeaderFieldLength = 128;

    private function __construct()
    {
        // Prevent direct instantiation
    }

    static function createFromFile($filepath, $relativeFilePath)
    {
        $instance = new DupArchiveFileHeader();

        // RSR TODO Populate fields based on file already on system
        // profile ok
        $instance->fileSize           = DupLiteSnapLibIOU::filesize($filepath);
        // end profile ok

        // profile ok
        $instance->permissions        = substr(sprintf('%o', fileperms($filepath)), -4);
        // end profile ok

        // profile ok
        $instance->mtime              = DupLiteSnapLibIOU::filemtime($filepath);
        // end profile ok

		if($instance->fileSize > DupArchiveConstants::$MaxFilesizeForHashing) {
			$instance->hash = false;
		}
		else {
			$instance->hash = hash_file('crc32b', $filepath);
		}
		
        $instance->relativePath       = $relativeFilePath;
        $instance->relativePathLength = strlen($instance->relativePath);

      //  DupArchiveUtil::tlog("paths=$filepath, {$instance->relativePath}");
        if ($instance->hash === false) {
            // RSR TODO: Best thing to do here?
            $instance->hash = "00000000000000000000000000000000";
        }
        
        return $instance;
        
    }

    /*
     * delta = 84-22 = 62 bytes per file -> 20000 files -> 1.2MB larger
     * <F><FS>x</FS><MT>x</<MT><FP>x</FP><HA>x</HA><RFPL>x</RFPL><RFP>x</RFP></F>
     # F#x#x#x#x#x#x!
     *
     */
    static function readFromArchive($archiveHandle, $skipContents, $skipMarker = false)
    {
        // RSR TODO Read header from archive handle and populate members
        // TODO: return null if end of archive or throw exception if can read something but its not a file header

        $instance = new DupArchiveFileHeader();

        if (!$skipMarker) {
            $marker = @fread($archiveHandle, 3);

            if ($marker === false) {
                if (feof($archiveHandle)) {
                    return false;
                } else {
                    throw new Exception('Error reading file header');
                }
            }

            if ($marker != '<F>') {
                throw new Exception("Invalid file header marker found [{$marker}] : location ".ftell($archiveHandle));
            }
        }

        $instance->fileSize           = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'FS');
        $instance->mtime              = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'MT');
        $instance->permissions        = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'P');
        $instance->hash                = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'HA');
        $instance->relativePathLength = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'RPL');

        // Skip <RP>
        fread($archiveHandle, 4);

        $instance->relativePath       = fread($archiveHandle, $instance->relativePathLength);

        // Skip </RP>
      //  fread($archiveHandle, 5);
       
        // Skip the </F>
//        fread($archiveHandle, 4);

        // Skip the </RP> and the </F>
        fread($archiveHandle, 9);

        if ($skipContents && ($instance->fileSize > 0)) {

            $dataSize = 0;

            $moreGlobs = true;
            while ($moreGlobs) {
                //echo 'read glob<br/>';
                /* @var $globHeader DupArchiveGlobHeader */
                $globHeader = DupArchiveGlobHeader::readFromArchive($archiveHandle, true);

                $dataSize += $globHeader->originalSize;

                $moreGlobs = ($dataSize < $instance->fileSize);
            }
        }

        return $instance;
    }

    public function writeToArchive($archiveHandle)
    {
        $headerString = '<F><FS>'.$this->fileSize.'</FS><MT>'.$this->mtime.'</MT><P>'.$this->permissions.'</P><HA>'.$this->hash.'</HA><RPL>'.$this->relativePathLength.'</RPL><RP>'.$this->relativePath.'</RP></F>';
        
        //DupLiteSnapLibIOU::fwrite($archiveHandle, $headerString);
        $bytes_written = @fwrite($archiveHandle, $headerString);

        if ($bytes_written === false) {
            throw new Exception('Error writing to file.');
        } else {
            return $bytes_written;
        }
    }
}
}lib/dup_archive/classes/headers/class.duparchive.header.glob.php000064400000004117151336065400021001 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
require_once(dirname(__FILE__).'/../util/class.duparchive.util.php');
require_once(dirname(__FILE__).'/class.duparchive.header.u.php');

if(!class_exists('DupArchiveGlobHeader')) {
// Format
// #C#{$originalSize}#{$storedSize}!
class DupArchiveGlobHeader //extends HeaderBase
{
    //	public $marker;
    public $originalSize;
    public $storedSize;
    public $hash;

    const MaxHeaderSize = 255;

    public function __construct()
    {

    }

    public static function readFromArchive($archiveHandle, $skipGlob)
    {
        $instance = new DupArchiveGlobHeader();

        DupArchiveUtil::log('Reading glob starting at ' . ftell($archiveHandle));

        $startElement = fread($archiveHandle, 3);

        //if ($marker != '?G#') {
        if ($startElement !== '<G>') {
            throw new Exception("Invalid glob header marker found {$startElement}. location:" . ftell($archiveHandle));
        }

        $instance->originalSize           = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'OS');
        $instance->storedSize             = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'SS');
        $instance->hash                   = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'HA');

        // Skip the </G>
        fread($archiveHandle, 4);
        
        if ($skipGlob) {
            DupLiteSnapLibIOU::fseek($archiveHandle, $instance->storedSize, SEEK_CUR);
        }

        return $instance;
    }

    public function writeToArchive($archiveHandle)
    {
        // <G><OS>x</OS>x<SS>x</SS><HA>x</HA></G>

        $headerString = '<G><OS>'.$this->originalSize.'</OS><SS>'.$this->storedSize.'</SS><HA>'.$this->hash.'</HA></G>';

        //DupLiteSnapLibIOU::fwrite($archiveHandle, $headerString);
        $bytes_written = @fwrite($archiveHandle, $headerString);

        if ($bytes_written === false) {
            throw new Exception('Error writing to file.');
        } else {
            return $bytes_written;
        }
    }
}
}lib/dup_archive/classes/headers/class.duparchive.header.php000064400000004706151336065400020063 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
require_once(dirname(__FILE__).'/../util/class.duparchive.util.php');
require_once(dirname(__FILE__).'/class.duparchive.header.u.php');
require_once(dirname(__FILE__).'/../../define.php');

if(!class_exists('DupArchiveHeader')) {
//require_once(dirname(__FILE__).'/class.HeaderBase.php');
// Format: #A#{version:5}#{isCompressed}!
class DupArchiveHeader// extends HeaderBase
{
    public $version;
    public $isCompressed;

    //   public $directoryCount;
    // public $fileCount;

    // Format Version History
    // 1 = Initial alpha format
    // 2 = Pseudo xml based format
    //const LatestVersion = 2;
    const MaxHeaderSize = 60;

    private function __construct()
    {
        // Prevent instantiation
    }

  //  public static function create($isCompressed, $directoryCount, $fileCount, $version = self::LatestVersion)
    public static function create($isCompressed)
    {
        $instance = new DupArchiveHeader();

   //     $instance->directoryCount = $directoryCount;
        //  $instance->fileCount      = $fileCount;
        $instance->version        = DUPARCHIVE_VERSION;
        $instance->isCompressed   = $isCompressed;

        return $instance;
    }

    public static function readFromArchive($archiveHandle)
    {
        $instance = new DupArchiveHeader();

        $startElement = fgets($archiveHandle, 4);

        if ($startElement != '<A>') {
            throw new Exception("Invalid archive header marker found {$startElement}");
        }

        $instance->version           = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'V');
        $instance->isCompressed      = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'C') == 'true' ? true : false;

        // Skip the </A>
        fgets($archiveHandle, 5);

        return $instance;
    }

    public function writeToArchive($archiveHandle)
    {
        $isCompressedString = DupArchiveUtil::boolToString($this->isCompressed);

        //DupLiteSnapLibIOU::fwrite($archiveHandle, "<A><V>{$this->version}</V><C>{$isCompressedString}</C></A>");
		DupLiteSnapLibIOU::fwrite($archiveHandle, '<A><V>'.$this->version.'</V><C>'.$isCompressedString.'</C></A>');
    }
}
}lib/dup_archive/classes/headers/class.duparchive.header.directory.php000064400000006400151336065400022057 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
require_once(dirname(__FILE__).'/../util/class.duparchive.util.php');
require_once(dirname(__FILE__).'/class.duparchive.header.u.php');

if(!class_exists('DupArchiveDirectoryHeader')) {
// Format
class DupArchiveDirectoryHeader// extends HeaderBase
{
    public $mtime;
    public $permissions;
    public $relativePathLength;
    public $relativePath;

    const MaxHeaderSize                = 8192;
    const MaxPathLength                = 4100;
    //const MaxStandardHeaderFieldLength = 128;

    public function __construct()
    {
        // Prevent direct instantiation
    }

//    static function createFromDirectory($directoryPath, $relativePath)
//    {
//        $instance = new DupArchiveDirectoryHeader();
//
//        $instance->permissions        = substr(sprintf('%o', fileperms($directoryPath)), -4);
//        $instance->mtime              = DupLiteSnapLibIOU::filemtime($directoryPath);
//        $instance->relativePath       = $relativePath;
//        $instance->relativePathLength = strlen($instance->relativePath);
//
//        return $instance;
//    }

    static function readFromArchive($archiveHandle, $skipStartElement = false)
    {
        $instance = new DupArchiveDirectoryHeader();

        if(!$skipStartElement)
        {
            // <A>
           $startElement = fread($archiveHandle, 3);

            if ($startElement === false) {
                if (feof($archiveHandle)) {
                    return false;
                } else {
                    throw new Exception('Error reading directory header');
                }
            }

            if ($startElement != '<D>') {
                throw new Exception("Invalid directory header marker found [{$startElement}] : location ".ftell($archiveHandle));
            }
        }

        $instance->mtime              = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'MT');
        $instance->permissions        = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'P');
        $instance->relativePathLength = DupArchiveHeaderU::readStandardHeaderField($archiveHandle, 'RPL');

        // Skip the <RP>
        fread($archiveHandle, 4);

        $instance->relativePath       = fread($archiveHandle, $instance->relativePathLength);

        // Skip the </RP>
//        fread($archiveHandle, 5);
//
//        // Skip the </D>
//        fread($archiveHandle, 4);

        // Skip the </RP> and the </D>
        fread($archiveHandle, 9);

        return $instance;
    }

    public function writeToArchive($archiveHandle)
    {
        if($this->relativePathLength == 0)
        {
            // Don't allow a base path to be written to the archive
            return;
        }

        $headerString = '<D><MT>'.$this->mtime.'</MT><P>'.$this->permissions.'</P><RPL>'.$this->relativePathLength.'</RPL><RP>'.$this->relativePath.'</RP></D>';

        //DupLiteSnapLibIOU::fwrite($archiveHandle, $headerString);
        $bytes_written = @fwrite($archiveHandle, $headerString);

        if ($bytes_written === false) {
            throw new Exception('Error writing to file.');
        } else {
            return $bytes_written;
        }
    }

}
}lib/dup_archive/classes/headers/class.duparchive.header.u.php000064400000002252151336065400020320 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

if(!class_exists('DupArchiveHeaderU')) {
class DupArchiveHeaderU
{
    const MaxStandardHeaderFieldLength = 128;
    
    public static function readStandardHeaderField($archiveHandle, $ename)
    {
        $expectedStart = '<'.$ename.'>';
        $expectedEnd = '</'.$ename.'>';

        $startingElement = fread($archiveHandle, strlen($expectedStart));

        if($startingElement !== $expectedStart) {
            throw new Exception("Invalid starting element. Was expecting {$expectedStart} but got {$startingElement}");
        }

        //return DupLiteSnapLibStreamU::streamGetLine($archiveHandle, self::MaxStandardHeaderFieldLength, $expectedEnd);

        $headerString = stream_get_line($archiveHandle, self::MaxStandardHeaderFieldLength, $expectedEnd);

        if ($headerString === false) {
            throw new Exception('Error reading line.');
        }

        return $headerString;
    }
}
}lib/dup_archive/classes/class.duparchive.mini.expander.php000064400000033570151336065400017762 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
//---------- DUPARCHIVE MINI EXPANDER: The contents of this file will be injected into the installer bootlog at build time ------------------------

class DupArchiveHeaderMiniU
{
    const MaxStandardHeaderFieldLength = 128;

    public static function readStandardHeaderField($archiveHandle, $ename)
    {
        $expectedStart = "<{$ename}>";
        $expectedEnd = "</{$ename}>";

        $startingElement = fread($archiveHandle, strlen($expectedStart));

        if($startingElement !== $expectedStart) {
            throw new Exception("Invalid starting element. Was expecting {$expectedStart} but got {$startingElement}");
        }

        return stream_get_line($archiveHandle, self::MaxStandardHeaderFieldLength, $expectedEnd);
    }
}

class DupArchiveMiniItemHeaderType
{
    const None      = 0;
    const File      = 1;
    const Directory = 2;
    const Glob      = 3;
}

class DupArchiveMiniFileHeader
{
    public $fileSize;
    public $mtime;
    public $permissions;
    public $hash;
    public $relativePathLength;
    public $relativePath;

    static function readFromArchive($archiveHandle)
    {
        $instance = new DupArchiveMiniFileHeader();

        $instance->fileSize           = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'FS');
        $instance->mtime              = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'MT');
        $instance->permissions        = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'P');
        $instance->hash                = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'HA');
        $instance->relativePathLength = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'RPL');

        // Skip <RP>
        fread($archiveHandle, 4);

        $instance->relativePath       = fread($archiveHandle, $instance->relativePathLength);

        // Skip </RP>
        fread($archiveHandle, 5);

        // Skip the #F!
        //fread($archiveHandle, 3);
        // Skip the </F>
        fread($archiveHandle, 4);

        return $instance;
    }
}

class DupArchiveMiniDirectoryHeader
{
    public $mtime;
    public $permissions;
    public $relativePathLength;
    public $relativePath;

   // const MaxHeaderSize                = 8192;
   // const MaxStandardHeaderFieldLength = 128;

    static function readFromArchive($archiveHandle)
    {
        $instance = new DupArchiveMiniDirectoryHeader();

        $instance->mtime              = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'MT');
        $instance->permissions        = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'P');
        $instance->relativePathLength = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'RPL');

        // Skip the <RP>
        fread($archiveHandle, 4);

        $instance->relativePath       = fread($archiveHandle, $instance->relativePathLength);

        // Skip the </RP>
        fread($archiveHandle, 5);

        // Skip the </D>
        fread($archiveHandle, 4);

        return $instance;
    }
}

class DupArchiveMiniGlobHeader //extends HeaderBase
{
    public $originalSize;
    public $storedSize;
    public $hash;

 //   const MaxHeaderSize = 255;

   public static function readFromArchive($archiveHandle, $skipGlob)
    {
        $instance = new DupArchiveMiniGlobHeader();

      //  DupArchiveUtil::log('Reading glob starting at ' . ftell($archiveHandle));

        $startElement = fread($archiveHandle, 3);

        //if ($marker != '?G#') {
        if ($startElement != '<G>') {
            throw new Exception("Invalid glob header marker found {$startElement}. location:" . ftell($archiveHandle));
        }

        $instance->originalSize           = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'OS');
        $instance->storedSize             = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'SS');
        $instance->hash                    = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'HA');

        // Skip the </G>
        fread($archiveHandle, 4);

        if ($skipGlob) {
          //  DupLiteSnapLibIOU::fseek($archiveHandle, $instance->storedSize, SEEK_CUR);
		    if(fseek($archiveHandle, $instance->storedSize, SEEK_CUR) === -1)
			{
                throw new Exception("Can't fseek when skipping glob at location:".ftell($archiveHandle));
            }
        }

        return $instance;
    }
}

class DupArchiveMiniHeader
{
    public $version;
    public $isCompressed;

//    const MaxHeaderSize = 50;

    private function __construct()
    {
        // Prevent instantiation
        if (!class_exists('DUPX_Bootstrap')) {
            throw new Exception('Class DUPX_Bootstrap not found');
        }
    }

    public static function readFromArchive($archiveHandle)
    {
        $instance = new DupArchiveMiniHeader();

        $startElement = fgets($archiveHandle, 4);

        if ($startElement != '<A>') {
            throw new Exception("Invalid archive header marker found {$startElement}");
        }

        $instance->version           = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'V');
        $instance->isCompressed      = DupArchiveHeaderMiniU::readStandardHeaderField($archiveHandle, 'C') == 'true' ? true : false;

        // Skip the </A>
        fgets($archiveHandle, 5);

        return $instance;
    }
}

class DupArchiveMiniWriteInfo
{
    public $archiveHandle       = null;
    public $currentFileHeader   = null;
    public $destDirectory       = null;
    public $directoryWriteCount = 0;
    public $fileWriteCount      = 0;
    public $isCompressed        = false;
    public $enableWrite         = false;

    public function getCurrentDestFilePath()
    {
        if($this->destDirectory != null)
        {
            return "{$this->destDirectory}/{$this->currentFileHeader->relativePath}";
        }
        else
        {
            return null;
        }
    }

}

class DupArchiveMiniExpander
{

    public static $loggingFunction     = null;

    public static function init($loggingFunction)
    {
        self::$loggingFunction = $loggingFunction;
    }

    public static function log($s, $flush=false)
    {
        if(self::$loggingFunction != null) {
            call_user_func(self::$loggingFunction, "MINI EXPAND:$s", $flush);
        }
    }

    public static function expandDirectory($archivePath, $relativePath, $destPath)
    {
        self::expandItems($archivePath, $relativePath, $destPath);
    }

    private static function expandItems($archivePath, $inclusionFilter, $destDirectory, $ignoreErrors = false)
    {
        $archiveHandle = fopen($archivePath, 'rb');

        if ($archiveHandle === false) {
            throw new Exception("Can’t open archive at $archivePath!");
        }

        $archiveHeader = DupArchiveMiniHeader::readFromArchive($archiveHandle);

        $writeInfo = new DupArchiveMiniWriteInfo();

        $writeInfo->destDirectory = $destDirectory;
        $writeInfo->isCompressed  = $archiveHeader->isCompressed;

        $moreToRead = true;

        while ($moreToRead) {

            if ($writeInfo->currentFileHeader != null) {

                try {
                    if (self::passesInclusionFilter($inclusionFilter, $writeInfo->currentFileHeader->relativePath)) {

                        self::writeToFile($archiveHandle, $writeInfo);

                        $writeInfo->fileWriteCount++;
                    }
                    else if($writeInfo->currentFileHeader->fileSize > 0) {
                      //  self::log("skipping {$writeInfo->currentFileHeader->relativePath} since it doesn’t match the filter");

                        // Skip the contents since the it isn't a match
                        $dataSize = 0;

                        do {
                            $globHeader = DupArchiveMiniGlobHeader::readFromArchive($archiveHandle, true);

                            $dataSize += $globHeader->originalSize;

                            $moreGlobs = ($dataSize < $writeInfo->currentFileHeader->fileSize);
                        } while ($moreGlobs);
                    }

                    $writeInfo->currentFileHeader = null;

                    // Expand state taken care of within the write to file to ensure consistency
                } catch (Exception $ex) {

                    if (!$ignoreErrors) {
                        throw $ex;
                    }
                }
            } else {

                $headerType = self::getNextHeaderType($archiveHandle);

                switch ($headerType) {
                    case DupArchiveMiniItemHeaderType::File:

                        //$writeInfo->currentFileHeader = DupArchiveMiniFileHeader::readFromArchive($archiveHandle, $inclusionFilter);
						$writeInfo->currentFileHeader = DupArchiveMiniFileHeader::readFromArchive($archiveHandle);

                        break;

                    case DupArchiveMiniItemHeaderType::Directory:

                        $directoryHeader = DupArchiveMiniDirectoryHeader::readFromArchive($archiveHandle);

                     //   self::log("considering $inclusionFilter and {$directoryHeader->relativePath}");
                        if (self::passesInclusionFilter($inclusionFilter, $directoryHeader->relativePath)) {

                        //    self::log("passed");
                            $directory = "{$writeInfo->destDirectory}/{$directoryHeader->relativePath}";

                          //  $mode = $directoryHeader->permissions;

                            // rodo handle this more elegantly @mkdir($directory, $directoryHeader->permissions, true);
                            DUPX_Bootstrap::mkdir($directory, 'u+rwx', true);


                            $writeInfo->directoryWriteCount++;
                        }
                        else {
                     //       self::log("didnt pass");
                        }


                        break;

                    case DupArchiveMiniItemHeaderType::None:
                        $moreToRead = false;
                }
            }
        }

        fclose($archiveHandle);
    }

    private static function getNextHeaderType($archiveHandle)
    {
        $retVal = DupArchiveMiniItemHeaderType::None;
        $marker = fgets($archiveHandle, 4);

        if (feof($archiveHandle) === false) {
            switch ($marker) {
                case '<D>':
                    $retVal = DupArchiveMiniItemHeaderType::Directory;
                    break;

                case '<F>':
                    $retVal = DupArchiveMiniItemHeaderType::File;
                    break;

                case '<G>':
                    $retVal = DupArchiveMiniItemHeaderType::Glob;
                    break;

                default:
                    throw new Exception("Invalid header marker {$marker}. Location:".ftell($archiveHandle));
            }
        }

        return $retVal;
    }

    private static function writeToFile($archiveHandle, $writeInfo)
    {
		$destFilePath = $writeInfo->getCurrentDestFilePath();

		if($writeInfo->currentFileHeader->fileSize > 0)
		{
			/* @var $writeInfo DupArchiveMiniWriteInfo */
			$parentDir = dirname($destFilePath);
			if (!file_exists($parentDir)) {
                if (!DUPX_Bootstrap::mkdir($parentDir, 'u+rwx', true)) {
                    throw new Exception("Couldn't create {$parentDir}");
                }
            }

            $destFileHandle = fopen($destFilePath, 'wb+');
			if ($destFileHandle === false) {
				throw new Exception("Couldn't open {$destFilePath} for writing.");
			}

			do {

				self::appendGlobToFile($archiveHandle, $destFileHandle, $writeInfo);

				$currentFileOffset = ftell($destFileHandle);

				$moreGlobstoProcess = $currentFileOffset < $writeInfo->currentFileHeader->fileSize;
			} while ($moreGlobstoProcess);

			fclose($destFileHandle);

            DUPX_Bootstrap::chmod($destFilePath, 'u+rw');

			self::validateExpandedFile($writeInfo);
		} else {
			if(touch($destFilePath) === false) {
				throw new Exception("Couldn't create $destFilePath");
			}
            DUPX_Bootstrap::chmod($destFilePath, 'u+rw');
		}
    }

    private static function validateExpandedFile($writeInfo)
    {
        /* @var $writeInfo DupArchiveMiniWriteInfo */

        if ($writeInfo->currentFileHeader->hash !== '00000000000000000000000000000000') {
            
            $hash = hash_file('crc32b', $writeInfo->getCurrentDestFilePath());

            if ($hash !== $writeInfo->currentFileHeader->hash) {

                throw new Exception("MD5 validation fails for {$writeInfo->getCurrentDestFilePath()}");
            }
        }
    }

    // Assumption is that archive handle points to a glob header on this call
    private static function appendGlobToFile($archiveHandle, $destFileHandle, $writeInfo)
    {
        /* @var $writeInfo DupArchiveMiniWriteInfo */
        $globHeader = DupArchiveMiniGlobHeader::readFromArchive($archiveHandle, false);

        $globContents = fread($archiveHandle, $globHeader->storedSize);

        if ($globContents === false) {

            throw new Exception("Error reading glob from {$writeInfo->getDestFilePath()}");
        }

        if ($writeInfo->isCompressed) {
            $globContents = gzinflate($globContents);
        }

        if (fwrite($destFileHandle, $globContents) === false) {
            throw new Exception("Error writing data glob to {$destFileHandle}");
        }
    }

    private static function passesInclusionFilter($filter, $candidate)
    {
        return (substr($candidate, 0, strlen($filter)) == $filter);
    }
}
?>lib/dup_archive/classes/processors/index.php000064400000000017151336065400015263 0ustar00<?php
//silentlib/dup_archive/classes/processors/class.duparchive.processor.file.php000064400000041577151336065400022366 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */


require_once(dirname(__FILE__).'/../headers/class.duparchive.header.file.php');
require_once(dirname(__FILE__).'/../headers/class.duparchive.header.glob.php');

if(!class_exists('DupArchiveFileProcessor')) {
class DupArchiveFileProcessor
{

    public static function writeFilePortionToArchive($createState, $archiveHandle, $sourceFilepath, $relativeFilePath)
    {
        /* @var $createState DupArchiveCreateState */

        DupArchiveUtil::tlog("writeFileToArchive for {$sourceFilepath}");

        // profile ok

        // switching to straight call for speed
        $sourceHandle = @fopen($sourceFilepath, 'rb');

        // end profile ok

        if(!is_resource($sourceHandle)) {
            $createState->archiveOffset     = DupLiteSnapLibIOU::ftell($archiveHandle);
            $createState->currentFileIndex++;
            $createState->currentFileOffset = 0;
            $createState->skippedFileCount++;
            $createState->addFailure(DupArchiveFailureTypes::File, $sourceFilepath, "Couldn't open $sourceFilepath", false);

            return;
        }

        if ($createState->currentFileOffset > 0) {
            DupArchiveUtil::tlog("Continuing {$sourceFilepath} so seeking to {$createState->currentFileOffset}");

            DupLiteSnapLibIOU::fseek($sourceHandle, $createState->currentFileOffset);
        } else {
            DupArchiveUtil::tlog("Starting new file entry for {$sourceFilepath}");


            // profile ok
            $fileHeader = DupArchiveFileHeader::createFromFile($sourceFilepath, $relativeFilePath);
            // end profile ok

            // profile ok
            $fileHeader->writeToArchive($archiveHandle);
            // end profile ok
        }

        // profile ok
        $sourceFileSize = filesize($sourceFilepath);

        DupArchiveUtil::tlog("writeFileToArchive for {$sourceFilepath}, size {$sourceFileSize}");

        $moreFileDataToProcess = true;

        while ((!$createState->timedOut()) && $moreFileDataToProcess) {

            if($createState->throttleDelayInUs !== 0) {
                usleep($createState->throttleDelayInUs);
            }
            
            DupArchiveUtil::tlog("Writing offset={$createState->currentFileOffset}");

            // profile ok
            $moreFileDataToProcess = self::appendGlobToArchive($createState, $archiveHandle, $sourceHandle, $sourceFilepath, $sourceFileSize);
            // end profile ok

            // profile ok
            if ($moreFileDataToProcess) {

                DupArchiveUtil::tlog("Need to keep writing {$sourceFilepath} to archive");
                $createState->currentFileOffset += $createState->globSize;
                $createState->archiveOffset = DupLiteSnapLibIOU::ftell($archiveHandle); //??
            } else {

                DupArchiveUtil::tlog("Completed writing {$sourceFilepath} to archive");
                $createState->archiveOffset     = DupLiteSnapLibIOU::ftell($archiveHandle);
                $createState->currentFileIndex++;
                $createState->currentFileOffset = 0;
            }

            // end profile ok

            if ($createState->currentFileIndex % 100 == 0) {
                DupArchiveUtil::log("Archive Offset={$createState->archiveOffset}; Current File Index={$createState->currentFileIndex}; Current File Offset={$createState->currentFileOffset}");
            }

            // Only writing state after full group of files have been written - less reliable but more efficient
            // $createState->save();
        }

        // profile ok
        DupLiteSnapLibIOU::fclose($sourceHandle);
        // end profile ok
    }

    // Assumption is that this is called at the beginning of a glob header since file header already writtern
    public static function writeToFile($expandState, $archiveHandle)
    {
        /* @var $expandState DupArchiveExpandState */
        $destFilepath = $expandState->basePath.'/'.$expandState->currentFileHeader->relativePath;

        $parentDir = dirname($destFilepath);
 
        $moreGlobstoProcess = true;
        
        DupLiteSnapLibIOU::dirWriteCheckOrMkdir($parentDir, 'u+rwx');

        if ($expandState->currentFileHeader->fileSize > 0) {

            if ($expandState->currentFileOffset > 0) {
                $destFileHandle = DupLiteSnapLibIOU::fopen($destFilepath, 'r+b');

                DupArchiveUtil::tlog('Continuing '.$destFilepath.' so seeking to '.$expandState->currentFileOffset);

                DupLiteSnapLibIOU::fseek($destFileHandle, $expandState->currentFileOffset);
            } else {
                DupArchiveUtil::tlog('Starting to write new file '.$destFilepath);
                $destFileHandle = DupLiteSnapLibIOU::fopen($destFilepath, 'w+b');
            }

            DupArchiveUtil::tlog('writeToFile for '.$destFilepath.', size '.$expandState->currentFileHeader->fileSize);

            while (!$expandState->timedOut()) {
                   
                $moreGlobstoProcess = $expandState->currentFileOffset < $expandState->currentFileHeader->fileSize;
                    
                if ($moreGlobstoProcess) {
                    DupArchiveUtil::tlog('Need to keep writing to '.$destFilepath.' because current file offset='.$expandState->currentFileOffset.' and file size='.$expandState->currentFileHeader->fileSize);
                
                    if($expandState->throttleDelayInUs !== 0) {
                        usleep($expandState->throttleDelayInUs);
                    }

                    DupArchiveUtil::tlog('Writing offset='.$expandState->currentFileOffset);

                    self::appendGlobToFile($expandState, $archiveHandle, $destFileHandle, $destFilepath);

                    DupArchiveUtil::tlog('After glob write');

                    $expandState->currentFileOffset = ftell($destFileHandle);
                    $expandState->archiveOffset     = DupLiteSnapLibIOU::ftell($archiveHandle);

                    $moreGlobstoProcess = $expandState->currentFileOffset < $expandState->currentFileHeader->fileSize;

                    if(!$moreGlobstoProcess) {
                        
                        break;
                    }

                    if (rand(0, 1000) > 990) {
                        DupArchiveUtil::log("Archive Offset={$expandState->archiveOffset}; Current File={$destFilepath}; Current File Offset={$expandState->currentFileOffset}");
                    }   
                } else {
                    // No more globs to process
                    
                    // Reset the expand state here to ensure it stays consistent
                    DupArchiveUtil::tlog('Writing of '.$destFilepath.' to archive is done');

                    // rsr todo record fclose error
                    @fclose($destFileHandle);
                    $destFileHandle = null;

                    self::setFileMode($expandState, $destFilepath);

                    if ($expandState->validationType == DupArchiveValidationTypes::Full) {
                        self::validateExpandedFile($expandState);
                    }
                     
                    break;
                }                  
            }
            
            DupArchiveUtil::tlog('Out of glob loop');

            if ($destFileHandle != null) {
                // rsr todo record file close error
                @fclose($destFileHandle);
                $destFileHandle = null;
            }

            if (!$moreGlobstoProcess && $expandState->validateOnly && ($expandState->validationType == DupArchiveValidationTypes::Full)) {
                if (!is_writable($destFilepath)) {
                    DupLiteSnapLibIOU::chmod($destFilepath, 'u+rw');
                }
                if (@unlink($destFilepath) === false) {
              //      $expandState->addFailure(DupArchiveFailureTypes::File, $destFilepath, "Couldn't delete {$destFilepath} during validation", false);
                    // TODO: Have to know how to handle this - want to report it but don’t want to mess up validation - some non critical errors could be important to validation
                }
            }

        } else {
            // 0 length file so just touch it
            $moreGlobstoProcess = false;

            if(file_exists($destFilepath)) {
                @unlink($destFilepath);
            }
            
            if (touch($destFilepath) === false) {
                throw new Exception("Couldn't create {$destFilepath}");
            }

            self::setFileMode($expandState, $destFilepath);
        }

        if(!$moreGlobstoProcess) {

            DupArchiveUtil::tlog('No more globs to process');
            
            if((!$expandState->validateOnly) && (isset($expandState->fileRenames[$expandState->currentFileHeader->relativePath]))) {
                $newRelativePath = $expandState->fileRenames[$expandState->currentFileHeader->relativePath];
                $newFilepath = $expandState->basePath.'/'.$newRelativePath;

                $perform_rename = true;

                if(@file_exists($newFilepath)) {
                    if(@unlink($newFilepath) === false) {

                        $perform_rename = false;

                        $error_message = "Couldn't delete {$newFilepath} when trying to rename {$destFilepath}";

                        $expandState->addFailure(DupArchiveFailureTypes::File, $expandState->currentFileHeader->relativePath, $error_message, true);
                        DupArchiveUtil::tlog($error_message);
                    }
                }
                
                if($perform_rename && @rename($destFilepath, $newFilepath) === false) {

                    $error_message = "Couldn't rename {$destFilepath} to {$newFilepath}";

                    $expandState->addFailure(DupArchiveFailureTypes::File, $expandState->currentFileHeader->relativePath, $error_message, true);
                    DupArchiveUtil::tlog($error_message);
                }
            }
            
            $expandState->fileWriteCount++;
            $expandState->resetForFile();
        }

        return !$moreGlobstoProcess;
    }

    public static function setFileMode($expandState, $filePath)
    {
        $mode = 'u+rw';
        if($expandState->fileModeOverride !== -1) {
            $mode = $expandState->fileModeOverride;
        }
        DupLiteSnapLibIOU::chmod($filePath, $mode);
    }

    public static function standardValidateFileEntry(&$expandState, $archiveHandle)
    {       
        /* @var $expandState DupArchiveExpandState */

        $moreGlobstoProcess = $expandState->currentFileOffset < $expandState->currentFileHeader->fileSize;

        if (!$moreGlobstoProcess) {

            // Not a 'real' write but indicates that we actually did fully process a file in the archive
            $expandState->fileWriteCount++;
        } else {

            while ((!$expandState->timedOut()) && $moreGlobstoProcess) {

                // Read in the glob header but leave the pointer at the payload

                // profile ok
                $globHeader = DupArchiveGlobHeader::readFromArchive($archiveHandle, false);                

                // profile ok
                $globContents = fread($archiveHandle, $globHeader->storedSize);

                if ($globContents === false) {
                    throw new Exception("Error reading glob from $destFilePath");
                }

                $hash = hash('crc32b', $globContents);    

                if ($hash != $globHeader->hash) {
                    $expandState->addFailure(DupArchiveFailureTypes::File, $expandState->currentFileHeader->relativePath, 'Hash mismatch on DupArchive file entry', true);
                    DupArchiveUtil::tlog("Glob hash mismatch during standard check of {$expandState->currentFileHeader->relativePath}");
                } else {
                    //    DupArchiveUtil::tlog("Glob MD5 passes");
                }

                $expandState->currentFileOffset += $globHeader->originalSize;

                // profile ok
                $expandState->archiveOffset = DupLiteSnapLibIOU::ftell($archiveHandle);
                

                $moreGlobstoProcess = $expandState->currentFileOffset < $expandState->currentFileHeader->fileSize;

                if (!$moreGlobstoProcess) {


                    $expandState->fileWriteCount++;

                    // profile ok
                    $expandState->resetForFile();
                }
            }
        }

        return !$moreGlobstoProcess;
    }

    private static function validateExpandedFile(&$expandState)
    {
        /* @var $expandState DupArchiveExpandState */
        $destFilepath = $expandState->basePath.'/'.$expandState->currentFileHeader->relativePath;

        if ($expandState->currentFileHeader->hash !== '00000000000000000000000000000000') {
      
            $hash = hash_file('crc32b', $destFilepath);
            
            if ($hash !== $expandState->currentFileHeader->hash) {
                $expandState->addFailure(DupArchiveFailureTypes::File, $destFilepath, "MD5 mismatch for {$destFilepath}", false);
            } else {
                DupArchiveUtil::tlog('MD5 Match for '.$destFilepath);
            }
        } else {
            DupArchiveUtil::tlog('MD5 non match is 0\'s');
        }
    }

    private static function appendGlobToArchive($createState, $archiveHandle, $sourceFilehandle, $sourceFilepath, $fileSize)
    {
        DupArchiveUtil::tlog("Appending file glob to archive for file {$sourceFilepath} at file offset {$createState->currentFileOffset}");

        if ($fileSize > 0) {
            $fileSize -= $createState->currentFileOffset;

            // profile ok
            $globContents = @fread($sourceFilehandle, $createState->globSize);
            // end profile ok

            if ($globContents === false) {
                throw new Exception("Error reading $sourceFilepath");
            }

            // profile ok
            $originalSize = strlen($globContents);
            // end profile ok

            if ($createState->isCompressed) {
                // profile ok
                $globContents = gzdeflate($globContents, 2);    // 2 chosen as best compromise between speed and size
                $storeSize    = strlen($globContents);
                // end profile ok
            } else {
                $storeSize = $originalSize;
            }


            $globHeader = new DupArchiveGlobHeader();

            $globHeader->originalSize = $originalSize;
            $globHeader->storedSize   = $storeSize;
            $globHeader->hash = hash('crc32b',$globContents);
             
            // profile ok
            $globHeader->writeToArchive($archiveHandle);
            // end profile ok
                
            // profile ok
            if (@fwrite($archiveHandle, $globContents) === false) {
                // Considered fatal since we should always be able to write to the archive - plus the header has already been written (could back this out later though)
                throw new Exception("Error writing $sourceFilepath to archive. Ensure site still hasn't run out of space.", DupArchiveExceptionCodes::Fatal);
            }
            // end profile ok

            $fileSizeRemaining = $fileSize - $createState->globSize;

            $moreFileRemaining = $fileSizeRemaining > 0;

            return $moreFileRemaining;
        } else {
            // 0 Length file
            return false;
        }
    }

    // Assumption is that archive handle points to a glob header on this call
    private static function appendGlobToFile($expandState, $archiveHandle, $destFileHandle, $destFilePath)
    {
        /* @var $expandState DupArchiveExpandState */
        DupArchiveUtil::tlog('Appending file glob to file '.$destFilePath.' at file offset '.$expandState->currentFileOffset);

        // Read in the glob header but leave the pointer at the payload
        $globHeader = DupArchiveGlobHeader::readFromArchive($archiveHandle, false);

        $globContents = @fread($archiveHandle, $globHeader->storedSize);

        if ($globContents === false) {
            throw new Exception("Error reading glob from $destFilePath");
        }

        if ($expandState->isCompressed) {
            $globContents = gzinflate($globContents);
        }

        if (@fwrite($destFileHandle, $globContents) === false) {
            throw new Exception("Error writing glob to $destFilePath");
        } else {
            DupArchiveUtil::tlog('Successfully wrote glob');
        }
    }
}
}lib/dup_archive/classes/processors/class.duparchive.processor.directory.php000064400000002034151336065400023434 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
require_once(dirname(__FILE__).'/../headers/class.duparchive.header.directory.php');

if(!class_exists('DupArchiveDirectoryProcessor')) {
class DupArchiveDirectoryProcessor
{
	public static function writeDirectoryToArchive($createState, $archiveHandle, $sourceDirectoryPath, $relativeDirectoryPath)
	{
		/* @var $createState DupArchiveCreateState */

		$directoryHeader = new DupArchiveDirectoryHeader();

		$directoryHeader->permissions        = substr(sprintf('%o', fileperms($sourceDirectoryPath)), -4);
		$directoryHeader->mtime              = DupLiteSnapLibIOU::filemtime($sourceDirectoryPath);
		$directoryHeader->relativePath       = $relativeDirectoryPath;
		$directoryHeader->relativePathLength = strlen($directoryHeader->relativePath);

		$directoryHeader->writeToArchive($archiveHandle);

		// Just increment this here - the actual state save is on the outside after timeout or completion of all directories
		$createState->currentDirectoryIndex++;

	}
}
}lib/dup_archive/classes/states/class.duparchive.state.simplecreate.php000064400000001225151336065400022310 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(dirname(__FILE__).'/class.duparchive.state.create.php');

if (!class_exists('DupArchiveSimpleCreateState')) {
class DupArchiveSimpleCreateState extends DupArchiveCreateState
{
    function __construct()
    {
        $this->currentDirectoryIndex = 0;
        $this->currentFileIndex = 0;
        $this->currentFileOffset = 0;
    }

    public function save()
    {

    }
}
}lib/dup_archive/classes/states/class.duparchive.state.base.php000064400000006560151336065400020554 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(dirname(__FILE__).'/../class.duparchive.processing.failure.php');

if(!class_exists('DupArchiveStateBase')) {
abstract class DupArchiveStateBase
{
    public $basePath          = '';
    public $archivePath       = '';
    public $isCompressed      = false;
    public $currentFileOffset = -1;
    public $archiveOffset     = -1;
    public $timeSliceInSecs   = -1;
    public $working           = false;
    public $failures          = null;
    public $startTimestamp    = -1;
    public $throttleDelayInUs  = 0;
    public $timeoutTimestamp  = -1;
    public $timerEnabled      = true;
    public $isRobust          = false;

    public function __construct()
    {
        $this->failures = array();
    }

    public function isCriticalFailurePresent()
    {
        if(count($this->failures) > 0) {
            foreach($this->failures as $failure) {
                /* @var $failure DupArchiveProcessingFailure */
                if($failure->isCritical) {
                    return true;
                }
            }
        }

        return false;
    }

    public function getFailureSummary($includeCritical = true, $includeWarnings = false)
    {        
        if(count($this->failures) > 0)
        {
            $message = '';
            
            foreach($this->failures as $failure)
            {
                /* @var $failure DupArchiveProcessingFailure */
                if($includeCritical || !$failure->isCritical) {

                    $message .= "\n" . $this->getFailureString($failure);
                }
            }

            return $message;
        }
        else
        {
            if($includeCritical)
            {
                if($includeWarnings) {
                    return 'No errors or warnings.';
                } else {
                    return 'No errors.';
                }
            } else {
                return 'No warnings.';
            }
        }
    }

    public function getFailureString($failure)
    {
        $s = '';

        if($failure->isCritical) {
            $s = 'CRITICAL: ';
        }

        return "{$s}{$failure->subject} : {$failure->description}";
    }

    public function addFailure($type, $subject, $description, $isCritical = true)
    {
        $failure = new DupArchiveProcessingFailure();

        $failure->type        = $type;
        $failure->subject     = $subject;
        $failure->description = $description;
        $failure->isCritical    = $isCritical;

        $this->failures[] = $failure;

        return $failure;
    }

    public function startTimer()
    {
        if ($this->timerEnabled) {
            $this->timeoutTimestamp = time() + $this->timeSliceInSecs;
        }
    }

    public function timedOut()
    {
        if ($this->timerEnabled) {
            if ($this->timeoutTimestamp != -1) {
                return time() >= $this->timeoutTimestamp;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    //   abstract public function save();
}
}lib/dup_archive/classes/states/class.duparchive.state.simpleexpand.php000064400000001045151336065400022324 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(dirname(__FILE__).'/class.duparchive.state.expand.php');

if (!class_exists('DupArchiveSimpleExpandState')) {
class DupArchiveSimpleExpandState extends DupArchiveExpandState
{
    function __construct()
    {        
    }

    public function save()
    {

    }
}
}lib/dup_archive/classes/states/class.duparchive.state.create.php000064400000001406151336065400021077 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(dirname(__FILE__).'/class.duparchive.state.base.php');

if (!class_exists('DupArchiveCreateState')) {
abstract class DupArchiveCreateState extends DupArchiveStateBase
{
    //const DEFAULT_GLOB_SIZE = 4180000; //512000;
    const DEFAULT_GLOB_SIZE = 1048576;

    public $currentDirectoryIndex = -1;
    public $currentFileIndex = -1;
    public $globSize = self::DEFAULT_GLOB_SIZE;
    public $newBasePath = null;
    public $skippedFileCount = 0;
    public $skippedDirectoryCount = 0;
}
}lib/dup_archive/classes/states/class.duparchive.state.expand.php000064400000002455151336065400021120 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(dirname(__FILE__).'/class.duparchive.state.base.php');

if (!class_exists('DupArchiveValidationTypes')) {

class DupArchiveValidationTypes
{
	const None	 = 0;
	const Standard = 1;
	const Full	 = 2;

}
}

if (!class_exists('DupArchiveExpandState')) {
	abstract class DupArchiveExpandState extends DupArchiveStateBase
	{
		public $archiveHeader			 = null;
		public $currentFileHeader		 = null;
		public $validateOnly			 = false;
		public $validationType			 = DupArchiveValidationTypes::Standard;
		public $fileWriteCount			 = 0;
		public $directoryWriteCount		 = 0;
		public $expectedFileCount		 = -1;
		public $expectedDirectoryCount	 = -1;
		public $filteredDirectories		 = array();
		public $filteredFiles			 = array();
		public $includedFiles			 = array();
		public $fileRenames				 = array();
		public $directoryModeOverride	 = -1;
		public $fileModeOverride		 = -1;
		public $lastHeaderOffset		 = -1;

		public function resetForFile()
		{
			$this->currentFileHeader = null;
			$this->currentFileOffset = 0;
		}
	}
}lib/dup_archive/classes/states/index.php000064400000000017151336065400014364 0ustar00<?php
//silentlib/dup_archive/classes/index.php000064400000000017151336065400013061 0ustar00<?php
//silentlib/dup_archive/classes/class.duparchive.processing.failure.php000064400000001147151336065400021016 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

if(!class_exists('DupArchiveProcessingFailure')) {
abstract class DupArchiveFailureTypes
{
    const Unknown = 0;
    const File = 1;
    const Directory = 2;
}

class DupArchiveProcessingFailure
{
    public $type = DupArchiveFailureTypes::Unknown;
    public $description = '';
    public $subject = '';
    public $isCritical = false;  
}

}lib/dup_archive/classes/class.duparchive.loggerbase.php000064400000000361151336065400017323 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
if(!class_exists('DupArchiveLoggerBase')) {
abstract class DupArchiveLoggerBase
{
    abstract public function log($s, $flush = false, $callingFunctionOverride = null);
}
}
lib/dup_archive/classes/class.duparchive.constants.php000064400000001444151336065400017230 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

if(!class_exists('DupArchiveConstants')) {
class DupArchiveConstants
{
    public static $DARoot;
    public static $LibRoot;
	public static $MaxFilesizeForHashing;

    public static function init() {

        self::$LibRoot = dirname(__FILE__).'/../../';
        self::$DARoot = dirname(__FILE__).'/../';
		self::$MaxFilesizeForHashing = 1000000000;
    }
}

DupArchiveConstants::init();
}

if(!class_exists('DupArchiveExceptionCodes')) {
class DupArchiveExceptionCodes
{
    const NonFatal = 0;
    const Fatal = 1;
}
}

lib/dup_archive/index.php000064400000000017151336065400011424 0ustar00<?php
//silentlib/dup_archive/daws/class.daws.constants.php000064400000002534151336065400015336 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

class DAWSConstants
{
    public static $DAWS_ROOT;

    public static $DUPARCHIVE_DIR;
    public static $DUPARCHIVE_CLASSES_DIR;
    public static $DUPARCHIVE_STATES_DIR;
    public static $DUPARCHIVE_UTIL_DIR;
    public static $DEFAULT_WORKER_TIME = 18;

    public static $LIB_DIR;

    public static $PROCESS_LOCK_FILEPATH;
    public static $PROCESS_CANCEL_FILEPATH;
    public static $LOG_FILEPATH;
          
    public static function init() {

        self::$DAWS_ROOT = dirname(__FILE__);

        self::$DUPARCHIVE_DIR = self::$DAWS_ROOT.'/..';
        self::$DUPARCHIVE_CLASSES_DIR = self::$DUPARCHIVE_DIR.'/classes';
        self::$DUPARCHIVE_STATES_DIR = self::$DUPARCHIVE_CLASSES_DIR.'/states';
        self::$DUPARCHIVE_UTIL_DIR = self::$DUPARCHIVE_CLASSES_DIR.'/util';

        self::$LIB_DIR = self::$DAWS_ROOT.'/../..';

        self::$PROCESS_LOCK_FILEPATH = self::$DAWS_ROOT.'/dawslock.bin';
        self::$PROCESS_CANCEL_FILEPATH = self::$DAWS_ROOT.'/dawscancel.bin';
        self::$LOG_FILEPATH = dirname(__FILE__).'/daws.log';
    }
}

DAWSConstants::init();lib/dup_archive/daws/index.php000064400000000017151336065400012362 0ustar00<?php
//silentlib/dup_archive/daws/dawslock.bin000064400000000000151336065400013033 0ustar00lib/dup_archive/daws/class.daws.state.expand.php000064400000012232151336065400015714 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(DAWSConstants::$DUPARCHIVE_STATES_DIR.'/class.duparchive.state.expand.php');

class DAWSExpandState extends DupArchiveExpandState
{
    public static $instance = null;

    const StateFilename = 'expandstate.json';

    public static function purgeStatefile()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        DupLiteSnapLibIOU::rm($stateFilepath, false);
    }

    public static function getInstance($reset = false)
    {
        if ((self::$instance == null) && (!$reset)) {
            $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

            self::$instance = new DAWSExpandState();

            if (file_exists($stateFilepath)) {
                $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'rb');

               // RSR we shouldn't need read locks and it seems to screw up on some boxes anyway.. DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

                $stateString = fread($stateHandle, filesize($stateFilepath));

                $data = json_decode($stateString);

                self::$instance->setFromData($data);

                self::$instance->fileRenames = (array)(self::$instance->fileRenames);

           //     DupLiteSnapLibIOU::flock($stateHandle, LOCK_UN);

                DupLiteSnapLibIOU::fclose($stateHandle);
            } else {
                $reset = true;
            }
        }

        if ($reset) {
            self::$instance = new DAWSExpandState();

            self::$instance->reset();
        }

        return self::$instance;
    }

    private function setFromData($data)
    {
        $this->currentFileHeader     = $data->currentFileHeader;
        $this->archiveHeader         = $data->archiveHeader;
        $this->archiveOffset         = $data->archiveOffset;
        $this->archivePath           = $data->archivePath;
        $this->basePath              = $data->basePath;
        $this->currentFileOffset     = $data->currentFileOffset;
        $this->failures              = $data->failures;
        $this->isCompressed          = $data->isCompressed;
        $this->startTimestamp        = $data->startTimestamp;
        $this->timeSliceInSecs       = $data->timeSliceInSecs;
        $this->validateOnly          = $data->validateOnly;
        $this->fileWriteCount        = $data->fileWriteCount;
        $this->directoryWriteCount   = $data->directoryWriteCount;
        $this->working               = $data->working;
        $this->filteredDirectories   = $data->filteredDirectories;
        $this->filteredFiles         = $data->filteredFiles;
        $this->fileRenames           = $data->fileRenames;
        $this->directoryModeOverride = $data->directoryModeOverride;
        $this->fileModeOverride      = $data->fileModeOverride;
        $this->lastHeaderOffset      = $data->lastHeaderOffset;
        $this->throttleDelayInUs     = $data->throttleDelayInUs;
        $this->timerEnabled          = $data->timerEnabled;
    }

    public function reset()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'w');

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

        $this->initMembers();

        DupLiteSnapLibIOU::fwrite($stateHandle, DupLiteSnapJsonU::wp_json_encode($this));

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_UN);
        
        DupLiteSnapLibIOU::fclose($stateHandle);
    }

    public function save()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'w');

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

        DupArchiveUtil::tlog("saving state");
        DupLiteSnapLibIOU::fwrite($stateHandle, DupLiteSnapJsonU::wp_json_encode($this));

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_UN);
        
        DupLiteSnapLibIOU::fclose($stateHandle);
    }

    private function initMembers()
    {
        $this->currentFileHeader = null;

        $this->archiveOffset         = 0;
        $this->archiveHeader         = 0;
        $this->archivePath           = null;
        $this->basePath              = null;
        $this->currentFileOffset     = 0;
        $this->failures              = array();
        $this->isCompressed          = false;
        $this->startTimestamp        = time();
        $this->timeSliceInSecs       = -1;
        $this->working               = false;
        $this->validateOnly          = false;
        $this->filteredDirectories   = array();
        $this->filteredFiles         = array();
        $this->fileRenames           = array();
        $this->directoryModeOverride = -1;
        $this->fileModeOverride      = -1;
        $this->lastHeaderOffset  = -1;
        $this->throttleDelayInUs     = 0;
        $this->timerEnabled          = true;
    }
}
lib/dup_archive/daws/daws.php000064400000025735151336065400012227 0ustar00<?php
/**
 *
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package daws
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('display_errors')) {
    @ini_set('display_errors', 1);
}
error_reporting(E_ALL);
set_error_handler("terminate_missing_variables");

require_once(dirname(__FILE__) . '/class.daws.constants.php');

require_once(DAWSConstants::$LIB_DIR . '/snaplib/snaplib.all.php');
require_once(DAWSConstants::$DUPARCHIVE_CLASSES_DIR . '/class.duparchive.loggerbase.php');
require_once(DAWSConstants::$DUPARCHIVE_CLASSES_DIR . '/class.duparchive.engine.php');
require_once(DAWSConstants::$DUPARCHIVE_CLASSES_DIR . '/class.duparchive.mini.expander.php');
require_once(DAWSConstants::$DUPARCHIVE_STATES_DIR . '/class.duparchive.state.simplecreate.php');
require_once(DAWSConstants::$DAWS_ROOT . '/class.daws.state.expand.php');

DupArchiveUtil::$TRACE_ON = false;

class DAWS_Logger extends DupArchiveLoggerBase
{
    public function log($s, $flush = false, $callingFunctionOverride = null)
    {
        DupLiteSnapLibLogger::log($s, $flush, $callingFunctionOverride);
    }
}

class DAWS
{

    private $lock_handle = null;

    function __construct()
    {
        date_default_timezone_set('UTC'); // Some machines don’t have this set so just do it here.

        DupLiteSnapLibLogger::init(DAWSConstants::$LOG_FILEPATH);

        DupArchiveEngine::init(new DAWS_Logger());
    }

    public function processRequest($params)
    {
        try {
			DupLiteSnapLibLogger::log('process request');
            $retVal = new StdClass();

            $retVal->pass = false;

            DupLiteSnapLibLogger::logObject('params', $params);
            DupLiteSnapLibLogger::logObject('keys', array_keys($params));

            $action = $params['action'];

            $initializeState = false;

            $isClientDriven = DupLiteSnapLibUtil::getArrayValue($params, 'client_driven', false);

            if ($action == 'start_expand') {

                $initializeState = true;

                DAWSExpandState::purgeStatefile();
                DupLiteSnapLibLogger::clearLog();

                DupLiteSnapLibIOU::rm(DAWSConstants::$PROCESS_CANCEL_FILEPATH);
                $archiveFilepath = DupLiteSnapLibUtil::getArrayValue($params, 'archive_filepath');
                $restoreDirectory = DupLiteSnapLibUtil::getArrayValue($params, 'restore_directory');
                $workerTime = DupLiteSnapLibUtil::getArrayValue($params, 'worker_time', false, DAWSConstants::$DEFAULT_WORKER_TIME);
                $filteredDirectories = DupLiteSnapLibUtil::getArrayValue($params, 'filtered_directories', false, array());
                $filteredFiles = DupLiteSnapLibUtil::getArrayValue($params, 'filtered_files', false, array()); 
                $fileRenames = DupLiteSnapLibUtil::getArrayValue($params, 'file_renames', false, array());

                $action = 'expand';

				DupLiteSnapLibLogger::log('startexpand->expand');
            } else if($action == 'start_create') {
             
                $archiveFilepath = DupLiteSnapLibUtil::getArrayValue($params, 'archive_filepath');
                $workerTime = DupLiteSnapLibUtil::getArrayValue($params, 'worker_time', false, DAWSConstants::$DEFAULT_WORKER_TIME);
                
                $createState->basePath        = $dataDirectory;
                $createState->isCompressed    = $isCompressed;
                
                $sourceDirectory = DupLiteSnapLibUtil::getArrayValue($params, 'source_directory');
                $isCompressed = DupLiteSnapLibUtil::getArrayValue($params, 'is_compressed') === 'true' ? true : false;
            }

			$throttleDelayInMs = DupLiteSnapLibUtil::getArrayValue($params, 'throttle_delay', false, 0);

            if ($action == 'expand') {

                DupLiteSnapLibLogger::log('expand action');

                /* @var $expandState DAWSExpandState */
                $expandState = DAWSExpandState::getInstance($initializeState);

				$this->lock_handle = DupLiteSnapLibIOU::fopen(DAWSConstants::$PROCESS_LOCK_FILEPATH, 'c+');
				DupLiteSnapLibIOU::flock($this->lock_handle, LOCK_EX);

				if($initializeState || $expandState->working) {

					if ($initializeState) {

                        DupLiteSnapLibLogger::logObject('file renames', $fileRenames);

						$expandState->archivePath = $archiveFilepath;
						$expandState->working = true;
						$expandState->timeSliceInSecs = $workerTime;
						$expandState->basePath = $restoreDirectory;
						$expandState->working = true;
						$expandState->filteredDirectories = $filteredDirectories;
                        $expandState->filteredFiles = $filteredFiles;
                        $expandState->fileRenames = $fileRenames;
                        $expandState->fileModeOverride = 0644;
                        $expandState->directoryModeOverride = 'u+rwx';

						$expandState->save();
					}

					$expandState->throttleDelayInUs = 1000 * $throttleDelayInMs;

                    DupLiteSnapLibLogger::logObject('Expand State In', $expandState);

					DupArchiveEngine::expandArchive($expandState);
				}

                if (!$expandState->working) {

                    $deltaTime = time() - $expandState->startTimestamp;
                    DupLiteSnapLibLogger::log("###### Processing ended.  Seconds taken:$deltaTime");

                    if (count($expandState->failures) > 0) {
                        DupLiteSnapLibLogger::log('Errors detected');

                        foreach ($expandState->failures as $failure) {
                            DupLiteSnapLibLogger::log("{$failure->subject}:{$failure->description}");
                        }
                    } else {
                        DupLiteSnapLibLogger::log('Expansion done, archive checks out!');
                    }
                }
				else {
					DupLiteSnapLibLogger::log("Processing will continue");
				}


                DupLiteSnapLibIOU::flock($this->lock_handle, LOCK_UN);

                $retVal->pass = true;
                $retVal->status = $this->getStatus($expandState);
            } else if ($action == 'create') {

                DupLiteSnapLibLogger::log('create action');

                /* @var $expandState DAWSExpandState */
                $createState = DAWSCreateState::getInstance($initializeState);

				$this->lock_handle = DupLiteSnapLibIOU::fopen(DAWSConstants::$PROCESS_LOCK_FILEPATH, 'c+');
				DupLiteSnapLibIOU::flock($this->lock_handle, LOCK_EX);

				if($initializeState || $createState->working) {

                    DupArchiveEngine::createArchive($archiveFilepath, $isCompressed);

                    $createState->archivePath     = $archiveFilepath;
                    $createState->archiveOffset   = DupLiteSnapLibIOU::filesize($archiveFilepath);
                    $createState->working         = true;
                    $createState->timeSliceInSecs = $workerTime;
                    $createState->basePath        = $dataDirectory;
                    $createState->isCompressed    = $isCompressed;
                    $createState->throttleDelayInUs = $throttleDelayInUs;

                    //   $daTesterCreateState->globSize        = self::GLOB_SIZE;

                    $createState->save();

                    $scan = DupArchiveScanUtil::createScan($this->paths->scanFilepath, $this->paths->dataDirectory);
				}
                
                $createState->throttleDelayInUs = 1000 * $throttleDelayInMs;

                if (!$createState->working) {

                    $deltaTime = time() - $createState->startTimestamp;
                    DupLiteSnapLibLogger::log("###### Processing ended.  Seconds taken:$deltaTime");

                    if (count($createState->failures) > 0) {
                        DupLiteSnapLibLogger::log('Errors detected');

                        foreach ($createState->failures as $failure) {
                            DupLiteSnapLibLogger::log("{$failure->subject}:{$failure->description}");
                        }
                    } else {
                        DupLiteSnapLibLogger::log('Creation done, archive checks out!');
                    }
                }
				else {
					DupLiteSnapLibLogger::log("Processing will continue");
				}

                DupLiteSnapLibIOU::flock($this->lock_handle, LOCK_UN);

                $retVal->pass = true;
                $retVal->status = $this->getStatus($createState);
            } else if ($action == 'get_status') {
                /* @var $expandState DAWSExpandState */
                $expandState = DAWSExpandState::getInstance($initializeState);

                $retVal->pass = true;
                $retVal->status = $this->getStatus($expandState);
            } else if ($action == 'cancel') {
                if (!DupLiteSnapLibIOU::touch(DAWSConstants::$PROCESS_CANCEL_FILEPATH)) {
                    throw new Exception("Couldn't update time on ".DAWSConstants::$PROCESS_CANCEL_FILEPATH);
                }
                $retVal->pass = true;
            } else {
                throw new Exception('Unknown command.');
            }

            session_write_close();
            
        } catch (Exception $ex) {
            $error_message = "Error Encountered:" . $ex->getMessage() . '<br/>' . $ex->getTraceAsString();

            DupLiteSnapLibLogger::log($error_message);

            $retVal->pass = false;
            $retVal->error = $error_message;
        }

		DupLiteSnapLibLogger::logObject("before json encode retval", $retVal);

		$jsonRetVal = DupLiteSnapJsonU::wp_json_encode($retVal);
		DupLiteSnapLibLogger::logObject("json encoded retval", $jsonRetVal);
        echo $jsonRetVal;
    }

    private function getStatus($state)
    {
        /* @var $state DupArchiveStateBase */

        $ret_val = new stdClass();

        $ret_val->archive_offset = $state->archiveOffset;
        $ret_val->archive_size = @filesize($state->archivePath);
        $ret_val->failures = $state->failures;
        $ret_val->file_index = $state->fileWriteCount;
        $ret_val->is_done = !$state->working;
        $ret_val->timestamp = time();

        return $ret_val;
    }
}

function generateCallTrace()
{
    $e = new Exception();
    $trace = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();

    for ($i = 0; $i < $length; $i++) {
        $result[] = ($i + 1) . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }

    return "\t" . implode("\n\t", $result);
}

function terminate_missing_variables($errno, $errstr, $errfile, $errline)
{
    DupLiteSnapLibLogger::log("ERROR $errno, $errstr, {$errfile}:{$errline}");
    DupLiteSnapLibLogger::log(generateCallTrace());
    //  DaTesterLogging::clearLog();

    /**
     * INTERCEPT ON processRequest AND RETURN JSON STATUS
     */
    throw new Exception("ERROR:{$errfile}:{$errline} | ".$errstr , $errno);
}
lib/dup_archive/tester/classes/class.datester.state.create.php000064400000007717151336065400020576 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(DUPARCHIVE_STATES_DIR.'/class.duparchive.state.create.php');

/**
 * Description of BuildState
 *
 * @author Bob
 */
// Note: All this stuff needs to be stored in the processstate of the package
class DaTesterCreateState extends DupArchiveCreateState
{
    public static $instance = null;

    const StateFilename = 'createstate.json';

    public static function getInstance($reset = false)
    {
        if ((self::$instance == null) && (!$reset)) {
            $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

            self::$instance = new DaTesterCreateState();

            if (file_exists($stateFilepath)) {
                $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'r');

                DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

                $stateString = fread($stateHandle, filesize($stateFilepath));

                $data = json_decode($stateString);

                self::$instance->setFromData($data);

                DupLiteSnapLibIOU::flock($stateHandle, LOCK_UN);

                DupLiteSnapLibIOU::fclose($stateHandle);
            } else {
                $reset = true;
            }
        }
        if ($reset) {
            self::$instance = new DaTesterCreateState();

            self::$instance->reset();
        }

        return self::$instance;
    }

    private function setFromData($data)
    {
        $this->archiveOffset         = $data->archiveOffset;
        $this->archivePath           = $data->archivePath;
        $this->basePath              = $data->basePath;
        $this->globSize              = $data->globSize;
        $this->currentFileIndex      = $data->currentFileIndex;
        $this->currentDirectoryIndex = $data->currentDirectoryIndex;
        $this->currentFileOffset     = $data->currentFileOffset;
        $this->failures              = $data->failures;
        $this->isCompressed          = $data->isCompressed;
        $this->startTimestamp        = $data->startTimestamp;
        $this->timeSliceInSecs       = $data->timeSliceInSecs;
        $this->working               = $data->working;
        $this->throttleDelayInUs     = $data->throttleDelayInUs;
    }

    public function reset()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'w');

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

        $this->initMembers();

        DupLiteSnapLibIOU::fwrite($stateHandle, json_encode($this));

        DupLiteSnapLibIOU::fclose($stateHandle);
    }

    public function save()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'w');

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

        DupArchiveUtil::tlog("saving state");
        DupLiteSnapLibIOU::fwrite($stateHandle, json_encode($this));

        DupLiteSnapLibIOU::fclose($stateHandle);
    }

    private function initMembers()
    {
        $this->archiveOffset         = 0;
        $this->archivePath           = null;
        $this->basePath              = null;
        $this->globSize              = -1;
        $this->currentFileIndex      = 0;
        $this->currentFileOffset     = 0;
        $this->currentDirectoryIndex = 0;
        $this->fileWriteCount        = 0;
        $this->directoryWriteCount   = 0;
        $this->failures              = array();
        $this->isCompressed          = false;
        $this->startTimestamp        = time();
        $this->timeSliceInSecs       = -1;
        $this->working               = false;
        $this->throttleDelayInUs     = 0;
    }
}lib/dup_archive/tester/classes/class.datester.logging.php000064400000004454151336065400017635 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of class
 *
 * @author Robert
 */
class DaTesterLogging extends DupArchiveLoggerBase
{
    private $logFilepath = null;
    private $logHandle          = null;

    public function __construct($logFilepath)
    {
        $this->logFilepath = $logFilepath;
    }

    public function clearLog()
    {
        if (file_exists($this->logFilepath)) {
            if ($this->logHandle !== null) {
                fflush($this->logHandle);
                fclose($this->logHandle);
                $this->logHandle = null;
            }
            @unlink($this->logFilepath);
        }
    }

    public function logObject($s, $o, $flush = false, $callingFunctionOverride = null)
    {
        $this->log($s, false, $callingFunctionOverride);
        $this->log(print_r($o, true), false, $callingFunctionOverride);

        if ($flush) {
            fflush($this->logHandle);
        }
    }

    public function log($s, $flush = false, $callingFunctionOverride = null)
    {
        $lfp = $this->logFilepath;

        if ($this->logFilepath === null) {
            error_log('logging not initialized');
            throw new Exception('Logging not initialized');
        }

        if(isset($_SERVER['REQUEST_TIME_FLOAT'])){
            $timepart = $_SERVER['REQUEST_TIME_FLOAT'];
        } else {
            $timepart = $_SERVER['REQUEST_TIME'];
        }

        $thread_id = sprintf("%08x", abs(crc32($_SERVER['REMOTE_ADDR'].$timepart.$_SERVER['REMOTE_PORT'])));

        $s = $thread_id.' '.date('h:i:s').":$s";

        if ($this->logHandle === null) {

            $this->logHandle = fopen($this->logFilepath, 'a');
        }

        fwrite($this->logHandle, "$s\n");

        if ($flush) {
            fflush($this->logHandle);
            fclose($this->logHandle);

            $this->logHandle = fopen($this->logFilepath, 'a');
        }
    }
    private static $profileLogArray = null;

    public static function initProfiling()
    {
        self::$profileLogArray = array();
    }  
}lib/dup_archive/tester/classes/state.json000064400000000433151336065400014564 0ustar00{"archiveHeader":0,"currentFileHeader":null,"validateOnly":false,"fileWriteCount":0,"directoryWriteCount":0,"basePath":null,"archivePath":null,"isCompressed":false,"currentFileOffset":0,"archiveOffset":0,"timeSliceInSecs":-1,"working":false,"failures":[],"startTimestamp":1491848703}lib/dup_archive/tester/classes/index.php000064400000000017151336065400014367 0ustar00<?php
//silentlib/dup_archive/tester/classes/class.datester.state.expand.php000064400000010123151336065400020573 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

require_once(DUPARCHIVE_STATES_DIR.'/class.duparchive.state.expand.php');

class DaTesterExpandState extends DupArchiveExpandState
{
    public static $instance = null;

    const StateFilename = 'expandstate.json';

    public static function getInstance($reset = false)
    {
        if ((self::$instance == null) && (!$reset)) {
            $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

            self::$instance = new DaTesterExpandState();

            if (file_exists($stateFilepath)) {
                $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'r');

                DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

                $stateString = fread($stateHandle, filesize($stateFilepath));

                $data = json_decode($stateString);

                self::$instance->setFromData($data);

                DupLiteSnapLibIOU::flock($stateHandle, LOCK_UN);

                DupLiteSnapLibIOU::fclose($stateHandle);
            } else {
                $reset = true;
            }
        }

        if ($reset) {
            self::$instance = new DaTesterExpandState();

            self::$instance->reset();
        }

        return self::$instance;
    }

    private function setFromData($data)
    {
        $this->currentFileHeader     = $data->currentFileHeader;
        $this->archiveHeader         = $data->archiveHeader;
        $this->archiveOffset         = $data->archiveOffset;
        $this->archivePath           = $data->archivePath;
        $this->basePath              = $data->basePath;
        $this->currentFileOffset     = $data->currentFileOffset;
        $this->failures              = $data->failures;
        $this->isCompressed          = $data->isCompressed;
        $this->startTimestamp        = $data->startTimestamp;
        $this->timeSliceInSecs       = $data->timeSliceInSecs;
        $this->validateOnly          = $data->validateOnly;
        $this->fileWriteCount        = $data->fileWriteCount;
        $this->directoryWriteCount   = $data->directoryWriteCount;
        $this->working               = $data->working;
        $this->directoryModeOverride = $data->directoryModeOverride;
        $this->fileModeOverride      = $data->fileModeOverride;
        $this->throttleDelayInUs     = $data->throttleDelayInUs;
    }

    public function reset()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'w');

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

        $this->initMembers();

        DupLiteSnapLibIOU::fwrite($stateHandle, json_encode($this));

        DupLiteSnapLibIOU::fclose($stateHandle);
    }

    public function save()
    {
        $stateFilepath = dirname(__FILE__).'/'.self::StateFilename;

        $stateHandle = DupLiteSnapLibIOU::fopen($stateFilepath, 'w');

        DupLiteSnapLibIOU::flock($stateHandle, LOCK_EX);

        DupArchiveUtil::tlog("saving state");
        DupLiteSnapLibIOU::fwrite($stateHandle, json_encode($this));

        DupLiteSnapLibIOU::fclose($stateHandle);
    }

    private function initMembers()
    {
        $this->currentFileHeader = null;

        $this->archiveOffset         = 0;
        $this->archiveHeader         = 0;
        $this->archivePath           = null;
        $this->basePath              = null;
        $this->currentFileOffset     = 0;
        $this->failures              = array();
        $this->isCompressed          = false;
        $this->startTimestamp        = time();
        $this->timeSliceInSecs       = -1;
        $this->working               = false;
        $this->validateOnly          = false;
        $this->directoryModeOverride = -1;
        $this->fileModeOverride      = -1;
        $this->throttleDelayInUs     = 0;
    }
}lib/dup_archive/tester/classes/expandstate.json000064400000001257151336065400015771 0ustar00{"archiveHeader":{"version":2,"isCompressed":true},"currentFileHeader":null,"validateOnly":true,"validationType":2,"fileWriteCount":6,"directoryWriteCount":0,"expectedFileCount":6,"expectedDirectoryCount":0,"filteredDirectories":[],"directoryModeOverride":-1,"fileModeOverride":-1,"lastHeaderOffset":196796990,"basePath":"C:\\Users\\Bob\\AppData\\Local\\Temp\/duparchivetester\/temp","archivePath":"C:\\Users\\Bob\\AppData\\Local\\Temp\/duparchivetester\/archive.daf","isCompressed":true,"currentFileOffset":0,"archiveOffset":196796990,"timeSliceInSecs":10,"working":false,"failures":[],"startTimestamp":1501534630,"throttleDelayInUs":0,"timeoutTimestamp":1501534640,"timerEnabled":true}lib/dup_archive/tester/datester.php000064400000051740151336065400013447 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('display_errors'))
    ini_set('display_errors', 1);
error_reporting(E_ALL);
error_reporting(E_ALL);
set_error_handler("terminate_missing_variables");


define('LIB_DIR', dirname(__FILE__).'/../..');
define('DUPARCHIVE_DIR', dirname(__FILE__).'/..');

define("ABSPATH", DUPARCHIVE_DIR);
    
define('DUPARCHIVE_CLASSES_DIR', DUPARCHIVE_DIR.'/classes');
define('DUPARCHIVE_STATES_DIR', DUPARCHIVE_CLASSES_DIR.'/states');
define('DUPARCHIVE_UTIL_DIR', DUPARCHIVE_CLASSES_DIR.'/util');

require_once(LIB_DIR.'/snaplib/snaplib.all.php');
require_once(DUPARCHIVE_UTIL_DIR.'/class.duparchive.util.php');
require_once(DUPARCHIVE_CLASSES_DIR.'/class.duparchive.loggerbase.php');
require_once(DUPARCHIVE_CLASSES_DIR.'/class.duparchive.engine.php');
require_once(DUPARCHIVE_CLASSES_DIR.'/class.duparchive.mini.expander.php');
require_once(DUPARCHIVE_UTIL_DIR.'/class.duparchive.util.scan.php');
require_once(DUPARCHIVE_STATES_DIR.'/class.duparchive.state.simplecreate.php');
require_once(dirname(__FILE__).'/classes/class.datester.state.create.php');
require_once(dirname(__FILE__).'/classes/class.datester.state.expand.php');
require_once(dirname(__FILE__).'/classes/class.datester.logging.php');

DupArchiveUtil::$TRACE_ON = true;

class DaTesterPaths
{
    public $dataRoot;
    public $scanFilepath;
    public $processLockFilepath;
    public $dataDirectory;
    public $restoreDirectory;
    public $tempDirectory;
    public $archiveFilepath;
    public $logFilepath;

    function __construct($isSmallArchive)
    {
        $this->dataRoot = getenv("TEMP").'/duparchivetester';

        $this->scanFilepath        = "{$this->dataRoot}/scan.json";
        $this->processLockFilepath = "{$this->dataRoot}/lock.bin";

        if ($isSmallArchive) {

            $this->dataDirectory   = "{$this->dataRoot}/smalldata";
            $this->archiveFilepath = "{$this->dataRoot}/archivesmall.daf";
        } else {
            $this->dataDirectory   = "{$this->dataRoot}/data";
            $this->archiveFilepath = "{$this->dataRoot}/archive.daf";
        }

        $this->restoreDirectory = "{$this->dataRoot}/restore";
        $this->tempDirectory    = "{$this->dataRoot}/temp";
        $this->logFilepath      = "{$this->dataRoot}/tester.log";

        if (!file_exists($this->dataRoot)) {
            @mkdir($this->dataRoot);
        }

        if (!file_exists($this->dataDirectory)) {
            @mkdir($this->dataDirectory);
        }

        if (!file_exists($this->restoreDirectory)) {
            @mkdir($this->restoreDirectory);
        }

        if (!file_exists($this->tempDirectory)) {
            @mkdir($this->tempDirectory);
        }
    }
}

class DaTesterParams
{
    public $compress       = true;
    public $isSmallArchive = true;
    public $action;
    public $p1             = null;
    public $workerTime     = 10;
    public $throttleDelayInUs = 100000;

    function __construct()
    {
        if (isset($_REQUEST['worker_time'])) {
            $this->workerTime = (int) $_REQUEST['worker_time'];
        }

        if (isset($_REQUEST['small_archive'])) {
            $this->isSmallArchive = ($_REQUEST['small_archive'] == 1);
        }

        if (isset($_REQUEST['compress'])) {
            $this->compress = ($_REQUEST['compress'] == 1);
        }

        if (isset($_REQUEST['action'])) {
            $this->action = $_REQUEST['action'];
        } else {
            $this->action = 'get_archive_info';
        }

        if (isset($_REQUEST['p1'])) {
            $this->p1 = $_REQUEST['p1'];
        }
    }

    public function getQueryStringData()
    {
        $qsa = array();

        $qsa['worker_time']   = $this->workerTime;
        $qsa['small_archive'] = ($this->isSmallArchive ? 1 : 0);
        $qsa['compress']      = ($this->compress ? 1 : 0);
        $qsa['action']        = $this->action;

        if ($this->p1 != null) {
            $qsa['p1'] = $this->p1;
        }

        return $qsa;
    }
}

class DaTester
{
    private $paths;
    private $params;
    private $lockHandle;
    private $logger;

    public function __construct()
    {
        $this->params = new DaTesterParams();
        $this->paths  = new DaTesterPaths($this->params->isSmallArchive);
        
    }

    public function processRequest()
    {
        try {
            $this->lockHandle = DupLiteSnapLibIOU::fopen($this->paths->processLockFilepath, 'c+');
            
            DupLiteSnapLibIOU::flock($this->lockHandle, LOCK_EX);

            $this->logger = new DaTesterLogging($this->paths->logFilepath);

            $this->logger->log("incoming request");

            DupArchiveEngine::init($this->logger);

            $this->logger->log("Got file lock");

            $this->logger->log("Action set to {$this->params->action}");
            $initializeState = false;

            if ($this->params->action == 'start_create_test') {

                $initializeState = true;

                $this->params->action = 'create_test';
            } else if ($this->params->action == 'start_expand_test') {

                $initializeState = true;

                $this->params->action = 'expand_test';
            } else if ($this->params->action == 'start_validate_test') {

                $initializeState = true;

                $this->params->action = 'validate_test';
            }

            $this->logger->log("incoming request after lock");

            $spawnAnotherThread = false;

            echo "action={$this->params->action}<br/>";

            if ($this->params->action == 'get_status') {

                $this->get_status();
            } else if ($this->params->action == 'create_test') {

                /* @var $daTesterCreateState DaTesterCreateState */
                $daTesterCreateState = DaTesterCreateState::getInstance($initializeState);

                $daTesterState = &$daTesterCreateState;
                if ($initializeState) {

                    $this->logger->log("Clearing files");

                    $this->clearCreateFiles();

                    DupArchiveEngine::createArchive($this->paths->archiveFilepath, $this->params->compress);

                    $daTesterCreateState->archivePath     = $this->paths->archiveFilepath;
                    $daTesterCreateState->archiveOffset   = DupLiteSnapLibIOU::filesize($this->paths->archiveFilepath);
                    $daTesterCreateState->working         = true;
                    $daTesterCreateState->timeSliceInSecs = $this->params->workerTime;
                    $daTesterCreateState->basePath        = $this->paths->dataDirectory;
                    $daTesterCreateState->isCompressed    = $this->params->compress;
                    $daTesterCreateState->throttleDelayInUs = $this->params->throttleDelayInUs;

                    //   $daTesterCreateState->globSize        = self::GLOB_SIZE;

                    $daTesterCreateState->save();
                    $this->logger->log("Cleared files");

                    $scan = DupArchiveScanUtil::createScan($this->paths->scanFilepath, $this->paths->dataDirectory);
                } else {

                    $scan = DupArchiveScanUtil::getScan($this->paths->scanFilepath);
                }

                $this->logger->logObject("createstate", $daTesterCreateState);
                DupArchiveEngine::addItemsToArchive($daTesterCreateState, $scan);

                $spawnAnotherThread = $daTesterCreateState->working;

                if (!$spawnAnotherThread) {
                    $this->logger->logObject("Done. Failures:", $daTesterCreateState->failures, true);
                }
            } else if ($this->params->action == 'start_add_file_test') {
                //DupArchiveUtil::writeToPLog("Start add file test");
                $this->logger->clearLog();

                $tmpname = tempnam($this->paths->dataDirectory, 'tmp');

                $this->logger->log("tempname $tmpname");
                file_put_contents($tmpname, 'test');

                DupArchiveEngine::addFileToArchiveUsingBaseDirST($this->paths->archiveFilepath, $this->paths->dataDirectory, $tmpname);

                echo "$tmpname added";

                unlink($tmpname);
                exit(1);
            } else if ($this->params->action == 'mini_expand_test') {

                $this->logger->log("Clearing files");
                $this->clearExpandFiles();
                $this->logger->log("Cleared files");

                try {
                    DupArchiveMiniExpander::init("$this->logger->log");
                    DupArchiveMiniExpander::expandDirectory($this->paths->archiveFilepath, 'dup-installer', $this->paths->restoreDirectory);
                } catch (Exception $ex) {
                    $message = $ex->getMessage();

                    echo "Exception: {$ex} ".$ex->getTraceAsString();
                }

                echo "Mini-extract done.<br/>";
                exit(1);
            } else if ($this->params->action == 'expand_test') {
                /* @var $daTesterExpandState DaTesterExpandState */
                $daTesterExpandState = DaTesterExpandState::getInstance($initializeState);

                $daTesterState = &$daTesterExpandState;

                if ($initializeState) {

                    $this->logger->log("Clearing files");

                    $this->clearExpandFiles();
                    $this->logger->log("Cleared files");

                    $daTesterExpandState->archivePath     = $this->paths->archiveFilepath;
                    $daTesterExpandState->working         = true;
                    $daTesterExpandState->timeSliceInSecs = $this->params->workerTime;
                    $daTesterExpandState->basePath        = $this->paths->restoreDirectory;
                    $daTesterExpandState->working         = true;
                    $daTesterExpandState->throttleDelayInUs = $this->params->throttleDelayInUs;;
                    $daTesterExpandState->save();
                }

                DupArchiveEngine::expandArchive($daTesterExpandState);

                $spawnAnotherThread = $daTesterExpandState->working;

                if (!$spawnAnotherThread) {

                    if (count($daTesterExpandState->failures) > 0) {
                        $this->logger->log('Errors detected');
                        echo 'Expanson done, but errors detected!';
                        echo '<br/><br/>';

                        foreach ($daTesterExpandState->failures as $failure) {
                            $this->logger->log($failure->description);
                            echo $failure->description;
                            echo '<br/><br/>';
                        }
                    } else {
                        echo 'Expansion done, archive checks out!';
                        $this->logger->log('Expansion done, archive checks out!');
                    }
                }
            } else if ($this->params->action == 'validate_test') {

                $validationType = DupArchiveValidationTypes::Full;

                if ($this->params->p1 != null) {
                    if ($this->params->p1 == 's') {
                        $validationType = DupArchiveValidationTypes::Standard;
                    }
                }

                /* @var $daTesterExpandState DaTesterExpandState */
                $daTesterExpandState = DaTesterExpandState::getInstance($initializeState);

                $daTesterState = &$daTesterExpandState;

                if ($initializeState) {

                    $this->logger->log("Clearing files");
                    $this->clearExpandFiles();
                    $this->logger->log("Cleared files");

                    $this->logger->log("Validation Type:" . (($validationType == DupArchiveValidationTypes::Full) ? 'Full' : 'Quick'));
                    
                    $scan = DupArchiveScanUtil::getScan($this->paths->scanFilepath);

                    $daTesterExpandState->archivePath            = $this->paths->archiveFilepath;
                    $daTesterExpandState->working                = true;
                    $daTesterExpandState->timeSliceInSecs        = $this->params->workerTime;
                    $daTesterExpandState->basePath               = $this->paths->tempDirectory;
                    $daTesterExpandState->validateOnly           = true;
                    $daTesterExpandState->validationType         = $validationType;
                    $daTesterExpandState->working                = true;
                    $daTesterExpandState->expectedDirectoryCount = count($scan->Dirs);
                    $daTesterExpandState->expectedFileCount      = count($scan->Files);
                    $daTesterExpandState->save();
                }

                DupArchiveEngine::expandArchive($daTesterExpandState);

                $spawnAnotherThread = $daTesterExpandState->working;

                if (!$spawnAnotherThread) {

                    if (count($daTesterExpandState->failures) > 0) {
                        echo 'Errors detected!';
                        echo '<br/><br/>';

                        foreach ($daTesterExpandState->failures as $failure) {
                            echo esc_html($failure->description);
                            echo '<br/><br/>';
                        }
                    } else {
                        echo 'Archive checks out!';
                    }
                }
            } else if ($this->params->action == 'get_archive_info') {
                $this->logger->log("get_archive_info()");

                $this->logger->clearLog();

                $archiveInfo = DupArchiveEngine::getArchiveInfo($this->paths->archiveFilepath);

                $sizeInArchive = 0;
                
                foreach($archiveInfo->fileHeaders as $fileHeader) {
                    $sizeInArchive += $fileHeader->fileSize;
                }
                
                $archiveSize = filesize($this->paths->archiveFilepath);
                
                echo "Version: {$archiveInfo->archiveHeader->version}";
                echo '<br/>';
                echo "IsCompressed: ".DupArchiveUtil::boolToString($archiveInfo->archiveHeader->isCompressed);
                echo '<br/>';
                //    echo "Expected Directory Count: {$archiveInfo->archiveHeader->directoryCount}";
                //    echo '<br/>';
                echo "Total file size: {$sizeInArchive} bytes";
                echo '<br/>';
                echo "Archive size: {$archiveSize} bytes";
                echo '<br/>';
                $directoryCount = count($archiveInfo->directoryHeaders);
                echo "Actual Directory Count: {$directoryCount}";
                echo '<br/>';
                //   echo "Expected File Count: {$archiveInfo->archiveHeader->fileCount}";
                //   echo '<br/>';
                $fileCount      = count($archiveInfo->fileHeaders);
                echo "Actual File Count: {$fileCount}";
                echo '<br/>';
                echo '<br/>';
                echo 'DIRECTORIES';
                echo '<br/>';
                $c              = 1;
                //print_r($archiveInfo);
                foreach ($archiveInfo->directoryHeaders as $directoryHeader) {
                    /* @var $directoryHeader DupArchiveDirectoryHeader */
                    echo "{$c}:{$directoryHeader->relativePath} P:{$directoryHeader->permissions} <br/>";
                    $c++;
                }
                echo '<br/>';
                echo 'FILES';
                echo '<br/>';
                $c = 1;
                //print_r($archiveInfo);
                foreach ($archiveInfo->fileHeaders as $fileHeader) {
                    /* @var $fileHeader DupArchiveFileHeader */
                    echo "{$c}:{$fileHeader->relativePath} ({$fileHeader->fileSize} bytes)<br/>";
                    $c++;
                }
                exit(1);
            } else {
                echo 'unknown command.';
                exit(1);
            }

            DupLiteSnapLibIOU::flock($this->lockHandle, LOCK_UN);

            $this->logger->log("Unlocked file");

            session_write_close();
            if ($spawnAnotherThread) {

                $url = "http://$_SERVER[HTTP_HOST]".strtok($_SERVER["REQUEST_URI"], '?');

                $data = $this->params->getQueryStringData();

                $this->logger->logObject("SPAWNING CUSTOM WORKER AT $url FOR ACTION {$this->params->action}", $data);

                DupLiteSnapLibNetU::postWithoutWait($url, $data);

                $this->logger->log('After post without wait');
            } else {
                $this->logger->log("start timestamp {$daTesterState->startTimestamp}");
                $deltaTime = time() - $daTesterState->startTimestamp;
                $this->logger->log("###### Processing ended.  Seconds taken:$deltaTime");
                $this->logger->logObject("##### FAILURES:", $daTesterState->failures);
            }
        } catch (Exception $ex) {
            $error_message = "Error Encountered:".$ex->getMessage().'<br/>'.$ex->getTraceAsString();

            $this->logger->log($error_message);
            echo $error_message;
        }
    }

    // Returns json
    // {
    //   status: 0|-1 (success, failure)
    //   data : true|false (for working) || {failure message}
    // }
    function get_status()
    {
        $error_message = null;
        $ret_val       = new stdClass();

        try {
            $build_state = CompressExtractState::getInstance();

            $ret_val->status = 0;
            $ret_val->data   = $build_state;
        } catch (Exception $ex) {
            $ret_val->status = -1;
            $ret_val->data   = $error_message;
        }

        echo json_encode($ret_val);
        //  JSON_U::customEncode($ret_val);
    }

    private function clearCreateFiles()
    {
        if (file_exists($this->paths->scanFilepath)) {
            @unlink($this->paths->scanFilepath);
        }

        $handle = DupLiteSnapLibIOU::fopen($this->paths->archiveFilepath, 'w');
        DupLiteSnapLibIOU::fclose($handle);

        //$this->logger->clearLog();
    }

    private function clearExpandFiles()
    {
        if (file_exists($this->paths->restoreDirectory)) {
            DupLiteSnapLibIOU::rrmdir($this->paths->restoreDirectory);
        }

        if (file_exists($this->paths->tempDirectory)) {
            DupLiteSnapLibIOU::rrmdir($this->paths->tempDirectory);
        }

        mkdir($this->paths->restoreDirectory);
    //    $this->logger->clearLog();
    }
//    private function fake_crash($worker_string, $next_scan_index, $next_file_offset)
//    {
//        $url  = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
//        $data = array('action' => $worker_string, 'next_scan_index' => $next_scan_index,
//            'next_file_offset' => $next_file_offset);
//
//        $this->logger->log("spawning new custom worker at $url");
//        $this->post_without_wait($url, $data);
//
//        exit();
//    }
//    private function try_crash($source_filepath, $next_file_offset)
//    {
//        $should_crash = (self::CRASH_PROBABILITY >= rand(1, 100));
//
//        $should_crash = false;
//
//        if ($should_crash) {
//            $this->logger->log("##### Crashing for $source_filepath at $next_file_offset");
//
//            $this->fake_crash('compress', $next_scan_index, $next_file_offset);
//        }
//    }
}

function generateCallTrace()
{
    $e      = new Exception();
    $trace  = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace  = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();

    for ($i = 0; $i < $length; $i++) {
        $result[] = ($i + 1).')'.substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }

    return "\t".implode("\n\t", $result);
}

function terminate_missing_variables($errno, $errstr, $errfile, $errline)
{
    echo "<br/>ERROR: $errstr $errfile $errline<br/>";
    //  if (($errno == E_NOTICE) and ( strstr($errstr, "Undefined variable"))) die("$errstr in $errfile line $errline");

    $logfilepath =  getenv("TEMP").'/duparchivetester';
    $logfilepath = "{$logfilepath}/tester2.log";

    $logger = new DaTesterLogging($this->paths->logFilepath);


    $logger->log("ERROR $errno, $errstr, {$errfile}:{$errline}");
    $logger->log(generateCallTrace());
    //  $this->logger->clearLog();

    exit(1);
    //return false; // Let the PHP error handler handle all the rest
}      

$daTester = new DaTester();
$daTester->processRequest();
lib/dup_archive/tester/index.php000064400000000017151336065400012732 0ustar00<?php
//silentlib/dup_archive/define.php000064400000000422151336065400011547 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
//Prevent directly browsing to the file
if(!defined('DUPARCHIVE_VERSION')) {
    // Should always match the version of Duplicator Pro that includes the library
    define('DUPARCHIVE_VERSION', '3.7.5.0');
}
duplicator-main.php000064400000064576151336065400010372 0ustar00<?php

/**
 *
 * @package Duplicator
 * @copyright (c) 2021, Snapcreek LLC
 *
 */
defined('ABSPATH') || exit;

use Duplicator\Lite as Duplicator;

/* @var $currentPluginBootFile string */

// CHECK IF PLUGIN CAN BE EXECTUED
require_once(__DIR__ . "/tools/Lite/Requirements.php");
if (Duplicator\Requirements::canRun($currentPluginBootFile) === false) {
    return;
} else {
    // NOTE: Plugin code must be inside a conditional block to prevent functions definition, simple return is not enough
    define('DUPLICATOR_LITE_PATH', dirname($currentPluginBootFile));
    define('DUPLICATOR_LITE_FILE', $currentPluginBootFile);
    define('DUPLICATOR_LITE_PLUGIN_URL', plugins_url('', $currentPluginBootFile));

    if (!defined('DUPXABSPATH')) {
        define('DUPXABSPATH', dirname(DUPLICATOR_LITE_FILE));
    }

    require_once("helper.php");
    require_once("define.php");
    if (is_admin() == true) {
        if (defined('DUPLICATOR_DEACTIVATION_FEEDBACK') && DUPLICATOR_DEACTIVATION_FEEDBACK) {
            require_once 'deactivation.php';
        }
        require_once 'lib/snaplib/snaplib.all.php';
        require_once 'classes/class.constants.php';
        require_once 'classes/host/class.custom.host.manager.php';
        require_once 'classes/class.settings.php';
        require_once 'classes/class.logging.php';
        require_once 'classes/class.plugin.upgrade.php';
        require_once 'classes/utilities/class.u.php';
        require_once 'classes/utilities/class.u.migration.php';
        require_once 'classes/utilities/class.u.string.php';
        require_once 'classes/utilities/class.u.validator.php';
        require_once 'classes/class.db.php';
        require_once 'classes/class.server.php';
        require_once 'classes/ui/class.ui.viewstate.php';
        require_once 'classes/ui/class.ui.notice.php';
        require_once 'classes/package/class.pack.php';
        require_once 'views/packages/screen.php';

        //Controllers
        require_once 'ctrls/ctrl.package.php';
        require_once 'ctrls/ctrl.tools.php';
        require_once 'ctrls/ctrl.ui.php';
        require_once 'ctrls/class.web.services.php';

        //Init Class
        DUP_Custom_Host_Manager::getInstance()->init();
        DUP_Settings::init();
        DUP_Log::Init();
        DUP_Util::init();
        DUP_DB::init();

        /** ========================================================
         * ACTIVATE/DEACTIVE/UPDATE HOOKS
         * =====================================================  */
        register_activation_hook(DUPLICATOR_LITE_FILE, array('DUP_LITE_Plugin_Upgrade', 'onActivationAction'));
        register_deactivation_hook(DUPLICATOR_LITE_FILE, 'duplicator_deactivate');

        /**
         * Hooked into `plugins_loaded`.  Routines used to update the plugin
         *
         * @access global
         * @return null
         */
        function duplicator_update()
        {
            if (DUPLICATOR_VERSION != get_option(DUP_LITE_Plugin_Upgrade::DUP_VERSION_OPT_KEY)) {
                DUP_LITE_Plugin_Upgrade::onActivationAction();
                // $snapShotDirPerm = substr(sprintf("%o", fileperms(DUP_Settings::getSsdirPath())),-4);
            }
            load_plugin_textdomain('duplicator');
        }

        /**
         * Hooked into `register_deactivation_hook`.  Routines used to deactivate the plugin
         * For uninstall see uninstall.php  WordPress by default will call the uninstall.php file
         *
         * @access global
         * @return null
         */
        function duplicator_deactivate()
        {
            //Logic has been added to uninstall.php
        }
        /** ========================================================
         * ACTION HOOKS
         * =====================================================  */
        add_action('plugins_loaded', 'duplicator_update');
        add_action('plugins_loaded', 'duplicator_wpfront_integrate');

        function duplicator_load_textdomain()
        {
            load_plugin_textdomain('duplicator', false, false);
        }
        add_action('plugins_loaded', 'duplicator_load_textdomain');

        add_action('admin_init', 'duplicator_admin_init');
        add_action('admin_menu', 'duplicator_menu');
        add_action('admin_enqueue_scripts', 'duplicator_admin_enqueue_scripts');
        DUP_UI_Notice::init();

        //CTRL ACTIONS
        DUP_Web_Services::init();
        add_action('wp_ajax_duplicator_active_package_info', 'duplicator_active_package_info');
        add_action('wp_ajax_duplicator_package_scan', 'duplicator_package_scan');
        add_action('wp_ajax_duplicator_package_build', 'duplicator_package_build');
        add_action('wp_ajax_duplicator_package_delete', 'duplicator_package_delete');
        add_action('wp_ajax_duplicator_duparchive_package_build', 'duplicator_duparchive_package_build');

        $GLOBALS['CTRLS_DUP_CTRL_UI']      = new DUP_CTRL_UI();
        $GLOBALS['CTRLS_DUP_CTRL_Tools']   = new DUP_CTRL_Tools();
        $GLOBALS['CTRLS_DUP_CTRL_Package'] = new DUP_CTRL_Package();

        /**
         * User role editor integration 
         *
         * @access global
         * @return null
         */
        function duplicator_wpfront_integrate()
        {
            if (DUP_Settings::Get('wpfront_integrate')) {
                do_action('wpfront_user_role_editor_duplicator_init', array('export', 'manage_options', 'read'));
            }
        }

        /**
         * Hooked into `admin_init`.  Init routines for all admin pages 
         *
         * @access global
         * @return null
         */
        function duplicator_admin_init()
        {
            /* CSS */
            wp_register_style('dup-jquery-ui', DUPLICATOR_PLUGIN_URL . 'assets/css/jquery-ui.css', null, "1.11.2");
            wp_register_style('dup-font-awesome', DUPLICATOR_PLUGIN_URL . 'assets/css/fontawesome-all.min.css', null, '5.7.2');
            wp_register_style('dup-plugin-global-style', DUPLICATOR_PLUGIN_URL . 'assets/css/global_admin_style.css', null, DUPLICATOR_VERSION);
            wp_register_style('dup-plugin-style', DUPLICATOR_PLUGIN_URL . 'assets/css/style.css', array('dup-plugin-global-style'), DUPLICATOR_VERSION);

            wp_register_style('dup-jquery-qtip', DUPLICATOR_PLUGIN_URL . 'assets/js/jquery.qtip/jquery.qtip.min.css', null, '2.2.1');
            wp_register_style('dup-parsley-style', DUPLICATOR_PLUGIN_URL . 'assets/css/parsley.css', null, '2.3.5');
            /* JS */
            wp_register_script('dup-handlebars', DUPLICATOR_PLUGIN_URL . 'assets/js/handlebars.min.js', array('jquery'), '4.0.10');
            wp_register_script('dup-parsley', DUPLICATOR_PLUGIN_URL . 'assets/js/parsley.min.js', array('jquery'), '1.1.18');
            wp_register_script('dup-jquery-qtip', DUPLICATOR_PLUGIN_URL . 'assets/js/jquery.qtip/jquery.qtip.min.js', array('jquery'), '2.2.1');

            add_action('admin_head', array('DUP_UI_Screen', 'getCustomCss'));
            // Clean tmp folder
            DUP_Package::not_active_files_tmp_cleanup();

            $unhook_third_party_js  = DUP_Settings::Get('unhook_third_party_js');
            $unhook_third_party_css = DUP_Settings::Get('unhook_third_party_css');
            if ($unhook_third_party_js || $unhook_third_party_css) {
                add_action('admin_enqueue_scripts', 'duplicator_unhook_third_party_assets', 99999, 1);
            }
        }

        /**
         * Hooked into `admin_enqueue_scripts`.  Init routines for all admin pages
         *
         * @access global
         * @return null
         */
        function duplicator_admin_enqueue_scripts()
        {
            wp_enqueue_script('dup-global-script', DUPLICATOR_PLUGIN_URL . 'assets/js/global-admin-script.js', array('jquery'), DUPLICATOR_VERSION, true);
            wp_localize_script('dup-global-script',
                               'dup_global_script_data',
                               array(
                    'duplicator_admin_notice_to_dismiss' => wp_create_nonce('duplicator_admin_notice_to_dismiss')
                )
            );
            wp_enqueue_style('dup-plugin-global-style');
        }

        /**
         * Redirects the clicked menu item to the correct location
         *
         * @access global
         * @return null
         */
        function duplicator_get_menu()
        {
            $current_page = isset($_REQUEST['page']) ? sanitize_text_field($_REQUEST['page']) : 'duplicator';
            switch ($current_page) {
                case 'duplicator': include(DUPLICATOR_PLUGIN_PATH.'views/packages/controller.php'); break;
                case 'duplicator-settings': include(DUPLICATOR_PLUGIN_PATH.'views/settings/controller.php'); break;
                case 'duplicator-tools': include(DUPLICATOR_PLUGIN_PATH.'views/tools/controller.php'); break;
                case 'duplicator-debug': include(DUPLICATOR_PLUGIN_PATH.'debug/main.php'); break;
                case 'duplicator-gopro': include(DUPLICATOR_PLUGIN_PATH.'views/settings/gopro.php'); break;
            }
        }

        /**
         * Hooked into `admin_menu`.  Loads all of the wp left nav admin menus for Duplicator
         *
         * @access global
         * @return null
         */
        function duplicator_menu()
        {
            $wpfront_caps_translator = 'wpfront_user_role_editor_duplicator_translate_capability';
            //SVG Icon: See https://websemantics.uk/tools/image-to-data-uri-converter/
            //older version
            //$icon_svg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQXJ0d29yayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIyMy4yNXB4IiBoZWlnaHQ9IjIyLjM3NXB4IiB2aWV3Qm94PSIwIDAgMjMuMjUgMjIuMzc1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyMy4yNSAyMi4zNzUiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGZpbGw9IiM5Q0ExQTYiIGQ9Ik0xOC4wMTEsMS4xODhjLTEuOTk1LDAtMy42MTUsMS42MTgtMy42MTUsMy42MTRjMCwwLjA4NSwwLjAwOCwwLjE2NywwLjAxNiwwLjI1TDcuNzMzLDguMTg0QzcuMDg0LDcuNTY1LDYuMjA4LDcuMTgyLDUuMjQsNy4xODJjLTEuOTk2LDAtMy42MTUsMS42MTktMy42MTUsMy42MTRjMCwxLjk5NiwxLjYxOSwzLjYxMywzLjYxNSwzLjYxM2MwLjYyOSwwLDEuMjIyLTAuMTYyLDEuNzM3LTAuNDQ1bDIuODksMi40MzhjLTAuMTI2LDAuMzY4LTAuMTk4LDAuNzYzLTAuMTk4LDEuMTczYzAsMS45OTUsMS42MTgsMy42MTMsMy42MTQsMy42MTNjMS45OTUsMCwzLjYxNS0xLjYxOCwzLjYxNS0zLjYxM2MwLTEuOTk3LTEuNjItMy42MTQtMy42MTUtMy42MTRjLTAuNjMsMC0xLjIyMiwwLjE2Mi0xLjczNywwLjQ0M2wtMi44OS0yLjQzNWMwLjEyNi0wLjM2OCwwLjE5OC0wLjc2MywwLjE5OC0xLjE3M2MwLTAuMDg0LTAuMDA4LTAuMTY2LTAuMDEzLTAuMjVsNi42NzYtMy4xMzNjMC42NDgsMC42MTksMS41MjUsMS4wMDIsMi40OTUsMS4wMDJjMS45OTQsMCwzLjYxMy0xLjYxNywzLjYxMy0zLjYxM0MyMS42MjUsMi44MDYsMjAuMDA2LDEuMTg4LDE4LjAxMSwxLjE4OHoiLz48L3N2Zz4=';
            $icon_svg                = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMjU2cHgiIGhlaWdodD0iMjU2cHgiIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNTYgMjU2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8cGF0aCBmaWxsPSIjQTdBOUFDIiBkPSJNMTcyLjEwMywzNS4yMjNsLTEuMzk1LTI0LjA5N0wxNTMuMzYsNi40NzhsLTEzLjI1MywyMC4xNzFjLTYuNzQyLTAuNjc1LTEzLjUzNS0wLjY5Ni0yMC4yNzYtMC4wNDINCgkJCUwxMDYuNDY3LDYuMjdsLTE3LjM0OCw0LjY0N2wtMS40LDI0LjIwNGMtNi4wNzMsMi43MjQtMTEuOTMsNi4wNzQtMTcuNDg1LDEwLjAzOUw0OC40MDMsMzQuMTgzTDM1LjcwNCw0Ni44ODJsMTAuOTEsMjEuNzAxDQoJCQljLTQuMDExLDUuNTIyLTcuMzk2LDExLjM1Mi0xMC4xNywxNy4zOTdsLTI0LjM2NywxLjQxbC00LjY0OCwxNy4zNDhsMjAuMjQxLDEzLjNjLTAuNzA4LDYuNzM0LTAuNzg1LDEzLjUyMy0wLjE2NiwyMC4yNjUNCgkJCWwtMjAuMjg0LDEzLjMzbDQuNjQ4LDE3LjM0OGwyMy4zMjQsMS4zNDlsMC4yMjctMC44MjZsOS4xMDYtMzMuMTc2Yy0yLjEyNS0yNC4zMzMsNi4xMDQtNDkuMzk3LDI0LjcyOS02OC4wMjMNCgkJCWMyNy4zOTMtMjcuMzkzLDY4LjcxLTMyLjMxNSwxMDEuMTQ1LTE0LjgzM0w1NC40MjIsMTY5LjQ0N2wtMi41ODUtMzIuMzU1TDMwLjg5LDIxMy4zOThsMzEuNjE0LTMxLjYxNEwxODIuNzM1LDYxLjU1Mw0KCQkJbDQuMjA0LTQuMjA2bDcuOTc4LTcuOTc4QzE4Ny44MzYsNDMuNTU3LDE4MC4xNSwzOC44NTcsMTcyLjEwMywzNS4yMjN6Ii8+DQoJCTxwYXRoIGZpbGw9IiNBN0E5QUMiIGQ9Ik0xMDUuMjE0LDkuNTU4bDEyLjIzMSwxOC42MTRsMC45NDUsMS40NGwxLjcxNS0wLjE2NmMzLjE4Mi0wLjMwOCw2LjQyMy0wLjQ2NSw5LjYzNC0wLjQ2NQ0KCQkJYzMuMzQ3LDAsNi43MzYsMC4xNywxMC4wODIsMC41MDZsMS43MTksMC4xNzJsMC45NS0xLjQ0NGwxMi4xMjItMTguNDQ5bDEzLjM2NSwzLjU4MWwxLjI3NCwyMi4wNDFsMC4xMDEsMS43MjRsMS41NzMsMC43MTENCgkJCWM3LjAzNiwzLjE3NSwxMy42NTIsNy4xMzYsMTkuNzExLDExLjc5MWwtNS43MTcsNS43MThsLTQuMjAzLDQuMjAzTDYwLjQ4NSwxNzkuNzY2bC0yMy45OTEsMjMuOTkybDEzLjc5Mi01MC4yNDRsMS4yOTIsMTYuMTYyDQoJCQlsMC40OTMsNi4xNTlsNC4zNjktNC4zNjdMMTcyLjQxNiw1NS40OWwyLjcwOS0yLjcxMWwtMy4zNzItMS44MThjLTEyLjgyOS02LjkxNS0yNy4zNDktMTAuNTcxLTQxLjk5NC0xMC41NzENCgkJCWMtMjMuNjIsMC00NS44MjMsOS4xOTgtNjIuNTIyLDI1Ljg5N0M0OC44MzMsODQuNjksMzkuNTIsMTEwLjA5NSw0MS42MzksMTM2LjA2MWwtOC41ODcsMzEuMjg4bC0xOC45NjItMS4wOTlsLTMuNTgxLTEzLjM2Mw0KCQkJbDE4LjU2Mi0xMi4xOThsMS40MzEtMC45NDJsLTAuMTU2LTEuNzA0Yy0wLjU5Mi02LjQzNi0wLjUzOC0xMy4wNjUsMC4xNjEtMTkuNzA2bDAuMTgyLTEuNzI4bC0xLjQ1Mi0wLjk1NWwtMTguNTE4LTEyLjE2Nw0KCQkJbDMuNTgxLTEzLjM2NmwyMi4zMDktMS4yOTFsMS43MTItMC4wOThsMC43MTctMS41NTljMi43MjktNS45NDgsNi4wNTUtMTEuNjM5LDkuODg1LTE2LjkxM2wxLjAyMS0xLjQwNmwtMC43NzktMS41NTINCgkJCWwtOS45ODQtMTkuODU5bDkuNzg0LTkuNzg0bDE5Ljk4OCwxMC4wNDlsMS41MzgsMC43NzRsMS40MDEtMS4wMDFjNS4zNDMtMy44MTEsMTEuMDYxLTcuMDk0LDE2Ljk5Ny05Ljc1N2wxLjU4MS0wLjcxMmwwLjEtMS43MjgNCgkJCWwxLjI4MS0yMi4xNDVMMTA1LjIxNCw5LjU1OCBNMTA2LjQ2Nyw2LjI3bC0xNy4zNDgsNC42NDdsLTEuNCwyNC4yMDRjLTYuMDczLDIuNzI2LTExLjkzLDYuMDc0LTE3LjQ4NiwxMC4wMzlsLTIxLjgzLTEwLjk3Ng0KCQkJbC0xMi43LDEyLjcwMWwxMC45MSwyMS42OTljLTQuMDExLDUuNTIyLTcuMzk2LDExLjM1My0xMC4xNywxNy4zOTdsLTI0LjM2NywxLjQxbC00LjY0OCwxNy4zNDhsMjAuMjQsMTMuMw0KCQkJYy0wLjcwOCw2LjczNC0wLjc4NCwxMy41MjMtMC4xNjUsMjAuMjY1bC0yMC4yODQsMTMuMzNsNC42NDgsMTcuMzQ4bDIzLjMyNCwxLjM0OWwwLjIyNy0wLjgyNmw5LjEwNi0zMy4xNzYNCgkJCWMtMi4xMjUtMjQuMzMzLDYuMTA0LTQ5LjM5NywyNC43MjktNjguMDIzYzE2LjcxLTE2LjcxMSwzOC42MDctMjUuMDYsNjAuNTA1LTI1LjA2YzEzLjk5OCwwLDI3Ljk5MiwzLjQxMSw0MC42NCwxMC4yMjcNCgkJCUw1NC40MjIsMTY5LjQ0OWwtMi41ODUtMzIuMzU3TDMwLjg5LDIxMy4zOThsMzEuNjE0LTMxLjYxNEwxODIuNzM1LDYxLjU1M2w0LjIwMy00LjIwNGw3Ljk3OS03Ljk3OQ0KCQkJYy03LjA4My01LjgxNS0xNC43NjctMTAuNTEzLTIyLjgxNC0xNC4xNDdsLTEuMzk1LTI0LjA5N0wxNTMuMzYsNi40NzhsLTEzLjI1NCwyMC4xN2MtMy40NDctMC4zNDYtNi45MDctMC41Mi0xMC4zNjYtMC41Mg0KCQkJYy0zLjMwNywwLTYuNjE0LDAuMTYtOS45MSwwLjQ3OUwxMDYuNDY3LDYuMjdMMTA2LjQ2Nyw2LjI3eiIvPg0KCTwvZz4NCgk8Zz4NCgkJPHBhdGggZmlsbD0iI0E3QTlBQyIgZD0iTTg3LjgwMiwyMjIuMjFsMS4zOTQsMjQuMDk3bDE3LjM0OCw0LjY0OWwxMy4yNTUtMjAuMTdjNi43NDIsMC42NzUsMTMuNTMzLDAuNjkzLDIwLjI3NCwwLjA0MQ0KCQkJbDEzLjM2NSwyMC4zMzVsMTcuMzQ3LTQuNjQ2bDEuMzk5LTI0LjIwMmM2LjA3My0yLjcyNSwxMS45My02LjA3NCwxNy40ODYtMTAuMDM4bDIxLjgzMSwxMC45NzRsMTIuNjk5LTEyLjY5OGwtMTAuOTEtMjEuNzAxDQoJCQljNC4wMTItNS41MjEsNy4zOTYtMTEuMzUyLDEwLjE2OS0xNy4zOThsMjQuMzY5LTEuNDA4bDQuNjQ2LTE3LjM0OGwtMjAuMjM5LTEzLjNjMC43MDgtNi43MzYsMC43ODQtMTMuNTIzLDAuMTY0LTIwLjI2Ng0KCQkJbDIwLjI4NC0xMy4zMjhsLTQuNjQ3LTE3LjM0OGwtMjMuMzIzLTEuMzQ5bC0wLjIyOCwwLjgyNWwtOS4xMDcsMzMuMTc1YzIuMTI3LDI0LjMzMi02LjEwNCw0OS4zOTctMjQuNzI5LDY4LjAyNA0KCQkJYy0yNy4zOTIsMjcuMzkzLTY4LjcwOSwzMi4zMTUtMTAxLjE0NCwxNC44MzFMMjA1LjQ4LDg3Ljk4NGwyLjU4NiwzMi4zNTZsMjAuOTQ4LTc2LjMwNWwtMzEuNjE1LDMxLjYxM0w3Ny4xNjksMTk1Ljg4DQoJCQlsLTQuMjA2LDQuMjA1bC03Ljk3OCw3Ljk3OUM3Mi4wNjgsMjEzLjg3Niw3OS43NTIsMjE4LjU3NSw4Ny44MDIsMjIyLjIxeiIvPg0KCQk8cGF0aCBmaWxsPSIjQTdBOUFDIiBkPSJNMjIzLjQwOSw1My42NzZsLTEzLjc5Myw1MC4yNGwtMS4yOS0xNi4xNmwtMC40OTQtNi4xNTlsLTQuMzY4LDQuMzdMODcuNDg3LDIwMS45NDJsLTIuNzA5LDIuNzEyDQoJCQlsMy4zNzMsMS44MThjMTIuODI4LDYuOTE0LDI3LjM1MSwxMC41NjgsNDEuOTk3LDEwLjU2OGMyMy42MTgsMCw0NS44MjEtOS4xOTUsNjIuNTItMjUuODk2DQoJCQljMTguNDAzLTE4LjQwMiwyNy43MTctNDMuODA3LDI1LjU5OC02OS43NzVsOC41ODgtMzEuMjgzbDE4Ljk2MSwxLjA5N2wzLjU4MiwxMy4zNjRsLTE4LjU2MywxMi4xOTdsLTEuNDMsMC45NDFsMC4xNTUsMS43MDUNCgkJCWMwLjU5Miw2LjQzNiwwLjUzOSwxMy4wNjctMC4xNiwxOS43MDZsLTAuMTgzLDEuNzI3bDEuNDUxLDAuOTU0bDE4LjUyMSwxMi4xNzFsLTMuNTgyLDEzLjM2NWwtMjIuMzExLDEuMjkxbC0xLjcxMiwwLjA5OQ0KCQkJbC0wLjcxNiwxLjU2Yy0yLjcyNyw1Ljk0NC02LjA1MywxMS42MzMtOS44ODYsMTYuOTExbC0xLjAyLDEuNDA0bDAuNzgsMS41NTRsOS45ODMsMTkuODU5bC05Ljc4NSw5Ljc4M2wtMTkuOTktMTAuMDUNCgkJCWwtMS41MzYtMC43NzJsLTEuNDAyLDAuOTk5Yy01LjM0MSwzLjgxNC0xMS4wNTksNy4wOTYtMTYuOTk0LDkuNzU4bC0xLjU4MiwwLjcxbC0wLjA5OSwxLjcyOWwtMS4yODMsMjIuMTQ2bC0xMy4zNjMsMy41ODENCgkJCWwtMTIuMjMzLTE4LjYxNWwtMC45NDYtMS40MzhsLTEuNzEzLDAuMTYzYy0zLjE4LDAuMzEtNi40MTcsMC40NjUtOS42MjYsMC40NjVjLTMuMzQ4LDAtNi43NDMtMC4xNjktMTAuMDktMC41MDVsLTEuNzE5LTAuMTcxDQoJCQlsLTAuOTUsMS40NDNsLTEyLjEyMiwxOC40NDhsLTEzLjM2Ni0zLjU4MWwtMS4yNzUtMjIuMDM4bC0wLjEtMS43MjdsLTEuNTc0LTAuNzA5Yy03LjAzNS0zLjE4LTEzLjY1My03LjEzOS0xOS43MS0xMS43OTINCgkJCWw1LjcxNi01LjcxNWw0LjIwNS00LjIwN0wxOTkuNDE4LDc3LjY2NkwyMjMuNDA5LDUzLjY3NiBNMjI5LjAxNSw0NC4wMzZsLTMxLjYxNSwzMS42MTNMNzcuMTY5LDE5NS44OGwtNC4yMDYsNC4yMDVsLTcuOTc3LDcuOTc5DQoJCQljNy4wOCw1LjgxMiwxNC43NjUsMTAuNTExLDIyLjgxNCwxNC4xNDZsMS4zOTQsMjQuMDk3bDE3LjM0OCw0LjY0OWwxMy4yNTQtMjAuMTczYzMuNDQ4LDAuMzQ4LDYuOTEyLDAuNTIzLDEwLjM3NCwwLjUyMw0KCQkJYzMuMzA0LDAsNi42MDctMC4xNjIsOS45LTAuNDc5bDEzLjM2NSwyMC4zMzVsMTcuMzQ3LTQuNjQ2bDEuMzk5LTI0LjIwMmM2LjA3My0yLjcyNSwxMS45MzEtNi4wNzcsMTcuNDg2LTEwLjAzOGwyMS44MzEsMTAuOTc0DQoJCQlsMTIuNjk5LTEyLjY5OGwtMTAuOTEtMjEuNzAxYzQuMDEyLTUuNTIxLDcuMzk2LTExLjM1MiwxMC4xNjktMTcuMzk4bDI0LjM2OS0xLjQwOGw0LjY0OS0xNy4zNDhsLTIwLjI0Mi0xMy4zDQoJCQljMC43MDgtNi43MzYsMC43ODQtMTMuNTIzLDAuMTY0LTIwLjI2NmwyMC4yODUtMTMuMzI4bC00LjY0OC0xNy4zNDhsLTIzLjMyNC0xLjM0OWwtMC4yMjcsMC44MjVsLTkuMTA3LDMzLjE3NQ0KCQkJYzIuMTI3LDI0LjMzMi02LjEwNCw0OS40MDEtMjQuNzI5LDY4LjAyNGMtMTYuNzA5LDE2LjcxLTM4LjYwNCwyNS4wNjEtNjAuNTAxLDI1LjA2MWMtMTMuOTk4LDAtMjcuOTk1LTMuNDEtNDAuNjQzLTEwLjIyOQ0KCQkJTDIwNS40OCw4Ny45ODRsMi41ODYsMzIuMzU2TDIyOS4wMTUsNDQuMDM2TDIyOS4wMTUsNDQuMDM2eiIvPg0KCTwvZz4NCjwvZz4NCjwvc3ZnPg0K';

            //Main Menu
            $perms                         = 'export';
            $perms                         = apply_filters($wpfront_caps_translator, $perms);
            $main_menu                     = add_menu_page('Duplicator Plugin', 'Duplicator', $perms, 'duplicator', 'duplicator_get_menu', $icon_svg);
            $perms                         = 'export';
            $perms                         = apply_filters($wpfront_caps_translator, $perms);
            $lang_txt                      = esc_html__('Packages', 'duplicator');
            $page_packages                 = add_submenu_page('duplicator', $lang_txt, $lang_txt, $perms, 'duplicator', 'duplicator_get_menu');
            $GLOBALS['DUP_Package_Screen'] = new DUP_Package_Screen($page_packages);

            $perms      = 'manage_options';
            $perms      = apply_filters($wpfront_caps_translator, $perms);
            $lang_txt   = esc_html__('Tools', 'duplicator');
            $page_tools = add_submenu_page('duplicator', $lang_txt, $lang_txt, $perms, 'duplicator-tools', 'duplicator_get_menu');

            $perms         = 'manage_options';
            $perms         = apply_filters($wpfront_caps_translator, $perms);
            $lang_txt      = esc_html__('Settings', 'duplicator');
            $page_settings = add_submenu_page('duplicator', $lang_txt, $lang_txt, $perms, 'duplicator-settings', 'duplicator_get_menu');

            $perms                   = 'manage_options';
            $admin_color             = get_user_option('admin_color');
            $orange_for_admin_colors = array(
                'fresh',
                'coffee',
                'ectoplasm',
                'midnight'
            );
            $style                   = in_array($admin_color, $orange_for_admin_colors) ? 'style="color:#f18500"' : '';
            $lang_txt                = esc_html__('Go Pro!', 'duplicator');
            $go_pro_link             = '<span ' . $style . '>' . $lang_txt . '</span>';
            $perms                   = apply_filters($wpfront_caps_translator, $perms);
            $page_gopro              = add_submenu_page('duplicator', $go_pro_link, $go_pro_link, $perms, 'duplicator-gopro', 'duplicator_get_menu');

            //Apply Scripts
            add_action('admin_print_scripts-' . $page_packages, 'duplicator_scripts');
            add_action('admin_print_scripts-' . $page_settings, 'duplicator_scripts');
            add_action('admin_print_scripts-' . $page_tools, 'duplicator_scripts');
            add_action('admin_print_scripts-' . $page_gopro, 'duplicator_scripts');

            //Apply Styles
            add_action('admin_print_styles-' . $page_packages, 'duplicator_styles');
            add_action('admin_print_styles-' . $page_settings, 'duplicator_styles');
            add_action('admin_print_styles-' . $page_tools, 'duplicator_styles');
            add_action('admin_print_styles-' . $page_gopro, 'duplicator_styles');
        }

        /**
         * Loads all required javascript libs/source for DupPro
         *
         * @access global
         * @return null
         */
        function duplicator_scripts()
        {
            wp_enqueue_script('jquery');
            wp_enqueue_script('jquery-ui-core');
            wp_enqueue_script('jquery-ui-progressbar');
            wp_enqueue_script('dup-parsley');
            wp_enqueue_script('dup-jquery-qtip');
        }

        /**
         * Loads all CSS style libs/source for DupPro
         *
         * @access global
         * @return null
         */
        function duplicator_styles()
        {
            wp_enqueue_style('dup-jquery-ui');
            wp_enqueue_style('dup-font-awesome');
            wp_enqueue_style('dup-plugin-style');
            wp_enqueue_style('dup-jquery-qtip');
        }
        /** ========================================================
         * FILTERS
         * =====================================================  */
        add_filter('plugin_action_links', 'duplicator_manage_link', 10, 2);
        add_filter('plugin_row_meta', 'duplicator_meta_links', 10, 2);

        /**
         * Adds the manage link in the plugins list 
         *
         * @access global
         * @return string The manage link in the plugins list 
         */
        function duplicator_manage_link($links, $file)
        {
            static $this_plugin;
            if (!$this_plugin)
                $this_plugin = plugin_basename(DUPLICATOR_LITE_FILE);

            if ($file == $this_plugin) {
                /*
                  $settings_link = '<a href="admin.php?page=duplicator">' . esc_html__("Manage", 'duplicator') . '</a>';
                  array_unshift($links, $settings_link);
                 */
                $upgrade_link = '<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=plugins_page&utm_campaign=duplicator_pro"><strong style="color: #11967A; display: inline;">' . esc_html__("Upgrade to Professional", 'duplicator') . '</strong></a>';
                array_unshift($links, $upgrade_link);
            }
            return $links;
        }

        /**
         * Adds links to the plugins manager page
         *
         * @access global
         * @return string The meta help link data for the plugins manager
         */
        function duplicator_meta_links($links, $file)
        {
            $plugin = plugin_basename(DUPLICATOR_LITE_FILE);
            // create link
            if ($file == $plugin) {
                $links[] = '<a href="admin.php?page=duplicator" title="' . esc_attr__('Manage Packages', 'duplicator') . '" style="">' . esc_html__('Manage', 'duplicator') . '</a>';
                return $links;
            }
            return $links;
        }
        /** ========================================================
         * GENERAL
         * =====================================================  */

        /**
         * Used for installer files to redirect if accessed directly
         *
         * @access global
         * @return null
         */
        function duplicator_secure_check()
        {
            $baseURL = "http://" . strlen($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST'];
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: $baseURL");
            exit;
        }
        if (!function_exists('duplicator_unhook_third_party_assets')) {

            /**
             * Remove all external styles and scripts coming from other plugins
             * which may cause compatibility issue, especially with React
             *
             * @return void
             */
            function duplicator_unhook_third_party_assets($hook)
            {
                /*
                  $hook values in duplicator admin pages:
                  toplevel_page_duplicator
                  duplicator_page_duplicator-tools
                  duplicator_page_duplicator-settings
                  duplicator_page_duplicator-gopro
                 */
                if (strpos($hook, 'duplicator') !== false && strpos($hook, 'duplicator-pro') === false) {
                    $unhook_third_party_js  = DUP_Settings::Get('unhook_third_party_js');
                    $unhook_third_party_css = DUP_Settings::Get('unhook_third_party_css');
                    $assets                 = array();
                    if ($unhook_third_party_css)
                        $assets['styles']       = wp_styles();
                    if ($unhook_third_party_js)
                        $assets['scripts']      = wp_scripts();
                    foreach ($assets as $type => $asset) {
                        foreach ($asset->registered as $handle => $dep) {
                            $src = $dep->src;
                            // test if the src is coming from /wp-admin/ or /wp-includes/ or /wp-fsqm-pro/.
                            if (
                                is_string($src) && // For some built-ins, $src is true|false
                                strpos($src, 'wp-admin') === false &&
                                strpos($src, 'wp-include') === false &&
                                // things below are specific to your plugin, so change them
                                strpos($src, 'duplicator') === false &&
                                strpos($src, 'woocommerce') === false &&
                                strpos($src, 'jetpack') === false &&
                                strpos($src, 'debug-bar') === false
                            ) {
                                'scripts' === $type ? wp_dequeue_script($handle) : wp_dequeue_style($handle);
                            }
                        }
                    }
                }
            }
        }
    }
}readme.txt000064400000015176151336065400006557 0ustar00=== Duplicator - WordPress Migration Plugin ===
Contributors: corylamleorg, bobriley
Tags: migration, backup, duplicate, move, migrate, restore, transfer, clone, automate, copy site, migrator
Requires at least: 4.0
Tested up to: 6.0
Requires PHP: 5.3.8
Stable tag: 1.4.7
License: GPLv2

WordPress migration and backups are much easier with Duplicator! Clone, backup, move and transfer an entire site from one location to another.

== Description ==

> With over **25 million downloads** Duplicator successfully gives WordPress users the ability to migrate, copy, move or clone a site from one location to another and also serves as a simple backup utility. Duplicator handles serialized and base64 serialized replacements.  Standard WordPress migration and WordPress backups are easily handled by this plugin as are **zero downtime migrations**.

For complete details visit [snapcreek.com](https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wp_org&utm_content=desc_details&utm_campaign=duplicator_free).

= Quick Video Demo =
http://www.youtube.com/watch?v=oc73jtvHWYQ

= Overview =
Duplicator is the most powerful migrator available. It enables you to:

* Move, migrate or clone a WordPress site between domains or hosts with **zero downtime**
* Pull down a live site to localhost for development
* Transfer a WordPress site from one host to another
* Manually backup a WordPress site or parts of a site
* Duplicate a live site to a staging area or vice versa
* Bundle up an entire WordPress site for easy reuse or distribution
* Perform a full WordPress migration without struggling with messy import/export sql scripts

= Migrate WordPress and Run WordPress Backups =
Duplicator creates a package that bundles all the site's plugins, themes, content, database and WordPress files into a simple zip file called a package. This package can then be used to easily migrate a WordPress site to any location you wish.  Move on the same server, across servers and pretty much any location a WordPress site can be hosted.  *WordPress is not required for installation* since the package contains all site files.

= Improve Your Workflow with Pre-Bundled Sites =
Duplicator lets you make your own preconfigured sites to eliminate rework.  Instead of manually configuring your favorite theme, set of plugins or content over and over, now just configure a single site and bundle it up into a Duplicator package. Once you have the bundled site, you can migrate the WordPress site over and over to different locations to instantly create many preconfigured sites!

= Duplicator Pro =
Duplicator Pro takes Duplicator to the next level with features you'll really appreciate, such as:

* Drag and Drop installs - just drag an archive to the destination site!
* Scheduled backups
* Cloud Storage to Dropbox, Google Drive, Microsoft OneDrive, Amazon S3 and FTP/SFTP
* A special 2-step streamlined installer mode for mega-fast installs
* Recovery Points added for very fast emergency site restores
* Support for Managed hosts such as WordPress.com, WPEngine, GoDaddy Managed, and more
* Multi-threaded to support larger web sites &amp; databases
* Migrate an entire multisite WordPress network in one shot
* Install a multisite subsite as a new standalone website
* Database and user creation *in the installer* with cPanel API
* Connect to cPanel directly from installer
* Custom plugin hooks for developers
* Email notifications
* Professional support
* ... and much more!

Check out [Duplicator Pro](https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wp_org&utm_content=wpo_premium&utm_campaign=duplicator_pro) today!

= Please Note =
The underlying logic to backup WordPress, move WordPress and transfer WordPress are complex and it's impossible to know how each system is setup; this is why your feedback is important to us.  Thanks for helping us to make WordPress the best blogging platform in the world.

= Disclaimer =
This plugin does require some technical knowledge.  If you plan to migrate WordPress or backup WordPress please use it at your own risk and don't forget to back up your files and databases beforehand. If you need to move or backup WordPress and would like additional help please visit the Duplicator [resources section](https://snapcreek.com/duplicator/docs/faqs-tech?utm_source=duplicator_free&utm_medium=wp_org&utm_content=free_disclaimer&utm_campaign=duplicator_free#faq-resource-030-q) .

= Active Contributors =
<li>[Andrea Leoni](https://profiles.wordpress.org/andreamk/) (Development)</li>
<li>[Paal Joachim Romdahl](http://www.easywebdesigntutorials.com) (Training)</li>
<li>[Hans-M. Herbrand](http://www.web266.de) (German) </li>
<li>[Nicolas Richer](http://nicolasricher.fr) (French)</li>

== Screenshots ==

1. Main Interface for all Packages
2. Create Package Step 1
3. Create Package Step 2
4. Build Process
5. Installer Screen

== Frequently Asked Questions ==

= Does Duplicator have a knowledge base or FAQ? =
Yes. Please see [all documents](https://snapcreek.com/duplicator/docs/?utm_source=duplicator_free&utm_medium=wp_org&utm_content=faq_docs&utm_campaign=duplicator_free) at snapcreek.com.

= Installation Instructions =
1. Upload `duplicator` folder to the `/wp-content/plugins/` directory
2. Activate the plugin through the 'Plugins' menu in WordPress
3. Click on the Duplicator link from the main menu
4. Check out the help by clicking the help icon and create your first package.

The Duplicator requires php 5.3 or higher.


= Are there any videos I can watch? =
Yes.  Please see the [video section](https://snapcreek.com/duplicator/docs/faqs-tech?utm_source=duplicator_free&utm_medium=wp_org&utm_content=faq_videos&utm_campaign=duplicator_free#faq-resource-070-q) on the FAQ.

= Is this plugin compatible with WordPress multisite (MU)? =
Duplicator isn't, however [Duplicator Pro](https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wp_org&utm_content=faq_dpro_multisiteinfo&utm_campaign=duplicator_pro) supports full multisite network migrations/backups and also can install a multisite subsite as a standalone site.

= Where can I get more help and support for this plugin? =
Visit the [Duplicator support](https://snapcreek.com/duplicator/docs/faqs-tech?utm_source=duplicator_free&utm_medium=wp_org&utm_content=faq_support&utm_campaign=duplicator_free#faq-resource-030-q) section at snapcreek.com


== Changelog ==

Please see the following url:
[https://snapcreek.com/duplicator/docs/changelog?lite](https://snapcreek.com/duplicator/docs/changelog?lite&utm_source=duplicator_free&utm_medium=wp_org&utm_content=changelog_support&utm_campaign=duplicator_free)



== Upgrade Notice ==

Please use our ticketing system when submitting your logs.  Please do not post to the forums.
duplicator.php000064400000003363151336065400007433 0ustar00<?php
/** ===============================================================================
  Plugin Name: Duplicator
  Plugin URI: https://snapcreek.com/duplicator/duplicator-free/
  Description: Migrate and backup a copy of your WordPress files and database. Duplicate and move a site from one location to another quickly.
  Version: 1.4.7
  Requires at least: 4.0
  Tested up to: 6.0
  Requires PHP: 5.3.8
  Author: Snap Creek
  Author URI: http://www.snapcreek.com/duplicator/
  Network: true
  Text Domain: duplicator
  License: GPLv2 or later

  Copyright 2011-2020  SnapCreek LLC

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License, version 2, as
  published by the Free Software Foundation.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

  ================================================================================ */
defined('ABSPATH') || exit;

// CHECK PHP VERSION
define('DUPLICATOR_LITE_PHP_MINIMUM_VERSION', '5.3.8');
define('DUPLICATOR_LITE_PHP_SUGGESTED_VERSION', '5.6.20');
require_once(dirname(__FILE__)."/tools/DuplicatorPhpVersionCheck.php");
if (DuplicatorPhpVersionCheck::check(DUPLICATOR_LITE_PHP_MINIMUM_VERSION, DUPLICATOR_LITE_PHP_SUGGESTED_VERSION) === false) {
    return;
}

$currentPluginBootFile = __FILE__;

require_once dirname(__FILE__).'/duplicator-main.php';
deactivation.php000064400000051157151336065400007743 0ustar00<?php
/**
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

function duplicator_deactivation_enqueue_scripts($hook)
{
    if ('plugins.php' == $hook && !defined('DOING_AJAX')) {
        wp_enqueue_style('duplicator-deactivation-modal', DUPLICATOR_PLUGIN_URL.'assets/css/modal.css', array(), '1.0.0');
    }
}
add_action('admin_enqueue_scripts', 'duplicator_deactivation_enqueue_scripts');

if (!function_exists('duplicator_plugins_admin_footer')) {

    function duplicator_plugins_admin_footer()
    {
        global $hook_suffix;

        if ('plugins.php' == $hook_suffix && !defined('DOING_AJAX')) {
            duplicator_add_deactivation_feedback_dialog_box();
        }
    }
}
add_action('admin_footer', 'duplicator_plugins_admin_footer');

/**
 * Displays a confirmation and feedback dialog box when the user clicks on the "Deactivate" link on the plugins
 * page.
 *
 * @since  2.1.3
 */
if (!function_exists('duplicator_add_deactivation_feedback_dialog_box')) {

    function duplicator_add_deactivation_feedback_dialog_box()
    {
        $basename  = 'duplicator/duplicator.php';
        /*
          $slug = dirname( $basename );
          $plugin_id = sanitize_title( $plugin_data['Name'] );
         */
        $slug      = 'duplicator';
        $plugin_id = 'duplicator';

        $contact_support_template = __('Need help? We are ready to answer your questions.', 'duplicator').' <a href="https://snapcreek.com/ticket/" target="_blank">'.__('Contact Support', 'duplicator').'</a>';

        $reasons = array(
            array(
                'id' => 'NOT_WORKING',
                'text' => __("It's not working on my server.", 'duplicator'),
                'input_type' => 'textarea',
                'input_placeholder' => __("Kindly share what didn't work so we can fix it in future updates...", 'duplicator'),
                'internal_message' => $contact_support_template
            ),
            array(
                'id' => 'CONFUSING_TO_UNDERSTAND',
                'text' => __("It's too confusing to understand.", 'duplicator'),
                'input_type' => 'textarea',
                'input_placeholder' => __('Please tell us what is not clear so that we can improve it.', 'duplicator'),
                'internal_message' => $contact_support_template
            ),
            array(
                'id' => 'FOUND_A_DIFFERENT_PLUGIN',
                'text' => __('I found a different plugin that I like better.', 'duplicator'),
                'input_type' => 'textfield',
                'input_placeholder' => __("What's the plugin name?", 'duplicator')
            ),
            array(
                'id' => 'NOT_DO_WHAT_I_NEED',
                'text' => __("It does not do what I need.", 'duplicator'),
                'input_type' => 'textarea',
                'input_placeholder' => __('What does it need to do?', 'duplicator')
            ),
            array(
                'id' => 'TEMPORARY_DEACTIVATION',
                'text' => __("It's a temporary deactivation, I use the plugin all the time.", 'duplicator'),
                'input_type' => '',
                'input_placeholder' => ''
            ),
            array(
                'id' => 'SWITCHING_PRO_VERSION',
                'text' => sprintf(__("I'm switching over to the %s", 'duplicator'), '<a href="https://snapcreek.com/duplicator/" target="_blank">'.__('Pro version', 'duplicator').'</a>'),
                'input_type' => '',
                'input_placeholder' => ''
            ),
            /*
            array(
                'id' => 'OTHER',
                'text' => __('Other', 'duplicator'),
                'input_type' => 'textarea',
                'input_placeholder' => __('Please tell us the reason so we can improve it.', 'duplicator')
            )
            */
        );

        $reasons_list_items_html = '';

        foreach ($reasons as $reason) {
            $list_item_classes = 'duplicator-modal-reason'.(!empty($reason['input_type']) ? ' has-input' : '' );

            if (!empty($reason['internal_message'])) {
                $list_item_classes       .= ' has-internal-message';
                $reason_internal_message = $reason['internal_message'];
            } else {
                $reason_internal_message = '';
            }

            $reasons_list_items_html .= '<li class="'.$list_item_classes.'" data-input-type="'.$reason['input_type'].'" data-input-placeholder="'.$reason['input_placeholder'].'">
                <label>
                    <span>
                        <input type="radio" name="selected-reason" value="'.$reason['id'].'"/>
                    </span>
                    <span>'.$reason['text'].'</span>
                </label>
                <div class="duplicator-modal-internal-message">'.$reason_internal_message.'</div>
            </li>';
        }
        ?>
        <script type="text/javascript">
            (function ($) {
                var modalHtml =
                        '<div class="duplicator-modal duplicator-modal-deactivation-feedback">'
                        + '	<div class="duplicator-modal-dialog">'
                        + '		<div class="duplicator-modal-body">'
                        + '		    <h2><?php _e('Quick Feedback', 'duplicator'); ?></h2>'
                        + '			<div class="duplicator-modal-panel active"><p><?php _e('If you have a moment, please let us know why you are deactivating', 'duplicator'); ?>:</p>' 
                        +                  '<ul>' + <?php echo DupLiteSnapJsonU::wp_json_encode($reasons_list_items_html); ?> + '</ul>'
                        + '			</div>'
                        + '		</div>'
                        + '		<div class="duplicator-modal-footer">'
                        + '			<div>'
                        + '			    <a href="#" class="button button-secondary duplicator-modal-button-close"><?php _e('Cancel', 'duplicator'); ?></a>'
                        + '			    <a href="#" class="button button-secondary duplicator-modal-button-skip"><?php _e('Skip & Deactivate', 'duplicator'); ?></a>'
                        + '			    <a href="#" class="button button-primary duplicator-modal-button-deactivate" disabled="disabled" ><?php _e('Send & Deactivate', 'duplicator'); ?></a>'
                        + '			</div>'
                        + '			<div class="clear"></div>'
                        + '			<div><small class="duplicator-modal-resp-msg" ><i><?php _e('Your response is sent anonymously.','duplicator'); ?></i></small></div>'
                        + '		</div>'
                        + '	</div>'
                        + '</div>',
                        $modal = $(modalHtml),
                        $deactivateLink = $('#the-list .active[data-plugin="<?php echo $basename; ?>"] .deactivate a'),
                        selectedReasonID = false;

                /* WP added data-plugin attr after 4.5 version/ In prev version was id attr */
                if (0 == $deactivateLink.length)
                    $deactivateLink = $('#the-list .active#<?php echo $plugin_id; ?> .deactivate a');

                $modal.appendTo($('body'));

                DuplicatorModalRegisterEventHandlers();

                function DuplicatorModalRegisterEventHandlers() {
                    $deactivateLink.click(function (evt) {
                        evt.preventDefault();

                        /* Display the dialog box.*/
                        DuplicatorModalReset();
                        $modal.addClass('active');
                        $('body').addClass('has-duplicator-modal');
                    });

                    $modal.on('input propertychange', '.duplicator-modal-reason-input input', function () {
                        if (!DuplicatorModalIsReasonSelected('OTHER')) {
                            return;
                        }

                        var reason = $(this).val().trim();

                        /* If reason is not empty, remove the error-message class of the message container to change the message color back to default. */
                        if (reason.length > 0) {
                            $modal.find('.message').removeClass('error-message');
                            DuplicatorModalEnableDeactivateButton();
                        }
                    });

                    $modal.on('blur', '.duplicator-modal-reason-input input', function () {
                        var $userReason = $(this);

                        setTimeout(function () {
                            if (!DuplicatorModalIsReasonSelected('OTHER')) {
                                return;
                            }

                            /* If reason is empty, add the error-message class to the message container to change the message color to red. */
                            if (0 === $userReason.val().trim().length) {
                                $modal.find('.message').addClass('error-message');
                                DuplicatorModalDisableDeactivateButton();
                            }
                        }, 150);
                    });

                    $modal.on('click', '.duplicator-modal-footer .button', function (evt) {
                        evt.preventDefault();

                        if ($(this).hasClass('disabled')) {
                            return;
                        }

                        var _parent = $(this).parents('.duplicator-modal:first'),
                                _this = $(this);

                        if (_this.hasClass('allow-deactivate')) {
                            var $radio = $modal.find('input[type="radio"]:checked');

                            if (0 === $radio.length) {
                                /* If no selected reason, just deactivate the plugin. */
                                window.location.href = $deactivateLink.attr('href');
                                return;
                            }

                            var $selected_reason = $radio.parents('li:first'),
                                    $input = $selected_reason.find('textarea, input[type="text"]'),
                                    userReason = (0 !== $input.length) ? $input.val().trim() : '';

                            if (DuplicatorModalIsReasonSelected('OTHER') && '' === userReason) {
                                return;
                            }

                            $.ajax({
                                url: ajaxurl,
                                method: 'POST',
                                data: {
                                    'action': 'duplicator_submit_uninstall_reason_action',
                                    'plugin': '<?php echo $basename; ?>',
                                    'reason_id': $radio.val(),
                                    'reason_info': userReason,
                                    'duplicator_ajax_nonce': '<?php echo wp_create_nonce('duplicator_ajax_nonce'); ?>'
                                },
                                beforeSend: function () {
                                    _parent.find('.duplicator-modal-footer .button').addClass('disabled');
                                    // _parent.find( '.duplicator-modal-footer .button-secondary' ).text( '<?php _e('Processing', 'duplicator'); ?>' + '...' );
                                    _parent.find('.duplicator-modal-footer .duplicator-modal-button-deactivate').text('<?php _e('Processing', 'duplicator'); ?>' + '...');
                                },
                                complete: function (message) {
                                    /* Do not show the dialog box, deactivate the plugin. */
                                    window.location.href = $deactivateLink.attr('href');
                                }
                            });
                        } else if (_this.hasClass('duplicator-modal-button-deactivate')) {
                            /* Change the Deactivate button's text and show the reasons panel. */
                            _parent.find('.duplicator-modal-button-deactivate').addClass('allow-deactivate');
                            DuplicatorModalShowPanel();
                        } else if (_this.hasClass('duplicator-modal-button-skip')) {
                            window.location.href = $deactivateLink.attr('href');
                            return;
                        }
                    });

                    $modal.on('click', 'input[type="radio"]', function () {
                        var $selectedReasonOption = $(this);

                        /* If the selection has not changed, do not proceed. */
                        if (selectedReasonID === $selectedReasonOption.val())
                            return;

                        selectedReasonID = $selectedReasonOption.val();

                        var _parent = $(this).parents('li:first');

                        $modal.find('.duplicator-modal-reason-input').remove();
                        $modal.find('.duplicator-modal-internal-message').hide();
                        $modal.find('.duplicator-modal-button-deactivate').removeAttr( 'disabled' );
                        //$modal.find('.duplicator-modal-button-skip').css('display', 'inline-block');
                        $modal.find('.duplicator-modal-resp-msg').show();

                        DuplicatorModalEnableDeactivateButton();

                        if (_parent.hasClass('has-internal-message')) {
                            _parent.find('.duplicator-modal-internal-message').show();
                        }

                        if (_parent.hasClass('has-input')) {
                            var reasonInputHtml = '<div class="duplicator-modal-reason-input"><span class="message"></span>' + (('textfield' === _parent.data('input-type')) ? '<input type="text" />' : '<textarea rows="5" maxlength="200"></textarea>') + '</div>';

                            _parent.append($(reasonInputHtml));
                            _parent.find('input, textarea').attr('placeholder', _parent.data('input-placeholder')).focus();

                            /*if (DuplicatorModalIsReasonSelected('OTHER')) {
                                $modal.find('.message').text('<?php _e('Please tell us the reason so we can improve it.', 'duplicator'); ?>').show();
                                DuplicatorModalDisableDeactivateButton();
                            }*/
                        }
                    });

                    /* If the user has clicked outside the window, cancel it. */
                    $modal.on('click', function (evt) {
                        var $target = $(evt.target);

                        /* If the user has clicked anywhere in the modal dialog, just return. */
                        if ($target.hasClass('duplicator-modal-body') || $target.hasClass('duplicator-modal-footer')) {
                            return;
                        }

                        /* If the user has not clicked the close button and the clicked element is inside the modal dialog, just return. */
                        if (!$target.hasClass('duplicator-modal-button-close') && ($target.parents('.duplicator-modal-body').length > 0 || $target.parents('.duplicator-modal-footer').length > 0)) {
                            return;
                        }

                        /* Close the modal dialog */
                        $modal.removeClass('active');
                        $('body').removeClass('has-duplicator-modal');

                        return false;
                    });
                }

                function DuplicatorModalIsReasonSelected(reasonID) {
                    /* Get the selected radio input element.*/
                    return (reasonID == $modal.find('input[type="radio"]:checked').val());
                }

                function DuplicatorModalReset() {
                    selectedReasonID = false;

                    DuplicatorModalEnableDeactivateButton();

                    /* Uncheck all radio buttons.*/
                    $modal.find('input[type="radio"]').prop('checked', false);

                    /* Remove all input fields ( textfield, textarea ).*/
                    $modal.find('.duplicator-modal-reason-input').remove();

                    $modal.find('.message').hide();
                    var $deactivateButton = $modal.find('.duplicator-modal-button-deactivate');
                    $deactivateButton.addClass('allow-deactivate');
                    DuplicatorModalShowPanel();
                }

                function DuplicatorModalEnableDeactivateButton() {
                    $modal.find('.duplicator-modal-button-deactivate').removeClass('disabled');
                }

                function DuplicatorModalDisableDeactivateButton() {
                    $modal.find('.duplicator-modal-button-deactivate').addClass('disabled');
                }

                function DuplicatorModalShowPanel() {
                    $modal.find('.duplicator-modal-panel').addClass('active');
                    /* Update the deactivate button's text */
                    //$modal.find('.duplicator-modal-button-deactivate').text('<?php _e('Skip & Deactivate', 'duplicator'); ?>');
                    //$modal.find('.duplicator-modal-button-skip, .duplicator-modal-resp-msg').css('display', 'none');
                }
            })(jQuery);
        </script>
        <?php
    }
}

/**
 * Called after the user has submitted his reason for deactivating the plugin.
 *
 */
if (!function_exists('duplicator_submit_uninstall_reason_action')) {

    function duplicator_submit_uninstall_reason_action()
    {
        DUP_Handler::init_error_handler();

        $isValid   = true;
        $inputData = filter_input_array(INPUT_POST, array(
            'reason_id' => array(
                'filter'  => FILTER_UNSAFE_RAW,
                'flags'   => FILTER_REQUIRE_SCALAR,
                'options' => array(
                    'default' => false
                )
            ),
            'plugin' => array(
                'filter'  => FILTER_UNSAFE_RAW,
                'flags'   => FILTER_REQUIRE_SCALAR,
                'options' => array(
                    'default' => false
                )
            ),
            'reason_info' => array(
                'filter'  => FILTER_UNSAFE_RAW,
                'flags'   => FILTER_REQUIRE_SCALAR,
                'options' => array(
                    'default' => ''
                )
            )
        ));

        $reason_id = $inputData['reason_id'];
        $basename  = $inputData['plugin'];

        if (!$reason_id || !$basename) {
            $isValid = false;
        }

        try {
            if (!wp_verify_nonce($_POST['duplicator_ajax_nonce'], 'duplicator_ajax_nonce')) {
                throw new Exception(__('Security issue', 'duplicator'));
            }

            DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

            if (!$isValid) {
                throw new Exception(__('Invalid Request.', 'duplicator'));
            }

            $reason_info = isset($_REQUEST['reason_info']) ? stripcslashes(esc_html($_REQUEST['reason_info'])) : '';
            if (!empty($reason_info)) {
                $reason_info = substr($reason_info, 0, 255);
            }

            $options = array(
                'product' => $basename,
                'reason_id' => $reason_id,
                'reason_info' => $reason_info,
            );

            /* send data */
            $raw_response = wp_remote_post('https://snapcreekanalytics.com/wp-content/plugins/duplicator-statistics-plugin/deactivation-feedback/',
                array(
                    'method' => 'POST',
                    'body' => $options,
                    'timeout' => 15,
                    // 'sslverify' => FALSE
                ));

            if (!is_wp_error($raw_response) && 200 == wp_remote_retrieve_response_code($raw_response)) {
                echo 'done';
            } else {
                $error_msg = $raw_response->get_error_code().': '.$raw_response->get_error_message();
                error_log($error_msg);
                throw new Exception($error_msg);
            }
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
        exit;
    }
}

add_action('wp_ajax_duplicator_submit_uninstall_reason_action', 'duplicator_submit_uninstall_reason_action');
ctrls/ctrl.base.php000064400000007435151336065400010275 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

require_once(DUPLICATOR_PLUGIN_PATH.'/classes/utilities/class.u.php');

//Enum used to define the various test statues
final class DUP_CTRL_Status
{
	const ERROR		= -2;
	const FAILED	= -1;
	const UNDEFINED	= 0;
	const SUCCESS	= 1;
}

/**
 * Base class for all controllers
 *
 * @package Duplicator
 * @subpackage classes/ctrls
 */
class DUP_CTRL_Base
{
	//Represents the name of the Nonce Action
	public $Action;
	//The return type valiad options: PHP, JSON-AJAX, JSON
	public $returnType = 'JSON-AJAX';

	public function setResponseType($type)
	{
		$opts = array('PHP', 'JSON-AJAX', 'JSON');
		if (!in_array($type, $opts)) {
			throw new Exception('The $type param must be one of the following: '.implode(',', $opts).' for the following function ['.__FUNCTION__.']');
		}
		$this->returnType = $type;
	}

}

/**
 * A class structer used to report on controller methods
 *
 * @package Duplicator
 * @subpackage classes/ctrls
 */
class DUP_CTRL_Report
{
	//Properties
	public $runTime;
	public $returnType;
	public $results;
	public $status;

}

/**
 * A class used format all controller responses in a consistent format.  Every controller response will
 * have a Report and Payload structer.  The Payload is an array of the result response.  The Report is used
 * report on the overall status of the controller method
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @subpackage classes/ctrls
 * @copyright (c) 2017, Snapcreek LLC
 *
 */
class DUP_CTRL_Result
{
	//Properties
	public $report;
	public $payload;
	private $timeStart;
	private $timeEnd;
	private $CTRL;

	function __construct(DUP_CTRL_Base $CTRL_OBJ)
	{
		DUP_Util::hasCapability('export');
		$this->timeStart = $this->microtimeFloat();
		$this->CTRL		 = $CTRL_OBJ;

		//Report Data
		$this->report				 = new DUP_CTRL_Report();
		$this->report->returnType	 = $CTRL_OBJ->returnType;
	}

	/**
	 * Used to process a controller request
	 *
	 * @param object $payload The response object that will be returned
	 * @param enum $test The status of a response
	 *
	 * @return object || JSON  Returns a PHP object or json encoded object
	 */
	public function process($payload, $test = DUP_CTRL_Status::UNDEFINED)
	{
		if (is_array($this->payload)) {
			$this->payload[]		 = $payload;
			$this->report->results	 = count($this->payload);
		} else {
			$this->payload			 = $payload;
			$this->report->results	 = (is_array($payload)) ? count($payload) : 1;
		}

		$this->report->status = $test;
		$this->getProcessTime();

		switch ($this->CTRL->returnType) {
			case 'JSON' :
				return DupLiteSnapJsonU::wp_json_encode($this);
				break;
			case 'PHP' :
				return $this;
				break;
			default:
                wp_send_json($this);
				break;
		}
	}

	/**
	 * Used to process an error response
	 *
	 * @param object $exception The PHP exception object
	 *
	 * @return object || JSON  Returns a PHP object or json encoded object
	 */
	public function processError($exception)
	{
		$payload			 = array();
		$payload['Message']	 = $exception->getMessage();
		$payload['File']	 = $exception->getFile();
		$payload['Line']	 = $exception->getLine();
		$payload['Trace']	 = $exception->getTraceAsString();
		$this->process($payload, DUP_CTRL_Status::ERROR);
		die(DupLiteSnapJsonU::wp_json_encode($this));
	}

	private function getProcessTime()
	{
		$this->timeEnd			 = $this->microtimeFloat();
		$this->report->runTime	 = $this->timeEnd - $this->timeStart;
	}

	private function microtimeFloat()
	{
		list($usec, $sec) = explode(" ", microtime());
		return ((float) $usec + (float) $sec);
	}
}ctrls/class.web.services.php000064400000017060151336065400012116 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUP_Web_Services
{

    /**
     * init ajax actions
     */
    public static function init()
    {
        add_action('wp_ajax_duplicator_reset_all_settings', array(__CLASS__, 'ajax_reset_all'));
        add_action('wp_ajax_duplicator_set_admin_notice_viewed', array(__CLASS__, 'set_admin_notice_viewed'));
        add_action('wp_ajax_duplicator_admin_notice_to_dismiss', array(__CLASS__, 'admin_notice_to_dismiss'));
        add_action('wp_ajax_duplicator_download_installer', array(__CLASS__, 'duplicator_download_installer'));
    }

    /**
     *
     * @param DUP_Package $package
     */
    public static function package_delete_callback($package)
    {
        $package->delete();
    }

    /**
     * reset all ajax action
     *
     * the output must be json
     */
    public static function ajax_reset_all()
    {
        ob_start();
        try {
            DUP_Handler::init_error_handler();

            if (!check_ajax_referer('duplicator_reset_all_settings', 'nonce', false)) {
                DUP_LOG::Trace('Security issue');
                throw new Exception('Security issue');
            }
            DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

            /** Execute function * */
            $error  = false;
            $result = array(
                'data'    => array(),
                'html'    => '',
                'message' => ''
            );

            DUP_Package::by_status_callback(array(__CLASS__, 'package_delete_callback'), array(
                array('op' => '<', 'status' => DUP_PackageStatus::COMPLETE)
            ));

            /** reset active package id * */
            DUP_Settings::Set('active_package_id', -1);
            DUP_Settings::Save();

            /** Clean tmp folder * */
            DUP_Package::not_active_files_tmp_cleanup();

            //throw new Exception('force error test');
        }
        catch (Exception $e) {
            $error             = true;
            $result['message'] = $e->getMessage();
        }

        /** Intercept output * */
        $result['html'] = ob_get_clean();

        /** check error and return json * */
        if ($error) {
            wp_send_json_error($result);
        } else {
            wp_send_json_success($result);
        }
    }

    public static function duplicator_download_installer()
    {
        check_ajax_referer('duplicator_download_installer', 'nonce');

        $isValid   = true;
        $inputData = filter_input_array(INPUT_GET, array(
            'id'   => array(
                'filter'  => FILTER_VALIDATE_INT,
                'flags'   => FILTER_REQUIRE_SCALAR,
                'options' => array(
                    'default' => false
                )
            ),
            'hash' => array(
                'filter'  => FILTER_UNSAFE_RAW,
                'flags'   => FILTER_REQUIRE_SCALAR,
                'options' => array(
                    'default' => false
                )
            )
        ));

        $packageId = $inputData['id'];
        $hash      = $inputData['hash'];

        if (!$packageId || !$hash) {
            $isValid = false;
        }

        try {
            DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

            if (!$isValid) {
                throw new Exception(__("Invalid request"));
            }

            if (($package = DUP_Package::getByID($packageId)) == null) {
                throw new Exception(__("Invalid request."));
            }

            if ($hash !== $package->Hash) {
                throw new Exception(__("Invalid request."));
            }

            $fileName = $package->getInstDownloadName();
            $filepath = DUP_Settings::getSsdirPath().'/'.$package->Installer->File;

            // Process download
            if (!file_exists($filepath)) {
                throw new Exception(__("Invalid request."));
            }

            // Clean output buffer
            if (ob_get_level() !== 0 && @ob_end_clean() === FALSE) {
                @ob_clean();
            }

            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename="'.$fileName.'"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: '.filesize($filepath));
            flush(); // Flush system output buffer

            try {
                $fp = @fopen($filepath, 'r');
                if (false === $fp) {
                    throw new Exception('Fail to open the file '.$filepath);
                }
                while (!feof($fp) && ($data = fread($fp, DUPLICATOR_BUFFER_READ_WRITE_SIZE)) !== FALSE) {
                    echo $data;
                }
                @fclose($fp);
            }
            catch (Exception $e) {
                readfile($filepath);
            }
            exit;
        }
        catch (Exception $ex) {
            //Prevent brute force
            sleep(2);
            wp_die($ex->getMessage());
        }
    }

    public static function set_admin_notice_viewed()
    {
        DUP_Handler::init_error_handler();

        try{
            DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

            if (!wp_verify_nonce($_REQUEST['nonce'], 'duplicator_set_admin_notice_viewed')) {
                DUP_Log::trace(__('Security issue', 'duplicator'));
                throw new Exception('Security issue');
            }

            $notice_id = DupLiteSnapLibUtil::filterInputRequest('notice_id', FILTER_UNSAFE_RAW);

            if (empty($notice_id)) {
                throw new Exception(__('Invalid Request', 'duplicator'));
            }

            $notices = get_user_meta(get_current_user_id(), DUPLICATOR_ADMIN_NOTICES_USER_META_KEY, true);
            if (empty($notices)) {
                $notices = array();
            }

            if (!isset($notices[$notice_id])) {
                throw new Exception(__("Notice with that ID doesn't exist.", 'duplicator'));
            }

            $notices[$notice_id] = 'true';
            update_user_meta(get_current_user_id(), DUPLICATOR_ADMIN_NOTICES_USER_META_KEY, $notices);
        }
        catch (Exception $ex) {
            wp_die($ex->getMessage());
        }
    }

    public static function admin_notice_to_dismiss()
    {
        try {
            DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

            $nonce = filter_input(INPUT_POST, 'nonce', FILTER_UNSAFE_RAW);
            if (!wp_verify_nonce($nonce, 'duplicator_admin_notice_to_dismiss')) {
                DUP_Log::trace('Security issue');
                throw new Exception('Security issue');
            }

            $noticeToDismiss = filter_input(INPUT_POST, 'notice', FILTER_UNSAFE_RAW);
            switch ($noticeToDismiss) {
                case DUP_UI_Notice::OPTION_KEY_ACTIVATE_PLUGINS_AFTER_INSTALL:
                case DUP_UI_Notice::OPTION_KEY_NEW_NOTICE_TEMPLATE:
                    delete_option($noticeToDismiss);
                    break;
                case DUP_UI_Notice::OPTION_KEY_IS_PRO_ENABLE_NOTICE_DISMISSED:
                case DUP_UI_Notice::OPTION_KEY_IS_MU_NOTICE_DISMISSED:
                    update_option($noticeToDismiss, true);
                    break;
                default:
                    throw new Exception('Notice invalid');
            }
        }
        catch (Exception $e) {
            wp_send_json_error($e->getMessage());
        }

        wp_send_json_success();
    }
}
ctrls/ctrl.ui.php000064400000012044151336065400007770 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

require_once(DUPLICATOR_PLUGIN_PATH . '/ctrls/ctrl.base.php'); 
require_once(DUPLICATOR_PLUGIN_PATH . '/classes/ui/class.ui.viewstate.php');

/**
 * Controller for Tools 
 * @package Duplicator\ctrls
 */
class DUP_CTRL_UI extends DUP_CTRL_Base
{	 
	
	function __construct() 
	{
		add_action('wp_ajax_DUP_CTRL_UI_SaveViewState',	      array($this,	  'SaveViewState'));
	}


	/** 
     * Calls the SaveViewState and returns a JSON result
	 * 
	 * @param string $_POST['key']		A unique key that identifies the state of the UI element
	 * @param bool   $_POST['value']	The value to store for the state of the UI element
	 * 
	 * @notes: Testing: See Testing Interface
	 * URL = /wp-admin/admin-ajax.php?action=DUP_CTRL_UI_SaveViewState
	 * 
	 * <code>
	 * //JavaScript Ajax Request
	 * Duplicator.UI.SaveViewState('dup-pack-archive-panel', 1);
	 * 
	 * //Call PHP Code
	 * $view_state       = DUP_UI_ViewState::getValue('dup-pack-archive-panel');
	 * $ui_css_archive   = ($view_state == 1)   ? 'display:block' : 'display:none';
	 * </code>
     */
    public function SaveViewState()
    {
        DUP_Handler::init_error_handler();
        check_ajax_referer('DUP_CTRL_UI_SaveViewState', 'nonce');
        DUP_Util::hasCapability('export');

        $payload = array(
            'success' => false,
            'message' => '',
            'key'     => '',
            'value'   => ''
        );
        $isValid = true;

        $inputData = filter_input_array(INPUT_POST, array(
            'states' => array(
                'filter'  => FILTER_UNSAFE_RAW,
                'flags'   => FILTER_FORCE_ARRAY,
                'options' => array(
                    'default' => array()
                )
            ),
            'key'    => array(
                'filter'  => FILTER_UNSAFE_RAW,
                'options' => array(
                    'default' => false
                )
            ),
            'value'  => array(
                'filter'  => FILTER_UNSAFE_RAW,
                'options' => array(
                    'default' => false
                )
            )
        ));

        if (is_array($inputData) && is_array($inputData['states'])) {
            foreach ($inputData['states'] as $index => $state) {
                $filteredState = filter_var_array($state, array(
                    'key'   => array(
                        'filter'  => FILTER_UNSAFE_RAW,
                        'options' => array(
                            'default' => false
                        )
                    ),
                    'value' => array(
                        'filter'  => FILTER_UNSAFE_RAW,
                        'options' => array(
                            'default' => false
                        )
                    )
                ));

                if ($filteredState['key'] === false && $filteredState['value']) {
                    $isValid = false;
                    break;
                }
                $inputData['states'][$index] = $filteredState;
            }
        }

        if ($inputData['key'] === false || $inputData['value'] === false) {
            $isValid = false;
        }

        $result = new DUP_CTRL_Result($this);
        try {
            if (!$isValid) {
                throw new Exception(__('Invalid Request.', 'duplicator'));
            }

            if (!empty($inputData['states'])) {
                $view_state = DUP_UI_ViewState::getArray();
                $last_key   = '';
                foreach ($inputData['states'] as $state) {
                    $view_state[$state['key']] = $state['value'];
                    $last_key                  = $state['key'];
                }
                $payload['success'] = DUP_UI_ViewState::setArray($view_state);
                $payload['key']     = esc_html($last_key);
                $payload['value']   = esc_html($view_state[$last_key]);
            } else {
                $payload['success'] = DUP_UI_ViewState::save($inputData['key'], $inputData['value']);
                $payload['key']     = esc_html($inputData['key']);
                $payload['value']   = esc_html($inputData['value']);
            }

            //RETURN RESULT
            $test = ($payload['success'])
                ? DUP_CTRL_Status::SUCCESS
                : DUP_CTRL_Status::FAILED;
            return $result->process($payload, $test);
        } catch (Exception $exc) {
            $result->processError($exc);
        }
    }
	
	/** 
   * Returns a JSON list of all saved view state items
	 *
	 * 
	 * <code>
	 *	See SaveViewState()
	 * </code>
     */
	public function GetViewStateList() 
	{
		$result = new DUP_CTRL_Result($this);
		
		try 
		{
			//CONTROLLER LOGIC
			$payload = DUP_UI_ViewState::getArray();
			
			//RETURN RESULT
			$test = (is_array($payload) && count($payload))
					? DUP_CTRL_Status::SUCCESS
					: DUP_CTRL_Status::FAILED;
			return $result->process($payload, $test);
		} 
		catch (Exception $exc) 
		{
			$result->processError($exc);
		}
  }	
}
ctrls/ctrl.package.php000064400000041261151336065400010751 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (!defined('DUPLICATOR_VERSION'))
    exit;

require_once(DUPLICATOR_PLUGIN_PATH.'/ctrls/ctrl.base.php');
require_once(DUPLICATOR_PLUGIN_PATH.'/classes/utilities/class.u.scancheck.php');
require_once(DUPLICATOR_PLUGIN_PATH.'/classes/utilities/class.u.json.php');
require_once(DUPLICATOR_PLUGIN_PATH.'/classes/package/class.pack.php');

require_once(DUPLICATOR_PLUGIN_PATH.'/classes/package/duparchive/class.pack.archive.duparchive.state.create.php');
require_once(DUPLICATOR_PLUGIN_PATH.'/classes/package/duparchive/class.pack.archive.duparchive.php');
/* @var $package DUP_Package */

/**
 * Display error if any fatal error occurs occurs while scan ajax call
 *
 * @return void
 */
function duplicator_package_scan_shutdown()
{
    $logMessage = DUP_Handler::getVarLog();
    if (!empty($logMessage)) {
        echo nl2br($logMessage);
    }
}

/**
 *  DUPLICATOR_PACKAGE_SCAN
 *  Returns a JSON scan report object which contains data about the system
 *
 *  @return json   JSON report object
 *  @example	   to test: /wp-admin/admin-ajax.php?action=duplicator_package_scan
 */
function duplicator_package_scan()
{
    DUP_Handler::init_error_handler();
    DUP_Handler::setMode(DUP_Handler::MODE_VAR);
    register_shutdown_function('duplicator_package_scan_shutdown');

    check_ajax_referer('duplicator_package_scan', 'nonce');
    DUP_Util::hasCapability('export');

    header('Content-Type: application/json;');
    @ob_flush();

    @set_time_limit(0);
    $errLevel = error_reporting();
    error_reporting(E_ERROR);
    DUP_Util::initSnapshotDirectory();

    $package = DUP_Package::getActive();
    $report  = $package->runScanner();

    $package->saveActiveItem('ScanFile', $package->ScanFile);
    $json_response = DUP_JSON::safeEncode($report);

    DUP_Package::tempFileCleanup();
    error_reporting($errLevel);
    die($json_response);
}

/**
 *  duplicator_package_build
 *  Returns the package result status
 *
 *  @return json   JSON object of package results
 */
function duplicator_package_build()
{
    DUP_Handler::init_error_handler();

    check_ajax_referer('duplicator_package_build', 'nonce');

    header('Content-Type: application/json');

    $Package = null;

    try {
        DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

        @set_time_limit(0);
        $errLevel = error_reporting();
        error_reporting(E_ERROR);
        DUP_Util::initSnapshotDirectory();

        $Package = DUP_Package::getActive();
        $Package->save('zip');

        DUP_Settings::Set('active_package_id', $Package->ID);
        DUP_Settings::Save();

        if (!is_readable(DUP_Settings::getSsdirTmpPath()."/{$Package->ScanFile}")) {
            die("The scan result file was not found.  Please run the scan step before building the package.");
        }

        $Package->runZipBuild();

        //JSON:Debug Response
        //Pass = 1, Warn = 2, Fail = 3
        $json                     = array();
        $json['status']           = 1;
        $json['error']            = '';
        $json['package']          = $Package;
        $json['instDownloadName'] = $Package->getInstDownloadName();
        $json['runtime']          = $Package->Runtime;
        $json['exeSize']          = $Package->ExeSize;
        $json['archiveSize']      = $Package->ZipSize;

        //Simulate a Host Build Interrupt
        //die(0);
    }
    catch (Exception $e) {
        $Package->setStatus(DUP_PackageStatus::ERROR);

        //JSON:Debug Response
        //Pass = 1, Warn = 2, Fail = 3
        $json                     = array();
        $json['status']           = 3;
        $json['error']            = $e->getMessage();
        $json['package']          = $Package;
        $json['instDownloadName'] = null;
        $json['runtime']          = null;
        $json['exeSize']          = null;
        $json['archiveSize']      = null;
    }
    $json_response = DupLiteSnapJsonU::wp_json_encode($json);

    error_reporting($errLevel);
    die($json_response);
}

/**
 *  Returns the package result status
 *
 *  @return json   JSON object of package results
 */
function duplicator_duparchive_package_build()
{
    DUP_Handler::init_error_handler();
    DUP_Log::Info('[CTRL DUP ARCIVE] CALL TO '.__FUNCTION__);

    check_ajax_referer('duplicator_duparchive_package_build', 'nonce');
    DUP_Util::hasCapability('export');
    header('Content-Type: application/json');

    @set_time_limit(0);
    $errLevel = error_reporting();
    error_reporting(E_ERROR);

    // The DupArchive build process always works on a saved package so the first time through save the active package to the package table.
    // After that, just retrieve it.
    $active_package_id = DUP_Settings::Get('active_package_id');
    DUP_Log::Info('[CTRL DUP ARCIVE] CURRENT PACKAGE ACTIVE '.$active_package_id);

    if ($active_package_id == -1) {
        $package = DUP_Package::getActive();
        $package->save('daf');
        DUP_Log::Info('[CTRL DUP ARCIVE] PACKAGE AS NEW ID '.$package->ID.' SAVED | STATUS:'.$package->Status);
        //DUP_Log::TraceObject("[CTRL DUP ARCIVE] PACKAGE SAVED:", $package);
        DUP_Settings::Set('active_package_id', $package->ID);
        DUP_Settings::Save();
    } else {
        if (($package = DUP_Package::getByID($active_package_id)) == null) {
            DUP_Log::Info('[CTRL DUP ARCIVE] ERROR: Get package by id '.$active_package_id.' FAILED');
            die('Get package by id '.$active_package_id.' FAILED');
        }
        DUP_Log::Info('[CTRL DUP ARCIVE] PACKAGE GET BY ID '.$active_package_id.' | STATUS:'.$package->Status);
        // DUP_Log::TraceObject("getting active package by id {$active_package_id}", $package);
    }

    if (!is_readable(DUP_Settings::getSsdirTmpPath()."/{$package->ScanFile}")) {
        DUP_Log::Info('[CTRL DUP ARCIVE] ERROR: The scan result file was not found.  Please run the scan step before building the package.');
        die("The scan result file was not found.  Please run the scan step before building the package.");
    }

    if ($package === null) {
        DUP_Log::Info('[CTRL DUP ARCIVE] There is no active package.');
        die("There is no active package.");
    }

    if ($package->Status == DUP_PackageStatus::ERROR) {
        $package->setStatus(DUP_PackageStatus::ERROR);
        $hasCompleted = true;
    } else {
        try {
            $hasCompleted = $package->runDupArchiveBuild();
        }
        catch (Exception $ex) {
            DUP_Log::Info('[CTRL DUP ARCIVE] ERROR: caught exception');
            Dup_Log::error('[CTRL DUP ARCIVE]  Caught exception', $ex->getMessage(), Dup_ErrorBehavior::LogOnly);
            DUP_Log::Info('[CTRL DUP ARCIVE] ERROR: after log');
            $package->setStatus(DUP_PackageStatus::ERROR);
            $hasCompleted = true;
        }
    }

    $json             = array();
    $json['failures'] = array_merge($package->BuildProgress->build_failures, $package->BuildProgress->validation_failures);
    if (!empty($json['failures'])) {
        DUP_Log::Info('[CTRL DUP ARCIVE] FAILURES '. print_r($json['failures'], true));
    }

    //JSON:Debug Response
    //Pass = 1, Warn = 2, 3 = Failure, 4 = Not Done
    if ($hasCompleted) {
        DUP_Log::Info('[CTRL DUP ARCIVE] COMPLETED PACKAGE STATUS: '.$package->Status);

        if ($package->Status == DUP_PackageStatus::ERROR) {
            DUP_Log::Info('[CTRL DUP ARCIVE] ERROR');
            $error_message = __('Error building DupArchive package').'<br/>';

            foreach ($json['failures'] as $failure) {
                $error_message .= implode(',', $failure->description);
            }

            Dup_Log::error("Build failed so sending back error", esc_html($error_message), Dup_ErrorBehavior::LogOnly);
            DUP_Log::Info('[CTRL DUP ARCIVE] ERROR AFTER LOG 2');

            $json['status'] = 3;
        } else {
            Dup_Log::Info("sending back success status");
            $json['status'] = 1;
        }

        Dup_Log::Trace('#### json package');
        $json['package']          = $package;
        $json['instDownloadName'] = $package->getInstDownloadName();
        $json['runtime']          = $package->Runtime;
        $json['exeSize']          = $package->ExeSize;
        $json['archiveSize']      = $package->ZipSize;
        DUP_Log::Trace('[CTRL DUP ARCIVE] JSON PACKAGE');
    } else {
        DUP_Log::Info('[CTRL DUP ARCIVE] sending back continue status PACKAGE STATUS: '.$package->Status);
        $json['status'] = 4;
    }

    $json_response = DupLiteSnapJsonU::wp_json_encode($json);

    Dup_Log::TraceObject('json response', $json_response);
    error_reporting($errLevel);
    die($json_response);
}

/**
 *  DUPLICATOR_PACKAGE_DELETE
 *  Deletes the files and database record entries
 *
 *  @return json   A JSON message about the action.
 * 				   Use console.log to debug from client
 */
function duplicator_package_delete()
{
    DUP_Handler::init_error_handler();
    check_ajax_referer('duplicator_package_delete', 'nonce');

    $json        = array(
        'success' => false,
        'message' => ''
    );
    $package_ids = filter_input(INPUT_POST, 'package_ids', FILTER_VALIDATE_INT, array(
        'flags'   => FILTER_REQUIRE_ARRAY,
        'options' => array(
            'default' => false
        )
    ));
    $delCount    = 0;

    try {
        DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

        if ($package_ids === false || in_array(false, $package_ids)) {
            throw new Exception('Invalid Request.', 'duplicator');
        }

        foreach ($package_ids as $id) {
            $package = DUP_Package::getByID($id);

            if ($package === null) {
                throw new Exception('Invalid Request.', 'duplicator');
            }

            $package->delete();
            $delCount++;
        }

        $json['success'] = true;
        $json['ids']     = $package_ids;
        $json['removed'] = $delCount;
    }
    catch (Exception $ex) {
        $json['message'] = $ex->getMessage();
    }

    die(DupLiteSnapJsonU::wp_json_encode($json));
}

/**
 *  Active package info
 *  Returns a JSON scan report active package info or
 *  active_package_present == false if no active package is present.
 *
 *  @return json
 */
function duplicator_active_package_info()
{
    ob_start();
    try {
        DUP_Handler::init_error_handler();
        DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

        if (!check_ajax_referer('duplicator_active_package_info', 'nonce', false)) {
            throw new Exception(__('An unauthorized security request was made to this page. Please try again!', 'duplicator'));
        }

        global $wpdb;

        $error  = false;
        $result = array(
            'active_package' => array(
                'present' => false,
                'status'  => 0,
                'size'    => 0
            ),
            'html'           => '',
            'message'        => ''
        );

        $result['active_package']['present'] = DUP_Package::is_active_package_present();

        if ($result['active_package']['present']) {
            $id      = DUP_Settings::Get('active_package_id');
            $package = DUP_Package::getByID($id);
            if (is_null($package)) {
                throw new Exception(__('Active package object error', 'duplicator'));
            }
            $result['active_package']['status']      = $package->Status;
            $result['active_package']['size']        = $package->getArchiveSize();
            $result['active_package']['size_format'] = DUP_Util::byteSize($package->getArchiveSize());
        }
    }
    catch (Exception $e) {
        $error             = true;
        $result['message'] = $e->getMessage();
    }

    $result['html'] = ob_get_clean();
    if ($error) {
        wp_send_json_error($result);
    } else {
        wp_send_json_success($result);
    }
}

/**
 * Controller for Tools
 * @package Duplicator\ctrls
 */
class DUP_CTRL_Package extends DUP_CTRL_Base
{

    /**
     *  Init this instance of the object
     */
    function __construct()
    {
        add_action('wp_ajax_DUP_CTRL_Package_addQuickFilters', array($this, 'addQuickFilters'));
        add_action('wp_ajax_DUP_CTRL_Package_getPackageFile', array($this, 'getPackageFile'));
        add_action('wp_ajax_DUP_CTRL_Package_getActivePackageStatus', array($this, 'getActivePackageStatus'));
    }

    /**
     * Removed all reserved installer files names
     *
     * @param string $_POST['dir_paths']		A semi-colon separated list of directory paths
     *
     * @return string	Returns all of the active directory filters as a ";" separated string
     */
    public function addQuickFilters()
    {
        DUP_Handler::init_error_handler();
        check_ajax_referer('DUP_CTRL_Package_addQuickFilters', 'nonce');

        $result = new DUP_CTRL_Result($this);

        $inputData = filter_input_array(INPUT_POST, array(
                'dir_paths' => array(
                    'filter'  => FILTER_DEFAULT,
                    'flags'   => FILTER_REQUIRE_SCALAR,
                    'options' => array(
                        'default' => ''
                    )
                ),
                'file_paths' => array(
                    'filter'  => FILTER_DEFAULT,
                    'flags'   => FILTER_REQUIRE_SCALAR,
                    'options' => array(
                        'default' => ''
                    )
                ),
            )
        );

        try {
            DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

            //CONTROLLER LOGIC
            $package = DUP_Package::getActive();

            //DIRS
            $dir_filters = ($package->Archive->FilterOn) ? $package->Archive->FilterDirs.';'.$inputData['dir_paths'] : $inputData['dir_paths'];
            $dir_filters = $package->Archive->parseDirectoryFilter($dir_filters);
            $changed     = $package->Archive->saveActiveItem($package, 'FilterDirs', $dir_filters);

            //FILES
            $file_filters = ($package->Archive->FilterOn) ? $package->Archive->FilterFiles.';'.$inputData['file_paths'] : $inputData['file_paths'];
            $file_filters = $package->Archive->parseFileFilter($file_filters);
            $changed      = $package->Archive->saveActiveItem($package, 'FilterFiles', $file_filters);

            if (!$package->Archive->FilterOn && !empty($package->Archive->FilterExts)) {
                $changed = $package->Archive->saveActiveItem($package, 'FilterExts', '');
            }

            $changed = $package->Archive->saveActiveItem($package, 'FilterOn', 1);

            //Result
            $package              = DUP_Package::getActive();
            $payload['dirs-in']   = esc_html(sanitize_text_field($inputData['dir_paths']));
            $payload['dir-out']   = esc_html($package->Archive->FilterDirs);
            $payload['files-in']  = esc_html(sanitize_text_field($inputData['file_paths']));
            $payload['files-out'] = esc_html($package->Archive->FilterFiles);

            //RETURN RESULT
            $test = ($changed) ? DUP_CTRL_Status::SUCCESS : DUP_CTRL_Status::FAILED;
            $result->process($payload, $test);
        }
        catch (Exception $exc) {
            $result->processError($exc);
        }
    }

    /**
     * Get active package status
     *
     * <code>
     * //JavaScript Ajax Request
     * Duplicator.Package.getActivePackageStatus()
     * </code>
     */
    public function getActivePackageStatus()
    {
        DUP_Handler::init_error_handler();
        check_ajax_referer('DUP_CTRL_Package_getActivePackageStatus', 'nonce');

        $result = new DUP_CTRL_Result($this);

        try {
            DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);
            //CONTROLLER LOGIC
            $active_package_id = DUP_Settings::Get('active_package_id');
            $package           = DUP_Package::getByID($active_package_id);
            $payload           = array();

            if ($package != null) {
                $test              = DUP_CTRL_Status::SUCCESS;
                $payload['status'] = $package->Status;
            } else {
                $test = DUP_CTRL_Status::FAILED;
            }

            //RETURN RESULT
            return $result->process($payload, $test);
        }
        catch (Exception $exc) {
            $result->processError($exc);
        }
    }
}ctrls/index.php000064400000000016151336065400007513 0ustar00<?php
//silentctrls/ctrl.tools.php000064400000010444151336065400010515 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;

require_once(DUPLICATOR_PLUGIN_PATH . '/ctrls/ctrl.base.php'); 
require_once(DUPLICATOR_PLUGIN_PATH . '/classes/utilities/class.u.scancheck.php');

/**
 * Controller for Tools 
 * @package Duplicator\ctrls
 */
class DUP_CTRL_Tools extends DUP_CTRL_Base
{	 
	/**
     *  Init this instance of the object
     */
	function __construct() 
	{
		add_action('wp_ajax_DUP_CTRL_Tools_runScanValidator', array($this, 'runScanValidator'));
        add_action('wp_ajax_DUP_CTRL_Tools_getTraceLog', array($this, 'getTraceLog'));
	}

    /**
     * Calls the ScanValidator and returns a JSON result
     *
     * @notes: Testing = /wp-admin/admin-ajax.php?action=DUP_CTRL_Tools_runScanValidator
     */
    public function runScanValidator()
    {
        DUP_Handler::init_error_handler();
        check_ajax_referer('DUP_CTRL_Tools_runScanValidator', 'nonce');

        @set_time_limit(0);

        $isValid   = true;
        $inputData = filter_input_array(INPUT_POST, array(
            'recursive_scan' => array(
                'filter'  => FILTER_VALIDATE_BOOLEAN,
                'flags'   => FILTER_NULL_ON_FAILURE
            )
        ));

        if (is_null($inputData['recursive_scan'])) {
            $isValid = false;
        }

        $result = new DUP_CTRL_Result($this);
        try {
            DUP_Util::hasCapability('export', DUP_Util::SECURE_ISSUE_THROW);

            if (!$isValid) {
                throw new Exception(__('Invalid Request.', 'duplicator'));
            }
            //CONTROLLER LOGIC
            $path = duplicator_get_abs_path();
            if (!is_dir($path)) {
                throw new Exception("Invalid directory provided '{$path}'!");
            }

            $scanner            = new DUP_ScanCheck();
            $scanner->recursion = $inputData['recursive_scan'];
            $payload            = $scanner->run($path);

            //RETURN RESULT
            $test = ($payload->fileCount > 0)
                ? DUP_CTRL_Status::SUCCESS
                : DUP_CTRL_Status::FAILED;
            $result->process($payload, $test);
        } catch (Exception $exc) {
            $result->processError($exc);
        }
    }

    public function getTraceLog()
    {
        DUP_Log::Trace("enter");
        
        check_ajax_referer('DUP_CTRL_Tools_getTraceLog', 'nonce');
        Dup_Util::hasCapability('export');

        $file_path   = DUP_Log::GetTraceFilepath();
        $backup_path = DUP_Log::GetBackupTraceFilepath();
        $zip_path    = DUP_Settings::getSsdirPath()."/".DUPLICATOR_ZIPPED_LOG_FILENAME;
        $zipped      = DUP_Zip_U::zipFile($file_path, $zip_path, true, null, true);

        if ($zipped && file_exists($backup_path)) {
            $zipped = DUP_Zip_U::zipFile($backup_path, $zip_path, false, null, true);
        }

        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private", false);
        header("Content-Transfer-Encoding: binary");

        $fp = fopen($zip_path, 'rb');

        if (($fp !== false) && $zipped) {
            $zip_filename = basename($zip_path);

            header("Content-Type: application/octet-stream");
            header("Content-Disposition: attachment; filename=\"$zip_filename\";");

            // required or large files wont work
            if (ob_get_length()) {
                ob_end_clean();
            }

            DUP_Log::trace("streaming $zip_path");
            if (fpassthru($fp) === false) {
                DUP_Log::trace("Error with fpassthru for $zip_path");
            }

            fclose($fp);
            @unlink($zip_path);
        } else {
            header("Content-Type: text/plain");
            header("Content-Disposition: attachment; filename=\"error.txt\";");
            if ($zipped === false) {
                $message = "Couldn't create zip file.";
            } else {
                $message = "Couldn't open $file_path.";
            }
            DUP_Log::trace($message);
            echo esc_html($message);
        }

        exit;
    }
	
}
languages/duplicator.pot000064400000302177151336065400011421 0ustar00# Copyright (C) 2019 Snap Creek
# This file is distributed under the same license as the Duplicator plugin.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Duplicator 1.3.7\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/duplicator\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2019-09-02 12:30+0530\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"X-Generator: Poedit 2.2.3\n"
"X-Poedit-KeywordsList: __;_e;esc_html_e;esc_html__;_x;_ex;esc_attr_e;esc_attr__\n"
"X-Poedit-Basepath: ..\n"
"X-Poedit-SearchPath-0: .\n"

#: classes/class.logging.php:141
msgid "No Log"
msgstr ""

#: classes/class.server.php:207
msgid "(directory)"
msgstr ""

#: classes/package/class.pack.database.php:663
msgid "Please contact your DataBase administrator to fix the error."
msgstr ""

#: classes/package/class.pack.installer.php:90
msgid "Error reading DupArchive mini expander"
msgstr ""

#: classes/package/class.pack.installer.php:103
msgid "Error writing installer contents"
msgstr ""

#: classes/package/class.pack.php:309
msgid "Package name can't be empty"
msgstr ""

#: classes/package/class.pack.php:315
#, php-format
msgid "Directories: <b>%1$s</b> isn't a valid path"
msgstr ""

#: classes/package/class.pack.php:321
#, php-format
msgid "File extension: <b>%1$s</b> isn't a valid extension"
msgstr ""

#: classes/package/class.pack.php:327
#, php-format
msgid "Files: <b>%1$s</b> isn't a valid file name"
msgstr ""

#: classes/package/class.pack.php:335
#, php-format
msgid "MySQL Server Host: <b>%1$s</b> isn't a valid host"
msgstr ""

#: classes/package/class.pack.php:346
#, php-format
msgid "MySQL Server Port: <b>%1$s</b> isn't a valid port"
msgstr ""

#: classes/package/class.pack.php:845
#, php-format
msgid "Can't find Scanfile %s. Please ensure there no non-English characters in the package or schedule name."
msgstr ""

#: classes/package/class.pack.php:868
#, php-format
msgid "EXPECTED FILE/DIRECTORY COUNT: %1$s"
msgstr ""

#: classes/package/class.pack.php:869
#, php-format
msgid "ACTUAL FILE/DIRECTORY COUNT: %1$s"
msgstr ""

#: classes/package/class.pack.php:913
#, php-format
msgid "ERROR: Cannot open created archive. Error code = %1$s"
msgstr ""

#: classes/package/class.pack.php:918
msgid "ERROR: Archive is not valid zip archive."
msgstr ""

#: classes/package/class.pack.php:922
msgid "ERROR: Archive doesn't pass consistency check."
msgstr ""

#: classes/package/class.pack.php:927
msgid "ERROR: Archive checksum is bad."
msgstr ""

#: classes/package/class.pack.php:938
msgid "ARCHIVE CONSISTENCY TEST: Pass"
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:44
msgid "Package build appears stuck so marking package as failed. Is the Max Worker Time set too high?."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:45
msgid "Build Failure"
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:83
msgid "Click on \"Resolve This\" button to fix the JSON settings."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:95
#, php-format
msgid "ERROR: Can't find Scanfile %s. Please ensure there no non-English characters in the package or schedule name."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:214
msgid "Problem adding items to archive."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:216
msgid "Problems adding items to archive."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:314
msgid "Critical failure present in validation"
msgstr ""

#: classes/ui/class.ui.dialog.php:95
msgid "Processing please wait..."
msgstr ""

#: classes/ui/class.ui.dialog.php:98
msgid "OK"
msgstr ""

#: classes/ui/class.ui.dialog.php:99 deactivation.php:135
msgid "Cancel"
msgstr ""

#: classes/ui/class.ui.notice.php:47
msgid "Safe Mode:"
msgstr ""

#: classes/ui/class.ui.notice.php:48
msgid "During the install safe mode was enabled deactivating all plugins.<br/> Please be sure to "
msgstr ""

#: classes/ui/class.ui.notice.php:49
msgid "re-activate the plugins"
msgstr ""

#: classes/ui/class.ui.notice.php:56
#: views/tools/diagnostics/information.php:158
msgid "This site has been successfully migrated!"
msgstr ""

#: classes/ui/class.ui.notice.php:57
msgid "Final step(s):"
msgstr ""

#: classes/ui/class.ui.notice.php:58
msgid "This message will be removed after all installer files are removed.  Installer files must be removed to maintain a secure site.  Click the link above or button below to remove all installer files and complete the migration."
msgstr ""

#: classes/ui/class.ui.notice.php:62
msgid "Remove Installation Files Now!"
msgstr ""

#: classes/ui/class.ui.notice.php:63
msgid "Optionally, Review Duplicator at WordPress.org..."
msgstr ""

#: classes/ui/class.ui.notice.php:69
msgid "Migration Almost Complete!"
msgstr ""

#: classes/ui/class.ui.notice.php:70
msgid "Reserved Duplicator installation files have been detected in the root directory.  Please delete these installation files to avoid security issues. <br/> Go to:Duplicator > Tools > Information >Stored Data and click the \"Remove Installation Files\" button"
msgstr ""

#: classes/ui/class.ui.notice.php:76
msgid "Take me there now!"
msgstr ""

#: classes/ui/class.ui.notice.php:91
msgid "Redirecting Please Wait..."
msgstr ""

#: classes/ui/class.ui.notice.php:94
msgid "Invalid token permissions to perform this request."
msgstr ""

#: classes/ui/class.ui.notice.php:117
#, php-format
msgid "Activate %s"
msgstr ""

#: classes/ui/class.ui.screen.base.php:44
msgid "<b>Need Help?</b>  Please check out these resources first:<ul>"
msgstr ""

#: classes/ui/class.ui.screen.base.php:52 views/settings/gopro.php:218
#: views/tools/diagnostics/main.php:45
msgid "Support"
msgstr ""

#: classes/ui/class.ui.screen.base.php:65
msgid "Resources"
msgstr ""

#: classes/ui/class.ui.screen.base.php:66
msgid "Knowledge Base"
msgstr ""

#: classes/ui/class.ui.screen.base.php:67
msgid "Full User Guide"
msgstr ""

#: classes/ui/class.ui.screen.base.php:68
msgid "Technical FAQs"
msgstr ""

#: classes/ui/class.ui.screen.base.php:69
msgid "Package Settings"
msgstr ""

#: classes/utilities/class.u.php:64
msgid "32-bit"
msgstr ""

#: classes/utilities/class.u.php:67
msgid "64-bit"
msgstr ""

#: classes/utilities/class.u.php:70
msgid "Unknown"
msgstr ""

#: classes/utilities/class.u.php:496
msgid "You do not have sufficient permissions to access this page."
msgstr ""

#: ctrls/ctrl.package.php:175
msgid "Error building DupArchive package"
msgstr ""

#: ctrls/ctrl.package.php:303
msgid "An unathorized security request was made to this page. Please try again!"
msgstr ""

#: ctrls/ctrl.package.php:325
msgid "Active package object error"
msgstr ""

#: ctrls/ctrl.package.php:488 ctrls/ctrl.package.php:506
msgid "Couldn't find a local copy of the file requested."
msgstr ""

#: deactivation.php:48
msgid "Need help? We are ready to answer your questions."
msgstr ""

#: deactivation.php:48
msgid "Contact Support"
msgstr ""

#: deactivation.php:53
msgid "It's not working on my server."
msgstr ""

#: deactivation.php:55
msgid "Kindly share what didn't work so we can fix it in future updates..."
msgstr ""

#: deactivation.php:60
msgid "It's too confusing to understand."
msgstr ""

#: deactivation.php:62
msgid "Please tell us what is not clear so that we can improve it."
msgstr ""

#: deactivation.php:67
msgid "I found a different plugin that I like better."
msgstr ""

#: deactivation.php:69
msgid "What's the plugin name?"
msgstr ""

#: deactivation.php:73
msgid "It does not do what I need."
msgstr ""

#: deactivation.php:75
msgid "What does it need to do?"
msgstr ""

#: deactivation.php:79
msgid "It's a temporary deactivation, I use the plugin all the time."
msgstr ""

#: deactivation.php:85
#, php-format
msgid "I'm switching over to the %s"
msgstr ""

#: deactivation.php:85
msgid "Pro version"
msgstr ""

#: deactivation.php:128
msgid "Quick Feedback"
msgstr ""

#: deactivation.php:129
msgid "If you have a moment, please let us know why you are deactivating"
msgstr ""

#: deactivation.php:136 deactivation.php:344
msgid "Skip & Deactivate"
msgstr ""

#: deactivation.php:137
msgid "Send & Deactivate"
msgstr ""

#: deactivation.php:140
msgid "Your response is sent anonymously."
msgstr ""

#: deactivation.php:235 deactivation.php:236
msgid "Processing"
msgstr ""

#: deactivation.php:283
msgid "Please tell us the reason so we can improve it."
msgstr ""

#: duplicator.php:398 views/packages/details/controller.php:48
#: views/packages/main/packages.php:88 views/packages/main/s1.setup1.php:72
#: views/packages/main/s2.scan1.php:185 views/packages/main/s3.build.php:90
#: views/settings/controller.php:23
msgid "Packages"
msgstr ""

#: duplicator.php:404 views/tools/controller.php:19
msgid "Tools"
msgstr ""

#: duplicator.php:409 views/packages/main/packages.php:85
#: views/settings/controller.php:19 views/settings/general.php:179
msgid "Settings"
msgstr ""

#: duplicator.php:413
msgid "Go Pro!"
msgstr ""

#: duplicator.php:481 views/settings/license.php:8
msgid "Manage"
msgstr ""

#: duplicator.php:498 views/packages/main/packages.php:82
msgid "Get Help"
msgstr ""

#: duplicator.php:498
msgid "Go Pro"
msgstr ""

#: views/packages/details/controller.php:13
msgid "package log"
msgstr ""

#: views/packages/details/controller.php:14
msgid "FAQ"
msgstr ""

#: views/packages/details/controller.php:15
msgid "resources page"
msgstr ""

#: views/packages/details/controller.php:34
msgid "This package contains an error.  Please review the "
msgstr ""

#: views/packages/details/controller.php:34
msgid " for details."
msgstr ""

#: views/packages/details/controller.php:35
msgid "For help visit the "
msgstr ""

#: views/packages/details/controller.php:35
msgid " and "
msgstr ""

#: views/packages/details/controller.php:42
msgid "Details"
msgstr ""

#: views/packages/details/controller.php:45
msgid "Transfer"
msgstr ""

#: views/packages/details/detail.php:63
msgid "Invalid Package ID request.  Please try again!"
msgstr ""

#: views/packages/details/detail.php:75 views/settings/controller.php:22
#: views/tools/diagnostics/inc.settings.php:29
msgid "General"
msgstr ""

#: views/packages/details/detail.php:81 views/packages/details/detail.php:184
#: views/packages/main/packages.php:138 views/packages/main/s1.setup2.php:73
#: views/packages/main/s1.setup2.php:99 views/packages/main/s2.scan3.php:529
#: views/packages/main/s3.build.php:133
msgid "Name"
msgstr ""

#: views/packages/details/detail.php:85
msgid "ID"
msgstr ""

#: views/packages/details/detail.php:86
msgid "Hash"
msgstr ""

#: views/packages/details/detail.php:87
msgid "Full Name"
msgstr ""

#: views/packages/details/detail.php:92 views/packages/main/s1.setup2.php:82
#: views/packages/main/s2.scan3.php:530
msgid "Notes"
msgstr ""

#: views/packages/details/detail.php:93
msgid "- no notes -"
msgstr ""

#: views/packages/details/detail.php:96
msgid "Versions"
msgstr ""

#: views/packages/details/detail.php:100 views/packages/main/s2.scan2.php:106
msgid "WordPress"
msgstr ""

#: views/packages/details/detail.php:100 views/packages/details/detail.php:101
#: views/packages/details/detail.php:103 views/packages/details/detail.php:104
#: views/packages/details/detail.php:118
msgid "- unknown -"
msgstr ""

#: views/packages/details/detail.php:101
msgid "PHP"
msgstr ""

#: views/packages/details/detail.php:102
msgid "Mysql"
msgstr ""

#: views/packages/details/detail.php:109
msgid "Runtime"
msgstr ""

#: views/packages/details/detail.php:110
msgid "error running"
msgstr ""

#: views/packages/details/detail.php:113
msgid "Status"
msgstr ""

#: views/packages/details/detail.php:114
msgid "completed"
msgstr ""

#: views/packages/details/detail.php:114
msgid "in-complete"
msgstr ""

#: views/packages/details/detail.php:117 views/packages/details/detail.php:366
#: views/packages/main/s1.setup2.php:472
#: views/tools/diagnostics/inc.settings.php:118
msgid "User"
msgstr ""

#: views/packages/details/detail.php:121 views/packages/details/detail.php:269
#: views/packages/main/s1.setup2.php:158 views/packages/main/s2.scan3.php:28
#: views/packages/main/s2.scan3.php:586 views/packages/main/s2.scan3.php:638
msgid "Files"
msgstr ""

#: views/packages/details/detail.php:129
msgid "Log"
msgstr ""

#: views/packages/details/detail.php:130
msgid "Share"
msgstr ""

#: views/packages/details/detail.php:138 views/packages/details/detail.php:226
#: views/packages/main/packages.php:208 views/packages/main/s1.setup2.php:142
#: views/packages/main/s2.scan3.php:21 views/packages/main/s3.build.php:146
#: views/settings/packages.php:204
msgid "Archive"
msgstr ""

#: views/packages/details/detail.php:142 views/packages/details/detail.php:325
#: views/packages/main/packages.php:205 views/packages/main/s1.setup2.php:381
#: views/packages/main/s3.build.php:143
msgid "Installer"
msgstr ""

#: views/packages/details/detail.php:146 views/packages/details/detail.php:362
#: views/packages/main/s1.setup2.php:159 views/packages/main/s1.setup2.php:468
#: views/packages/main/s2.scan3.php:365 views/packages/main/s2.scan3.php:535
#: views/settings/packages.php:70
msgid "Database"
msgstr ""

#: views/packages/details/detail.php:160
msgid "Download Links"
msgstr ""

#: views/packages/details/detail.php:163
msgid "The following links contain sensitive data.  Please share with caution!"
msgstr ""

#: views/packages/details/detail.php:169
msgid "The database SQL script is a quick link to your database backup script.  An exact copy is also stored in the package."
msgstr ""

#: views/packages/details/detail.php:177 views/packages/main/s1.setup2.php:92
#: views/settings/controller.php:25 views/settings/general.php:110
msgid "Storage"
msgstr ""

#: views/packages/details/detail.php:185 views/packages/details/detail.php:286
#: views/packages/main/s1.setup2.php:100 views/settings/license.php:12
msgid "Type"
msgstr ""

#: views/packages/details/detail.php:186 views/packages/main/s1.setup2.php:101
msgid "Location"
msgstr ""

#: views/packages/details/detail.php:191 views/packages/main/s1.setup2.php:106
msgid "Default"
msgstr ""

#: views/packages/details/detail.php:192 views/packages/main/s1.setup2.php:107
msgid "Local"
msgstr ""

#: views/packages/details/detail.php:203 views/packages/main/s1.setup2.php:119
#, php-format
msgid "%1$s, %2$s, %3$s, %4$s, %5$s and other storage options available in"
msgstr ""

#: views/packages/details/detail.php:204 views/packages/main/s1.setup2.php:120
#: views/packages/main/s2.scan3.php:485 views/packages/main/s2.scan3.php:497
#: views/packages/main/s3.build.php:21
msgid "Duplicator Pro"
msgstr ""

#: views/packages/details/detail.php:206 views/packages/main/s1.setup2.php:122
msgid "Additional Storage:"
msgstr ""

#: views/packages/details/detail.php:207 views/packages/main/s1.setup2.php:123
msgid "Duplicator Pro allows you to create a package and then store it at a custom location on this server or to a cloud based location such as Google Drive, Amazon, Dropbox or FTP."
msgstr ""

#: views/packages/details/detail.php:234 views/packages/details/detail.php:290
#: views/packages/main/s1.setup2.php:260
msgid "Build Mode"
msgstr ""

#: views/packages/details/detail.php:241
msgid "Database Mode"
msgstr ""

#: views/packages/details/detail.php:242
msgid "Archive Database Only Enabled"
msgstr ""

#: views/packages/details/detail.php:246 views/packages/details/detail.php:303
msgid "Filters"
msgstr ""

#: views/packages/details/detail.php:250 views/packages/main/s2.scan3.php:564
#: views/packages/main/s2.scan3.php:629
msgid "Directories"
msgstr ""

#: views/packages/details/detail.php:254 views/packages/details/detail.php:264
#: views/packages/details/detail.php:273 views/packages/details/detail.php:312
msgid "- no filters -"
msgstr ""

#: views/packages/details/detail.php:260 views/packages/main/s2.scan3.php:575
msgid "Extensions"
msgstr ""

#: views/packages/details/detail.php:283 views/packages/details/detail.php:395
msgid "DATABASE"
msgstr ""

#: views/packages/details/detail.php:296 views/packages/main/s2.scan3.php:546
msgid "MySQL Compatibility Mode Enabled"
msgstr ""

#: views/packages/details/detail.php:297 views/packages/main/s1.setup2.php:336
#: views/packages/main/s2.scan2.php:76 views/packages/main/s2.scan2.php:87
#: views/packages/main/s2.scan2.php:94 views/packages/main/s2.scan3.php:547
msgid "details"
msgstr ""

#: views/packages/details/detail.php:307 views/packages/main/s2.scan3.php:393
msgid "Tables"
msgstr ""

#: views/packages/details/detail.php:332
msgid " Security"
msgstr ""

#: views/packages/details/detail.php:336
msgid "Password Protection"
msgstr ""

#: views/packages/details/detail.php:345 views/packages/main/s1.setup2.php:431
msgid "Show/Hide Password"
msgstr ""

#: views/packages/details/detail.php:355 views/packages/main/s1.setup2.php:457
msgid " MySQL Server"
msgstr ""

#: views/packages/details/detail.php:358 views/packages/main/s1.setup2.php:460
msgid "Host"
msgstr ""

#: views/packages/details/detail.php:359 views/packages/details/detail.php:363
#: views/packages/details/detail.php:367
msgid "- not set -"
msgstr ""

#: views/packages/details/detail.php:375
msgid "View Package Object"
msgstr ""

#: views/packages/details/detail.php:392
msgid "Package File Links"
msgstr ""

#: views/packages/details/detail.php:396
msgid "PACKAGE"
msgstr ""

#: views/packages/details/detail.php:397
msgid "INSTALLER"
msgstr ""

#: views/packages/details/detail.php:398
msgid "LOG"
msgstr ""

#: views/packages/details/transfer.php:15
msgid "Transfer your packages to multiple locations  with Duplicator Pro"
msgstr ""

#: views/packages/details/transfer.php:20 views/settings/storage.php:19
msgid "Amazon S3"
msgstr ""

#: views/packages/details/transfer.php:21
msgid "Dropbox"
msgstr ""

#: views/packages/details/transfer.php:22 views/settings/storage.php:21
msgid "Google Drive"
msgstr ""

#: views/packages/details/transfer.php:23 views/settings/storage.php:22
msgid "One Drive"
msgstr ""

#: views/packages/details/transfer.php:24 views/settings/storage.php:23
msgid "FTP &amp; SFTP"
msgstr ""

#: views/packages/details/transfer.php:25 views/settings/storage.php:24
msgid "Custom Directory"
msgstr ""

#: views/packages/details/transfer.php:29
msgid "Set up a one-time storage location and automatically push the package to your destination."
msgstr ""

#: views/packages/details/transfer.php:35 views/settings/schedule.php:22
#: views/settings/storage.php:34 views/tools/templates.php:23
msgid "Learn More"
msgstr ""

#: views/packages/main/controller.php:9
msgid "An invalid request was made to this page."
msgstr ""

#: views/packages/main/controller.php:10
msgid "Please retry by going to the"
msgstr ""

#: views/packages/main/controller.php:11
msgid "Packages Screen"
msgstr ""

#: views/packages/main/controller.php:59
msgid "Packages &raquo; All"
msgstr ""

#: views/packages/main/controller.php:63 views/packages/main/controller.php:67
#: views/packages/main/controller.php:71
msgid "Packages &raquo; New"
msgstr ""

#: views/packages/main/packages.php:77
msgid "Bulk Actions"
msgstr ""

#: views/packages/main/packages.php:78
msgid "Delete selected package(s)"
msgstr ""

#: views/packages/main/packages.php:78
msgid "Delete"
msgstr ""

#: views/packages/main/packages.php:80
msgid "Apply"
msgstr ""

#: views/packages/main/packages.php:98 views/packages/main/s1.setup1.php:73
#: views/packages/main/s2.scan1.php:186 views/packages/main/s3.build.php:101
msgid "Create New"
msgstr ""

#: views/packages/main/packages.php:114 views/packages/main/packages.php:148
msgid "No Packages Found."
msgstr ""

#: views/packages/main/packages.php:115 views/packages/main/packages.php:149
msgid "Click the 'Create New' button to build a package."
msgstr ""

#: views/packages/main/packages.php:117 views/packages/main/packages.php:151
msgid "New to Duplicator?"
msgstr ""

#: views/packages/main/packages.php:119 views/packages/main/packages.php:153
msgid "Check out the 'Quick Start' guide!"
msgstr ""

#: views/packages/main/packages.php:135
msgid "Select all packages"
msgstr ""

#: views/packages/main/packages.php:136
msgid "Created"
msgstr ""

#: views/packages/main/packages.php:137 views/packages/main/s2.scan3.php:88
#: views/packages/main/s2.scan3.php:392
msgid "Size"
msgstr ""

#: views/packages/main/packages.php:140 views/packages/main/s2.scan3.php:528
msgid "Package"
msgstr ""

#: views/packages/main/packages.php:189
msgid "Archive created as zip file"
msgstr ""

#: views/packages/main/packages.php:190
msgid "Archive created as daf file"
msgstr ""

#: views/packages/main/packages.php:195 views/packages/main/s1.setup2.php:148
#: views/packages/main/s2.scan3.php:35
msgid "Database Only"
msgstr ""

#: views/packages/main/packages.php:199
msgid "Package Build Running"
msgstr ""

#: views/packages/main/packages.php:200
msgid "To stop or reset this package build goto Settings > Advanced > Reset Packages"
msgstr ""

#: views/packages/main/packages.php:210 views/packages/main/packages.php:228
msgid "Package Details"
msgstr ""

#: views/packages/main/packages.php:226
msgid "Error Processing"
msgstr ""

#: views/packages/main/packages.php:246
msgid "Current Server Time"
msgstr ""

#: views/packages/main/packages.php:249 views/packages/main/s3.build.php:321
msgid "Time"
msgstr ""

#: views/packages/main/packages.php:258
msgid "Items"
msgstr ""

#: views/packages/main/packages.php:268
msgid "Bulk Action Required"
msgstr ""

#: views/packages/main/packages.php:270
msgid "No selections made! Please select an action from the \"Bulk Actions\" drop down menu."
msgstr ""

#: views/packages/main/packages.php:274
msgid "Selection Required"
msgstr ""

#: views/packages/main/packages.php:276
msgid "No selections made! Please select at least one package to delete."
msgstr ""

#: views/packages/main/packages.php:280
msgid "Delete Packages?"
msgstr ""

#: views/packages/main/packages.php:281
msgid "Are you sure you want to delete the selected package(s)?"
msgstr ""

#: views/packages/main/packages.php:282
msgid "Removing Packages, Please Wait..."
msgstr ""

#: views/packages/main/packages.php:289
msgid "Duplicator Help"
msgstr ""

#: views/packages/main/packages.php:294
msgid "Alert!"
msgstr ""

#: views/packages/main/packages.php:295
msgid "A package is being processed. Retry later."
msgstr ""

#: views/packages/main/packages.php:302
msgid "Common Questions:"
msgstr ""

#: views/packages/main/packages.php:303
msgid "How do I create a package"
msgstr ""

#: views/packages/main/packages.php:304
msgid "How do I install a package?"
msgstr ""

#: views/packages/main/packages.php:305
msgid "Frequently Asked Questions!"
msgstr ""

#: views/packages/main/packages.php:308
msgid "Other Resources:"
msgstr ""

#: views/packages/main/packages.php:309
msgid "Need help with the plugin?"
msgstr ""

#: views/packages/main/packages.php:310
msgid "Have an idea for the plugin?"
msgstr ""

#: views/packages/main/packages.php:312
msgid "Help review the plugin!"
msgstr ""

#: views/packages/main/s1.setup1.php:12
msgid "Package settings have been reset."
msgstr ""

#: views/packages/main/s1.setup1.php:62 views/packages/main/s1.setup2.php:401
#: views/packages/main/s2.scan1.php:175 views/packages/main/s2.scan2.php:56
#: views/packages/main/s3.build.php:79
msgid "Setup"
msgstr ""

#: views/packages/main/s1.setup1.php:63 views/packages/main/s2.scan1.php:176
#: views/packages/main/s3.build.php:80
msgid "Scan"
msgstr ""

#: views/packages/main/s1.setup1.php:64 views/packages/main/s2.scan1.php:177
#: views/packages/main/s2.scan1.php:269 views/packages/main/s3.build.php:81
msgid "Build"
msgstr ""

#: views/packages/main/s1.setup1.php:67
msgid "Step 1: Package Setup"
msgstr ""

#: views/packages/main/s1.setup1.php:90
msgid "Requirements:"
msgstr ""

#: views/packages/main/s1.setup1.php:99
msgid "System requirements must pass for the Duplicator to work properly.  Click each link for details."
msgstr ""

#: views/packages/main/s1.setup1.php:105
msgid "PHP Support"
msgstr ""

#: views/packages/main/s1.setup1.php:111 views/packages/main/s2.scan2.php:68
msgid "PHP Version"
msgstr ""

#: views/packages/main/s1.setup1.php:113
msgid "PHP versions 5.2.9+ or higher is required."
msgstr ""

#: views/packages/main/s1.setup1.php:117
msgid "Zip Archive Enabled"
msgstr ""

#: views/packages/main/s1.setup1.php:121
msgid "ZipArchive extension is required or"
msgstr ""

#: views/packages/main/s1.setup1.php:122
msgid "Switch to DupArchive"
msgstr ""

#: views/packages/main/s1.setup1.php:123
msgid "to by-pass this requirement."
msgstr ""

#: views/packages/main/s1.setup1.php:129
msgid "Safe Mode Off"
msgstr ""

#: views/packages/main/s1.setup1.php:131
msgid "Safe Mode should be set to Off in you php.ini file and is deprecated as of PHP 5.3.0."
msgstr ""

#: views/packages/main/s1.setup1.php:134 views/packages/main/s1.setup1.php:139
#: views/packages/main/s1.setup1.php:144
msgid "Function"
msgstr ""

#: views/packages/main/s1.setup1.php:150
msgid "For any issues in this section please contact your hosting provider or server administrator.  For additional information see our online documentation."
msgstr ""

#: views/packages/main/s1.setup1.php:158
msgid "Required Paths"
msgstr ""

#: views/packages/main/s1.setup1.php:178
msgid "If the root WordPress path is not writable by PHP on some systems this can cause issues."
msgstr ""

#: views/packages/main/s1.setup1.php:181
msgid "If Duplicator does not have enough permissions then you will need to manually create the paths above. &nbsp; "
msgstr ""

#: views/packages/main/s1.setup1.php:190
msgid "Server Support"
msgstr ""

#: views/packages/main/s1.setup1.php:196
msgid "MySQL Version"
msgstr ""

#: views/packages/main/s1.setup1.php:200
msgid "MySQLi Support"
msgstr ""

#: views/packages/main/s1.setup1.php:206
msgid "MySQL version 5.0+ or better is required and the PHP MySQLi extension (note the trailing 'i') is also required.  Contact your server administrator and request that mysqli extension and MySQL Server 5.0+ be installed."
msgstr ""

#: views/packages/main/s1.setup1.php:207
#: views/tools/diagnostics/inc.data.php:26
msgid "more info"
msgstr ""

#: views/packages/main/s1.setup1.php:216
msgid "Reserved Files"
msgstr ""

#: views/packages/main/s1.setup1.php:221
msgid "None of the reserved files where found from a previous install.  This means you are clear to create a new package."
msgstr ""

#: views/packages/main/s1.setup1.php:229
msgid "WordPress Root Path:"
msgstr ""

#: views/packages/main/s1.setup1.php:231
msgid "Remove Files Now"
msgstr ""

#: views/packages/main/s1.setup2.php:76
msgid "Add Notes"
msgstr ""

#: views/packages/main/s1.setup2.php:79
msgid "Toggle a default name"
msgstr ""

#: views/packages/main/s1.setup2.php:146
msgid "File filter enabled"
msgstr ""

#: views/packages/main/s1.setup2.php:147
msgid "Database filter enabled"
msgstr ""

#: views/packages/main/s1.setup2.php:148 views/packages/main/s1.setup2.php:173
msgid "Archive Only the Database"
msgstr ""

#: views/packages/main/s1.setup2.php:177
msgid "Enable File Filters"
msgstr ""

#: views/packages/main/s1.setup2.php:179
msgid "File Filters:"
msgstr ""

#: views/packages/main/s1.setup2.php:180
msgid "File filters allow you to ignore directories and file extensions.  When creating a package only include the data you want and need.  This helps to improve the overall archive build time and keep your backups simple and clean."
msgstr ""

#: views/packages/main/s1.setup2.php:185 views/packages/main/s1.setup2.php:199
#: views/packages/main/s1.setup2.php:207
msgid "Separate all filters by semicolon"
msgstr ""

#: views/packages/main/s1.setup2.php:187
msgid "Directories:"
msgstr ""

#: views/packages/main/s1.setup2.php:188
msgid "Number of directories filtered"
msgstr ""

#: views/packages/main/s1.setup2.php:192
msgid "root path"
msgstr ""

#: views/packages/main/s1.setup2.php:193
msgid "wp-uploads"
msgstr ""

#: views/packages/main/s1.setup2.php:194
msgid "cache"
msgstr ""

#: views/packages/main/s1.setup2.php:195 views/packages/main/s1.setup2.php:203
#: views/packages/main/s1.setup2.php:215
msgid "(clear)"
msgstr ""

#: views/packages/main/s1.setup2.php:199
msgid "File extensions"
msgstr ""

#: views/packages/main/s1.setup2.php:201
msgid "media"
msgstr ""

#: views/packages/main/s1.setup2.php:202
msgid "archive"
msgstr ""

#: views/packages/main/s1.setup2.php:209
msgid "Files:"
msgstr ""

#: views/packages/main/s1.setup2.php:210
msgid "Number of files filtered"
msgstr ""

#: views/packages/main/s1.setup2.php:214
msgid "(file path)"
msgstr ""

#: views/packages/main/s1.setup2.php:220
msgid "The directory, file and extensions paths above will be excluded from the archive file if enabled is checked."
msgstr ""

#: views/packages/main/s1.setup2.php:221
msgid "Use the full path for directories and files with semicolons to separate all paths."
msgstr ""

#: views/packages/main/s1.setup2.php:231
msgid "This option has automatically been checked because you have opted for a <i class='fa fa-random'></i> Two-Part Install Process.  Please complete the package build and continue with the "
msgstr ""

#: views/packages/main/s1.setup2.php:234 views/packages/main/s3.build.php:279
msgid "Quick Start Two-Part Install Instructions"
msgstr ""

#: views/packages/main/s1.setup2.php:238
msgid "<b>Overview:</b><br/> This advanced option excludes all files from the archive.  Only the database and a copy of the installer.php will be included in the archive.zip file. The option can be used for backing up and moving only the database."
msgstr ""

#: views/packages/main/s1.setup2.php:243
msgid "<b><i class='fa fa-exclamation-circle'></i> Notice:</b><br/>"
msgstr ""

#: views/packages/main/s1.setup2.php:245
msgid "Please use caution when installing only the database over an existing site and be sure the correct files correspond with the database. For example, if WordPress 4.6 is on this site and you copy the database to a host that has WordPress 4.8 files then the source code of the files will not be in sync with the database causing possible errors.  If you’re immediately moving the source files with the database then you can ignore this notice. Please use this advanced feature with caution!"
msgstr ""

#: views/packages/main/s1.setup2.php:267
msgid "Enable Table Filters"
msgstr ""

#: views/packages/main/s1.setup2.php:269
msgid "Enable Table Filters:"
msgstr ""

#: views/packages/main/s1.setup2.php:270
msgid "Checked tables will not be added to the database script.  Excluding certain tables can possibly cause your site or plugins to not work correctly after install!"
msgstr ""

#: views/packages/main/s1.setup2.php:276
msgid "Include All"
msgstr ""

#: views/packages/main/s1.setup2.php:277
msgid "Exclude All"
msgstr ""

#: views/packages/main/s1.setup2.php:321
msgid "Checked tables will be <u>excluded</u> from the database script. "
msgstr ""

#: views/packages/main/s1.setup2.php:322
msgid "Excluding certain tables can cause your site or plugins to not work correctly after install!<br/>"
msgstr ""

#: views/packages/main/s1.setup2.php:323
msgid "<i class='core-table-info'> Use caution when excluding tables! It is highly recommended to not exclude WordPress core tables*, unless you know the impact.</i>"
msgstr ""

#: views/packages/main/s1.setup2.php:328
msgid "Compatibility Mode"
msgstr ""

#: views/packages/main/s1.setup2.php:330
msgid "Compatibility Mode:"
msgstr ""

#: views/packages/main/s1.setup2.php:331
msgid "This is an advanced database backwards compatibility feature that should ONLY be used if having problems installing packages. If the database server version is lower than the version where the package was built then these options may help generate a script that is more compliant with the older database server. It is recommended to try each option separately starting with mysql40."
msgstr ""

#: views/packages/main/s1.setup2.php:352
msgid "mysql40"
msgstr ""

#: views/packages/main/s1.setup2.php:356
msgid "no_table_options"
msgstr ""

#: views/packages/main/s1.setup2.php:360
msgid "no_key_options"
msgstr ""

#: views/packages/main/s1.setup2.php:364
msgid "no_field_options"
msgstr ""

#: views/packages/main/s1.setup2.php:369
msgid "This option is only available with mysqldump mode."
msgstr ""

#: views/packages/main/s1.setup2.php:382
msgid "Installer password protection is on"
msgstr ""

#: views/packages/main/s1.setup2.php:383
msgid "Installer password protection is off"
msgstr ""

#: views/packages/main/s1.setup2.php:390
msgid "All values in this section are"
msgstr ""

#: views/packages/main/s1.setup2.php:390
msgid "optional"
msgstr ""

#: views/packages/main/s1.setup2.php:392
msgid "Setup/Prefills"
msgstr ""

#: views/packages/main/s1.setup2.php:393
msgid "All values in this section are OPTIONAL! If you know ahead of time the database input fields the installer will use, then you can optionally enter them here and they will be prefilled at install time.  Otherwise you can just enter them in at install time and ignore all these options in the Installer section."
msgstr ""

#: views/packages/main/s1.setup2.php:404 views/packages/main/s1.setup2.php:409
msgid "Branding"
msgstr ""

#: views/packages/main/s1.setup2.php:407
msgid "Available with Duplicator Pro - Freelancer!"
msgstr ""

#: views/packages/main/s1.setup2.php:410
msgid "Branding is a way to customize the installer look and feel.  With branding you can create multiple brands of installers."
msgstr ""

#: views/packages/main/s1.setup2.php:415
msgid "Security"
msgstr ""

#: views/packages/main/s1.setup2.php:422
msgid "Enable Password Protection"
msgstr ""

#: views/packages/main/s1.setup2.php:424
msgid "Security:"
msgstr ""

#: views/packages/main/s1.setup2.php:425
msgid "Enabling this option will allow for basic password protection on the installer. Before running the installer the password below must be entered before proceeding with an install.  This password is a general deterrent and should not be substituted for properly keeping your files secure.  Be sure to remove all installer files when the install process is completed."
msgstr ""

#: views/packages/main/s1.setup2.php:440
msgid "Prefills"
msgstr ""

#: views/packages/main/s1.setup2.php:448
msgid "Basic"
msgstr ""

#: views/packages/main/s1.setup2.php:449 views/settings/gopro.php:176
msgid "cPanel"
msgstr ""

#: views/packages/main/s1.setup2.php:461
msgid "example: localhost (value is optional)"
msgstr ""

#: views/packages/main/s1.setup2.php:464
msgid "Host Port"
msgstr ""

#: views/packages/main/s1.setup2.php:465
msgid "example: 3306 (value is optional)"
msgstr ""

#: views/packages/main/s1.setup2.php:469
msgid "example: DatabaseName (value is optional)"
msgstr ""

#: views/packages/main/s1.setup2.php:473
msgid "example: DatabaseUserName (value is optional)"
msgstr ""

#: views/packages/main/s1.setup2.php:483
msgid "Create the database and database user at install time without leaving the installer!"
msgstr ""

#: views/packages/main/s1.setup2.php:484
msgid "This feature is only availble in "
msgstr ""

#: views/packages/main/s1.setup2.php:485
msgid "Duplicator Pro!"
msgstr ""

#: views/packages/main/s1.setup2.php:486
msgid "This feature works only with hosts that support cPanel."
msgstr ""

#: views/packages/main/s1.setup2.php:498
msgid "Reset"
msgstr ""

#: views/packages/main/s1.setup2.php:499
msgid "Next"
msgstr ""

#: views/packages/main/s1.setup2.php:508
msgid "Reset Package Settings?"
msgstr ""

#: views/packages/main/s1.setup2.php:509
msgid "This will clear and reset all of the current package settings.  Would you like to continue?"
msgstr ""

#: views/packages/main/s2.scan1.php:148
msgid "Input fields not valid"
msgstr ""

#: views/packages/main/s2.scan1.php:149 views/packages/main/s2.scan1.php:207
msgid "Please try again!"
msgstr ""

#: views/packages/main/s2.scan1.php:151 views/packages/main/s2.scan1.php:212
#: views/packages/main/s3.build.php:353
msgid "Error Message:"
msgstr ""

#: views/packages/main/s2.scan1.php:161 views/packages/main/s2.scan1.php:267
msgid "Back"
msgstr ""

#: views/packages/main/s2.scan1.php:180
msgid "Step 2: System Scan"
msgstr ""

#: views/packages/main/s2.scan1.php:197
msgid "Scanning Site"
msgstr ""

#: views/packages/main/s2.scan1.php:199 views/packages/main/s3.build.php:116
msgid "Please Wait..."
msgstr ""

#: views/packages/main/s2.scan1.php:200
msgid "Keep this window open during the scan process."
msgstr ""

#: views/packages/main/s2.scan1.php:201
msgid "This can take several minutes."
msgstr ""

#: views/packages/main/s2.scan1.php:206
msgid "Scan Error"
msgstr ""

#: views/packages/main/s2.scan1.php:209 views/packages/main/s3.build.php:349
msgid "Server Status:"
msgstr ""

#: views/packages/main/s2.scan1.php:221
msgid "Scan Complete"
msgstr ""

#: views/packages/main/s2.scan1.php:223
msgid "Process Time:"
msgstr ""

#: views/packages/main/s2.scan1.php:239
msgid "A notice status has been detected, are you sure you want to continue?"
msgstr ""

#: views/packages/main/s2.scan1.php:243
msgid "Yes.  Continue with the build process!"
msgstr ""

#: views/packages/main/s2.scan1.php:249
msgid "Scan checks are not required to pass, however they could cause issues on some systems."
msgstr ""

#: views/packages/main/s2.scan1.php:251
msgid "Please review the details for each section by clicking on the detail title."
msgstr ""

#: views/packages/main/s2.scan1.php:258
msgid "Do you want to continue?"
msgstr ""

#: views/packages/main/s2.scan1.php:260
msgid "At least one or more checkboxes was checked in \"Quick Filters\"."
msgstr ""

#: views/packages/main/s2.scan1.php:261
msgid "To apply a \"Quick Filter\" click the \"Add Filters & Rescan\" button"
msgstr ""

#: views/packages/main/s2.scan1.php:263
msgid "Yes. Continue without applying any file filters."
msgstr ""

#: views/packages/main/s2.scan1.php:268
msgid "Rescan"
msgstr ""

#: views/packages/main/s2.scan1.php:414
msgid "Unable to perform a full scan, please try the following actions:"
msgstr ""

#: views/packages/main/s2.scan1.php:415
msgid "1. Go back and create a root path directory filter to validate the site is scan-able."
msgstr ""

#: views/packages/main/s2.scan1.php:416
msgid "2. Continue to add/remove filters to isolate which path is causing issues."
msgstr ""

#: views/packages/main/s2.scan1.php:417
msgid "3. This message will go away once the correct filters are applied."
msgstr ""

#: views/packages/main/s2.scan1.php:419
msgid "Common Issues:"
msgstr ""

#: views/packages/main/s2.scan1.php:420
msgid "- On some budget hosts scanning over 30k files can lead to timeout/gateway issues. Consider scanning only your main WordPress site and avoid trying to backup other external directories."
msgstr ""

#: views/packages/main/s2.scan1.php:421
msgid "- Symbolic link recursion can cause timeouts.  Ask your server admin if any are present in the scan path.  If they are add the full path as a filter and try running the scan again."
msgstr ""

#: views/packages/main/s2.scan1.php:434 views/packages/main/s2.scan3.php:57
#: views/packages/main/s2.scan3.php:68 views/packages/main/s3.build.php:245
msgid "Notice"
msgstr ""

#: views/packages/main/s2.scan1.php:436
msgid "Good"
msgstr ""

#: views/packages/main/s2.scan1.php:437
msgid "Fail"
msgstr ""

#: views/packages/main/s2.scan2.php:7
msgid "Server"
msgstr ""

#: views/packages/main/s2.scan2.php:8
msgid "Show Diagnostics"
msgstr ""

#: views/packages/main/s2.scan2.php:63
#: views/tools/diagnostics/inc.settings.php:51
msgid "Web Server"
msgstr ""

#: views/packages/main/s2.scan2.php:64
msgid "Supported web servers: "
msgstr ""

#: views/packages/main/s2.scan2.php:69
msgid "The minimum PHP version supported by Duplicator is 5.2.9. It is highly recommended to use PHP 5.3+ for improved stability.  For international language support please use PHP 7.0+."
msgstr ""

#: views/packages/main/s2.scan2.php:74
msgid "PHP Open Base Dir"
msgstr ""

#: views/packages/main/s2.scan2.php:75
msgid "Issues might occur when [open_basedir] is enabled. Work with your server admin to disable this value in the php.ini file if you’re having issues building a package."
msgstr ""

#: views/packages/main/s2.scan2.php:80 views/packages/main/s3.build.php:328
msgid "PHP Max Execution Time"
msgstr ""

#: views/packages/main/s2.scan2.php:81
msgid "Timeouts may occur for larger packages when [max_execution_time] time in the php.ini is too low.  A value of 0 (recommended) indicates that PHP has no time limits. An attempt is made to override this value if the server allows it."
msgstr ""

#: views/packages/main/s2.scan2.php:84
msgid "Note: Timeouts can also be set at the web server layer, so if the PHP max timeout passes and you still see a build timeout messages, then your web server could be killing the process.   If you are on a budget host and limited on processing time, consider using the database or file filters to shrink the size of your overall package.   However use caution as excluding the wrong resources can cause your install to not work properly."
msgstr ""

#: views/packages/main/s2.scan2.php:92
msgid "Get faster builds with Duplicator Pro with access to shell_exec zip."
msgstr ""

#: views/packages/main/s2.scan2.php:112
msgid "WordPress Version"
msgstr ""

#: views/packages/main/s2.scan2.php:113
#, php-format
msgid "It is recommended to have a version of WordPress that is greater than %1$s.  Older version of WordPress can lead to migration issues and are a security risk. If possible please update your WordPress site to the latest version."
msgstr ""

#: views/packages/main/s2.scan2.php:117
msgid "Core Files"
msgstr ""

#: views/packages/main/s2.scan2.php:123
msgid "The core WordPress paths below will <u>not</u> be included in the archive. These paths are required for WordPress to function!"
msgstr ""

#: views/packages/main/s2.scan2.php:134
msgid "The core WordPress file below will <u>not</u> be included in the archive. This file is required for WordPress to function!"
msgstr ""

#: views/packages/main/s2.scan2.php:147
msgid " to the new location for the site to function properly."
msgstr ""

#: views/packages/main/s2.scan2.php:153
msgid "If the scanner is unable to locate the wp-config.php file in the root directory, then you will need to manually copy it to its new location. This check will also look for core WordPress paths that should be included in the archive for WordPress to work correctly."
msgstr ""

#: views/packages/main/s2.scan2.php:172
msgid "Multisite: Unsupported"
msgstr ""

#: views/packages/main/s2.scan2.php:173
msgid "Duplicator does not support WordPress multisite migrations.  We recommend using Duplicator Pro which currently supports full multisite migrations and subsite to standalone site migrations."
msgstr ""

#: views/packages/main/s2.scan2.php:177
msgid "While it is not recommended you can still continue with the build of this package.  Please note that at install time additional manual custom configurations will need to be made to finalize this multisite migration."
msgstr ""

#: views/packages/main/s2.scan2.php:179 views/packages/main/s2.scan2.php:184
msgid "upgrade to pro"
msgstr ""

#: views/packages/main/s2.scan2.php:181
msgid "Multisite: N/A"
msgstr ""

#: views/packages/main/s2.scan2.php:182
msgid "This is not a multisite install so duplication will proceed without issue.  Duplicator does not officially support multisite. However, Duplicator Pro supports duplication of a full multisite network and also has the ability to install a multisite subsite as a standalone site."
msgstr ""

#: views/packages/main/s2.scan3.php:6
#: views/tools/diagnostics/inc.settings.php:55
msgid "Root Path"
msgstr ""

#: views/packages/main/s2.scan3.php:23
msgid "Show Scan Details"
msgstr ""

#: views/packages/main/s2.scan3.php:38 views/packages/main/s2.scan3.php:370
#: views/packages/main/s2.scan3.php:557 views/settings/general.php:158
#: views/tools/diagnostics/inc.settings.php:167
msgid "Enabled"
msgstr ""

#: views/packages/main/s2.scan3.php:44
msgid "Archive Size"
msgstr ""

#: views/packages/main/s2.scan3.php:45
msgid "This size includes only files BEFORE compression is applied. It does not include the size of the database script or any applied filters.  Once complete the package size will be smaller than this number."
msgstr ""

#: views/packages/main/s2.scan3.php:48 views/packages/main/s2.scan3.php:380
#: views/packages/main/s2.scan3.php:442
msgid "uncompressed"
msgstr ""

#: views/packages/main/s2.scan3.php:56
msgid "Database only"
msgstr ""

#: views/packages/main/s2.scan3.php:60
msgid "Only the database and a copy of the installer.php will be included in the archive.zip file."
msgstr ""

#: views/packages/main/s2.scan3.php:67
msgid "Skip archive scan enabled"
msgstr ""

#: views/packages/main/s2.scan3.php:71
msgid "All file checks are skipped. This could cause problems during extraction if problematic files are included."
msgstr ""

#: views/packages/main/s2.scan3.php:73
msgid " Disable the advanced option to re-enable file controls."
msgstr ""

#: views/packages/main/s2.scan3.php:84
msgid "Size Checks"
msgstr ""

#: views/packages/main/s2.scan3.php:89
msgid "File Count"
msgstr ""

#: views/packages/main/s2.scan3.php:90
msgid "Directory Count"
msgstr ""

#: views/packages/main/s2.scan3.php:92
msgid "Compressing larger sites on <i>some budget hosts</i> may cause timeouts.  "
msgstr ""

#: views/packages/main/s2.scan3.php:93
msgid "more details..."
msgstr ""

#: views/packages/main/s2.scan3.php:97 views/packages/main/s2.scan3.php:387
#: views/packages/main/s3.build.php:203 views/packages/screen.php:53
msgid "Overview"
msgstr ""

#: views/packages/main/s2.scan3.php:99
#, php-format
msgid "This notice is triggered at [%s] and can be ignored on most hosts.  If during the build process you see a \"Host Build Interrupt\" message then this host has strict processing limits.  Below are some options you can take to overcome constraints set up on this host."
msgstr ""

#: views/packages/main/s2.scan3.php:103
msgid "Timeout Options"
msgstr ""

#: views/packages/main/s2.scan3.php:105
msgid "Apply the \"Quick Filters\" below or click the back button to apply on previous page."
msgstr ""

#: views/packages/main/s2.scan3.php:106
msgid "See the FAQ link to adjust this hosts timeout limits: "
msgstr ""

#: views/packages/main/s2.scan3.php:106
msgid "What can I try for Timeout Issues?"
msgstr ""

#: views/packages/main/s2.scan3.php:107
msgid "Consider trying multi-threaded support in "
msgstr ""

#: views/packages/main/s2.scan3.php:108
msgid "Duplicator Pro."
msgstr ""

#: views/packages/main/s2.scan3.php:112
#, php-format
msgid "Files over %1$s are listed below. Larger files such as movies or zipped content can cause timeout issues on some budget hosts.  If you are having issues creating a package try excluding the directory paths below or go back to Step 1 and add them."
msgstr ""

#: views/packages/main/s2.scan3.php:121 views/packages/main/s2.scan3.php:208
#: views/packages/main/s2.scan3.php:257
msgid "Quick Filters"
msgstr ""

#: views/packages/main/s2.scan3.php:122
msgid "Large Files"
msgstr ""

#: views/packages/main/s2.scan3.php:125 views/packages/main/s2.scan3.php:260
msgid "Hide All"
msgstr ""

#: views/packages/main/s2.scan3.php:126 views/packages/main/s2.scan3.php:261
msgid "Show All"
msgstr ""

#: views/packages/main/s2.scan3.php:136 views/packages/main/s2.scan3.php:276
msgid "Core WordPress directories should not be filtered. Use caution when excluding files."
msgstr ""

#: views/packages/main/s2.scan3.php:156
msgid "No large files found during this scan."
msgstr ""

#: views/packages/main/s2.scan3.php:159
msgid "No large files found during this scan.  If you're having issues building a package click the back button and try adding a file filter to non-essential files paths like wp-content/uploads.   These excluded files can then be manually moved to the new location after you have ran the migration installer."
msgstr ""

#: views/packages/main/s2.scan3.php:172 views/packages/main/s2.scan3.php:302
msgid "*Checking a directory will exclude all items recursively from that path down.  Please use caution when filtering directories."
msgstr ""

#: views/packages/main/s2.scan3.php:175 views/packages/main/s2.scan3.php:231
#: views/packages/main/s2.scan3.php:305
msgid "Add Filters &amp; Rescan"
msgstr ""

#: views/packages/main/s2.scan3.php:177 views/packages/main/s2.scan3.php:307
msgid "Copy Paths to Clipboard"
msgstr ""

#: views/packages/main/s2.scan3.php:193
msgid "Addon Sites"
msgstr ""

#: views/packages/main/s2.scan3.php:199
msgid "An \"Addon Site\" is a separate WordPress site(s) residing in subdirectories within this site. If you confirm these to be separate sites, then it is recommended that you exclude them by checking the corresponding boxes below and clicking the 'Add Filters & Rescan' button.  To backup the other sites install the plugin on the sites needing to be backed-up."
msgstr ""

#: views/packages/main/s2.scan3.php:222
msgid "No add on sites found."
msgstr ""

#: views/packages/main/s2.scan3.php:228
msgid "*Checking a directory will exclude all items in that path recursively."
msgstr ""

#: views/packages/main/s2.scan3.php:244 views/packages/main/s2.scan3.php:258
msgid "Name Checks"
msgstr ""

#: views/packages/main/s2.scan3.php:249
msgid "Unicode and special characters such as \"*?><:/\\|\", can be problematic on some hosts."
msgstr ""

#: views/packages/main/s2.scan3.php:250
msgid "  Only consider using this filter if the package build is failing. Select files that are not important to your site or you can migrate manually."
msgstr ""

#: views/packages/main/s2.scan3.php:251
msgid "If this environment/system and the system where it will be installed are set up to support Unicode and long paths then these filters can be ignored.  If you run into issues with creating or installing a package, then is recommended to filter these paths."
msgstr ""

#: views/packages/main/s2.scan3.php:296
msgid "No file/directory name warnings found."
msgstr ""

#: views/packages/main/s2.scan3.php:319
msgid "Read Checks"
msgstr ""

#: views/packages/main/s2.scan3.php:324
msgid "PHP is unable to read the following items and they will NOT be included in the package.  Please work with your host to adjust the permissions or resolve the symbolic-link(s) shown in the lists below.  If these items are not needed then this notice can be ignored."
msgstr ""

#: views/packages/main/s2.scan3.php:330
msgid "Unreadable Items:"
msgstr ""

#: views/packages/main/s2.scan3.php:337
msgid "No unreadable items found."
msgstr ""

#: views/packages/main/s2.scan3.php:341
msgid "Recursive Links:"
msgstr ""

#: views/packages/main/s2.scan3.php:348
msgid "No recursive sym-links found."
msgstr ""

#: views/packages/main/s2.scan3.php:376
msgid "Database Size:"
msgstr ""

#: views/packages/main/s2.scan3.php:377
msgid "The database size represents only the included tables. The process for gathering the size uses the query SHOW TABLE STATUS.  The overall size of the database file can impact the final size of the package."
msgstr ""

#: views/packages/main/s2.scan3.php:391
msgid "TOTAL SIZE"
msgstr ""

#: views/packages/main/s2.scan3.php:394
msgid "Records"
msgstr ""

#: views/packages/main/s2.scan3.php:397
#, php-format
msgid "Total size and row counts are approximate values.  The thresholds that trigger notices are %1$s records total for the entire database.  Larger databases take more time to process.  On some budget hosts that have cpu/memory/timeout limits this may cause issues."
msgstr ""

#: views/packages/main/s2.scan3.php:402
msgid "TABLE DETAILS:"
msgstr ""

#: views/packages/main/s2.scan3.php:404
#, php-format
msgid "The notices for tables are %1$s records or names with upper-case characters.  Individual tables will not trigger a notice message, but can help narrow down issues if they occur later on."
msgstr ""

#: views/packages/main/s2.scan3.php:411 views/packages/main/s2.scan3.php:463
msgid "RECOMMENDATIONS:"
msgstr ""

#: views/packages/main/s2.scan3.php:414
msgid "repair and optimization"
msgstr ""

#: views/packages/main/s2.scan3.php:415
#, php-format
msgid "1. Run a %1$s on the table to improve the overall size and performance."
msgstr ""

#: views/packages/main/s2.scan3.php:417
msgid "2. Remove post revisions and stale data from tables.  Tables such as logs, statistical or other non-critical data should be cleared."
msgstr ""

#: views/packages/main/s2.scan3.php:419
msgid "Enable mysqldump"
msgstr ""

#: views/packages/main/s2.scan3.php:420
#, php-format
msgid "3. %1$s if this host supports the option."
msgstr ""

#: views/packages/main/s2.scan3.php:422
msgid "lower_case_table_names"
msgstr ""

#: views/packages/main/s2.scan3.php:423
#, php-format
msgid "4. For table name case sensitivity issues either rename the table with lower case characters or be prepared to work with the %1$s system variable setting."
msgstr ""

#: views/packages/main/s2.scan3.php:434
msgid "Total Size"
msgstr ""

#: views/packages/main/s2.scan3.php:439
msgid "Total Size:"
msgstr ""

#: views/packages/main/s2.scan3.php:440
msgid "The total size of the site (files plus  database)."
msgstr ""

#: views/packages/main/s2.scan3.php:450
#, php-format
msgid "The build can't continue because the total size of files and the database exceeds the %s limit that can be processed when creating a DupArchive package. "
msgstr ""

#: views/packages/main/s2.scan3.php:451
msgid "<a href=\"javascript:void(0)\" onclick=\"jQuery('#data-ll-status-recommendations').toggle()\">Click for recommendations.</a>"
msgstr ""

#: views/packages/main/s2.scan3.php:457 views/packages/main/s2.scan3.php:531
#: views/settings/packages.php:208
msgid "Archive Engine"
msgstr ""

#: views/packages/main/s2.scan3.php:459
#, php-format
msgid " With DupArchive, Duplicator is restricted to processing sites up to %s.  To process larger sites, consider these recommendations. "
msgstr ""

#: views/packages/main/s2.scan3.php:468
msgid "Step 1"
msgstr ""

#: views/packages/main/s2.scan3.php:469
#, php-format
msgid "- Add data filters to get the package size under %s: "
msgstr ""

#: views/packages/main/s2.scan3.php:471
msgid "- In the 'Size Checks' section above consider adding filters (if notice is shown)."
msgstr ""

#: views/packages/main/s2.scan3.php:473
#, php-format
msgid "- In %s consider adding file/directory or database table filters."
msgstr ""

#: views/packages/main/s2.scan3.php:477
msgid "covered here."
msgstr ""

#: views/packages/main/s2.scan3.php:478
#, php-format
msgid "- Perform a two part install %s"
msgstr ""

#: views/packages/main/s2.scan3.php:481
msgid "ZipArchive Engine"
msgstr ""

#: views/packages/main/s2.scan3.php:482
#, php-format
msgid "- Switch to the %s which requires a capable hosting provider (VPS recommended)."
msgstr ""

#: views/packages/main/s2.scan3.php:486
#, php-format
msgid "- Consider upgrading to %s for large site support. (unlimited)"
msgstr ""

#: views/packages/main/s2.scan3.php:496
msgid "Migrate large, multi-gig sites with"
msgstr ""

#: views/packages/main/s2.scan3.php:511
msgid "Scan Details"
msgstr ""

#: views/packages/main/s2.scan3.php:518
msgid "Copy Quick Filter Paths"
msgstr ""

#: views/packages/main/s2.scan3.php:537
msgid "Name:"
msgstr ""

#: views/packages/main/s2.scan3.php:538
msgid "Host:"
msgstr ""

#: views/packages/main/s2.scan3.php:540
msgid "Build Mode:"
msgstr ""

#: views/packages/main/s2.scan3.php:556 views/settings/gopro.php:55
msgid "File Filters"
msgstr ""

#: views/packages/main/s2.scan3.php:557
#: views/tools/diagnostics/inc.settings.php:167
msgid "Disabled"
msgstr ""

#: views/packages/main/s2.scan3.php:571
msgid "No custom directory filters set."
msgstr ""

#: views/packages/main/s2.scan3.php:581
msgid "No file extension filters have been set."
msgstr ""

#: views/packages/main/s2.scan3.php:593
msgid "No custom file filters set."
msgstr ""

#: views/packages/main/s2.scan3.php:597
msgid "Auto Directory Filters"
msgstr ""

#: views/packages/main/s2.scan3.php:603
msgid "Auto File Filters"
msgstr ""

#: views/packages/main/s2.scan3.php:616
msgid "Path filters will be skipped during the archive process when enabled."
msgstr ""

#: views/packages/main/s2.scan3.php:618
msgid "[view json result report]"
msgstr ""

#: views/packages/main/s2.scan3.php:621
msgid "Auto filters are applied to prevent archiving other backup sets."
msgstr ""

#: views/packages/main/s2.scan3.php:632 views/packages/main/s2.scan3.php:641
msgid "Click to Copy"
msgstr ""

#: views/packages/main/s2.scan3.php:646
msgid "Copy the paths above and apply them as needed on Step 1 &gt; Archive &gt; Files section."
msgstr ""

#: views/packages/main/s2.scan3.php:663
msgid "Directory applied filter set."
msgstr ""

#: views/packages/main/s2.scan3.php:690
msgid "No directories have been selected!"
msgstr ""

#: views/packages/main/s2.scan3.php:694
msgid "No files have been selected!"
msgstr ""

#: views/packages/main/s2.scan3.php:732
msgid "Copied to Clipboard!"
msgstr ""

#: views/packages/main/s2.scan3.php:734
msgid "Manual copy of selected text required on this browser."
msgstr ""

#: views/packages/main/s2.scan3.php:741
msgid "Initializing Please Wait..."
msgstr ""

#: views/packages/main/s2.scan3.php:784 views/packages/main/s2.scan3.php:791
msgid "Error applying filters.  Please go back to Step 1 to add filter manually!"
msgstr ""

#: views/packages/main/s2.scan3.php:867
msgid "Unable to report on any tables"
msgstr ""

#: views/packages/main/s2.scan3.php:893
msgid "Unable to report on database stats"
msgstr ""

#: views/packages/main/s3.build.php:16
msgid "Help review the plugin"
msgstr ""

#: views/packages/main/s3.build.php:19
msgid "Want more power?  Try"
msgstr ""

#: views/packages/main/s3.build.php:84
msgid "Step 3: Build Package"
msgstr ""

#: views/packages/main/s3.build.php:114
msgid "Building Package"
msgstr ""

#: views/packages/main/s3.build.php:117
msgid "Keep this window open and do not close during the build process."
msgstr ""

#: views/packages/main/s3.build.php:118
msgid "This may take several minutes to complete."
msgstr ""

#: views/packages/main/s3.build.php:122
msgid "Build Status"
msgstr ""

#: views/packages/main/s3.build.php:129
msgid "Package Completed"
msgstr ""

#: views/packages/main/s3.build.php:134
msgid "Process Time"
msgstr ""

#: views/packages/main/s3.build.php:140
msgid "Download Files"
msgstr ""

#: views/packages/main/s3.build.php:142
msgid "Click to download installer file"
msgstr ""

#: views/packages/main/s3.build.php:145
msgid "Click to download archive file"
msgstr ""

#: views/packages/main/s3.build.php:151
msgid "Click to download both files"
msgstr ""

#: views/packages/main/s3.build.php:152
msgid "One-Click Download"
msgstr ""

#: views/packages/main/s3.build.php:155
msgid "One Click:"
msgstr ""

#: views/packages/main/s3.build.php:156
msgid "Clicking this link will open both the installer and archive download prompts at the same time. On some browsers you may have to disable pop-up warnings on this domain for this to work correctly."
msgstr ""

#: views/packages/main/s3.build.php:164
msgid "How do I install this Package?"
msgstr ""

#: views/packages/main/s3.build.php:176
msgid "Host Build Interrupt"
msgstr ""

#: views/packages/main/s3.build.php:177
msgid "This server cannot complete the build due to host setup constraints."
msgstr ""

#: views/packages/main/s3.build.php:178
msgid "To get past this hosts limitation consider the options below by clicking each section."
msgstr ""

#: views/packages/main/s3.build.php:184
msgid "Option 1: Try DupArchive"
msgstr ""

#: views/packages/main/s3.build.php:188
msgid "OPTION 1:"
msgstr ""

#: views/packages/main/s3.build.php:190
msgid "Enable the DupArchive format which is specific to Duplicator and designed to perform better on constrained budget hosts."
msgstr ""

#: views/packages/main/s3.build.php:194
msgid "Note: DupArchive on Duplicator only supports sites up to 500MB.  If your site is over 500MB then use a file filter on step 1 to get the size below 500MB or try the other options mentioned below.  Alternatively, you may want to consider"
msgstr ""

#: views/packages/main/s3.build.php:200
msgid " which is capable of migrating sites much larger than 500MB."
msgstr ""

#: views/packages/main/s3.build.php:204 views/packages/main/s3.build.php:271
msgid "Please follow these steps:"
msgstr ""

#: views/packages/main/s3.build.php:206
msgid "On the scanner step check to make sure your package is under 500MB. If not see additional options below."
msgstr ""

#: views/packages/main/s3.build.php:208
msgid "Go to Duplicator &gt; Settings &gt; Packages Tab &gt; Archive Engine &gt;"
msgstr ""

#: views/packages/main/s3.build.php:209
msgid "Enable DupArchive"
msgstr ""

#: views/packages/main/s3.build.php:211
msgid "Build a new package using the new engine format."
msgstr ""

#: views/packages/main/s3.build.php:215
msgid "Note: The DupArchive engine will generate an archive.daf file. This file is very similar to a .zip except that it can only be extracted by the installer.php file or the"
msgstr ""

#: views/packages/main/s3.build.php:217
msgid "commandline extraction tool"
msgstr ""

#: views/packages/main/s3.build.php:225
msgid "Option 2: File Filters"
msgstr ""

#: views/packages/main/s3.build.php:229
msgid "OPTION 2:"
msgstr ""

#: views/packages/main/s3.build.php:231
msgid "The first pass for reading files on some budget hosts maybe slow and have conflicts with strict timeout settings setup by the hosting provider.  In these cases, it is recommended to retry the build by adding file filters to larger files/directories."
msgstr ""

#: views/packages/main/s3.build.php:236
msgid "For example, you could  filter out the  \"/wp-content/uploads/\" folder to create the package then move the files from that directory over manually.  If this work-flow is not desired or does not work please check-out the other options below."
msgstr ""

#: views/packages/main/s3.build.php:241
msgid "Retry Build With Filters"
msgstr ""

#: views/packages/main/s3.build.php:247
msgid "Build Folder:"
msgstr ""

#: views/packages/main/s3.build.php:248
msgid "On some servers the build will continue to run in the background. To validate if a build is still running; open the 'tmp' folder above and see if the archive file is growing in size or check the main packages screen to see if the package completed. If it is not then your server has strict timeout constraints."
msgstr ""

#: views/packages/main/s3.build.php:260
msgid "Option 3: Two-Part Install"
msgstr ""

#: views/packages/main/s3.build.php:264
msgid "OPTION 3:"
msgstr ""

#: views/packages/main/s3.build.php:266
msgid "A two-part install minimizes server load and can avoid I/O and CPU issues encountered on some budget hosts. With this procedure you simply build a 'database-only' archive, manually move the website files, and then run the installer to complete the process."
msgstr ""

#: views/packages/main/s3.build.php:270
msgid " Overview"
msgstr ""

#: views/packages/main/s3.build.php:273
msgid "Click the button below to go back to Step 1."
msgstr ""

#: views/packages/main/s3.build.php:274
msgid "On Step 1 the \"Archive Only the Database\" checkbox will be auto checked."
msgstr ""

#: views/packages/main/s3.build.php:276
msgid "Complete the package build and follow the "
msgstr ""

#: views/packages/main/s3.build.php:286
msgid "Yes. I have read the above overview and would like to continue!"
msgstr ""

#: views/packages/main/s3.build.php:288
msgid "Start Two-Part Install Process"
msgstr ""

#: views/packages/main/s3.build.php:297
msgid "Option 4: Configure Server"
msgstr ""

#: views/packages/main/s3.build.php:301
msgid "OPTION 4:"
msgstr ""

#: views/packages/main/s3.build.php:302
msgid "This option is available on some hosts that allow for users to adjust server configurations.  With this option you will be directed to an FAQ page that will show various recommendations you can take to improve/unlock constraints set up on this server."
msgstr ""

#: views/packages/main/s3.build.php:308
msgid "Diagnose Server Setup"
msgstr ""

#: views/packages/main/s3.build.php:312
msgid "RUNTIME DETAILS"
msgstr ""

#: views/packages/main/s3.build.php:315
msgid "Allowed Runtime:"
msgstr ""

#: views/packages/main/s3.build.php:319
msgid "PHP Max Execution"
msgstr ""

#: views/packages/main/s3.build.php:329
msgid "This value is represented in seconds. A value of 0 means no timeout limit is set for PHP."
msgstr ""

#: views/packages/main/s3.build.php:333 views/settings/packages.php:167
msgid "Mode"
msgstr ""

#: views/packages/main/s3.build.php:339
msgid "PHP Max Execution Mode"
msgstr ""

#: views/packages/main/s3.build.php:341
msgid "If the value is [dynamic] then its possible for PHP to run longer than the default.  If the value is [fixed] then PHP will not be allowed to run longer than the default. <br/><br/> If this value is larger than the [Allowed Runtime] above then the web server has been enabled with a timeout cap and is overriding the PHP max time setting."
msgstr ""

#: views/packages/main/s3.build.php:362
msgid "Read Package Log File"
msgstr ""

#: views/packages/screen.php:64
msgid "<b><i class='fa fa-archive'></i> Packages » All</b><br/> The 'Packages' section is the main interface for managing all the packages that have been created.  A Package consists of two core files, the 'archive.zip' and the 'installer.php' file.  The archive file is a zip file containing all your WordPress files and a copy of your WordPress database.  The installer file is a php file that when browsed to via a web browser presents a wizard that redeploys/installs the website by extracting the archive file and installing the database.   To create a package, click the 'Create New' button and follow the prompts. <br/><br/><b><i class='fa fa-download'></i> Downloads</b><br/>To download the package files click on the Installer and Archive buttons after creating a package.  The archive file will have a copy of the installer inside of it named installer-backup.php in case the original installer file is lost.  To see the details of a package click on the <i class='fa fa-archive'></i> details button.<br/><br/><b><i class='far fa-file-archive'></i> Archive Types</b><br/>An archive file can be saved as either a .zip file or .daf file.  A zip file is a common archive format used to compress and group files.  The daf file short for 'Duplicator Archive Format' is a custom format used specifically  for working with larger packages and scale-ability issues on many shared hosting platforms.  Both formats work very similar.  The main difference is that the daf file can only be extracted using the installer.php file or the <a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-052-q' target='_blank'>DAF extraction tool</a>.  The zip file can be used by the installer.php or other zip tools like winrar/7zip/winzip or other client-side tools. <br/><br/>"
msgstr ""

#: views/packages/screen.php:85
msgid "<b>Packages New » 1 Setup</b> <br/>The setup step allows for optional filtered directory paths, files, file extensions and database tables.  To filter specific system files, click the 'Enable File Filters' checkbox and add the full path of the file or directory, followed by a semicolon.  For a file extension add the name (i.e. 'zip') followed by a semicolon. <br/><br/>To exclude a database table, check the box labeled 'Enable Table Filters' and check the table name to exclude. To include only a copy of your database in the archive file check the box labeled 'Archive Only the Database'.  The installer.php file can optionally be pre-filled with data at install time but is not required.  <br/><br/>"
msgstr ""

#: views/packages/screen.php:97
msgid "<b>Packages » 2 Scan</b> <br/>The plugin will scan your system files and database to let you know if there are any concerns or issues that may be present.  All items in green mean the checks looked good.  All items in red indicate a warning.  Warnings will not prevent the build from running, however if you do run into issues with the build then investigating the warnings should be considered.  Click on each section for more details about each scan check. <br/><br/>"
msgstr ""

#: views/packages/screen.php:105
msgid ""
"<b>Packages » 3 Build</b> <br/>The final step in the build process where the installer script and archive of the website can be downloaded.   To start the install process follow these steps: <ol><li>Download the installer.php and archive.zip files to your local computer.</li><li>For localhost installs be sure you have PHP, Apache & MySQL installed on your local computer with software such as XAMPP, Instant WordPress or MAMP for MAC. Place the package.zip and installer.php into any empty directory under your webroot then browse to the installer.php via your web browser to launch the install wizard.</li><li>For remote installs use FTP or cPanel to upload both the archive.zip and installer.php to your hosting provider. Place the files in a new empty directory under your host's webroot accessible from a valid URL such as http://your-domain/your-wp-directory/installer.php to launch the install wizard. On some hosts the root directory will be a something like public_html -or- www.  If your're not sure contact your hosting provider. </li></ol>For complete instructions see:<br/>\n"
"\t\t\t\t\t<a href='https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&amp;utm_medium=wordpress_plugin&amp;utm_content=package_built_install_help&amp;utm_campaign=duplicator_free#quick-040-q' target='_blank'>\n"
"\t\t\t\t\tHow do I install this Package?</a><br/><br/>"
msgstr ""

#: views/packages/screen.php:122
msgid "<b>Packages » Details</b> <br/>The details view will give you a full break-down of the package including any errors that may have occured during the install. <br/><br/>"
msgstr ""

#: views/settings/about-info.php:49
msgid "Duplicator can streamline your workflow and quickly clone/migrate a WordPress site. The plugin helps admins, designers and developers speed up the migration process of moving a WordPress site. Please help us continue development by giving the plugin a 5 star."
msgstr ""

#: views/settings/about-info.php:58
msgid "Rate Duplicator"
msgstr ""

#: views/settings/about-info.php:69
msgid "Support Duplicator"
msgstr ""

#: views/settings/about-info.php:71
msgid "with a 5 star review!"
msgstr ""

#: views/settings/about-info.php:85
msgid "Spread the Word"
msgstr ""

#: views/settings/about-info.php:92
msgid "Facebook"
msgstr ""

#: views/settings/about-info.php:95
msgid "Twitter"
msgstr ""

#: views/settings/about-info.php:98
msgid "LinkedIn"
msgstr ""

#: views/settings/about-info.php:101
msgid "Google+"
msgstr ""

#: views/settings/about-info.php:120
msgid "Stay in the Loop"
msgstr ""

#: views/settings/about-info.php:130
msgid "Subscribe to the Duplicator newsletter and stay on top of great ideas, tutorials, and better ways to improve your workflows"
msgstr ""

#: views/settings/controller.php:24
msgid "Schedules"
msgstr ""

#: views/settings/controller.php:26
msgid "License"
msgstr ""

#: views/settings/controller.php:27
msgid "About"
msgstr ""

#: views/settings/general.php:8
msgid "General Settings Saved"
msgstr ""

#: views/settings/general.php:88
msgid "Plugin"
msgstr ""

#: views/settings/general.php:92 views/tools/diagnostics/inc.settings.php:91
#: views/tools/diagnostics/inc.settings.php:110
#: views/tools/diagnostics/inc.settings.php:183
msgid "Version"
msgstr ""

#: views/settings/general.php:99
msgid "Uninstall"
msgstr ""

#: views/settings/general.php:102
msgid "Delete Plugin Settings"
msgstr ""

#: views/settings/general.php:105
msgid "Delete Entire Storage Directory"
msgstr ""

#: views/settings/general.php:112
msgid "Full Path"
msgstr ""

#: views/settings/general.php:115
msgid "Disable .htaccess File In Storage Directory"
msgstr ""

#: views/settings/general.php:117
msgid "Disable if issues occur when downloading installer/archive files."
msgstr ""

#: views/settings/general.php:122
msgid "Custom Roles"
msgstr ""

#: views/settings/general.php:125
msgid "Enable User Role Editor Plugin Integration"
msgstr ""

#: views/settings/general.php:130
msgid "The User Role Editor Plugin"
msgstr ""

#: views/settings/general.php:131 views/settings/gopro.php:46
msgid "Free"
msgstr ""

#: views/settings/general.php:132
msgid "or"
msgstr ""

#: views/settings/general.php:133 views/settings/gopro.php:47
msgid "Professional"
msgstr ""

#: views/settings/general.php:134
msgid "must be installed to use"
msgstr ""

#: views/settings/general.php:135
msgid "this feature."
msgstr ""

#: views/settings/general.php:144
msgid "Debug"
msgstr ""

#: views/settings/general.php:148
msgid "Debugging"
msgstr ""

#: views/settings/general.php:151
msgid "Enable debug options throughout user interface"
msgstr ""

#: views/settings/general.php:155
msgid "Trace Log"
msgstr ""

#: views/settings/general.php:161
msgid "Turns on detailed operation logging. Logging will occur in both PHP error and local trace logs."
msgstr ""

#: views/settings/general.php:163
msgid "WARNING: Only turn on this setting when asked to by support as tracing will impact performance."
msgstr ""

#: views/settings/general.php:167
msgid "Download Trace Log"
msgstr ""

#: views/settings/general.php:175
msgid "Advanced"
msgstr ""

#: views/settings/general.php:182
msgid "Reset Packages"
msgstr ""

#: views/settings/general.php:185
msgid "This process will reset all packages by deleting those without a completed status, reset the active package id and perform a cleanup of the build tmp file."
msgstr ""

#: views/settings/general.php:188
msgid "Reset Settings"
msgstr ""

#: views/settings/general.php:189
msgid "This action should only be used if the packages screen is having issues or a build is stuck."
msgstr ""

#: views/settings/general.php:194
msgid "Archive scan"
msgstr ""

#: views/settings/general.php:197
msgid "Skip"
msgstr ""

#: views/settings/general.php:199
msgid "If enabled all files check on scan will be skipped before package creation.  In some cases, this option can be beneficial if the scan process is having issues running or returning errors."
msgstr ""

#: views/settings/general.php:205
msgid "Other Plugins/Themes JS"
msgstr ""

#: views/settings/general.php:208 views/settings/general.php:224
msgid "Unhook them on Duplicator pages"
msgstr ""

#: views/settings/general.php:211
msgid "Check this option if other plugins/themes JavaScript files are conflicting with Duplicator."
msgstr ""

#: views/settings/general.php:215 views/settings/general.php:231
msgid "Do not modify this setting unless you know the expected result or have talked to support."
msgstr ""

#: views/settings/general.php:221
msgid "Other Plugins/Themes CSS"
msgstr ""

#: views/settings/general.php:227
msgid "Check this option if other plugins/themes CSS files are conflicting with Duplicator."
msgstr ""

#: views/settings/general.php:240
msgid "Save General Settings"
msgstr ""

#: views/settings/general.php:249
msgid "Reset Packages ?"
msgstr ""

#: views/settings/general.php:250
msgid "This will clear and reset all of the current temporary packages.  Would you like to continue?"
msgstr ""

#: views/settings/general.php:251
msgid "Resetting settings, Please Wait..."
msgstr ""

#: views/settings/general.php:254
msgid "Yes"
msgstr ""

#: views/settings/general.php:255
msgid "No"
msgstr ""

#: views/settings/general.php:259
msgid "AJAX ERROR!"
msgstr ""

#: views/settings/general.php:259
msgid "Ajax request error"
msgstr ""

#: views/settings/general.php:264 views/settings/general.php:317
msgid "RESPONSE ERROR!"
msgstr ""

#: views/settings/general.php:307
msgid "Packages successfully reset"
msgstr ""

#: views/settings/gopro.php:39
msgid "The simplicity of Duplicator"
msgstr ""

#: views/settings/gopro.php:40
msgid "with power for everyone."
msgstr ""

#: views/settings/gopro.php:45
msgid "Feature"
msgstr ""

#: views/settings/gopro.php:50
msgid "Backup Files & Database"
msgstr ""

#: views/settings/gopro.php:60
msgid "Database Table Filters"
msgstr ""

#: views/settings/gopro.php:65
msgid "Migration Wizard"
msgstr ""

#: views/settings/gopro.php:70
msgid "Scheduled Backups"
msgstr ""

#: views/settings/gopro.php:77
msgid "Amazon S3 Storage"
msgstr ""

#: views/settings/gopro.php:85
msgid "Dropbox Storage "
msgstr ""

#: views/settings/gopro.php:93
msgid "Google Drive Storage"
msgstr ""

#: views/settings/gopro.php:101
msgid "Microsoft One Drive Storage"
msgstr ""

#: views/settings/gopro.php:109
msgid "Remote FTP/SFTP Storage"
msgstr ""

#: views/settings/gopro.php:115
msgid "Overwrite Live Site"
msgstr ""

#: views/settings/gopro.php:117
msgid "Overwrite Existing Site"
msgstr ""

#: views/settings/gopro.php:118
msgid "Overwrite a live site. Makes installing super-fast!"
msgstr ""

#: views/settings/gopro.php:124 views/settings/gopro.php:126
msgid "Large Site Support"
msgstr ""

#: views/settings/gopro.php:127
msgid "Advanced archive engine processes multi-gig sites - even on stubborn budget hosts!"
msgstr ""

#: views/settings/gopro.php:133
msgid "Multiple Archive Engines"
msgstr ""

#: views/settings/gopro.php:138
msgid "Server Throttling"
msgstr ""

#: views/settings/gopro.php:143
msgid "Background Processing"
msgstr ""

#: views/settings/gopro.php:148
msgid "Installer Passwords"
msgstr ""

#: views/settings/gopro.php:153
msgid " Regenerate Salts"
msgstr ""

#: views/settings/gopro.php:155
msgid "Regenerate Salts"
msgstr ""

#: views/settings/gopro.php:156
msgid "Installer contains option to regenerate salts in the wp-config.php file.  This feature is only available with Freelancer, Business or Gold licenses."
msgstr ""

#: views/settings/gopro.php:162 views/settings/gopro.php:164
msgid "WP-Config Control Plus"
msgstr ""

#: views/settings/gopro.php:165
msgid "Control many wp-config.php settings right from the installer!"
msgstr ""

#: views/settings/gopro.php:173
msgid "cPanel Database API"
msgstr ""

#: views/settings/gopro.php:177
msgid "Create the database and database user directly in the installer.  No need to browse to your host's cPanel application."
msgstr ""

#: views/settings/gopro.php:183
msgid "Multisite Network Migration"
msgstr ""

#: views/settings/gopro.php:188
msgid "Multisite Subsite &gt; Standalone"
msgstr ""

#: views/settings/gopro.php:190
msgid "Multisite"
msgstr ""

#: views/settings/gopro.php:191
msgid "Install an individual subsite from a Multisite as a standalone site.  This feature is only available with Business or Gold licenses."
msgstr ""

#: views/settings/gopro.php:198
msgid "Custom Search & Replace"
msgstr ""

#: views/settings/gopro.php:204
msgid "Email Alerts"
msgstr ""

#: views/settings/gopro.php:210
msgid "Manual Transfers"
msgstr ""

#: views/settings/gopro.php:216
msgid "Active Customer Support"
msgstr ""

#: views/settings/gopro.php:219
msgid "Pro users get top priority for any requests to our support desk.  In most cases responses will be answered in under 24 hours."
msgstr ""

#: views/settings/gopro.php:225
msgid "Plus Many Other Features..."
msgstr ""

#: views/settings/gopro.php:234
msgid "Check It Out!"
msgstr ""

#: views/settings/license.php:4
msgid "Activation"
msgstr ""

#: views/settings/license.php:9
#, php-format
msgid "%1$sManage Licenses%2$s"
msgstr ""

#: views/settings/license.php:14
msgid "Duplicator Free"
msgstr ""

#: views/settings/license.php:16
msgid "Basic Features"
msgstr ""

#: views/settings/license.php:17
msgid "Pro Features"
msgstr ""

#: views/settings/license.php:22
msgid "License Key"
msgstr ""

#: views/settings/license.php:26
msgid "The free version of Duplicator does not require a license key. "
msgstr ""

#: views/settings/license.php:28
msgid "Professional Users: Please note that if you have already purchased the Professional version it is a separate plugin that you download and install.  You can download the Professional version  from the email sent after your purchase or click on the 'Manage Licenses' link above to download the plugin from your snapcreek.com dashboard.  "
msgstr ""

#: views/settings/license.php:31
msgid "If you would like to purchase the professional version you can "
msgstr ""

#: views/settings/license.php:32
msgid "get a copy here"
msgstr ""

#: views/settings/packages.php:8
msgid "Package Settings Saved"
msgstr ""

#: views/settings/packages.php:74
msgid "SQL Script"
msgstr ""

#: views/settings/packages.php:78
msgid "Mysqldump"
msgstr ""

#: views/settings/packages.php:88
msgid "PHP Code"
msgstr ""

#: views/settings/packages.php:98
msgid "This server does not support the PHP shell_exec function which is required for mysqldump to run. "
msgstr ""

#: views/settings/packages.php:99
msgid "Please contact the host or server administrator to enable this feature."
msgstr ""

#: views/settings/packages.php:104 views/tools/diagnostics/logging.php:180
msgid "Host Recommendation:"
msgstr ""

#: views/settings/packages.php:105 views/tools/diagnostics/logging.php:181
msgid "Duplicator recommends going with the high performance pro plan or better from our recommended list"
msgstr ""

#: views/settings/packages.php:109
msgid "Please visit our recommended"
msgstr ""

#: views/settings/packages.php:110 views/settings/packages.php:134
#: views/tools/diagnostics/logging.php:186
msgid "host list"
msgstr ""

#: views/settings/packages.php:111
msgid "for reliable access to mysqldump"
msgstr ""

#: views/settings/packages.php:122
msgid "Successfully Found:"
msgstr ""

#: views/settings/packages.php:129
msgid "Mysqldump was not found at its default location or the location provided.  Please enter a custom path to a valid location where mysqldump can run.  If the problem persist contact your host or server administrator.  "
msgstr ""

#: views/settings/packages.php:133
msgid "See the"
msgstr ""

#: views/settings/packages.php:135
msgid "for reliable access to mysqldump."
msgstr ""

#: views/settings/packages.php:141
msgid "Custom Path"
msgstr ""

#: views/settings/packages.php:143
msgid "mysqldump path:"
msgstr ""

#: views/settings/packages.php:144
msgid "Add a custom path if the path to mysqldump is not properly detected.   For all paths use a forward slash as the path seperator.  On Linux systems use mysqldump for Windows systems use mysqldump.exe.  If the path tried does not work please contact your hosting provider for details on the correct path."
msgstr ""

#: views/settings/packages.php:148
msgid "/usr/bin/mypath/mysqldump"
msgstr ""

#: views/settings/packages.php:152
msgid "<i class=\"fa fa-exclamation-triangle fa-sm\"></i> The custom path provided is not recognized as a valid mysqldump file:<br/>"
msgstr ""

#: views/settings/packages.php:170
msgid "Single-Threaded"
msgstr ""

#: views/settings/packages.php:173
msgid "Multi-Threaded"
msgstr ""

#: views/settings/packages.php:177
msgid "PHP Code Mode:"
msgstr ""

#: views/settings/packages.php:179
msgid "Single-Threaded mode attempts to create the entire database script in one request.  Multi-Threaded mode allows the database script to be chunked over multiple requests.  Multi-Threaded mode is typically slower but much more reliable especially for larger databases."
msgstr ""

#: views/settings/packages.php:181
msgid "<br><br><i>Multi-Threaded mode is only available in Duplicator Pro.</i>"
msgstr ""

#: views/settings/packages.php:184
msgid "Query Limit Size"
msgstr ""

#: views/settings/packages.php:194
msgid "PHP Query Limit Size"
msgstr ""

#: views/settings/packages.php:195
msgid "A higher limit size will speed up the database build time, however it will use more memory.  If your host has memory caps start off low."
msgstr ""

#: views/settings/packages.php:213
msgid "ZipArchive"
msgstr ""

#: views/settings/packages.php:219
msgid "DupArchive"
msgstr ""

#: views/settings/packages.php:228
msgid "Creates a archive format (archive.zip)."
msgstr ""

#: views/settings/packages.php:229
msgid "This option uses the internal PHP ZipArchive classes to create a Zip file."
msgstr ""

#: views/settings/packages.php:238
msgid "Creates a custom archive format (archive.daf)."
msgstr ""

#: views/settings/packages.php:239
msgid "This option is recommended for large sites or sites on constrained servers."
msgstr ""

#: views/settings/packages.php:246
msgid "Archive Flush"
msgstr ""

#: views/settings/packages.php:249
msgid "Attempt Network Keep Alive"
msgstr ""

#: views/settings/packages.php:250
msgid "enable only for large archives"
msgstr ""

#: views/settings/packages.php:253
msgid "This will attempt to keep a network connection established for large archives."
msgstr ""

#: views/settings/packages.php:254
msgid " Valid only when Archive Engine for ZipArchive is enabled."
msgstr ""

#: views/settings/packages.php:261
msgid "Visual"
msgstr ""

#: views/settings/packages.php:265
msgid "Created Format"
msgstr ""

#: views/settings/packages.php:269
msgid "By Year"
msgstr ""

#: views/settings/packages.php:276
msgid "By Month"
msgstr ""

#: views/settings/packages.php:283
msgid "By Day"
msgstr ""

#: views/settings/packages.php:291
msgid "The UTC date format shown in the 'Created' column on the Packages screen."
msgstr ""

#: views/settings/packages.php:292
msgid "To use WordPress timezone formats consider an upgrade to Duplicator Pro."
msgstr ""

#: views/settings/packages.php:301
msgid "Save Package Settings"
msgstr ""

#: views/settings/schedule.php:14 views/tools/templates.php:15
msgid "This option is available in Duplicator Pro."
msgstr ""

#: views/settings/schedule.php:15
msgid "Create robust schedules that automatically create packages while you sleep."
msgstr ""

#: views/settings/schedule.php:17
msgid "Simply choose your storage location and when you want it to run."
msgstr ""

#: views/settings/storage.php:15
msgid "Store your packages in multiple locations  with Duplicator Pro"
msgstr ""

#: views/settings/storage.php:20
msgid " Dropbox"
msgstr ""

#: views/settings/storage.php:28
msgid "Set up a one-time storage location and automatically <br/> push the package to your destination."
msgstr ""

#: views/tools/controller.php:22
msgid "Diagnostics"
msgstr ""

#: views/tools/controller.php:23
msgid "Templates"
msgstr ""

#: views/tools/diagnostics/inc.data.php:11
msgid "Stored Data"
msgstr ""

#: views/tools/diagnostics/inc.data.php:16
msgid "Data Cleanup"
msgstr ""

#: views/tools/diagnostics/inc.data.php:21
msgid "Remove Installation Files"
msgstr ""

#: views/tools/diagnostics/inc.data.php:25
msgid "Removes all reserved installer files."
msgstr ""

#: views/tools/diagnostics/inc.data.php:30
msgid "Clicking on the 'Remove Installation Files' button will attempt to remove the installer files used by Duplicator.  These files should not be left on production systems for security reasons. Below are the files that should be removed."
msgstr ""

#: views/tools/diagnostics/inc.data.php:45
msgid "Clear Build Cache"
msgstr ""

#: views/tools/diagnostics/inc.data.php:48
msgid "Removes all build data from:"
msgstr ""

#: views/tools/diagnostics/inc.data.php:53
msgid "Options Values"
msgstr ""

#: views/tools/diagnostics/inc.data.php:87
msgid "Delete Option?"
msgstr ""

#: views/tools/diagnostics/inc.data.php:88
msgid "Delete the option value just selected?"
msgstr ""

#: views/tools/diagnostics/inc.data.php:89
msgid "Removing Option, Please Wait..."
msgstr ""

#: views/tools/diagnostics/inc.data.php:94
msgid "Clear Build Cache?"
msgstr ""

#: views/tools/diagnostics/inc.data.php:95
msgid "This process will remove all build cache files.  Be sure no packages are currently building or else they will be cancelled."
msgstr ""

#: views/tools/diagnostics/inc.data.php:107
msgid "Delete the option value"
msgstr ""

#: views/tools/diagnostics/inc.phpinfo.php:17
msgid "PHP Information"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:5
#: views/tools/diagnostics/inc.settings.php:6
msgid "unknow"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:23
msgid "Server Settings"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:32
msgid "Duplicator Version"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:39
msgid "Operating System"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:43
msgid "Timezone"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:47
msgid "Server Time"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:59
msgid "ABSPATH"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:63
msgid "Plugins Path"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:67
msgid "Loaded PHP INI"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:71
msgid "Server IP"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:78
msgid "Can't detect"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:84
msgid "Client IP"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:95
msgid "Language"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:99
#: views/tools/diagnostics/inc.settings.php:191
msgid "Charset"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:103
msgid "Memory Limit "
msgstr ""

#: views/tools/diagnostics/inc.settings.php:104
msgid "Max"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:122
msgid "Process"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:126
msgid "Safe Mode"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:130
msgid "On"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:130
msgid "Off"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:135
msgid "Memory Limit"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:139
msgid "Memory In Use"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:143
#: views/tools/diagnostics/inc.settings.php:152
msgid "Max Execution Time"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:153
msgid "If the value shows dynamic then this means its possible for PHP to run longer than the default.  If the value is fixed then PHP will not be allowed to run longer than the default."
msgstr ""

#: views/tools/diagnostics/inc.settings.php:158
msgid "Shell Exec"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:159
#: views/tools/diagnostics/inc.settings.php:163
msgid "Is Supported"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:159
#: views/tools/diagnostics/inc.settings.php:163
msgid "Not Supported"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:162
msgid "Shell Exec Zip"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:166
msgid "Suhosin Extension"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:170
msgid "Architecture "
msgstr ""

#: views/tools/diagnostics/inc.settings.php:176
msgid "Error Log File "
msgstr ""

#: views/tools/diagnostics/inc.settings.php:187
msgid "Comments"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:195
msgid "Wait Timeout"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:199
msgid "Max Allowed Packets"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:203
msgid "msyqldump Path"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:207
msgid "Server Disk"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:210
msgid "Free space"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:213
msgid "Note: This value is the physical servers hard-drive allocation."
msgstr ""

#: views/tools/diagnostics/inc.settings.php:214
msgid "On shared hosts check your control panel for the 'TRUE' disk space quota value."
msgstr ""

#: views/tools/diagnostics/inc.validator.php:16
msgid "Run Validator"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:17
msgid "This will run the scan validation check.  This may take several minutes.  Do you want to Continue?"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:28
msgid "Scan Validator"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:33
msgid "This utility will help to find unreadable files and sys-links in your environment  that can lead to issues during the scan process.  "
msgstr ""

#: views/tools/diagnostics/inc.validator.php:34
msgid "The utility will also shows how many files and directories you have in your system.  This process may take several minutes to run.  "
msgstr ""

#: views/tools/diagnostics/inc.validator.php:35
msgid "If there is a recursive loop on your system then the process has a built in check to stop after a large set of files and directories have been scanned.  "
msgstr ""

#: views/tools/diagnostics/inc.validator.php:36
msgid "A message will show indicated that that a scan depth has been reached. If you have issues with the package scanner (step 2) during the build process then try to add The paths below to your file filters to allow the scanner to finish."
msgstr ""

#: views/tools/diagnostics/inc.validator.php:43
#: views/tools/diagnostics/inc.validator.php:153
msgid "Run Scan Integrity Validation"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:77
msgid "Note: Symlinks are not discoverable on Windows OS with PHP"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:122
msgid "Scanning Environment... This may take a few minutes."
msgstr ""

#: views/tools/diagnostics/information.php:25
msgid "File Found: Unable to remove"
msgstr ""

#: views/tools/diagnostics/information.php:26
msgid "Removed"
msgstr ""

#: views/tools/diagnostics/information.php:44
msgid "Installer file cleanup ran!"
msgstr ""

#: views/tools/diagnostics/information.php:48
msgid "Build cache removed."
msgstr ""

#: views/tools/diagnostics/information.php:125
msgid "No Duplicator installer files found on this WordPress Site."
msgstr ""

#: views/tools/diagnostics/information.php:132
msgid "Security Notes"
msgstr ""

#: views/tools/diagnostics/information.php:133
msgid "If the installer files do not successfully get removed with this action, then they WILL need to be removed manually through your hosts control panel  or FTP.  Please remove all installer files to avoid any security issues on this site.  For more details please visit the FAQ link <a href=\"https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-295-q\" target=\"_blank\">Which files need to be removed after an install?</a>"
msgstr ""

#: views/tools/diagnostics/information.php:140
msgid "Some of the installer files did not get removed, "
msgstr ""

#: views/tools/diagnostics/information.php:142
msgid "please retry the installer cleanup process"
msgstr ""

#: views/tools/diagnostics/information.php:144
msgid " If this process continues please see the previous FAQ link."
msgstr ""

#: views/tools/diagnostics/information.php:148
msgid "Help Support Duplicator"
msgstr ""

#: views/tools/diagnostics/information.php:149
msgid "The Duplicator team has worked many years to make moving a WordPress site a much easier process.  Show your support with a <a href=\"https://wordpress.org/support/plugin/duplicator/reviews/?filter=5\" target=\"_blank\">5 star review</a>!  We would be thrilled if you could!"
msgstr ""

#: views/tools/diagnostics/information.php:159
msgid "Please test the entire site to validate the migration process!"
msgstr ""

#: views/tools/diagnostics/information.php:165
msgid "NOTICE: Safe mode (Basic) was enabled during install, be sure to re-enable all your plugins."
msgstr ""

#: views/tools/diagnostics/information.php:170
msgid "NOTICE: Safe mode (Advanced) was enabled during install, be sure to re-enable all your plugins."
msgstr ""

#: views/tools/diagnostics/information.php:212
msgid "Plugin settings reset."
msgstr ""

#: views/tools/diagnostics/information.php:213
msgid "View state settings reset."
msgstr ""

#: views/tools/diagnostics/information.php:214
msgid "Active package settings reset."
msgstr ""

#: views/tools/diagnostics/logging.php:166
msgid "Log file not found or unreadable"
msgstr ""

#: views/tools/diagnostics/logging.php:167
msgid "Try to create a package, since no log files were found in the snapshots directory with the extension *.log"
msgstr ""

#: views/tools/diagnostics/logging.php:168
msgid "Reasons for log file not showing"
msgstr ""

#: views/tools/diagnostics/logging.php:169
msgid "The web server does not support returning .log file extentions"
msgstr ""

#: views/tools/diagnostics/logging.php:170
msgid "The snapshots directory does not have the correct permissions to write files.  Try setting the permissions to 755"
msgstr ""

#: views/tools/diagnostics/logging.php:171
msgid "The process that PHP runs under does not have enough permissions to create files.  Please contact your hosting provider for more details"
msgstr ""

#: views/tools/diagnostics/logging.php:185
msgid "Consider our recommended"
msgstr ""

#: views/tools/diagnostics/logging.php:187
msgid "if you’re unhappy with your current provider"
msgstr ""

#: views/tools/diagnostics/logging.php:191
#: views/tools/diagnostics/logging.php:196
msgid "Options"
msgstr ""

#: views/tools/diagnostics/logging.php:198
msgid "Refresh"
msgstr ""

#: views/tools/diagnostics/logging.php:201
msgid "Auto Refresh"
msgstr ""

#: views/tools/diagnostics/logging.php:207
msgid "Package Logs"
msgstr ""

#: views/tools/diagnostics/logging.php:208
msgid "Top 20"
msgstr ""

#: views/tools/diagnostics/main.php:43
msgid "Information"
msgstr ""

#: views/tools/diagnostics/main.php:44
msgid "Logs"
msgstr ""

#: views/tools/diagnostics/support.php:32
msgid "Migrating WordPress is a complex process and the logic to make all the magic happen smoothly may not work quickly with every site.  With over 30,000 plugins and a very complex server eco-system some migrations may run into issues.  This is why the Duplicator includes a detailed knowledgebase that can help with many common issues.  Resources to additional support, approved hosting, and alternatives to fit your needs can be found below."
msgstr ""

#: views/tools/diagnostics/support.php:44
msgid "Knowledgebase"
msgstr ""

#: views/tools/diagnostics/support.php:47
msgid "Complete Online Documentation"
msgstr ""

#: views/tools/diagnostics/support.php:49
msgid "Choose A Section"
msgstr ""

#: views/tools/diagnostics/support.php:50
msgid "Quick Start"
msgstr ""

#: views/tools/diagnostics/support.php:52
msgid "User Guide"
msgstr ""

#: views/tools/diagnostics/support.php:54
msgid "FAQs"
msgstr ""

#: views/tools/diagnostics/support.php:56
msgid "Change Log"
msgstr ""

#: views/tools/diagnostics/support.php:66
msgid "Online Support"
msgstr ""

#: views/tools/diagnostics/support.php:69
msgid "Get Help From IT Professionals"
msgstr ""

#: views/tools/diagnostics/support.php:73
msgid "Get Support!"
msgstr ""

#: views/tools/diagnostics/support.php:87
msgid "Approved Hosting"
msgstr ""

#: views/tools/diagnostics/support.php:90
msgid "Servers That Work With Duplicator"
msgstr ""

#: views/tools/diagnostics/support.php:93
msgid "Trusted Providers!"
msgstr ""

#: views/tools/diagnostics/support.php:104
msgid "Alternatives"
msgstr ""

#: views/tools/diagnostics/support.php:107
msgid "Other Commercial Resources"
msgstr ""

#: views/tools/diagnostics/support.php:110
msgid "Pro Solutions!"
msgstr ""

#: views/tools/templates.php:16
msgid "Templates allow you to customize what you want to include in your site and store it as a re-usable profile."
msgstr ""

#: views/tools/templates.php:18
msgid "Save time and create a template that can be applied to a schedule or a custom package setup."
msgstr ""
languages/duplicator-en_US.po000064400000304711151336065400012240 0ustar00# Copyright (C) 2019 Snap Creek
# This file is distributed under the same license as the Duplicator plugin.
msgid ""
msgstr ""
"Project-Id-Version: Duplicator 1.3.7\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/duplicator\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2019-09-02 12:30+0530\n"
"PO-Revision-Date: 2019-09-02 12:45+0530\n"
"X-Generator: Poedit 2.2.3\n"
"X-Poedit-KeywordsList: __;_e;esc_html_e;esc_html__;_x;_ex;esc_attr_e;"
"esc_attr__\n"
"X-Poedit-Basepath: ..\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: en_US\n"
"X-Poedit-SearchPath-0: .\n"

#: classes/class.logging.php:141
msgid "No Log"
msgstr ""

#: classes/class.server.php:207
msgid "(directory)"
msgstr ""

#: classes/package/class.pack.database.php:663
msgid "Please contact your DataBase administrator to fix the error."
msgstr ""

#: classes/package/class.pack.installer.php:90
msgid "Error reading DupArchive mini expander"
msgstr ""

#: classes/package/class.pack.installer.php:103
msgid "Error writing installer contents"
msgstr ""

#: classes/package/class.pack.php:309
msgid "Package name can't be empty"
msgstr ""

#: classes/package/class.pack.php:315
#, php-format
msgid "Directories: <b>%1$s</b> isn't a valid path"
msgstr ""

#: classes/package/class.pack.php:321
#, php-format
msgid "File extension: <b>%1$s</b> isn't a valid extension"
msgstr ""

#: classes/package/class.pack.php:327
#, php-format
msgid "Files: <b>%1$s</b> isn't a valid file name"
msgstr ""

#: classes/package/class.pack.php:335
#, php-format
msgid "MySQL Server Host: <b>%1$s</b> isn't a valid host"
msgstr ""

#: classes/package/class.pack.php:346
#, php-format
msgid "MySQL Server Port: <b>%1$s</b> isn't a valid port"
msgstr ""

#: classes/package/class.pack.php:845
#, php-format
msgid ""
"Can't find Scanfile %s. Please ensure there no non-English characters in the "
"package or schedule name."
msgstr ""

#: classes/package/class.pack.php:868
#, php-format
msgid "EXPECTED FILE/DIRECTORY COUNT: %1$s"
msgstr ""

#: classes/package/class.pack.php:869
#, php-format
msgid "ACTUAL FILE/DIRECTORY COUNT: %1$s"
msgstr ""

#: classes/package/class.pack.php:913
#, php-format
msgid "ERROR: Cannot open created archive. Error code = %1$s"
msgstr ""

#: classes/package/class.pack.php:918
msgid "ERROR: Archive is not valid zip archive."
msgstr ""

#: classes/package/class.pack.php:922
msgid "ERROR: Archive doesn't pass consistency check."
msgstr ""

#: classes/package/class.pack.php:927
msgid "ERROR: Archive checksum is bad."
msgstr ""

#: classes/package/class.pack.php:938
msgid "ARCHIVE CONSISTENCY TEST: Pass"
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:44
msgid ""
"Package build appears stuck so marking package as failed. Is the Max Worker "
"Time set too high?."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:45
msgid "Build Failure"
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:83
msgid "Click on \"Resolve This\" button to fix the JSON settings."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:95
#, php-format
msgid ""
"ERROR: Can't find Scanfile %s. Please ensure there no non-English characters "
"in the package or schedule name."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:214
msgid "Problem adding items to archive."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:216
msgid "Problems adding items to archive."
msgstr ""

#: classes/package/duparchive/class.pack.archive.duparchive.php:314
msgid "Critical failure present in validation"
msgstr ""

#: classes/ui/class.ui.dialog.php:95
msgid "Processing please wait..."
msgstr ""

#: classes/ui/class.ui.dialog.php:98
msgid "OK"
msgstr ""

#: classes/ui/class.ui.dialog.php:99 deactivation.php:135
msgid "Cancel"
msgstr ""

#: classes/ui/class.ui.notice.php:47
msgid "Safe Mode:"
msgstr ""

#: classes/ui/class.ui.notice.php:48
msgid ""
"During the install safe mode was enabled deactivating all plugins.<br/> "
"Please be sure to "
msgstr ""

#: classes/ui/class.ui.notice.php:49
msgid "re-activate the plugins"
msgstr ""

#: classes/ui/class.ui.notice.php:56
#: views/tools/diagnostics/information.php:158
msgid "This site has been successfully migrated!"
msgstr ""

#: classes/ui/class.ui.notice.php:57
msgid "Final step(s):"
msgstr ""

#: classes/ui/class.ui.notice.php:58
msgid ""
"This message will be removed after all installer files are removed.  "
"Installer files must be removed to maintain a secure site.  Click the link "
"above or button below to remove all installer files and complete the "
"migration."
msgstr ""

#: classes/ui/class.ui.notice.php:62
msgid "Remove Installation Files Now!"
msgstr ""

#: classes/ui/class.ui.notice.php:63
msgid "Optionally, Review Duplicator at WordPress.org..."
msgstr ""

#: classes/ui/class.ui.notice.php:69
msgid "Migration Almost Complete!"
msgstr ""

#: classes/ui/class.ui.notice.php:70
msgid ""
"Reserved Duplicator installation files have been detected in the root "
"directory.  Please delete these installation files to avoid security issues. "
"<br/> Go to:Duplicator > Tools > Information >Stored Data and click the "
"\"Remove Installation Files\" button"
msgstr ""

#: classes/ui/class.ui.notice.php:76
msgid "Take me there now!"
msgstr ""

#: classes/ui/class.ui.notice.php:91
msgid "Redirecting Please Wait..."
msgstr ""

#: classes/ui/class.ui.notice.php:94
msgid "Invalid token permissions to perform this request."
msgstr ""

#: classes/ui/class.ui.notice.php:117
#, php-format
msgid "Activate %s"
msgstr ""

#: classes/ui/class.ui.screen.base.php:44
msgid "<b>Need Help?</b>  Please check out these resources first:<ul>"
msgstr ""

#: classes/ui/class.ui.screen.base.php:52 views/settings/gopro.php:218
#: views/tools/diagnostics/main.php:45
msgid "Support"
msgstr ""

#: classes/ui/class.ui.screen.base.php:65
msgid "Resources"
msgstr ""

#: classes/ui/class.ui.screen.base.php:66
msgid "Knowledge Base"
msgstr ""

#: classes/ui/class.ui.screen.base.php:67
msgid "Full User Guide"
msgstr ""

#: classes/ui/class.ui.screen.base.php:68
msgid "Technical FAQs"
msgstr ""

#: classes/ui/class.ui.screen.base.php:69
msgid "Package Settings"
msgstr ""

#: classes/utilities/class.u.php:64
msgid "32-bit"
msgstr ""

#: classes/utilities/class.u.php:67
msgid "64-bit"
msgstr ""

#: classes/utilities/class.u.php:70
msgid "Unknown"
msgstr ""

#: classes/utilities/class.u.php:496
msgid "You do not have sufficient permissions to access this page."
msgstr ""

#: ctrls/ctrl.package.php:175
msgid "Error building DupArchive package"
msgstr ""

#: ctrls/ctrl.package.php:303
msgid ""
"An unathorized security request was made to this page. Please try again!"
msgstr ""

#: ctrls/ctrl.package.php:325
msgid "Active package object error"
msgstr ""

#: ctrls/ctrl.package.php:488 ctrls/ctrl.package.php:506
msgid "Couldn't find a local copy of the file requested."
msgstr ""

#: deactivation.php:48
msgid "Need help? We are ready to answer your questions."
msgstr ""

#: deactivation.php:48
msgid "Contact Support"
msgstr ""

#: deactivation.php:53
msgid "It's not working on my server."
msgstr ""

#: deactivation.php:55
msgid "Kindly share what didn't work so we can fix it in future updates..."
msgstr ""

#: deactivation.php:60
msgid "It's too confusing to understand."
msgstr ""

#: deactivation.php:62
msgid "Please tell us what is not clear so that we can improve it."
msgstr ""

#: deactivation.php:67
msgid "I found a different plugin that I like better."
msgstr ""

#: deactivation.php:69
msgid "What's the plugin name?"
msgstr ""

#: deactivation.php:73
msgid "It does not do what I need."
msgstr ""

#: deactivation.php:75
msgid "What does it need to do?"
msgstr ""

#: deactivation.php:79
msgid "It's a temporary deactivation, I use the plugin all the time."
msgstr ""

#: deactivation.php:85
#, php-format
msgid "I'm switching over to the %s"
msgstr ""

#: deactivation.php:85
msgid "Pro version"
msgstr ""

#: deactivation.php:128
msgid "Quick Feedback"
msgstr ""

#: deactivation.php:129
msgid "If you have a moment, please let us know why you are deactivating"
msgstr ""

#: deactivation.php:136 deactivation.php:344
msgid "Skip & Deactivate"
msgstr ""

#: deactivation.php:137
msgid "Send & Deactivate"
msgstr ""

#: deactivation.php:140
msgid "Your response is sent anonymously."
msgstr ""

#: deactivation.php:235 deactivation.php:236
msgid "Processing"
msgstr ""

#: deactivation.php:283
msgid "Please tell us the reason so we can improve it."
msgstr ""

#: duplicator.php:398 views/packages/details/controller.php:48
#: views/packages/main/packages.php:88 views/packages/main/s1.setup1.php:72
#: views/packages/main/s2.scan1.php:185 views/packages/main/s3.build.php:90
#: views/settings/controller.php:23
msgid "Packages"
msgstr ""

#: duplicator.php:404 views/tools/controller.php:19
msgid "Tools"
msgstr ""

#: duplicator.php:409 views/packages/main/packages.php:85
#: views/settings/controller.php:19 views/settings/general.php:179
msgid "Settings"
msgstr ""

#: duplicator.php:413
msgid "Go Pro!"
msgstr ""

#: duplicator.php:481 views/settings/license.php:8
msgid "Manage"
msgstr ""

#: duplicator.php:498 views/packages/main/packages.php:82
msgid "Get Help"
msgstr ""

#: duplicator.php:498
msgid "Go Pro"
msgstr ""

#: views/packages/details/controller.php:13
msgid "package log"
msgstr ""

#: views/packages/details/controller.php:14
msgid "FAQ"
msgstr ""

#: views/packages/details/controller.php:15
msgid "resources page"
msgstr ""

#: views/packages/details/controller.php:34
msgid "This package contains an error.  Please review the "
msgstr ""

#: views/packages/details/controller.php:34
msgid " for details."
msgstr ""

#: views/packages/details/controller.php:35
msgid "For help visit the "
msgstr ""

#: views/packages/details/controller.php:35
msgid " and "
msgstr ""

#: views/packages/details/controller.php:42
msgid "Details"
msgstr ""

#: views/packages/details/controller.php:45
msgid "Transfer"
msgstr ""

#: views/packages/details/detail.php:63
msgid "Invalid Package ID request.  Please try again!"
msgstr ""

#: views/packages/details/detail.php:75 views/settings/controller.php:22
#: views/tools/diagnostics/inc.settings.php:29
msgid "General"
msgstr ""

#: views/packages/details/detail.php:81 views/packages/details/detail.php:184
#: views/packages/main/packages.php:138 views/packages/main/s1.setup2.php:73
#: views/packages/main/s1.setup2.php:99 views/packages/main/s2.scan3.php:529
#: views/packages/main/s3.build.php:133
msgid "Name"
msgstr ""

#: views/packages/details/detail.php:85
msgid "ID"
msgstr ""

#: views/packages/details/detail.php:86
msgid "Hash"
msgstr ""

#: views/packages/details/detail.php:87
msgid "Full Name"
msgstr ""

#: views/packages/details/detail.php:92 views/packages/main/s1.setup2.php:82
#: views/packages/main/s2.scan3.php:530
msgid "Notes"
msgstr ""

#: views/packages/details/detail.php:93
msgid "- no notes -"
msgstr ""

#: views/packages/details/detail.php:96
msgid "Versions"
msgstr ""

#: views/packages/details/detail.php:100 views/packages/main/s2.scan2.php:106
msgid "WordPress"
msgstr ""

#: views/packages/details/detail.php:100 views/packages/details/detail.php:101
#: views/packages/details/detail.php:103 views/packages/details/detail.php:104
#: views/packages/details/detail.php:118
msgid "- unknown -"
msgstr ""

#: views/packages/details/detail.php:101
msgid "PHP"
msgstr ""

#: views/packages/details/detail.php:102
msgid "Mysql"
msgstr ""

#: views/packages/details/detail.php:109
msgid "Runtime"
msgstr ""

#: views/packages/details/detail.php:110
msgid "error running"
msgstr ""

#: views/packages/details/detail.php:113
msgid "Status"
msgstr ""

#: views/packages/details/detail.php:114
msgid "completed"
msgstr ""

#: views/packages/details/detail.php:114
msgid "in-complete"
msgstr ""

#: views/packages/details/detail.php:117 views/packages/details/detail.php:366
#: views/packages/main/s1.setup2.php:472
#: views/tools/diagnostics/inc.settings.php:118
msgid "User"
msgstr ""

#: views/packages/details/detail.php:121 views/packages/details/detail.php:269
#: views/packages/main/s1.setup2.php:158 views/packages/main/s2.scan3.php:28
#: views/packages/main/s2.scan3.php:586 views/packages/main/s2.scan3.php:638
msgid "Files"
msgstr ""

#: views/packages/details/detail.php:129
msgid "Log"
msgstr ""

#: views/packages/details/detail.php:130
msgid "Share"
msgstr ""

#: views/packages/details/detail.php:138 views/packages/details/detail.php:226
#: views/packages/main/packages.php:208 views/packages/main/s1.setup2.php:142
#: views/packages/main/s2.scan3.php:21 views/packages/main/s3.build.php:146
#: views/settings/packages.php:204
msgid "Archive"
msgstr ""

#: views/packages/details/detail.php:142 views/packages/details/detail.php:325
#: views/packages/main/packages.php:205 views/packages/main/s1.setup2.php:381
#: views/packages/main/s3.build.php:143
msgid "Installer"
msgstr ""

#: views/packages/details/detail.php:146 views/packages/details/detail.php:362
#: views/packages/main/s1.setup2.php:159 views/packages/main/s1.setup2.php:468
#: views/packages/main/s2.scan3.php:365 views/packages/main/s2.scan3.php:535
#: views/settings/packages.php:70
msgid "Database"
msgstr ""

#: views/packages/details/detail.php:160
msgid "Download Links"
msgstr ""

#: views/packages/details/detail.php:163
msgid "The following links contain sensitive data.  Please share with caution!"
msgstr ""

#: views/packages/details/detail.php:169
msgid ""
"The database SQL script is a quick link to your database backup script.  An "
"exact copy is also stored in the package."
msgstr ""

#: views/packages/details/detail.php:177 views/packages/main/s1.setup2.php:92
#: views/settings/controller.php:25 views/settings/general.php:110
msgid "Storage"
msgstr ""

#: views/packages/details/detail.php:185 views/packages/details/detail.php:286
#: views/packages/main/s1.setup2.php:100 views/settings/license.php:12
msgid "Type"
msgstr ""

#: views/packages/details/detail.php:186 views/packages/main/s1.setup2.php:101
msgid "Location"
msgstr ""

#: views/packages/details/detail.php:191 views/packages/main/s1.setup2.php:106
msgid "Default"
msgstr ""

#: views/packages/details/detail.php:192 views/packages/main/s1.setup2.php:107
msgid "Local"
msgstr ""

#: views/packages/details/detail.php:203 views/packages/main/s1.setup2.php:119
#, php-format
msgid "%1$s, %2$s, %3$s, %4$s, %5$s and other storage options available in"
msgstr ""

#: views/packages/details/detail.php:204 views/packages/main/s1.setup2.php:120
#: views/packages/main/s2.scan3.php:485 views/packages/main/s2.scan3.php:497
#: views/packages/main/s3.build.php:21
msgid "Duplicator Pro"
msgstr ""

#: views/packages/details/detail.php:206 views/packages/main/s1.setup2.php:122
msgid "Additional Storage:"
msgstr ""

#: views/packages/details/detail.php:207 views/packages/main/s1.setup2.php:123
msgid ""
"Duplicator Pro allows you to create a package and then store it at a custom "
"location on this server or to a cloud based location such as Google Drive, "
"Amazon, Dropbox or FTP."
msgstr ""

#: views/packages/details/detail.php:234 views/packages/details/detail.php:290
#: views/packages/main/s1.setup2.php:260
msgid "Build Mode"
msgstr ""

#: views/packages/details/detail.php:241
msgid "Database Mode"
msgstr ""

#: views/packages/details/detail.php:242
msgid "Archive Database Only Enabled"
msgstr ""

#: views/packages/details/detail.php:246 views/packages/details/detail.php:303
msgid "Filters"
msgstr ""

#: views/packages/details/detail.php:250 views/packages/main/s2.scan3.php:564
#: views/packages/main/s2.scan3.php:629
msgid "Directories"
msgstr ""

#: views/packages/details/detail.php:254 views/packages/details/detail.php:264
#: views/packages/details/detail.php:273 views/packages/details/detail.php:312
msgid "- no filters -"
msgstr ""

#: views/packages/details/detail.php:260 views/packages/main/s2.scan3.php:575
msgid "Extensions"
msgstr ""

#: views/packages/details/detail.php:283 views/packages/details/detail.php:395
msgid "DATABASE"
msgstr ""

#: views/packages/details/detail.php:296 views/packages/main/s2.scan3.php:546
msgid "MySQL Compatibility Mode Enabled"
msgstr ""

#: views/packages/details/detail.php:297 views/packages/main/s1.setup2.php:336
#: views/packages/main/s2.scan2.php:76 views/packages/main/s2.scan2.php:87
#: views/packages/main/s2.scan2.php:94 views/packages/main/s2.scan3.php:547
msgid "details"
msgstr ""

#: views/packages/details/detail.php:307 views/packages/main/s2.scan3.php:393
msgid "Tables"
msgstr ""

#: views/packages/details/detail.php:332
msgid " Security"
msgstr ""

#: views/packages/details/detail.php:336
msgid "Password Protection"
msgstr ""

#: views/packages/details/detail.php:345 views/packages/main/s1.setup2.php:431
msgid "Show/Hide Password"
msgstr ""

#: views/packages/details/detail.php:355 views/packages/main/s1.setup2.php:457
msgid " MySQL Server"
msgstr ""

#: views/packages/details/detail.php:358 views/packages/main/s1.setup2.php:460
msgid "Host"
msgstr ""

#: views/packages/details/detail.php:359 views/packages/details/detail.php:363
#: views/packages/details/detail.php:367
msgid "- not set -"
msgstr ""

#: views/packages/details/detail.php:375
msgid "View Package Object"
msgstr ""

#: views/packages/details/detail.php:392
msgid "Package File Links"
msgstr ""

#: views/packages/details/detail.php:396
msgid "PACKAGE"
msgstr ""

#: views/packages/details/detail.php:397
msgid "INSTALLER"
msgstr ""

#: views/packages/details/detail.php:398
msgid "LOG"
msgstr ""

#: views/packages/details/transfer.php:15
msgid "Transfer your packages to multiple locations  with Duplicator Pro"
msgstr ""

#: views/packages/details/transfer.php:20 views/settings/storage.php:19
msgid "Amazon S3"
msgstr ""

#: views/packages/details/transfer.php:21
msgid "Dropbox"
msgstr ""

#: views/packages/details/transfer.php:22 views/settings/storage.php:21
msgid "Google Drive"
msgstr ""

#: views/packages/details/transfer.php:23 views/settings/storage.php:22
msgid "One Drive"
msgstr ""

#: views/packages/details/transfer.php:24 views/settings/storage.php:23
msgid "FTP &amp; SFTP"
msgstr ""

#: views/packages/details/transfer.php:25 views/settings/storage.php:24
msgid "Custom Directory"
msgstr ""

#: views/packages/details/transfer.php:29
msgid ""
"Set up a one-time storage location and automatically push the package to "
"your destination."
msgstr ""

#: views/packages/details/transfer.php:35 views/settings/schedule.php:22
#: views/settings/storage.php:34 views/tools/templates.php:23
msgid "Learn More"
msgstr ""

#: views/packages/main/controller.php:9
msgid "An invalid request was made to this page."
msgstr ""

#: views/packages/main/controller.php:10
msgid "Please retry by going to the"
msgstr ""

#: views/packages/main/controller.php:11
msgid "Packages Screen"
msgstr ""

#: views/packages/main/controller.php:59
msgid "Packages &raquo; All"
msgstr ""

#: views/packages/main/controller.php:63 views/packages/main/controller.php:67
#: views/packages/main/controller.php:71
msgid "Packages &raquo; New"
msgstr ""

#: views/packages/main/packages.php:77
msgid "Bulk Actions"
msgstr ""

#: views/packages/main/packages.php:78
msgid "Delete selected package(s)"
msgstr ""

#: views/packages/main/packages.php:78
msgid "Delete"
msgstr ""

#: views/packages/main/packages.php:80
msgid "Apply"
msgstr ""

#: views/packages/main/packages.php:98 views/packages/main/s1.setup1.php:73
#: views/packages/main/s2.scan1.php:186 views/packages/main/s3.build.php:101
msgid "Create New"
msgstr ""

#: views/packages/main/packages.php:114 views/packages/main/packages.php:148
msgid "No Packages Found."
msgstr ""

#: views/packages/main/packages.php:115 views/packages/main/packages.php:149
msgid "Click the 'Create New' button to build a package."
msgstr ""

#: views/packages/main/packages.php:117 views/packages/main/packages.php:151
msgid "New to Duplicator?"
msgstr ""

#: views/packages/main/packages.php:119 views/packages/main/packages.php:153
msgid "Check out the 'Quick Start' guide!"
msgstr ""

#: views/packages/main/packages.php:135
msgid "Select all packages"
msgstr ""

#: views/packages/main/packages.php:136
msgid "Created"
msgstr ""

#: views/packages/main/packages.php:137 views/packages/main/s2.scan3.php:88
#: views/packages/main/s2.scan3.php:392
msgid "Size"
msgstr ""

#: views/packages/main/packages.php:140 views/packages/main/s2.scan3.php:528
msgid "Package"
msgstr ""

#: views/packages/main/packages.php:189
msgid "Archive created as zip file"
msgstr ""

#: views/packages/main/packages.php:190
msgid "Archive created as daf file"
msgstr ""

#: views/packages/main/packages.php:195 views/packages/main/s1.setup2.php:148
#: views/packages/main/s2.scan3.php:35
msgid "Database Only"
msgstr ""

#: views/packages/main/packages.php:199
msgid "Package Build Running"
msgstr ""

#: views/packages/main/packages.php:200
msgid ""
"To stop or reset this package build goto Settings > Advanced > Reset Packages"
msgstr ""

#: views/packages/main/packages.php:210 views/packages/main/packages.php:228
msgid "Package Details"
msgstr ""

#: views/packages/main/packages.php:226
msgid "Error Processing"
msgstr ""

#: views/packages/main/packages.php:246
msgid "Current Server Time"
msgstr ""

#: views/packages/main/packages.php:249 views/packages/main/s3.build.php:321
msgid "Time"
msgstr ""

#: views/packages/main/packages.php:258
msgid "Items"
msgstr ""

#: views/packages/main/packages.php:268
msgid "Bulk Action Required"
msgstr ""

#: views/packages/main/packages.php:270
msgid ""
"No selections made! Please select an action from the \"Bulk Actions\" drop "
"down menu."
msgstr ""

#: views/packages/main/packages.php:274
msgid "Selection Required"
msgstr ""

#: views/packages/main/packages.php:276
msgid "No selections made! Please select at least one package to delete."
msgstr ""

#: views/packages/main/packages.php:280
msgid "Delete Packages?"
msgstr ""

#: views/packages/main/packages.php:281
msgid "Are you sure you want to delete the selected package(s)?"
msgstr ""

#: views/packages/main/packages.php:282
msgid "Removing Packages, Please Wait..."
msgstr ""

#: views/packages/main/packages.php:289
msgid "Duplicator Help"
msgstr ""

#: views/packages/main/packages.php:294
msgid "Alert!"
msgstr ""

#: views/packages/main/packages.php:295
msgid "A package is being processed. Retry later."
msgstr ""

#: views/packages/main/packages.php:302
msgid "Common Questions:"
msgstr ""

#: views/packages/main/packages.php:303
msgid "How do I create a package"
msgstr ""

#: views/packages/main/packages.php:304
msgid "How do I install a package?"
msgstr ""

#: views/packages/main/packages.php:305
msgid "Frequently Asked Questions!"
msgstr ""

#: views/packages/main/packages.php:308
msgid "Other Resources:"
msgstr ""

#: views/packages/main/packages.php:309
msgid "Need help with the plugin?"
msgstr ""

#: views/packages/main/packages.php:310
msgid "Have an idea for the plugin?"
msgstr ""

#: views/packages/main/packages.php:312
msgid "Help review the plugin!"
msgstr ""

#: views/packages/main/s1.setup1.php:12
msgid "Package settings have been reset."
msgstr ""

#: views/packages/main/s1.setup1.php:62 views/packages/main/s1.setup2.php:401
#: views/packages/main/s2.scan1.php:175 views/packages/main/s2.scan2.php:56
#: views/packages/main/s3.build.php:79
msgid "Setup"
msgstr ""

#: views/packages/main/s1.setup1.php:63 views/packages/main/s2.scan1.php:176
#: views/packages/main/s3.build.php:80
msgid "Scan"
msgstr ""

#: views/packages/main/s1.setup1.php:64 views/packages/main/s2.scan1.php:177
#: views/packages/main/s2.scan1.php:269 views/packages/main/s3.build.php:81
msgid "Build"
msgstr ""

#: views/packages/main/s1.setup1.php:67
msgid "Step 1: Package Setup"
msgstr ""

#: views/packages/main/s1.setup1.php:90
msgid "Requirements:"
msgstr ""

#: views/packages/main/s1.setup1.php:99
msgid ""
"System requirements must pass for the Duplicator to work properly.  Click "
"each link for details."
msgstr ""

#: views/packages/main/s1.setup1.php:105
msgid "PHP Support"
msgstr ""

#: views/packages/main/s1.setup1.php:111 views/packages/main/s2.scan2.php:68
msgid "PHP Version"
msgstr ""

#: views/packages/main/s1.setup1.php:113
msgid "PHP versions 5.2.9+ or higher is required."
msgstr ""

#: views/packages/main/s1.setup1.php:117
msgid "Zip Archive Enabled"
msgstr ""

#: views/packages/main/s1.setup1.php:121
msgid "ZipArchive extension is required or"
msgstr ""

#: views/packages/main/s1.setup1.php:122
msgid "Switch to DupArchive"
msgstr ""

#: views/packages/main/s1.setup1.php:123
msgid "to by-pass this requirement."
msgstr ""

#: views/packages/main/s1.setup1.php:129
msgid "Safe Mode Off"
msgstr ""

#: views/packages/main/s1.setup1.php:131
msgid ""
"Safe Mode should be set to Off in you php.ini file and is deprecated as of "
"PHP 5.3.0."
msgstr ""

#: views/packages/main/s1.setup1.php:134 views/packages/main/s1.setup1.php:139
#: views/packages/main/s1.setup1.php:144
msgid "Function"
msgstr ""

#: views/packages/main/s1.setup1.php:150
msgid ""
"For any issues in this section please contact your hosting provider or "
"server administrator.  For additional information see our online "
"documentation."
msgstr ""

#: views/packages/main/s1.setup1.php:158
msgid "Required Paths"
msgstr ""

#: views/packages/main/s1.setup1.php:178
msgid ""
"If the root WordPress path is not writable by PHP on some systems this can "
"cause issues."
msgstr ""

#: views/packages/main/s1.setup1.php:181
msgid ""
"If Duplicator does not have enough permissions then you will need to "
"manually create the paths above. &nbsp; "
msgstr ""

#: views/packages/main/s1.setup1.php:190
msgid "Server Support"
msgstr ""

#: views/packages/main/s1.setup1.php:196
msgid "MySQL Version"
msgstr ""

#: views/packages/main/s1.setup1.php:200
msgid "MySQLi Support"
msgstr ""

#: views/packages/main/s1.setup1.php:206
msgid ""
"MySQL version 5.0+ or better is required and the PHP MySQLi extension (note "
"the trailing 'i') is also required.  Contact your server administrator and "
"request that mysqli extension and MySQL Server 5.0+ be installed."
msgstr ""

#: views/packages/main/s1.setup1.php:207
#: views/tools/diagnostics/inc.data.php:26
msgid "more info"
msgstr ""

#: views/packages/main/s1.setup1.php:216
msgid "Reserved Files"
msgstr ""

#: views/packages/main/s1.setup1.php:221
msgid ""
"None of the reserved files where found from a previous install.  This means "
"you are clear to create a new package."
msgstr ""

#: views/packages/main/s1.setup1.php:229
msgid "WordPress Root Path:"
msgstr ""

#: views/packages/main/s1.setup1.php:231
msgid "Remove Files Now"
msgstr ""

#: views/packages/main/s1.setup2.php:76
msgid "Add Notes"
msgstr ""

#: views/packages/main/s1.setup2.php:79
msgid "Toggle a default name"
msgstr ""

#: views/packages/main/s1.setup2.php:146
msgid "File filter enabled"
msgstr ""

#: views/packages/main/s1.setup2.php:147
msgid "Database filter enabled"
msgstr ""

#: views/packages/main/s1.setup2.php:148 views/packages/main/s1.setup2.php:173
msgid "Archive Only the Database"
msgstr ""

#: views/packages/main/s1.setup2.php:177
msgid "Enable File Filters"
msgstr ""

#: views/packages/main/s1.setup2.php:179
msgid "File Filters:"
msgstr ""

#: views/packages/main/s1.setup2.php:180
msgid ""
"File filters allow you to ignore directories and file extensions.  When "
"creating a package only include the data you want and need.  This helps to "
"improve the overall archive build time and keep your backups simple and "
"clean."
msgstr ""

#: views/packages/main/s1.setup2.php:185 views/packages/main/s1.setup2.php:199
#: views/packages/main/s1.setup2.php:207
msgid "Separate all filters by semicolon"
msgstr ""

#: views/packages/main/s1.setup2.php:187
msgid "Directories:"
msgstr ""

#: views/packages/main/s1.setup2.php:188
msgid "Number of directories filtered"
msgstr ""

#: views/packages/main/s1.setup2.php:192
msgid "root path"
msgstr ""

#: views/packages/main/s1.setup2.php:193
msgid "wp-uploads"
msgstr ""

#: views/packages/main/s1.setup2.php:194
msgid "cache"
msgstr ""

#: views/packages/main/s1.setup2.php:195 views/packages/main/s1.setup2.php:203
#: views/packages/main/s1.setup2.php:215
msgid "(clear)"
msgstr ""

#: views/packages/main/s1.setup2.php:199
msgid "File extensions"
msgstr ""

#: views/packages/main/s1.setup2.php:201
msgid "media"
msgstr ""

#: views/packages/main/s1.setup2.php:202
msgid "archive"
msgstr ""

#: views/packages/main/s1.setup2.php:209
msgid "Files:"
msgstr ""

#: views/packages/main/s1.setup2.php:210
msgid "Number of files filtered"
msgstr ""

#: views/packages/main/s1.setup2.php:214
msgid "(file path)"
msgstr ""

#: views/packages/main/s1.setup2.php:220
msgid ""
"The directory, file and extensions paths above will be excluded from the "
"archive file if enabled is checked."
msgstr ""

#: views/packages/main/s1.setup2.php:221
msgid ""
"Use the full path for directories and files with semicolons to separate all "
"paths."
msgstr ""

#: views/packages/main/s1.setup2.php:231
msgid ""
"This option has automatically been checked because you have opted for a <i "
"class='fa fa-random'></i> Two-Part Install Process.  Please complete the "
"package build and continue with the "
msgstr ""

#: views/packages/main/s1.setup2.php:234 views/packages/main/s3.build.php:279
msgid "Quick Start Two-Part Install Instructions"
msgstr ""

#: views/packages/main/s1.setup2.php:238
msgid ""
"<b>Overview:</b><br/> This advanced option excludes all files from the "
"archive.  Only the database and a copy of the installer.php will be included "
"in the archive.zip file. The option can be used for backing up and moving "
"only the database."
msgstr ""

#: views/packages/main/s1.setup2.php:243
msgid "<b><i class='fa fa-exclamation-circle'></i> Notice:</b><br/>"
msgstr ""

#: views/packages/main/s1.setup2.php:245
msgid ""
"Please use caution when installing only the database over an existing site "
"and be sure the correct files correspond with the database. For example, if "
"WordPress 4.6 is on this site and you copy the database to a host that has "
"WordPress 4.8 files then the source code of the files will not be in sync "
"with the database causing possible errors.  If you’re immediately moving the "
"source files with the database then you can ignore this notice. Please use "
"this advanced feature with caution!"
msgstr ""

#: views/packages/main/s1.setup2.php:267
msgid "Enable Table Filters"
msgstr ""

#: views/packages/main/s1.setup2.php:269
msgid "Enable Table Filters:"
msgstr ""

#: views/packages/main/s1.setup2.php:270
msgid ""
"Checked tables will not be added to the database script.  Excluding certain "
"tables can possibly cause your site or plugins to not work correctly after "
"install!"
msgstr ""

#: views/packages/main/s1.setup2.php:276
msgid "Include All"
msgstr ""

#: views/packages/main/s1.setup2.php:277
msgid "Exclude All"
msgstr ""

#: views/packages/main/s1.setup2.php:321
msgid "Checked tables will be <u>excluded</u> from the database script. "
msgstr ""

#: views/packages/main/s1.setup2.php:322
msgid ""
"Excluding certain tables can cause your site or plugins to not work "
"correctly after install!<br/>"
msgstr ""

#: views/packages/main/s1.setup2.php:323
msgid ""
"<i class='core-table-info'> Use caution when excluding tables! It is highly "
"recommended to not exclude WordPress core tables*, unless you know the "
"impact.</i>"
msgstr ""

#: views/packages/main/s1.setup2.php:328
msgid "Compatibility Mode"
msgstr ""

#: views/packages/main/s1.setup2.php:330
msgid "Compatibility Mode:"
msgstr ""

#: views/packages/main/s1.setup2.php:331
msgid ""
"This is an advanced database backwards compatibility feature that should "
"ONLY be used if having problems installing packages. If the database server "
"version is lower than the version where the package was built then these "
"options may help generate a script that is more compliant with the older "
"database server. It is recommended to try each option separately starting "
"with mysql40."
msgstr ""

#: views/packages/main/s1.setup2.php:352
msgid "mysql40"
msgstr ""

#: views/packages/main/s1.setup2.php:356
msgid "no_table_options"
msgstr ""

#: views/packages/main/s1.setup2.php:360
msgid "no_key_options"
msgstr ""

#: views/packages/main/s1.setup2.php:364
msgid "no_field_options"
msgstr ""

#: views/packages/main/s1.setup2.php:369
msgid "This option is only available with mysqldump mode."
msgstr ""

#: views/packages/main/s1.setup2.php:382
msgid "Installer password protection is on"
msgstr ""

#: views/packages/main/s1.setup2.php:383
msgid "Installer password protection is off"
msgstr ""

#: views/packages/main/s1.setup2.php:390
msgid "All values in this section are"
msgstr ""

#: views/packages/main/s1.setup2.php:390
msgid "optional"
msgstr ""

#: views/packages/main/s1.setup2.php:392
msgid "Setup/Prefills"
msgstr ""

#: views/packages/main/s1.setup2.php:393
msgid ""
"All values in this section are OPTIONAL! If you know ahead of time the "
"database input fields the installer will use, then you can optionally enter "
"them here and they will be prefilled at install time.  Otherwise you can "
"just enter them in at install time and ignore all these options in the "
"Installer section."
msgstr ""

#: views/packages/main/s1.setup2.php:404 views/packages/main/s1.setup2.php:409
msgid "Branding"
msgstr ""

#: views/packages/main/s1.setup2.php:407
msgid "Available with Duplicator Pro - Freelancer!"
msgstr ""

#: views/packages/main/s1.setup2.php:410
msgid ""
"Branding is a way to customize the installer look and feel.  With branding "
"you can create multiple brands of installers."
msgstr ""

#: views/packages/main/s1.setup2.php:415
msgid "Security"
msgstr ""

#: views/packages/main/s1.setup2.php:422
msgid "Enable Password Protection"
msgstr ""

#: views/packages/main/s1.setup2.php:424
msgid "Security:"
msgstr ""

#: views/packages/main/s1.setup2.php:425
msgid ""
"Enabling this option will allow for basic password protection on the "
"installer. Before running the installer the password below must be entered "
"before proceeding with an install.  This password is a general deterrent and "
"should not be substituted for properly keeping your files secure.  Be sure "
"to remove all installer files when the install process is completed."
msgstr ""

#: views/packages/main/s1.setup2.php:440
msgid "Prefills"
msgstr ""

#: views/packages/main/s1.setup2.php:448
msgid "Basic"
msgstr ""

#: views/packages/main/s1.setup2.php:449 views/settings/gopro.php:176
msgid "cPanel"
msgstr ""

#: views/packages/main/s1.setup2.php:461
msgid "example: localhost (value is optional)"
msgstr ""

#: views/packages/main/s1.setup2.php:464
msgid "Host Port"
msgstr ""

#: views/packages/main/s1.setup2.php:465
msgid "example: 3306 (value is optional)"
msgstr ""

#: views/packages/main/s1.setup2.php:469
msgid "example: DatabaseName (value is optional)"
msgstr ""

#: views/packages/main/s1.setup2.php:473
msgid "example: DatabaseUserName (value is optional)"
msgstr ""

#: views/packages/main/s1.setup2.php:483
msgid ""
"Create the database and database user at install time without leaving the "
"installer!"
msgstr ""

#: views/packages/main/s1.setup2.php:484
msgid "This feature is only availble in "
msgstr ""

#: views/packages/main/s1.setup2.php:485
msgid "Duplicator Pro!"
msgstr ""

#: views/packages/main/s1.setup2.php:486
msgid "This feature works only with hosts that support cPanel."
msgstr ""

#: views/packages/main/s1.setup2.php:498
msgid "Reset"
msgstr ""

#: views/packages/main/s1.setup2.php:499
msgid "Next"
msgstr ""

#: views/packages/main/s1.setup2.php:508
msgid "Reset Package Settings?"
msgstr ""

#: views/packages/main/s1.setup2.php:509
msgid ""
"This will clear and reset all of the current package settings.  Would you "
"like to continue?"
msgstr ""

#: views/packages/main/s2.scan1.php:148
msgid "Input fields not valid"
msgstr ""

#: views/packages/main/s2.scan1.php:149 views/packages/main/s2.scan1.php:207
msgid "Please try again!"
msgstr ""

#: views/packages/main/s2.scan1.php:151 views/packages/main/s2.scan1.php:212
#: views/packages/main/s3.build.php:353
msgid "Error Message:"
msgstr ""

#: views/packages/main/s2.scan1.php:161 views/packages/main/s2.scan1.php:267
msgid "Back"
msgstr ""

#: views/packages/main/s2.scan1.php:180
msgid "Step 2: System Scan"
msgstr ""

#: views/packages/main/s2.scan1.php:197
msgid "Scanning Site"
msgstr ""

#: views/packages/main/s2.scan1.php:199 views/packages/main/s3.build.php:116
msgid "Please Wait..."
msgstr ""

#: views/packages/main/s2.scan1.php:200
msgid "Keep this window open during the scan process."
msgstr ""

#: views/packages/main/s2.scan1.php:201
msgid "This can take several minutes."
msgstr ""

#: views/packages/main/s2.scan1.php:206
msgid "Scan Error"
msgstr ""

#: views/packages/main/s2.scan1.php:209 views/packages/main/s3.build.php:349
msgid "Server Status:"
msgstr ""

#: views/packages/main/s2.scan1.php:221
msgid "Scan Complete"
msgstr ""

#: views/packages/main/s2.scan1.php:223
msgid "Process Time:"
msgstr ""

#: views/packages/main/s2.scan1.php:239
msgid "A notice status has been detected, are you sure you want to continue?"
msgstr ""

#: views/packages/main/s2.scan1.php:243
msgid "Yes.  Continue with the build process!"
msgstr ""

#: views/packages/main/s2.scan1.php:249
msgid ""
"Scan checks are not required to pass, however they could cause issues on "
"some systems."
msgstr ""

#: views/packages/main/s2.scan1.php:251
msgid ""
"Please review the details for each section by clicking on the detail title."
msgstr ""

#: views/packages/main/s2.scan1.php:258
msgid "Do you want to continue?"
msgstr ""

#: views/packages/main/s2.scan1.php:260
msgid "At least one or more checkboxes was checked in \"Quick Filters\"."
msgstr ""

#: views/packages/main/s2.scan1.php:261
msgid "To apply a \"Quick Filter\" click the \"Add Filters & Rescan\" button"
msgstr ""

#: views/packages/main/s2.scan1.php:263
msgid "Yes. Continue without applying any file filters."
msgstr ""

#: views/packages/main/s2.scan1.php:268
msgid "Rescan"
msgstr ""

#: views/packages/main/s2.scan1.php:414
msgid "Unable to perform a full scan, please try the following actions:"
msgstr ""

#: views/packages/main/s2.scan1.php:415
msgid ""
"1. Go back and create a root path directory filter to validate the site is "
"scan-able."
msgstr ""

#: views/packages/main/s2.scan1.php:416
msgid ""
"2. Continue to add/remove filters to isolate which path is causing issues."
msgstr ""

#: views/packages/main/s2.scan1.php:417
msgid "3. This message will go away once the correct filters are applied."
msgstr ""

#: views/packages/main/s2.scan1.php:419
msgid "Common Issues:"
msgstr ""

#: views/packages/main/s2.scan1.php:420
msgid ""
"- On some budget hosts scanning over 30k files can lead to timeout/gateway "
"issues. Consider scanning only your main WordPress site and avoid trying to "
"backup other external directories."
msgstr ""

#: views/packages/main/s2.scan1.php:421
msgid ""
"- Symbolic link recursion can cause timeouts.  Ask your server admin if any "
"are present in the scan path.  If they are add the full path as a filter and "
"try running the scan again."
msgstr ""

#: views/packages/main/s2.scan1.php:434 views/packages/main/s2.scan3.php:57
#: views/packages/main/s2.scan3.php:68 views/packages/main/s3.build.php:245
msgid "Notice"
msgstr ""

#: views/packages/main/s2.scan1.php:436
msgid "Good"
msgstr ""

#: views/packages/main/s2.scan1.php:437
msgid "Fail"
msgstr ""

#: views/packages/main/s2.scan2.php:7
msgid "Server"
msgstr ""

#: views/packages/main/s2.scan2.php:8
msgid "Show Diagnostics"
msgstr ""

#: views/packages/main/s2.scan2.php:63
#: views/tools/diagnostics/inc.settings.php:51
msgid "Web Server"
msgstr ""

#: views/packages/main/s2.scan2.php:64
msgid "Supported web servers: "
msgstr ""

#: views/packages/main/s2.scan2.php:69
msgid ""
"The minimum PHP version supported by Duplicator is 5.2.9. It is highly "
"recommended to use PHP 5.3+ for improved stability.  For international "
"language support please use PHP 7.0+."
msgstr ""

#: views/packages/main/s2.scan2.php:74
msgid "PHP Open Base Dir"
msgstr ""

#: views/packages/main/s2.scan2.php:75
msgid ""
"Issues might occur when [open_basedir] is enabled. Work with your server "
"admin to disable this value in the php.ini file if you’re having issues "
"building a package."
msgstr ""

#: views/packages/main/s2.scan2.php:80 views/packages/main/s3.build.php:328
msgid "PHP Max Execution Time"
msgstr ""

#: views/packages/main/s2.scan2.php:81
msgid ""
"Timeouts may occur for larger packages when [max_execution_time] time in the "
"php.ini is too low.  A value of 0 (recommended) indicates that PHP has no "
"time limits. An attempt is made to override this value if the server allows "
"it."
msgstr ""

#: views/packages/main/s2.scan2.php:84
msgid ""
"Note: Timeouts can also be set at the web server layer, so if the PHP max "
"timeout passes and you still see a build timeout messages, then your web "
"server could be killing the process.   If you are on a budget host and "
"limited on processing time, consider using the database or file filters to "
"shrink the size of your overall package.   However use caution as excluding "
"the wrong resources can cause your install to not work properly."
msgstr ""

#: views/packages/main/s2.scan2.php:92
msgid "Get faster builds with Duplicator Pro with access to shell_exec zip."
msgstr ""

#: views/packages/main/s2.scan2.php:112
msgid "WordPress Version"
msgstr ""

#: views/packages/main/s2.scan2.php:113
#, php-format
msgid ""
"It is recommended to have a version of WordPress that is greater than %1$s.  "
"Older version of WordPress can lead to migration issues and are a security "
"risk. If possible please update your WordPress site to the latest version."
msgstr ""

#: views/packages/main/s2.scan2.php:117
msgid "Core Files"
msgstr ""

#: views/packages/main/s2.scan2.php:123
msgid ""
"The core WordPress paths below will <u>not</u> be included in the archive. "
"These paths are required for WordPress to function!"
msgstr ""

#: views/packages/main/s2.scan2.php:134
msgid ""
"The core WordPress file below will <u>not</u> be included in the archive. "
"This file is required for WordPress to function!"
msgstr ""

#: views/packages/main/s2.scan2.php:147
msgid " to the new location for the site to function properly."
msgstr ""

#: views/packages/main/s2.scan2.php:153
msgid ""
"If the scanner is unable to locate the wp-config.php file in the root "
"directory, then you will need to manually copy it to its new location. This "
"check will also look for core WordPress paths that should be included in the "
"archive for WordPress to work correctly."
msgstr ""

#: views/packages/main/s2.scan2.php:172
msgid "Multisite: Unsupported"
msgstr ""

#: views/packages/main/s2.scan2.php:173
msgid ""
"Duplicator does not support WordPress multisite migrations.  We recommend "
"using Duplicator Pro which currently supports full multisite migrations and "
"subsite to standalone site migrations."
msgstr ""

#: views/packages/main/s2.scan2.php:177
msgid ""
"While it is not recommended you can still continue with the build of this "
"package.  Please note that at install time additional manual custom "
"configurations will need to be made to finalize this multisite migration."
msgstr ""

#: views/packages/main/s2.scan2.php:179 views/packages/main/s2.scan2.php:184
msgid "upgrade to pro"
msgstr ""

#: views/packages/main/s2.scan2.php:181
msgid "Multisite: N/A"
msgstr ""

#: views/packages/main/s2.scan2.php:182
msgid ""
"This is not a multisite install so duplication will proceed without issue.  "
"Duplicator does not officially support multisite. However, Duplicator Pro "
"supports duplication of a full multisite network and also has the ability to "
"install a multisite subsite as a standalone site."
msgstr ""

#: views/packages/main/s2.scan3.php:6
#: views/tools/diagnostics/inc.settings.php:55
msgid "Root Path"
msgstr ""

#: views/packages/main/s2.scan3.php:23
msgid "Show Scan Details"
msgstr ""

#: views/packages/main/s2.scan3.php:38 views/packages/main/s2.scan3.php:370
#: views/packages/main/s2.scan3.php:557 views/settings/general.php:158
#: views/tools/diagnostics/inc.settings.php:167
msgid "Enabled"
msgstr ""

#: views/packages/main/s2.scan3.php:44
msgid "Archive Size"
msgstr ""

#: views/packages/main/s2.scan3.php:45
msgid ""
"This size includes only files BEFORE compression is applied. It does not "
"include the size of the database script or any applied filters.  Once "
"complete the package size will be smaller than this number."
msgstr ""

#: views/packages/main/s2.scan3.php:48 views/packages/main/s2.scan3.php:380
#: views/packages/main/s2.scan3.php:442
msgid "uncompressed"
msgstr ""

#: views/packages/main/s2.scan3.php:56
msgid "Database only"
msgstr ""

#: views/packages/main/s2.scan3.php:60
msgid ""
"Only the database and a copy of the installer.php will be included in the "
"archive.zip file."
msgstr ""

#: views/packages/main/s2.scan3.php:67
msgid "Skip archive scan enabled"
msgstr ""

#: views/packages/main/s2.scan3.php:71
msgid ""
"All file checks are skipped. This could cause problems during extraction if "
"problematic files are included."
msgstr ""

#: views/packages/main/s2.scan3.php:73
msgid " Disable the advanced option to re-enable file controls."
msgstr ""

#: views/packages/main/s2.scan3.php:84
msgid "Size Checks"
msgstr ""

#: views/packages/main/s2.scan3.php:89
msgid "File Count"
msgstr ""

#: views/packages/main/s2.scan3.php:90
msgid "Directory Count"
msgstr ""

#: views/packages/main/s2.scan3.php:92
msgid ""
"Compressing larger sites on <i>some budget hosts</i> may cause timeouts.  "
msgstr ""

#: views/packages/main/s2.scan3.php:93
msgid "more details..."
msgstr ""

#: views/packages/main/s2.scan3.php:97 views/packages/main/s2.scan3.php:387
#: views/packages/main/s3.build.php:203 views/packages/screen.php:53
msgid "Overview"
msgstr ""

#: views/packages/main/s2.scan3.php:99
#, php-format
msgid ""
"This notice is triggered at [%s] and can be ignored on most hosts.  If "
"during the build process you see a \"Host Build Interrupt\" message then "
"this host has strict processing limits.  Below are some options you can take "
"to overcome constraints set up on this host."
msgstr ""

#: views/packages/main/s2.scan3.php:103
msgid "Timeout Options"
msgstr ""

#: views/packages/main/s2.scan3.php:105
msgid ""
"Apply the \"Quick Filters\" below or click the back button to apply on "
"previous page."
msgstr ""

#: views/packages/main/s2.scan3.php:106
msgid "See the FAQ link to adjust this hosts timeout limits: "
msgstr ""

#: views/packages/main/s2.scan3.php:106
msgid "What can I try for Timeout Issues?"
msgstr ""

#: views/packages/main/s2.scan3.php:107
msgid "Consider trying multi-threaded support in "
msgstr ""

#: views/packages/main/s2.scan3.php:108
msgid "Duplicator Pro."
msgstr ""

#: views/packages/main/s2.scan3.php:112
#, php-format
msgid ""
"Files over %1$s are listed below. Larger files such as movies or zipped "
"content can cause timeout issues on some budget hosts.  If you are having "
"issues creating a package try excluding the directory paths below or go back "
"to Step 1 and add them."
msgstr ""

#: views/packages/main/s2.scan3.php:121 views/packages/main/s2.scan3.php:208
#: views/packages/main/s2.scan3.php:257
msgid "Quick Filters"
msgstr ""

#: views/packages/main/s2.scan3.php:122
msgid "Large Files"
msgstr ""

#: views/packages/main/s2.scan3.php:125 views/packages/main/s2.scan3.php:260
msgid "Hide All"
msgstr ""

#: views/packages/main/s2.scan3.php:126 views/packages/main/s2.scan3.php:261
msgid "Show All"
msgstr ""

#: views/packages/main/s2.scan3.php:136 views/packages/main/s2.scan3.php:276
msgid ""
"Core WordPress directories should not be filtered. Use caution when "
"excluding files."
msgstr ""

#: views/packages/main/s2.scan3.php:156
msgid "No large files found during this scan."
msgstr ""

#: views/packages/main/s2.scan3.php:159
msgid ""
"No large files found during this scan.  If you're having issues building a "
"package click the back button and try adding a file filter to non-essential "
"files paths like wp-content/uploads.   These excluded files can then be "
"manually moved to the new location after you have ran the migration "
"installer."
msgstr ""

#: views/packages/main/s2.scan3.php:172 views/packages/main/s2.scan3.php:302
msgid ""
"*Checking a directory will exclude all items recursively from that path "
"down.  Please use caution when filtering directories."
msgstr ""

#: views/packages/main/s2.scan3.php:175 views/packages/main/s2.scan3.php:231
#: views/packages/main/s2.scan3.php:305
msgid "Add Filters &amp; Rescan"
msgstr ""

#: views/packages/main/s2.scan3.php:177 views/packages/main/s2.scan3.php:307
msgid "Copy Paths to Clipboard"
msgstr ""

#: views/packages/main/s2.scan3.php:193
msgid "Addon Sites"
msgstr ""

#: views/packages/main/s2.scan3.php:199
msgid ""
"An \"Addon Site\" is a separate WordPress site(s) residing in subdirectories "
"within this site. If you confirm these to be separate sites, then it is "
"recommended that you exclude them by checking the corresponding boxes below "
"and clicking the 'Add Filters & Rescan' button.  To backup the other sites "
"install the plugin on the sites needing to be backed-up."
msgstr ""

#: views/packages/main/s2.scan3.php:222
msgid "No add on sites found."
msgstr ""

#: views/packages/main/s2.scan3.php:228
msgid "*Checking a directory will exclude all items in that path recursively."
msgstr ""

#: views/packages/main/s2.scan3.php:244 views/packages/main/s2.scan3.php:258
msgid "Name Checks"
msgstr ""

#: views/packages/main/s2.scan3.php:249
msgid ""
"Unicode and special characters such as \"*?><:/\\|\", can be problematic on "
"some hosts."
msgstr ""

#: views/packages/main/s2.scan3.php:250
msgid ""
"  Only consider using this filter if the package build is failing. Select "
"files that are not important to your site or you can migrate manually."
msgstr ""

#: views/packages/main/s2.scan3.php:251
msgid ""
"If this environment/system and the system where it will be installed are set "
"up to support Unicode and long paths then these filters can be ignored.  If "
"you run into issues with creating or installing a package, then is "
"recommended to filter these paths."
msgstr ""

#: views/packages/main/s2.scan3.php:296
msgid "No file/directory name warnings found."
msgstr ""

#: views/packages/main/s2.scan3.php:319
msgid "Read Checks"
msgstr ""

#: views/packages/main/s2.scan3.php:324
msgid ""
"PHP is unable to read the following items and they will NOT be included in "
"the package.  Please work with your host to adjust the permissions or "
"resolve the symbolic-link(s) shown in the lists below.  If these items are "
"not needed then this notice can be ignored."
msgstr ""

#: views/packages/main/s2.scan3.php:330
msgid "Unreadable Items:"
msgstr ""

#: views/packages/main/s2.scan3.php:337
msgid "No unreadable items found."
msgstr ""

#: views/packages/main/s2.scan3.php:341
msgid "Recursive Links:"
msgstr ""

#: views/packages/main/s2.scan3.php:348
msgid "No recursive sym-links found."
msgstr ""

#: views/packages/main/s2.scan3.php:376
msgid "Database Size:"
msgstr ""

#: views/packages/main/s2.scan3.php:377
msgid ""
"The database size represents only the included tables. The process for "
"gathering the size uses the query SHOW TABLE STATUS.  The overall size of "
"the database file can impact the final size of the package."
msgstr ""

#: views/packages/main/s2.scan3.php:391
msgid "TOTAL SIZE"
msgstr ""

#: views/packages/main/s2.scan3.php:394
msgid "Records"
msgstr ""

#: views/packages/main/s2.scan3.php:397
#, php-format
msgid ""
"Total size and row counts are approximate values.  The thresholds that "
"trigger notices are %1$s records total for the entire database.  Larger "
"databases take more time to process.  On some budget hosts that have cpu/"
"memory/timeout limits this may cause issues."
msgstr ""

#: views/packages/main/s2.scan3.php:402
msgid "TABLE DETAILS:"
msgstr ""

#: views/packages/main/s2.scan3.php:404
#, php-format
msgid ""
"The notices for tables are %1$s records or names with upper-case "
"characters.  Individual tables will not trigger a notice message, but can "
"help narrow down issues if they occur later on."
msgstr ""

#: views/packages/main/s2.scan3.php:411 views/packages/main/s2.scan3.php:463
msgid "RECOMMENDATIONS:"
msgstr ""

#: views/packages/main/s2.scan3.php:414
msgid "repair and optimization"
msgstr ""

#: views/packages/main/s2.scan3.php:415
#, php-format
msgid "1. Run a %1$s on the table to improve the overall size and performance."
msgstr ""

#: views/packages/main/s2.scan3.php:417
msgid ""
"2. Remove post revisions and stale data from tables.  Tables such as logs, "
"statistical or other non-critical data should be cleared."
msgstr ""

#: views/packages/main/s2.scan3.php:419
msgid "Enable mysqldump"
msgstr ""

#: views/packages/main/s2.scan3.php:420
#, php-format
msgid "3. %1$s if this host supports the option."
msgstr ""

#: views/packages/main/s2.scan3.php:422
msgid "lower_case_table_names"
msgstr ""

#: views/packages/main/s2.scan3.php:423
#, php-format
msgid ""
"4. For table name case sensitivity issues either rename the table with lower "
"case characters or be prepared to work with the %1$s system variable setting."
msgstr ""

#: views/packages/main/s2.scan3.php:434
msgid "Total Size"
msgstr ""

#: views/packages/main/s2.scan3.php:439
msgid "Total Size:"
msgstr ""

#: views/packages/main/s2.scan3.php:440
msgid "The total size of the site (files plus  database)."
msgstr ""

#: views/packages/main/s2.scan3.php:450
#, php-format
msgid ""
"The build can't continue because the total size of files and the database "
"exceeds the %s limit that can be processed when creating a DupArchive "
"package. "
msgstr ""

#: views/packages/main/s2.scan3.php:451
msgid ""
"<a href=\"javascript:void(0)\" onclick=\"jQuery('#data-ll-status-"
"recommendations').toggle()\">Click for recommendations.</a>"
msgstr ""

#: views/packages/main/s2.scan3.php:457 views/packages/main/s2.scan3.php:531
#: views/settings/packages.php:208
msgid "Archive Engine"
msgstr ""

#: views/packages/main/s2.scan3.php:459
#, php-format
msgid ""
" With DupArchive, Duplicator is restricted to processing sites up to %s.  To "
"process larger sites, consider these recommendations. "
msgstr ""

#: views/packages/main/s2.scan3.php:468
msgid "Step 1"
msgstr ""

#: views/packages/main/s2.scan3.php:469
#, php-format
msgid "- Add data filters to get the package size under %s: "
msgstr ""

#: views/packages/main/s2.scan3.php:471
msgid ""
"- In the 'Size Checks' section above consider adding filters (if notice is "
"shown)."
msgstr ""

#: views/packages/main/s2.scan3.php:473
#, php-format
msgid "- In %s consider adding file/directory or database table filters."
msgstr ""

#: views/packages/main/s2.scan3.php:477
msgid "covered here."
msgstr ""

#: views/packages/main/s2.scan3.php:478
#, php-format
msgid "- Perform a two part install %s"
msgstr ""

#: views/packages/main/s2.scan3.php:481
msgid "ZipArchive Engine"
msgstr ""

#: views/packages/main/s2.scan3.php:482
#, php-format
msgid ""
"- Switch to the %s which requires a capable hosting provider (VPS "
"recommended)."
msgstr ""

#: views/packages/main/s2.scan3.php:486
#, php-format
msgid "- Consider upgrading to %s for large site support. (unlimited)"
msgstr ""

#: views/packages/main/s2.scan3.php:496
msgid "Migrate large, multi-gig sites with"
msgstr ""

#: views/packages/main/s2.scan3.php:511
msgid "Scan Details"
msgstr ""

#: views/packages/main/s2.scan3.php:518
msgid "Copy Quick Filter Paths"
msgstr ""

#: views/packages/main/s2.scan3.php:537
msgid "Name:"
msgstr ""

#: views/packages/main/s2.scan3.php:538
msgid "Host:"
msgstr ""

#: views/packages/main/s2.scan3.php:540
msgid "Build Mode:"
msgstr ""

#: views/packages/main/s2.scan3.php:556 views/settings/gopro.php:55
msgid "File Filters"
msgstr ""

#: views/packages/main/s2.scan3.php:557
#: views/tools/diagnostics/inc.settings.php:167
msgid "Disabled"
msgstr ""

#: views/packages/main/s2.scan3.php:571
msgid "No custom directory filters set."
msgstr ""

#: views/packages/main/s2.scan3.php:581
msgid "No file extension filters have been set."
msgstr ""

#: views/packages/main/s2.scan3.php:593
msgid "No custom file filters set."
msgstr ""

#: views/packages/main/s2.scan3.php:597
msgid "Auto Directory Filters"
msgstr ""

#: views/packages/main/s2.scan3.php:603
msgid "Auto File Filters"
msgstr ""

#: views/packages/main/s2.scan3.php:616
msgid "Path filters will be skipped during the archive process when enabled."
msgstr ""

#: views/packages/main/s2.scan3.php:618
msgid "[view json result report]"
msgstr ""

#: views/packages/main/s2.scan3.php:621
msgid "Auto filters are applied to prevent archiving other backup sets."
msgstr ""

#: views/packages/main/s2.scan3.php:632 views/packages/main/s2.scan3.php:641
msgid "Click to Copy"
msgstr ""

#: views/packages/main/s2.scan3.php:646
msgid ""
"Copy the paths above and apply them as needed on Step 1 &gt; Archive &gt; "
"Files section."
msgstr ""

#: views/packages/main/s2.scan3.php:663
msgid "Directory applied filter set."
msgstr ""

#: views/packages/main/s2.scan3.php:690
msgid "No directories have been selected!"
msgstr ""

#: views/packages/main/s2.scan3.php:694
msgid "No files have been selected!"
msgstr ""

#: views/packages/main/s2.scan3.php:732
msgid "Copied to Clipboard!"
msgstr ""

#: views/packages/main/s2.scan3.php:734
msgid "Manual copy of selected text required on this browser."
msgstr ""

#: views/packages/main/s2.scan3.php:741
msgid "Initializing Please Wait..."
msgstr ""

#: views/packages/main/s2.scan3.php:784 views/packages/main/s2.scan3.php:791
msgid ""
"Error applying filters.  Please go back to Step 1 to add filter manually!"
msgstr ""

#: views/packages/main/s2.scan3.php:867
msgid "Unable to report on any tables"
msgstr ""

#: views/packages/main/s2.scan3.php:893
msgid "Unable to report on database stats"
msgstr ""

#: views/packages/main/s3.build.php:16
msgid "Help review the plugin"
msgstr ""

#: views/packages/main/s3.build.php:19
msgid "Want more power?  Try"
msgstr ""

#: views/packages/main/s3.build.php:84
msgid "Step 3: Build Package"
msgstr ""

#: views/packages/main/s3.build.php:114
msgid "Building Package"
msgstr ""

#: views/packages/main/s3.build.php:117
msgid "Keep this window open and do not close during the build process."
msgstr ""

#: views/packages/main/s3.build.php:118
msgid "This may take several minutes to complete."
msgstr ""

#: views/packages/main/s3.build.php:122
msgid "Build Status"
msgstr ""

#: views/packages/main/s3.build.php:129
msgid "Package Completed"
msgstr ""

#: views/packages/main/s3.build.php:134
msgid "Process Time"
msgstr ""

#: views/packages/main/s3.build.php:140
msgid "Download Files"
msgstr ""

#: views/packages/main/s3.build.php:142
msgid "Click to download installer file"
msgstr ""

#: views/packages/main/s3.build.php:145
msgid "Click to download archive file"
msgstr ""

#: views/packages/main/s3.build.php:151
msgid "Click to download both files"
msgstr ""

#: views/packages/main/s3.build.php:152
msgid "One-Click Download"
msgstr ""

#: views/packages/main/s3.build.php:155
msgid "One Click:"
msgstr ""

#: views/packages/main/s3.build.php:156
msgid ""
"Clicking this link will open both the installer and archive download prompts "
"at the same time. On some browsers you may have to disable pop-up warnings "
"on this domain for this to work correctly."
msgstr ""

#: views/packages/main/s3.build.php:164
msgid "How do I install this Package?"
msgstr ""

#: views/packages/main/s3.build.php:176
msgid "Host Build Interrupt"
msgstr ""

#: views/packages/main/s3.build.php:177
msgid "This server cannot complete the build due to host setup constraints."
msgstr ""

#: views/packages/main/s3.build.php:178
msgid ""
"To get past this hosts limitation consider the options below by clicking "
"each section."
msgstr ""

#: views/packages/main/s3.build.php:184
msgid "Option 1: Try DupArchive"
msgstr ""

#: views/packages/main/s3.build.php:188
msgid "OPTION 1:"
msgstr ""

#: views/packages/main/s3.build.php:190
msgid ""
"Enable the DupArchive format which is specific to Duplicator and designed to "
"perform better on constrained budget hosts."
msgstr ""

#: views/packages/main/s3.build.php:194
msgid ""
"Note: DupArchive on Duplicator only supports sites up to 500MB.  If your "
"site is over 500MB then use a file filter on step 1 to get the size below "
"500MB or try the other options mentioned below.  Alternatively, you may want "
"to consider"
msgstr ""

#: views/packages/main/s3.build.php:200
msgid " which is capable of migrating sites much larger than 500MB."
msgstr ""

#: views/packages/main/s3.build.php:204 views/packages/main/s3.build.php:271
msgid "Please follow these steps:"
msgstr ""

#: views/packages/main/s3.build.php:206
msgid ""
"On the scanner step check to make sure your package is under 500MB. If not "
"see additional options below."
msgstr ""

#: views/packages/main/s3.build.php:208
msgid ""
"Go to Duplicator &gt; Settings &gt; Packages Tab &gt; Archive Engine &gt;"
msgstr ""

#: views/packages/main/s3.build.php:209
msgid "Enable DupArchive"
msgstr ""

#: views/packages/main/s3.build.php:211
msgid "Build a new package using the new engine format."
msgstr ""

#: views/packages/main/s3.build.php:215
msgid ""
"Note: The DupArchive engine will generate an archive.daf file. This file is "
"very similar to a .zip except that it can only be extracted by the installer."
"php file or the"
msgstr ""

#: views/packages/main/s3.build.php:217
msgid "commandline extraction tool"
msgstr ""

#: views/packages/main/s3.build.php:225
msgid "Option 2: File Filters"
msgstr ""

#: views/packages/main/s3.build.php:229
msgid "OPTION 2:"
msgstr ""

#: views/packages/main/s3.build.php:231
msgid ""
"The first pass for reading files on some budget hosts maybe slow and have "
"conflicts with strict timeout settings setup by the hosting provider.  In "
"these cases, it is recommended to retry the build by adding file filters to "
"larger files/directories."
msgstr ""

#: views/packages/main/s3.build.php:236
msgid ""
"For example, you could  filter out the  \"/wp-content/uploads/\" folder to "
"create the package then move the files from that directory over manually.  "
"If this work-flow is not desired or does not work please check-out the other "
"options below."
msgstr ""

#: views/packages/main/s3.build.php:241
msgid "Retry Build With Filters"
msgstr ""

#: views/packages/main/s3.build.php:247
msgid "Build Folder:"
msgstr ""

#: views/packages/main/s3.build.php:248
msgid ""
"On some servers the build will continue to run in the background. To "
"validate if a build is still running; open the 'tmp' folder above and see if "
"the archive file is growing in size or check the main packages screen to see "
"if the package completed. If it is not then your server has strict timeout "
"constraints."
msgstr ""

#: views/packages/main/s3.build.php:260
msgid "Option 3: Two-Part Install"
msgstr ""

#: views/packages/main/s3.build.php:264
msgid "OPTION 3:"
msgstr ""

#: views/packages/main/s3.build.php:266
msgid ""
"A two-part install minimizes server load and can avoid I/O and CPU issues "
"encountered on some budget hosts. With this procedure you simply build a "
"'database-only' archive, manually move the website files, and then run the "
"installer to complete the process."
msgstr ""

#: views/packages/main/s3.build.php:270
msgid " Overview"
msgstr ""

#: views/packages/main/s3.build.php:273
msgid "Click the button below to go back to Step 1."
msgstr ""

#: views/packages/main/s3.build.php:274
msgid ""
"On Step 1 the \"Archive Only the Database\" checkbox will be auto checked."
msgstr ""

#: views/packages/main/s3.build.php:276
msgid "Complete the package build and follow the "
msgstr ""

#: views/packages/main/s3.build.php:286
msgid "Yes. I have read the above overview and would like to continue!"
msgstr ""

#: views/packages/main/s3.build.php:288
msgid "Start Two-Part Install Process"
msgstr ""

#: views/packages/main/s3.build.php:297
msgid "Option 4: Configure Server"
msgstr ""

#: views/packages/main/s3.build.php:301
msgid "OPTION 4:"
msgstr ""

#: views/packages/main/s3.build.php:302
msgid ""
"This option is available on some hosts that allow for users to adjust server "
"configurations.  With this option you will be directed to an FAQ page that "
"will show various recommendations you can take to improve/unlock constraints "
"set up on this server."
msgstr ""

#: views/packages/main/s3.build.php:308
msgid "Diagnose Server Setup"
msgstr ""

#: views/packages/main/s3.build.php:312
msgid "RUNTIME DETAILS"
msgstr ""

#: views/packages/main/s3.build.php:315
msgid "Allowed Runtime:"
msgstr ""

#: views/packages/main/s3.build.php:319
msgid "PHP Max Execution"
msgstr ""

#: views/packages/main/s3.build.php:329
msgid ""
"This value is represented in seconds. A value of 0 means no timeout limit is "
"set for PHP."
msgstr ""

#: views/packages/main/s3.build.php:333 views/settings/packages.php:167
msgid "Mode"
msgstr ""

#: views/packages/main/s3.build.php:339
msgid "PHP Max Execution Mode"
msgstr ""

#: views/packages/main/s3.build.php:341
msgid ""
"If the value is [dynamic] then its possible for PHP to run longer than the "
"default.  If the value is [fixed] then PHP will not be allowed to run longer "
"than the default. <br/><br/> If this value is larger than the [Allowed "
"Runtime] above then the web server has been enabled with a timeout cap and "
"is overriding the PHP max time setting."
msgstr ""

#: views/packages/main/s3.build.php:362
msgid "Read Package Log File"
msgstr ""

#: views/packages/screen.php:64
msgid ""
"<b><i class='fa fa-archive'></i> Packages » All</b><br/> The 'Packages' "
"section is the main interface for managing all the packages that have been "
"created.  A Package consists of two core files, the 'archive.zip' and the "
"'installer.php' file.  The archive file is a zip file containing all your "
"WordPress files and a copy of your WordPress database.  The installer file "
"is a php file that when browsed to via a web browser presents a wizard that "
"redeploys/installs the website by extracting the archive file and installing "
"the database.   To create a package, click the 'Create New' button and "
"follow the prompts. <br/><br/><b><i class='fa fa-download'></i> Downloads</"
"b><br/>To download the package files click on the Installer and Archive "
"buttons after creating a package.  The archive file will have a copy of the "
"installer inside of it named installer-backup.php in case the original "
"installer file is lost.  To see the details of a package click on the <i "
"class='fa fa-archive'></i> details button.<br/><br/><b><i class='far fa-file-"
"archive'></i> Archive Types</b><br/>An archive file can be saved as either "
"a .zip file or .daf file.  A zip file is a common archive format used to "
"compress and group files.  The daf file short for 'Duplicator Archive "
"Format' is a custom format used specifically  for working with larger "
"packages and scale-ability issues on many shared hosting platforms.  Both "
"formats work very similar.  The main difference is that the daf file can "
"only be extracted using the installer.php file or the <a href='https://"
"snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-052-q' "
"target='_blank'>DAF extraction tool</a>.  The zip file can be used by the "
"installer.php or other zip tools like winrar/7zip/winzip or other client-"
"side tools. <br/><br/>"
msgstr ""

#: views/packages/screen.php:85
msgid ""
"<b>Packages New » 1 Setup</b> <br/>The setup step allows for optional "
"filtered directory paths, files, file extensions and database tables.  To "
"filter specific system files, click the 'Enable File Filters' checkbox and "
"add the full path of the file or directory, followed by a semicolon.  For a "
"file extension add the name (i.e. 'zip') followed by a semicolon. <br/><br/"
">To exclude a database table, check the box labeled 'Enable Table Filters' "
"and check the table name to exclude. To include only a copy of your database "
"in the archive file check the box labeled 'Archive Only the Database'.  The "
"installer.php file can optionally be pre-filled with data at install time "
"but is not required.  <br/><br/>"
msgstr ""

#: views/packages/screen.php:97
msgid ""
"<b>Packages » 2 Scan</b> <br/>The plugin will scan your system files and "
"database to let you know if there are any concerns or issues that may be "
"present.  All items in green mean the checks looked good.  All items in red "
"indicate a warning.  Warnings will not prevent the build from running, "
"however if you do run into issues with the build then investigating the "
"warnings should be considered.  Click on each section for more details about "
"each scan check. <br/><br/>"
msgstr ""

#: views/packages/screen.php:105
msgid ""
"<b>Packages » 3 Build</b> <br/>The final step in the build process where the "
"installer script and archive of the website can be downloaded.   To start "
"the install process follow these steps: <ol><li>Download the installer.php "
"and archive.zip files to your local computer.</li><li>For localhost installs "
"be sure you have PHP, Apache & MySQL installed on your local computer with "
"software such as XAMPP, Instant WordPress or MAMP for MAC. Place the package."
"zip and installer.php into any empty directory under your webroot then "
"browse to the installer.php via your web browser to launch the install "
"wizard.</li><li>For remote installs use FTP or cPanel to upload both the "
"archive.zip and installer.php to your hosting provider. Place the files in a "
"new empty directory under your host's webroot accessible from a valid URL "
"such as http://your-domain/your-wp-directory/installer.php to launch the "
"install wizard. On some hosts the root directory will be a something like "
"public_html -or- www.  If your're not sure contact your hosting provider. </"
"li></ol>For complete instructions see:<br/>\n"
"\t\t\t\t\t<a href='https://snapcreek.com/duplicator/docs/quick-start/?"
"utm_source=duplicator_free&amp;utm_medium=wordpress_plugin&amp;"
"utm_content=package_built_install_help&amp;"
"utm_campaign=duplicator_free#quick-040-q' target='_blank'>\n"
"\t\t\t\t\tHow do I install this Package?</a><br/><br/>"
msgstr ""

#: views/packages/screen.php:122
msgid ""
"<b>Packages » Details</b> <br/>The details view will give you a full break-"
"down of the package including any errors that may have occured during the "
"install. <br/><br/>"
msgstr ""

#: views/settings/about-info.php:49
msgid ""
"Duplicator can streamline your workflow and quickly clone/migrate a "
"WordPress site. The plugin helps admins, designers and developers speed up "
"the migration process of moving a WordPress site. Please help us continue "
"development by giving the plugin a 5 star."
msgstr ""

#: views/settings/about-info.php:58
msgid "Rate Duplicator"
msgstr ""

#: views/settings/about-info.php:69
msgid "Support Duplicator"
msgstr ""

#: views/settings/about-info.php:71
msgid "with a 5 star review!"
msgstr ""

#: views/settings/about-info.php:85
msgid "Spread the Word"
msgstr ""

#: views/settings/about-info.php:92
msgid "Facebook"
msgstr ""

#: views/settings/about-info.php:95
msgid "Twitter"
msgstr ""

#: views/settings/about-info.php:98
msgid "LinkedIn"
msgstr ""

#: views/settings/about-info.php:101
msgid "Google+"
msgstr ""

#: views/settings/about-info.php:120
msgid "Stay in the Loop"
msgstr ""

#: views/settings/about-info.php:130
msgid ""
"Subscribe to the Duplicator newsletter and stay on top of great ideas, "
"tutorials, and better ways to improve your workflows"
msgstr ""

#: views/settings/controller.php:24
msgid "Schedules"
msgstr ""

#: views/settings/controller.php:26
msgid "License"
msgstr ""

#: views/settings/controller.php:27
msgid "About"
msgstr ""

#: views/settings/general.php:8
msgid "General Settings Saved"
msgstr ""

#: views/settings/general.php:88
msgid "Plugin"
msgstr ""

#: views/settings/general.php:92 views/tools/diagnostics/inc.settings.php:91
#: views/tools/diagnostics/inc.settings.php:110
#: views/tools/diagnostics/inc.settings.php:183
msgid "Version"
msgstr ""

#: views/settings/general.php:99
msgid "Uninstall"
msgstr ""

#: views/settings/general.php:102
msgid "Delete Plugin Settings"
msgstr ""

#: views/settings/general.php:105
msgid "Delete Entire Storage Directory"
msgstr ""

#: views/settings/general.php:112
msgid "Full Path"
msgstr ""

#: views/settings/general.php:115
msgid "Disable .htaccess File In Storage Directory"
msgstr ""

#: views/settings/general.php:117
msgid "Disable if issues occur when downloading installer/archive files."
msgstr ""

#: views/settings/general.php:122
msgid "Custom Roles"
msgstr ""

#: views/settings/general.php:125
msgid "Enable User Role Editor Plugin Integration"
msgstr ""

#: views/settings/general.php:130
msgid "The User Role Editor Plugin"
msgstr ""

#: views/settings/general.php:131 views/settings/gopro.php:46
msgid "Free"
msgstr ""

#: views/settings/general.php:132
msgid "or"
msgstr ""

#: views/settings/general.php:133 views/settings/gopro.php:47
msgid "Professional"
msgstr ""

#: views/settings/general.php:134
msgid "must be installed to use"
msgstr ""

#: views/settings/general.php:135
msgid "this feature."
msgstr ""

#: views/settings/general.php:144
msgid "Debug"
msgstr ""

#: views/settings/general.php:148
msgid "Debugging"
msgstr ""

#: views/settings/general.php:151
msgid "Enable debug options throughout user interface"
msgstr ""

#: views/settings/general.php:155
msgid "Trace Log"
msgstr ""

#: views/settings/general.php:161
msgid ""
"Turns on detailed operation logging. Logging will occur in both PHP error "
"and local trace logs."
msgstr ""

#: views/settings/general.php:163
msgid ""
"WARNING: Only turn on this setting when asked to by support as tracing will "
"impact performance."
msgstr ""

#: views/settings/general.php:167
msgid "Download Trace Log"
msgstr ""

#: views/settings/general.php:175
msgid "Advanced"
msgstr ""

#: views/settings/general.php:182
msgid "Reset Packages"
msgstr ""

#: views/settings/general.php:185
msgid ""
"This process will reset all packages by deleting those without a completed "
"status, reset the active package id and perform a cleanup of the build tmp "
"file."
msgstr ""

#: views/settings/general.php:188
msgid "Reset Settings"
msgstr ""

#: views/settings/general.php:189
msgid ""
"This action should only be used if the packages screen is having issues or a "
"build is stuck."
msgstr ""

#: views/settings/general.php:194
msgid "Archive scan"
msgstr ""

#: views/settings/general.php:197
msgid "Skip"
msgstr ""

#: views/settings/general.php:199
msgid ""
"If enabled all files check on scan will be skipped before package creation.  "
"In some cases, this option can be beneficial if the scan process is having "
"issues running or returning errors."
msgstr ""

#: views/settings/general.php:205
msgid "Other Plugins/Themes JS"
msgstr ""

#: views/settings/general.php:208 views/settings/general.php:224
msgid "Unhook them on Duplicator pages"
msgstr ""

#: views/settings/general.php:211
msgid ""
"Check this option if other plugins/themes JavaScript files are conflicting "
"with Duplicator."
msgstr ""

#: views/settings/general.php:215 views/settings/general.php:231
msgid ""
"Do not modify this setting unless you know the expected result or have "
"talked to support."
msgstr ""

#: views/settings/general.php:221
msgid "Other Plugins/Themes CSS"
msgstr ""

#: views/settings/general.php:227
msgid ""
"Check this option if other plugins/themes CSS files are conflicting with "
"Duplicator."
msgstr ""

#: views/settings/general.php:240
msgid "Save General Settings"
msgstr ""

#: views/settings/general.php:249
msgid "Reset Packages ?"
msgstr ""

#: views/settings/general.php:250
msgid ""
"This will clear and reset all of the current temporary packages.  Would you "
"like to continue?"
msgstr ""

#: views/settings/general.php:251
msgid "Resetting settings, Please Wait..."
msgstr ""

#: views/settings/general.php:254
msgid "Yes"
msgstr ""

#: views/settings/general.php:255
msgid "No"
msgstr ""

#: views/settings/general.php:259
msgid "AJAX ERROR!"
msgstr ""

#: views/settings/general.php:259
msgid "Ajax request error"
msgstr ""

#: views/settings/general.php:264 views/settings/general.php:317
msgid "RESPONSE ERROR!"
msgstr ""

#: views/settings/general.php:307
msgid "Packages successfully reset"
msgstr ""

#: views/settings/gopro.php:39
msgid "The simplicity of Duplicator"
msgstr ""

#: views/settings/gopro.php:40
msgid "with power for everyone."
msgstr ""

#: views/settings/gopro.php:45
msgid "Feature"
msgstr ""

#: views/settings/gopro.php:50
msgid "Backup Files & Database"
msgstr ""

#: views/settings/gopro.php:60
msgid "Database Table Filters"
msgstr ""

#: views/settings/gopro.php:65
msgid "Migration Wizard"
msgstr ""

#: views/settings/gopro.php:70
msgid "Scheduled Backups"
msgstr ""

#: views/settings/gopro.php:77
msgid "Amazon S3 Storage"
msgstr ""

#: views/settings/gopro.php:85
msgid "Dropbox Storage "
msgstr ""

#: views/settings/gopro.php:93
msgid "Google Drive Storage"
msgstr ""

#: views/settings/gopro.php:101
msgid "Microsoft One Drive Storage"
msgstr ""

#: views/settings/gopro.php:109
msgid "Remote FTP/SFTP Storage"
msgstr ""

#: views/settings/gopro.php:115
msgid "Overwrite Live Site"
msgstr ""

#: views/settings/gopro.php:117
msgid "Overwrite Existing Site"
msgstr ""

#: views/settings/gopro.php:118
msgid "Overwrite a live site. Makes installing super-fast!"
msgstr ""

#: views/settings/gopro.php:124 views/settings/gopro.php:126
msgid "Large Site Support"
msgstr ""

#: views/settings/gopro.php:127
msgid ""
"Advanced archive engine processes multi-gig sites - even on stubborn budget "
"hosts!"
msgstr ""

#: views/settings/gopro.php:133
msgid "Multiple Archive Engines"
msgstr ""

#: views/settings/gopro.php:138
msgid "Server Throttling"
msgstr ""

#: views/settings/gopro.php:143
msgid "Background Processing"
msgstr ""

#: views/settings/gopro.php:148
msgid "Installer Passwords"
msgstr ""

#: views/settings/gopro.php:153
msgid " Regenerate Salts"
msgstr ""

#: views/settings/gopro.php:155
msgid "Regenerate Salts"
msgstr ""

#: views/settings/gopro.php:156
msgid ""
"Installer contains option to regenerate salts in the wp-config.php file.  "
"This feature is only available with Freelancer, Business or Gold licenses."
msgstr ""

#: views/settings/gopro.php:162 views/settings/gopro.php:164
msgid "WP-Config Control Plus"
msgstr ""

#: views/settings/gopro.php:165
msgid "Control many wp-config.php settings right from the installer!"
msgstr ""

#: views/settings/gopro.php:173
msgid "cPanel Database API"
msgstr ""

#: views/settings/gopro.php:177
msgid ""
"Create the database and database user directly in the installer.  No need to "
"browse to your host's cPanel application."
msgstr ""

#: views/settings/gopro.php:183
msgid "Multisite Network Migration"
msgstr ""

#: views/settings/gopro.php:188
msgid "Multisite Subsite &gt; Standalone"
msgstr ""

#: views/settings/gopro.php:190
msgid "Multisite"
msgstr ""

#: views/settings/gopro.php:191
msgid ""
"Install an individual subsite from a Multisite as a standalone site.  This "
"feature is only available with Business or Gold licenses."
msgstr ""

#: views/settings/gopro.php:198
msgid "Custom Search & Replace"
msgstr ""

#: views/settings/gopro.php:204
msgid "Email Alerts"
msgstr ""

#: views/settings/gopro.php:210
msgid "Manual Transfers"
msgstr ""

#: views/settings/gopro.php:216
msgid "Active Customer Support"
msgstr ""

#: views/settings/gopro.php:219
msgid ""
"Pro users get top priority for any requests to our support desk.  In most "
"cases responses will be answered in under 24 hours."
msgstr ""

#: views/settings/gopro.php:225
msgid "Plus Many Other Features..."
msgstr ""

#: views/settings/gopro.php:234
msgid "Check It Out!"
msgstr ""

#: views/settings/license.php:4
msgid "Activation"
msgstr ""

#: views/settings/license.php:9
#, php-format
msgid "%1$sManage Licenses%2$s"
msgstr ""

#: views/settings/license.php:14
msgid "Duplicator Free"
msgstr ""

#: views/settings/license.php:16
msgid "Basic Features"
msgstr ""

#: views/settings/license.php:17
msgid "Pro Features"
msgstr ""

#: views/settings/license.php:22
msgid "License Key"
msgstr ""

#: views/settings/license.php:26
msgid "The free version of Duplicator does not require a license key. "
msgstr ""

#: views/settings/license.php:28
msgid ""
"Professional Users: Please note that if you have already purchased the "
"Professional version it is a separate plugin that you download and install.  "
"You can download the Professional version  from the email sent after your "
"purchase or click on the 'Manage Licenses' link above to download the plugin "
"from your snapcreek.com dashboard.  "
msgstr ""

#: views/settings/license.php:31
msgid "If you would like to purchase the professional version you can "
msgstr ""

#: views/settings/license.php:32
msgid "get a copy here"
msgstr ""

#: views/settings/packages.php:8
msgid "Package Settings Saved"
msgstr ""

#: views/settings/packages.php:74
msgid "SQL Script"
msgstr ""

#: views/settings/packages.php:78
msgid "Mysqldump"
msgstr ""

#: views/settings/packages.php:88
msgid "PHP Code"
msgstr ""

#: views/settings/packages.php:98
msgid ""
"This server does not support the PHP shell_exec function which is required "
"for mysqldump to run. "
msgstr ""

#: views/settings/packages.php:99
msgid "Please contact the host or server administrator to enable this feature."
msgstr ""

#: views/settings/packages.php:104 views/tools/diagnostics/logging.php:180
msgid "Host Recommendation:"
msgstr ""

#: views/settings/packages.php:105 views/tools/diagnostics/logging.php:181
msgid ""
"Duplicator recommends going with the high performance pro plan or better "
"from our recommended list"
msgstr ""

#: views/settings/packages.php:109
msgid "Please visit our recommended"
msgstr ""

#: views/settings/packages.php:110 views/settings/packages.php:134
#: views/tools/diagnostics/logging.php:186
msgid "host list"
msgstr ""

#: views/settings/packages.php:111
msgid "for reliable access to mysqldump"
msgstr ""

#: views/settings/packages.php:122
msgid "Successfully Found:"
msgstr ""

#: views/settings/packages.php:129
msgid ""
"Mysqldump was not found at its default location or the location provided.  "
"Please enter a custom path to a valid location where mysqldump can run.  If "
"the problem persist contact your host or server administrator.  "
msgstr ""

#: views/settings/packages.php:133
msgid "See the"
msgstr ""

#: views/settings/packages.php:135
msgid "for reliable access to mysqldump."
msgstr ""

#: views/settings/packages.php:141
msgid "Custom Path"
msgstr ""

#: views/settings/packages.php:143
msgid "mysqldump path:"
msgstr ""

#: views/settings/packages.php:144
msgid ""
"Add a custom path if the path to mysqldump is not properly detected.   For "
"all paths use a forward slash as the path seperator.  On Linux systems use "
"mysqldump for Windows systems use mysqldump.exe.  If the path tried does not "
"work please contact your hosting provider for details on the correct path."
msgstr ""

#: views/settings/packages.php:148
msgid "/usr/bin/mypath/mysqldump"
msgstr ""

#: views/settings/packages.php:152
msgid ""
"<i class=\"fa fa-exclamation-triangle fa-sm\"></i> The custom path provided "
"is not recognized as a valid mysqldump file:<br/>"
msgstr ""

#: views/settings/packages.php:170
msgid "Single-Threaded"
msgstr ""

#: views/settings/packages.php:173
msgid "Multi-Threaded"
msgstr ""

#: views/settings/packages.php:177
msgid "PHP Code Mode:"
msgstr ""

#: views/settings/packages.php:179
msgid ""
"Single-Threaded mode attempts to create the entire database script in one "
"request.  Multi-Threaded mode allows the database script to be chunked over "
"multiple requests.  Multi-Threaded mode is typically slower but much more "
"reliable especially for larger databases."
msgstr ""

#: views/settings/packages.php:181
msgid "<br><br><i>Multi-Threaded mode is only available in Duplicator Pro.</i>"
msgstr ""

#: views/settings/packages.php:184
msgid "Query Limit Size"
msgstr ""

#: views/settings/packages.php:194
msgid "PHP Query Limit Size"
msgstr ""

#: views/settings/packages.php:195
msgid ""
"A higher limit size will speed up the database build time, however it will "
"use more memory.  If your host has memory caps start off low."
msgstr ""

#: views/settings/packages.php:213
msgid "ZipArchive"
msgstr ""

#: views/settings/packages.php:219
msgid "DupArchive"
msgstr ""

#: views/settings/packages.php:228
msgid "Creates a archive format (archive.zip)."
msgstr ""

#: views/settings/packages.php:229
msgid ""
"This option uses the internal PHP ZipArchive classes to create a Zip file."
msgstr ""

#: views/settings/packages.php:238
msgid "Creates a custom archive format (archive.daf)."
msgstr ""

#: views/settings/packages.php:239
msgid ""
"This option is recommended for large sites or sites on constrained servers."
msgstr ""

#: views/settings/packages.php:246
msgid "Archive Flush"
msgstr ""

#: views/settings/packages.php:249
msgid "Attempt Network Keep Alive"
msgstr ""

#: views/settings/packages.php:250
msgid "enable only for large archives"
msgstr ""

#: views/settings/packages.php:253
msgid ""
"This will attempt to keep a network connection established for large "
"archives."
msgstr ""

#: views/settings/packages.php:254
msgid " Valid only when Archive Engine for ZipArchive is enabled."
msgstr ""

#: views/settings/packages.php:261
msgid "Visual"
msgstr ""

#: views/settings/packages.php:265
msgid "Created Format"
msgstr ""

#: views/settings/packages.php:269
msgid "By Year"
msgstr ""

#: views/settings/packages.php:276
msgid "By Month"
msgstr ""

#: views/settings/packages.php:283
msgid "By Day"
msgstr ""

#: views/settings/packages.php:291
msgid ""
"The UTC date format shown in the 'Created' column on the Packages screen."
msgstr ""

#: views/settings/packages.php:292
msgid ""
"To use WordPress timezone formats consider an upgrade to Duplicator Pro."
msgstr ""

#: views/settings/packages.php:301
msgid "Save Package Settings"
msgstr ""

#: views/settings/schedule.php:14 views/tools/templates.php:15
msgid "This option is available in Duplicator Pro."
msgstr ""

#: views/settings/schedule.php:15
msgid ""
"Create robust schedules that automatically create packages while you sleep."
msgstr ""

#: views/settings/schedule.php:17
msgid "Simply choose your storage location and when you want it to run."
msgstr ""

#: views/settings/storage.php:15
msgid "Store your packages in multiple locations  with Duplicator Pro"
msgstr ""

#: views/settings/storage.php:20
msgid " Dropbox"
msgstr ""

#: views/settings/storage.php:28
msgid ""
"Set up a one-time storage location and automatically <br/> push the package "
"to your destination."
msgstr ""

#: views/tools/controller.php:22
msgid "Diagnostics"
msgstr ""

#: views/tools/controller.php:23
msgid "Templates"
msgstr ""

#: views/tools/diagnostics/inc.data.php:11
msgid "Stored Data"
msgstr ""

#: views/tools/diagnostics/inc.data.php:16
msgid "Data Cleanup"
msgstr ""

#: views/tools/diagnostics/inc.data.php:21
msgid "Remove Installation Files"
msgstr ""

#: views/tools/diagnostics/inc.data.php:25
msgid "Removes all reserved installer files."
msgstr ""

#: views/tools/diagnostics/inc.data.php:30
msgid ""
"Clicking on the 'Remove Installation Files' button will attempt to remove "
"the installer files used by Duplicator.  These files should not be left on "
"production systems for security reasons. Below are the files that should be "
"removed."
msgstr ""

#: views/tools/diagnostics/inc.data.php:45
msgid "Clear Build Cache"
msgstr ""

#: views/tools/diagnostics/inc.data.php:48
msgid "Removes all build data from:"
msgstr ""

#: views/tools/diagnostics/inc.data.php:53
msgid "Options Values"
msgstr ""

#: views/tools/diagnostics/inc.data.php:87
msgid "Delete Option?"
msgstr ""

#: views/tools/diagnostics/inc.data.php:88
msgid "Delete the option value just selected?"
msgstr ""

#: views/tools/diagnostics/inc.data.php:89
msgid "Removing Option, Please Wait..."
msgstr ""

#: views/tools/diagnostics/inc.data.php:94
msgid "Clear Build Cache?"
msgstr ""

#: views/tools/diagnostics/inc.data.php:95
msgid ""
"This process will remove all build cache files.  Be sure no packages are "
"currently building or else they will be cancelled."
msgstr ""

#: views/tools/diagnostics/inc.data.php:107
msgid "Delete the option value"
msgstr ""

#: views/tools/diagnostics/inc.phpinfo.php:17
msgid "PHP Information"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:5
#: views/tools/diagnostics/inc.settings.php:6
msgid "unknow"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:23
msgid "Server Settings"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:32
msgid "Duplicator Version"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:39
msgid "Operating System"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:43
msgid "Timezone"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:47
msgid "Server Time"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:59
msgid "ABSPATH"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:63
msgid "Plugins Path"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:67
msgid "Loaded PHP INI"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:71
msgid "Server IP"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:78
msgid "Can't detect"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:84
msgid "Client IP"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:95
msgid "Language"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:99
#: views/tools/diagnostics/inc.settings.php:191
msgid "Charset"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:103
msgid "Memory Limit "
msgstr ""

#: views/tools/diagnostics/inc.settings.php:104
msgid "Max"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:122
msgid "Process"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:126
msgid "Safe Mode"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:130
msgid "On"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:130
msgid "Off"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:135
msgid "Memory Limit"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:139
msgid "Memory In Use"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:143
#: views/tools/diagnostics/inc.settings.php:152
msgid "Max Execution Time"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:153
msgid ""
"If the value shows dynamic then this means its possible for PHP to run "
"longer than the default.  If the value is fixed then PHP will not be allowed "
"to run longer than the default."
msgstr ""

#: views/tools/diagnostics/inc.settings.php:158
msgid "Shell Exec"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:159
#: views/tools/diagnostics/inc.settings.php:163
msgid "Is Supported"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:159
#: views/tools/diagnostics/inc.settings.php:163
msgid "Not Supported"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:162
msgid "Shell Exec Zip"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:166
msgid "Suhosin Extension"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:170
msgid "Architecture "
msgstr ""

#: views/tools/diagnostics/inc.settings.php:176
msgid "Error Log File "
msgstr ""

#: views/tools/diagnostics/inc.settings.php:187
msgid "Comments"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:195
msgid "Wait Timeout"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:199
msgid "Max Allowed Packets"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:203
msgid "msyqldump Path"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:207
msgid "Server Disk"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:210
msgid "Free space"
msgstr ""

#: views/tools/diagnostics/inc.settings.php:213
msgid "Note: This value is the physical servers hard-drive allocation."
msgstr ""

#: views/tools/diagnostics/inc.settings.php:214
msgid ""
"On shared hosts check your control panel for the 'TRUE' disk space quota "
"value."
msgstr ""

#: views/tools/diagnostics/inc.validator.php:16
msgid "Run Validator"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:17
msgid ""
"This will run the scan validation check.  This may take several minutes.  Do "
"you want to Continue?"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:28
msgid "Scan Validator"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:33
msgid ""
"This utility will help to find unreadable files and sys-links in your "
"environment  that can lead to issues during the scan process.  "
msgstr ""

#: views/tools/diagnostics/inc.validator.php:34
msgid ""
"The utility will also shows how many files and directories you have in your "
"system.  This process may take several minutes to run.  "
msgstr ""

#: views/tools/diagnostics/inc.validator.php:35
msgid ""
"If there is a recursive loop on your system then the process has a built in "
"check to stop after a large set of files and directories have been scanned.  "
msgstr ""

#: views/tools/diagnostics/inc.validator.php:36
msgid ""
"A message will show indicated that that a scan depth has been reached. If "
"you have issues with the package scanner (step 2) during the build process "
"then try to add The paths below to your file filters to allow the scanner to "
"finish."
msgstr ""

#: views/tools/diagnostics/inc.validator.php:43
#: views/tools/diagnostics/inc.validator.php:153
msgid "Run Scan Integrity Validation"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:77
msgid "Note: Symlinks are not discoverable on Windows OS with PHP"
msgstr ""

#: views/tools/diagnostics/inc.validator.php:122
msgid "Scanning Environment... This may take a few minutes."
msgstr ""

#: views/tools/diagnostics/information.php:25
msgid "File Found: Unable to remove"
msgstr ""

#: views/tools/diagnostics/information.php:26
msgid "Removed"
msgstr ""

#: views/tools/diagnostics/information.php:44
msgid "Installer file cleanup ran!"
msgstr ""

#: views/tools/diagnostics/information.php:48
msgid "Build cache removed."
msgstr ""

#: views/tools/diagnostics/information.php:125
msgid "No Duplicator installer files found on this WordPress Site."
msgstr ""

#: views/tools/diagnostics/information.php:132
msgid "Security Notes"
msgstr ""

#: views/tools/diagnostics/information.php:133
msgid ""
"If the installer files do not successfully get removed with this action, "
"then they WILL need to be removed manually through your hosts control panel  "
"or FTP.  Please remove all installer files to avoid any security issues on "
"this site.  For more details please visit the FAQ link <a href=\"https://"
"snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-295-q\" target="
"\"_blank\">Which files need to be removed after an install?</a>"
msgstr ""

#: views/tools/diagnostics/information.php:140
msgid "Some of the installer files did not get removed, "
msgstr ""

#: views/tools/diagnostics/information.php:142
msgid "please retry the installer cleanup process"
msgstr ""

#: views/tools/diagnostics/information.php:144
msgid " If this process continues please see the previous FAQ link."
msgstr ""

#: views/tools/diagnostics/information.php:148
msgid "Help Support Duplicator"
msgstr ""

#: views/tools/diagnostics/information.php:149
msgid ""
"The Duplicator team has worked many years to make moving a WordPress site a "
"much easier process.  Show your support with a <a href=\"https://wordpress."
"org/support/plugin/duplicator/reviews/?filter=5\" target=\"_blank\">5 star "
"review</a>!  We would be thrilled if you could!"
msgstr ""

#: views/tools/diagnostics/information.php:159
msgid "Please test the entire site to validate the migration process!"
msgstr ""

#: views/tools/diagnostics/information.php:165
msgid ""
"NOTICE: Safe mode (Basic) was enabled during install, be sure to re-enable "
"all your plugins."
msgstr ""

#: views/tools/diagnostics/information.php:170
msgid ""
"NOTICE: Safe mode (Advanced) was enabled during install, be sure to re-"
"enable all your plugins."
msgstr ""

#: views/tools/diagnostics/information.php:212
msgid "Plugin settings reset."
msgstr ""

#: views/tools/diagnostics/information.php:213
msgid "View state settings reset."
msgstr ""

#: views/tools/diagnostics/information.php:214
msgid "Active package settings reset."
msgstr ""

#: views/tools/diagnostics/logging.php:166
msgid "Log file not found or unreadable"
msgstr ""

#: views/tools/diagnostics/logging.php:167
msgid ""
"Try to create a package, since no log files were found in the snapshots "
"directory with the extension *.log"
msgstr ""

#: views/tools/diagnostics/logging.php:168
msgid "Reasons for log file not showing"
msgstr ""

#: views/tools/diagnostics/logging.php:169
msgid "The web server does not support returning .log file extentions"
msgstr ""

#: views/tools/diagnostics/logging.php:170
msgid ""
"The snapshots directory does not have the correct permissions to write "
"files.  Try setting the permissions to 755"
msgstr ""

#: views/tools/diagnostics/logging.php:171
msgid ""
"The process that PHP runs under does not have enough permissions to create "
"files.  Please contact your hosting provider for more details"
msgstr ""

#: views/tools/diagnostics/logging.php:185
msgid "Consider our recommended"
msgstr ""

#: views/tools/diagnostics/logging.php:187
msgid "if you’re unhappy with your current provider"
msgstr ""

#: views/tools/diagnostics/logging.php:191
#: views/tools/diagnostics/logging.php:196
msgid "Options"
msgstr ""

#: views/tools/diagnostics/logging.php:198
msgid "Refresh"
msgstr ""

#: views/tools/diagnostics/logging.php:201
msgid "Auto Refresh"
msgstr ""

#: views/tools/diagnostics/logging.php:207
msgid "Package Logs"
msgstr ""

#: views/tools/diagnostics/logging.php:208
msgid "Top 20"
msgstr ""

#: views/tools/diagnostics/main.php:43
msgid "Information"
msgstr ""

#: views/tools/diagnostics/main.php:44
msgid "Logs"
msgstr ""

#: views/tools/diagnostics/support.php:32
msgid ""
"Migrating WordPress is a complex process and the logic to make all the magic "
"happen smoothly may not work quickly with every site.  With over 30,000 "
"plugins and a very complex server eco-system some migrations may run into "
"issues.  This is why the Duplicator includes a detailed knowledgebase that "
"can help with many common issues.  Resources to additional support, approved "
"hosting, and alternatives to fit your needs can be found below."
msgstr ""

#: views/tools/diagnostics/support.php:44
msgid "Knowledgebase"
msgstr ""

#: views/tools/diagnostics/support.php:47
msgid "Complete Online Documentation"
msgstr ""

#: views/tools/diagnostics/support.php:49
msgid "Choose A Section"
msgstr ""

#: views/tools/diagnostics/support.php:50
msgid "Quick Start"
msgstr ""

#: views/tools/diagnostics/support.php:52
msgid "User Guide"
msgstr ""

#: views/tools/diagnostics/support.php:54
msgid "FAQs"
msgstr ""

#: views/tools/diagnostics/support.php:56
msgid "Change Log"
msgstr ""

#: views/tools/diagnostics/support.php:66
msgid "Online Support"
msgstr ""

#: views/tools/diagnostics/support.php:69
msgid "Get Help From IT Professionals"
msgstr ""

#: views/tools/diagnostics/support.php:73
msgid "Get Support!"
msgstr ""

#: views/tools/diagnostics/support.php:87
msgid "Approved Hosting"
msgstr ""

#: views/tools/diagnostics/support.php:90
msgid "Servers That Work With Duplicator"
msgstr ""

#: views/tools/diagnostics/support.php:93
msgid "Trusted Providers!"
msgstr ""

#: views/tools/diagnostics/support.php:104
msgid "Alternatives"
msgstr ""

#: views/tools/diagnostics/support.php:107
msgid "Other Commercial Resources"
msgstr ""

#: views/tools/diagnostics/support.php:110
msgid "Pro Solutions!"
msgstr ""

#: views/tools/templates.php:16
msgid ""
"Templates allow you to customize what you want to include in your site and "
"store it as a re-usable profile."
msgstr ""

#: views/tools/templates.php:18
msgid ""
"Save time and create a template that can be applied to a schedule or a "
"custom package setup."
msgstr ""
languages/index.php000064400000000034151336065400010332 0ustar00<?php
// Silence is golden.
languages/duplicator-en_US.mo000064400000001106151336065400012225 0ustar00��$,89Project-Id-Version: Duplicator 1.3.7
Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/duplicator
Language-Team: 
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
POT-Creation-Date: 2019-09-02 12:30+0530
PO-Revision-Date: 2019-09-02 12:45+0530
X-Generator: Poedit 2.2.3
X-Poedit-KeywordsList: __;_e;esc_html_e;esc_html__;_x;_ex;esc_attr_e;esc_attr__
X-Poedit-Basepath: ..
Last-Translator: 
Plural-Forms: nplurals=2; plural=(n != 1);
Language: en_US
X-Poedit-SearchPath-0: .
helper.php000064400000014060151336065400006540 0ustar00<?php
defined('ABSPATH') || exit;

if (!function_exists('duplicator_cloned_get_home_path')) {
    /**
     * Cloned function of the get_home_path(). It is same code except two lines of code
     * Get the absolute filesystem path to the root of the WordPress installation
     *
     * @return string Full filesystem path to the root of the WordPress installation
     */
    function duplicator_cloned_get_home_path()
    {
        $home    = set_url_scheme(get_option('home'), 'http');
        $siteurl = set_url_scheme(get_option('siteurl'), 'http');

        // below two lines
        // extra added by snapcreek
        // when home is www. path and siteurl is non-www , the duplicator_get_home_psth() was  returning empty value
        $home = str_ireplace('://www.', '://', $home);
        $siteurl = str_ireplace('://www.', '://', $siteurl);

        if (!empty($home) && 0 !== strcasecmp($home, $siteurl)  && $home !== $siteurl) {
            $wp_path_rel_to_home = str_ireplace($home, '', $siteurl); /* $siteurl - $home */
            $pos                 = strripos(str_replace('\\', '/', $_SERVER['SCRIPT_FILENAME']), trailingslashit($wp_path_rel_to_home));
            $home_path           = substr($_SERVER['SCRIPT_FILENAME'], 0, $pos);
            $home_path           = trailingslashit($home_path);
        } else {
            $home_path = ABSPATH;
        }
        return str_replace('\\', '/', $home_path);
    }
}

if (!function_exists('duplicator_get_home_path')) {
    function duplicator_get_home_path() {
        static $homePath = null;
        if (is_null($homePath)) {
            if (!function_exists('get_home_path')) {
                require_once(ABSPATH.'wp-admin/includes/file.php');
            }
            $homePath = wp_normalize_path(duplicator_cloned_get_home_path());
            if ($homePath == '//' || $homePath == '') {
                $homePath = '/';
            } else {
                $homePath = rtrim($homePath, '/');
            }
        }
        return $homePath;
    }
}

if (!function_exists('duplicator_get_abs_path')) {
    function duplicator_get_abs_path() {
        static $absPath = null;
        if (is_null($absPath)) {
            $absPath = wp_normalize_path(ABSPATH);
            if ($absPath == '//' || $absPath == '') {
                $absPath = '/';
            } else {
                $absPath = rtrim($absPath, '/');
            }
        }
        return $absPath;
    }
}

if (!function_exists('sanitize_textarea_field')) {
    /**
     * Sanitizes a multiline string from user input or from the database.
     *
     * The function is like sanitize_text_field(), but preserves
     * new lines (\n) and other whitespace, which are legitimate
     * input in textarea elements.
     *
     * @see sanitize_text_field()
     *
     * @since 4.7.0
     *
     * @param string $str String to sanitize.
     * @return string Sanitized string.
     */
    function sanitize_textarea_field($str)
    {
        $filtered = _sanitize_text_fields($str, true);

        /**
         * Filters a sanitized textarea field string.
         *
         * @since 4.7.0
         *
         * @param string $filtered The sanitized string.
         * @param string $str      The string prior to being sanitized.
         */
        return apply_filters('sanitize_textarea_field', $filtered, $str);
    }
}

if (!function_exists('_sanitize_text_fields')) {
    /**
     * Internal helper function to sanitize a string from user input or from the db
     *
     * @since 4.7.0
     * @access private
     *
     * @param string $str String to sanitize.
     * @param bool $keep_newlines optional Whether to keep newlines. Default: false.
     * @return string Sanitized string.
     */
    function _sanitize_text_fields($str, $keep_newlines = false)
    {
        $filtered = wp_check_invalid_utf8($str);

        if (strpos($filtered, '<') !== false) {
            $filtered = wp_pre_kses_less_than($filtered);
            // This will strip extra whitespace for us.
            $filtered = wp_strip_all_tags($filtered, false);

            // Use html entities in a special case to make sure no later
            // newline stripping stage could lead to a functional tag
            $filtered = str_replace("<\n", "&lt;\n", $filtered);
        }

        if (! $keep_newlines) {
            $filtered = preg_replace('/[\r\n\t ]+/', ' ', $filtered);
        }
        $filtered = trim($filtered);

        $found = false;
        while (preg_match('/%[a-f0-9]{2}/i', $filtered, $match)) {
            $filtered = str_replace($match[0], '', $filtered);
            $found = true;
        }

        if ($found) {
            // Strip out the whitespace that may now exist after removing the octets.
            $filtered = trim(preg_replace('/ +/', ' ', $filtered));
        }

        return $filtered;
    }
}

if (!function_exists('wp_normalize_path')) {
    /**
     * Normalize a filesystem path.
     *
     * On windows systems, replaces backslashes with forward slashes
     * and forces upper-case drive letters.
     * Allows for two leading slashes for Windows network shares, but
     * ensures that all other duplicate slashes are reduced to a single.
     *
     * @since 3.9.0
     * @since 4.4.0 Ensures upper-case drive letters on Windows systems.
     * @since 4.5.0 Allows for Windows network shares.
     * @since 4.9.7 Allows for PHP file wrappers.
     *
     * @param string $path Path to normalize.
     * @return string Normalized path.
     */
    function wp_normalize_path( $path ) {
        $wrapper = '';
        if ( wp_is_stream( $path ) ) {
            list( $wrapper, $path ) = explode( '://', $path, 2 );
            $wrapper .= '://';
        }

        // Standardise all paths to use /
        $path = str_replace( '\\', '/', $path );

        // Replace multiple slashes down to a singular, allowing for network shares having two slashes.
        $path = preg_replace( '|(?<=.)/+|', '/', $path );

        // Windows paths should uppercase the drive letter
        if ( ':' === substr( $path, 1, 1 ) ) {
            $path = ucfirst( $path );
        }

        return $wrapper . $path;
    }
}tools/Lite/Requirements.php000064400000010255151336065400012003 0ustar00<?php
/**
 * Class that collects the functions of initial checks on the requirements to run the plugin
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2
 *
 * @package Duplicator
 * @copyright (c) 2021, Snapcreek LLC
 *
 */

namespace Duplicator\Lite;

defined('ABSPATH') || exit;

class Requirements
{
    const DUP_PRO_PLUGIN_KEY = 'duplicator-pro/duplicator-pro.php';

    /**
     * 
     * @var string // current plugin file full path
     */
    protected static $pluginFile = '';

    /**
     * 
     * @var string // message on deactivation
     */
    protected static $deactivationMessage = '';

    /**
     * This function checks the requirements to run Duplicator.
     * At this point WordPress is not yet completely initialized so functionality is limited.
     * It need to hook into "admin_init" to get the full functionality of WordPress.
     * 
     * @param string $pluginFile    // main plugin file path
     * @return boolean              // true if plugin can be executed
     */
    public static function canRun($pluginFile)
    {
        $result           = true;
        self::$pluginFile = $pluginFile;

        if ($result === true && self::isPluginActive(self::DUP_PRO_PLUGIN_KEY)) {
            add_action('admin_init', array(__CLASS__, 'addProEnableNotice'));
            $pluginUrl = (is_multisite() ? network_admin_url('plugins.php') : admin_url('plugins.php'));
            self::$deactivationMessage = __('Can\'t enable Duplicator LITE if the PRO version is enabled.', 'duplicator') . '<br/>'
                . __('Please deactivate Duplicator PRO, then reactivate LITE version from the ', 'duplicator')
                . "<a href='" . $pluginUrl . "'>" . __('plugins page', 'duplicator') . ".</a>";
            $result = false;
        }

        if ($result === false) {
            register_activation_hook($pluginFile, array(__CLASS__, 'deactivateOnActivation'));
        }

        return $result;
    }

    /**
     * 
     * @param string $plugin
     * @return boolean // return true if plugin key is active and plugin file exists
     */
    protected static function isPluginActive($plugin)
    {
        $isActive = false;
        if (in_array($plugin, (array) get_option('active_plugins', array()))) {
            $isActive = true;
        }

        if (is_multisite()) {
            $plugins = get_site_option('active_sitewide_plugins');
            if (isset($plugins[$plugin])) {
                $isActive = true;
            }
        }

        return ($isActive && file_exists(WP_PLUGIN_DIR . '/' . $plugin));
    }

    /**
     * display admin notice only if user can manage plugins.
     */
    public static function addProEnableNotice()
    {
        if (current_user_can('activate_plugins')) {
            add_action('admin_notices', array(__CLASS__, 'proEnabledNotice'));
        }
    }

    /**
     * display admin notice 
     */
    public static function addMultisiteNotice()
    {
        if (current_user_can('activate_plugins')) {
            add_action('admin_notices', array(__CLASS__, 'multisiteNotice'));
        }
    }

    /**
     * deactivate current plugin on activation
     */
    public static function deactivateOnActivation()
    {
        deactivate_plugins(plugin_basename(self::$pluginFile));
        wp_die(self::$deactivationMessage);
    }

    /**
     * Display admin notice if duplicator pro is enabled
     */
    public static function proEnabledNotice()
    {
        $pluginUrl = (is_multisite() ? network_admin_url('plugins.php') : admin_url('plugins.php'));
        ?>
        <div class="error notice">
            <p>
                <span class="dashicons dashicons-warning"></span>
                <b><?php _e('Duplicator Notice:', 'duplicator'); ?></b>
                <?php _e('The "Duplicator Lite" and "Duplicator Pro" plugins cannot both be active at the same time.  ', 'duplicator'); ?>
            </p>
            <p>
                <?php _e('To use "Duplicator LITE" please deactivate "Duplicator PRO" from the ', 'duplicator-pro'); ?>
                <a href="<?php echo esc_url($pluginUrl); ?>">
                    <?php _e('plugins page', 'duplicator'); ?>.
                </a>
            </p>
        </div>
        <?php
    }
}
tools/DuplicatorPhpVersionCheck.php000064400000004323151336065400013504 0ustar00<?php
/**
 * These functions are performed before including any other Duplicator file so
 * do not use any Duplicator library or feature and use code compatible with PHP 5.2
 *
 */
defined('ABSPATH') || exit;

// In the future it will be included on both PRO and LITE so you need to check if the define exists.
if (!class_exists('DuplicatorPhpVersionCheck')) {

    class DuplicatorPhpVersionCheck
    {

        protected static $minVer       = null;
        protected static $suggestedVer = null;

        public static function check($minVer, $suggestedVer)
        {
            self::$minVer       = $minVer;
            self::$suggestedVer = $suggestedVer;

            if (version_compare(PHP_VERSION, self::$minVer, '<')) {
                if (is_multisite()) {
                    add_action('network_admin_notices', array(__CLASS__, 'notice'));
                } else {
                    add_action('admin_notices', array(__CLASS__, 'notice'));
                }
                return false;
            } else {
                return true;
            }
        }

        public static function notice()
        {
            ?>
            <div class="error notice">
                <p>
                    <?php
                    $str = 'DUPLICATOR: '.__('Your system is running a very old version of PHP (%s) that is no longer supported by Duplicator.  ', 'duplicator');
                    printf($str, PHP_VERSION);
                    
                    $str = __('Please ask your host or server administrator to update to PHP %1s or greater.') . '<br/>';
                    $str .= __('If this is not possible, please visit the FAQ link titled ', 'duplicator');
                    $str .= '<a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-licensing-017-q" target="blank">';
                    $str .= __('"What version of PHP Does Duplicator Support?"', 'duplicator');
                    $str .= '</a>';
                    $str .= __(' for instructions on how to download a previous version of Duplicator compatible with PHP %2s.', 'duplicator');
                    printf($str, self::$suggestedVer, PHP_VERSION);
                    ?>
                </p>
            </div>
            <?php
        }
    }
}
assets/img/logo-box.png000064400000076620151336065400011074 0ustar00�PNG


IHDR\r�f	pHYs���+tIME�	(7���w IDATx��w�]g}'�}��ۧ�Ѹ[#w�`6��4k�0/�@��mH��B��%�Iv�].b�df�A c[��傚m�*�Fe��~O{��q�-SdK��f$ݯ>Ws�)�s��W�j���j���j���j���j���j���j���j���j���j���j���j���j���j���j���j���j���j�a������ۗEM�]
�v۸�~u����W�z� �5mF��~���+h�i��Q�^��57D����n����eM��q��+�SG^],��5v^a4�K�sLIOz�^"RO:��t�g�J�X,�jx}���w�=m]��B�^�Yc쪄�Zu.Y��c�`�ar�_ty��Š�����Y�6C�=�8s�&M)��e\�-���-)�?�pk���b�Z�|��ž��k���,ຈ�ƅ��Ą��S�!��Î�Î�v���ۖ��춳����C�i����s��g��?v
�n3��P�F-��X�:�DV�QI�yW�_����+��&O6�5�QK�:�F��GyHI�Q��A��!��q�BN)H��x��؆��_�r��cl쵓E�K-��t���L!ĿN���V�14i:�0���@00��?o�N�5̇���P�C*R؜M����҃���L�fIl`s6�s�1�G�R~��N�wz�n��t�\&���������pص1��x.�D�q�!�T߂�Baĸ^S@����P5��c#)=�!�B�Ac>�|&{<9�)�C�a����e�{2h]��sw��|Ե�Xr�DS%8@��@
;�<&\`Q�ɠ����&�8XTA�`�������``1�C��͙iH������ۗ�H:�6�\٤��@x29�I�A?��4�ABlR�'���5���7<"���p�?��<8B���l��<�4��>d~�D��h6�}���m�e��\���_p�/�f,:j`	�s�.)x� 
�F�W6��0.]tj��m�]�}"h���ҡ�o�p<���=��9Bc��X�q�&���Q�K����P�yHpr
�u6b���Ս��:�I�֖�K���	`cj���8��P�Ώw����X"8;�S��P��G�G{�L`k6�}Vm��ܬ�kդ�Q3��
s{>�糩�2�+Q:cf����͠&�4��u� � 0��,�18J��&��v]�����_
�v��|�K7�9�:����܏��IDpAMՠ��7��X"�ׄ�G��\�׃��8��#�cq���\��-1����MB��`Sz
����q���p�(��w�9M5,j�@K��84�T��+���s�ȥЦ�8�u����'�Q���FAP�G�Ib�Ɣ�����;R�&���SG
�n@\7�m�Ȗ|/fS��8��pɷr!�
0���q�5T5�D��xC#\�@XE�~=I@�����p���l
u�:�B|�h��,�L78��`��W���� H��*��[,�	�uq]<��Ac��1�:f!�C�Y�݉�@:}|7����&��k��"�`�hb���Ȅ&8�X�]Ȣ7G�D����R(�ϰD�c������"������i�;6L�s�O�J���_O0���t0���k`�PK��sx���m�_�cg>�	ׁ�$�!F��d�c��/�Ag�1��`#v����@%����RI,,|�<(�D�9�NH�}����	�%F,��kG���>{���'�Ҳ@ (ȱG9+���" ��, 4�"��&X,�B�H�|1P�:c���f#�{sj8a�	�%����.�R�߱`!��7�)EƝ�]i_ڏ��Lz
��2�����'��'ڿ��x��>
�\R�1�C�'��Bk8!�	��Bc�
O����#O�Yy�G��7�8�P�O��+_3Vf�"����2 `|��{��F��U�/�
A���VI�&cP,�
�aQP���[���
�jY�|qg�?�q���D�ss}˻�cy������s��N.@)EŨ�7H'������:����+If����׌�t,��|0�A.)0�Т�?�l}G����5,�ZC�
liZv]�!6�5-!	0Lz�R8;u����T5�LC�1�#��0g�a_!��v�<�sЂϩ� ��lZ�=`V�����|Zܿh�WF�� �5���x=f<w*��?������Ѩ��(�����x���~+��8:
�{�!��٩�n���RS�M
mW�4���3�$�=������Cl�͔�'�МO�A����|��%�"*�����9��HWD�qN(��p<�'u�+���OO����͠&<���NC{�N��v�er�!&4���Pm��E�)��-����f��<O45]g�t�?��'�Ąkcܱ��,�����r)�_f@6g;�9���*x�Pv��X�ۿ�5P���˂�|\����0��Ho�7�P�qL��hA�/�?����o���8��l����	XJ��
O"\�p焢h����.���.��#�}�8�=��������k�I%1�98b[�H����s�9�\�K���84Π3?������6�B"|�\��GW)ؤ`I�$l%a��Ge��8��[�_+����9�[�]���x#�5��i�y~Z����~z������-�i��,�QB�u��~93��F��.A��ˌz�a4SR�f+���v���f�s��tc��qh_��ĕ���vi��]�A�����T�y�9�1��3S�8G�q��`:��ce�oY����������pH�R
y%��2����"-=XJ����P)�~��[6�(c�"V�k
h�MX�C��a����oLOy�ﴆ��+�kK�~T'���m�3�{]̌+_;��@�F�F��AÌ��H�ݴ�����L�����.�����'�`Ա0�ڐ��_�����T2��9B\ ""\ �9Œ���% MJ)��`�/	�L3��AE�)�HI	b�\�yPgq�v��-�u��ǹoIH��Q3��)��� �:��
��F�AU��� h��k��X"\ �:�\�O���U���w�q�GN���)�kn��Sm��0�g3%�E�,��*A�B�B�������@�e`lմ�gHa�up�.�R
g�[ļ/#��uu��Q����_��"%��O��sг�b{���)xS������.��hT�ن&�k��:���,ε�8��*�i��m�S�d 8+����pa(��qN(���2�Y��:��G???=|�<�@�d��d��Z;oh�"����x"9���_�g�����c��z�	�!�&���uHJ�mӞSZ�W2}��@q�,�р�c��ϓ�Ej?IlR�I���R���u�ob��"�M�\���svgx[�0�c�(�q��U�;��Q�`�Ps���@�s\�h�5�D���k�2f��/��x"����W�����g����:��Z,�q��e�w�a�{Dy���QLy.B2�֟��d�
���E7Ѭ((�Cv�R��?DZ�*�~��_r1�!����&���N��G�h!Ğ�mll���o�5��0��u�����Mӣ`S���N��s8��)�y��8�18W�0u􆣸���fi�q&����F��퉸���^�w�b���sվ=;�_�⿟��,6�80�W����E7.z*=���L�_��+3�*,�e�x�����V�l`~r��bB�	��*�G���IM�|���4�ik;�^}&c���;깆4I�-����B)�Ű#�.����6��h&�;�?|k��ﯟu\����k����W^�v�<pZ�,�q��m�k(����GAJh�ؙ�����J!5?�^�+���>�	��9bB �5ę�ϑ�UP�x߿9�<�Fl3
�p�Ʈs�\opv�šH�3���eS�k劕����U��H+	KIpy��$_8���Ҳڶ-xR>s�2?p
�8��;[�?ߦ���b[.��\����G��>s,V�9*�`?�1�#�89�
7���p2�;��D��C�x��^W�?Ѕ�0�w!��ylͦq�)�D�0������x��èc�=l�բ��-���3�‘\�y���qF}	���J��١�Ełm��}�+
`��e+��x]��"A�Na�Ѥh��3���/e<��ɫoLM~�t`�J\5=�ʹ�#�W.;hY��熣x_S4����tC*2����x
Jbı���J��i���}u.��|.'���/�w���3R���C�<�ۛ5g����^���XEA�?*+�fW�����*�h`�5M\�Qr"��N�W�'=����׏����:c(H�_�L`ҵ��9�s�?р��8�X+�F��Z�\�R��W�wvt�MNL�m[a�&l�����dG�γq�
��ʒ�$)t�a$�������*��(k��h����F�C#�����n�L|�d����+��?\f�k���Xr���"�^�`�4����<�C�5�������wvu���)�px�T
�XҕO�������+��G�\wG����y���EaQ����̭��!&t�	

�#Org��n�155�*�<#Zb�
�7�t?ܭ��&��'���ke��O	�$��P���R�[]�����?�ѵÝ�}�t
��^ݵ,_DZa���z����K����KE
�F1��*��;Ky��u��BG���zI���wܖ���"]�I�=��[-]Ý��jRI<���>+��{���(�m�m�:^�k�����4�#Ãx�簬�,���cff�096vB���h?�>28�y���N#\r��¹��%�BN>Tt�	vq���P�9R�~�����}�$��.�77w
w�ƪ	)�)5����exv�P�Rnml��c��yF,k��*{�g�';:;V��)�`x۷l�a���A<��8���׾v�[fg�� ]��H��0��
���Y����B�W8���3��RO�H��7�ɡE��E�=�qcS�p�n�>)%���`�.�W�m���V\�CNz��5MV��o���su:����m���a��笳���_T�Kg��
Sc����A��=�8JN*��~}9��.��`HJ�����Wg�v-�U�|�
�74u�������$Z�r�%�B�h�_�Ђ+b	䕇#��v���?U�����ѵ:�N�aۖ-�D"PJ!�����\����:�RFM��)�R�Y7��������(6��G�����_�9=u��ڛ�{�採6ݸ}R)lɦpx��/V�>^Wׄ�#qXR�]����Jh��~��d�a�_D$x����455#�ɌM�:�\�ν�Q$LJ'<oK=h1�׷p��8�H�������_�kZ,�hok�nzߤ�ؑKcԱa򲷿x_U���M�$���$9���'�T5����pG{G_*���-�.1?(%�}�Y�D"�����L�ο�Q>(G�_�Dh�LD�1X8�/Za.c�ȱH}��o-�-����nZߔ�x9���k�(u*��*�"tu��Ⱔ�#�Uu����m�}�T
?��#رu+"�(��D�0��s<����	�YxwrlhJz/Ƃ]E=2����0�q�T� ����/�,}ec��-��jJJ�Z�bҵa0^���B�m�*ހ�,�u�2oo�����������)������oC$缔�%�DCC�::���Q�T�բa��&*���s���n04sva�ѭ����o���S?^��X$�=���-B[5�$�X9L�΂~E���z,Ea)�1�Y�������lmm�K�R��ᕗv <�����{�������M��Zt,u��ՀGC��!&x�a��oWr��5�����9ŒA��'����ɟ,�%,
���Z���X5�$F�<f\:+�Z�3E
 ��b	\0��묹rz�����o6���N��ſ��v��p���420���u4]�'�ǟ|�Iy�^�	�O4��i���O���J��A�]�I�}���g��W5�7
�)%qض��\h�\���R�L0\��<3
G)L��W��?�
�47�N�Rx���=�v!�S�I�9�c�I�h�]�(��N��߹�	�56.��})„� �
�_l^d~��o2�(����2�������<�$�ۧIbԶ��\h�oT�`:pi�O��h�a8$1�:k���*��ÿ5��Ҽ:�Nc��c��G" 
&s̚Y�)��v455!���N�~�Z�
�	&�$4:�9HzN�ïl��"��X�cr�8c�Vr������Z[]�P�O)�I�FVz�x�(r�`Z�?�Hg!�Ja�u�93V�8�ʕ+���Ʀ�t:�g�ڈ��A(� ʟh�|/@#(���Սp$�t:��7��3j��/��k��Q��f�Ĕk#�;���o[\��#�R�vd�XD��������M+��ANy��|?��b�8�
G���%´�U
���}nlh��d�xv�&ط�Pȧ�*T?�P����:���9#�+qF����:�C1�����X��s�~��8B`(���p2uZu�y#l�t]��\���
i顠4��>0TX�����<���3�o���Í��}�L/l~#�ìd��@!�CKk2���|M�I�a|�Y��1�a�uK�*M�J����g00!�g�2�m�H�I� ����C
���!����
�����@��f�t�&<"�x�uUd���^��[�;�P�Зɤ��p���D�i�'�`9B�g��� QW�t:u��מ�m�
�X�����y"L�$Q0��覿�9�cZ�GV�aN�
�1��P��U3J��$R���Vl���a�k<"�����3�U[���s�`}C}_&���-���C2͠�x��� ��"�\qPq ���N��q�����df,�,���@Q2>�(DÌt�����o��#��JMH���bмX�0�Dv8���$)X$���0+��0Z�Z���:k�=]]�?�suu�3�vl݂��#0M�s0�8�J�@CC����ԕ�4Chim�繐�{Z�x#���c

]cwe�0�e�*���`��m
@���������
��
C1�oO*���N+��b�d�a�E�!��&w�
�ɪ��������su���L�^y�cc0
3=���T8���W#��`zj
�������J��\.�D�h<�pFZ3>�(x,)=d=o��(k�"t�c@J��xf�����6{�#�0���b4�ʿW�]G��A���ܵ7LW��{{������X<�:���՝�`bb�i�s��"c��\��U��o!�RhjnA4�m�/��_�Y-:O%�v���D[�ɽ:��HLh�&�.�lq�2ƛu�Y"̸���ڿ���y"����]�I�f@��	�*I
��sOq]v��fB�� 4("�=9pK��fo��qk�P<��e3طw/�&'aF�e� �)0�p�ŗ��{l˂�kB+y����
!<�}�Zt�j8e���7�;/ĵn�Hט.�IhR$�X�1�3��!����4�#�8`���aF�Ȫ����9"`����Sg��^@;�{8�}�opV
�Q��̷�!&B@����-�ɪy�d�- IDAT�ׯ_���u>��8��5�LOA7t�8�OI	�9.��EW�2�R� �!8�HB�0��`Yl{~����W46ׯ�d2��8����x8s]��˥\۶�Eà�����=:��N�����F�qPPd�)	��U
�"��� I�"��$��= �9 �R�����Gq��L6��=6�H�p��U)"���(��0_�
(Z&����-�*2�zM���h,ޗ�ep��A��I�A�6�FI�3����^��\�v�'�D|���RR
u

��H�3�l6�i�y����u��D��(���oR�5��<�+!2�"k����}�o�T�0��sw=���2<<�V�~T���q��x͵1b���%��=<RP�'wHP�if�I?\L�ՂRU���9�3D�0	�~{��ɺ��� ��D�Q�UI"ą�1HB����	Ą?�7-i�*2�ι>�F�r�ƎF:����A���o a~ֹ硣���P(�i��D]b�����+膦f���\.�ܽ��;1�ܜ�kә����P�2��tC�a�0M�ip]7�B��fj��4M��l�~ߊ+�dۋ�2@�Ic{�6����Ҭ<�G���\��yx0m�Ի�6^�l��q�CR�i��I��E��V$94���d2(��³(T�ݏÌ���%���t�����zcc�`,���r�G6���k�������>��p�ln�7��G>��O^�:��\M�!=	�ihllxқ��S���5]��P�c��'09>M��=�~�sh�Mӡ:t�h����.�w��Db7�&�~PW㌿3K���`]Z�Fcҥ9|����\�?�3�Cރ�+L���6F>��0�J)�F�D�sx��4?-���]��L�������h$�:��azj
�\���}T*4RR�q���.����ud��u��7M�ƥ��"��l���H�!����[������XL9p�|��G@)�?<��<xH)�$"�y���c���t�&KV��a���ʸ�3��i���SD����^/j���s���1�3�H٤�oT�B� 6��E�C&�U)"4�l�rn0[�*|[ �Tՙ���a0����򘙞F����i�$�x |g���BSK<�E6�.1?�R)Oz��Ch�"$uG"�
���2���[8���y�B�q�����4-�L�_�B!D�Q:8�|.�iW�y�պ?��)!t��X�&\y�A�U��[ӳ��ru�G�1�yvro��c�a{o���
�W���0ӴrQOV!<]E�@��*Z���tU�?��«�ҩl�*1?g��8ghkoGcc#<�C&�Z����`�1'''-�d�sM�
�����S?�𬁬��0��ֲ,L���kV^���q�zD�������DӅ^�jݣj��؍�1�9V��d	l������>�L�����9T�o�����X�m9p`(��4)t�!$���h�{d����Jo�*&E�\�^�EcC�Phu.�C.���:B��{/3gM�-�����Id�ف�����}��GsDg��ku]G�.����4z�U��ٕN������i��+���}�/��sd�Y>x�h�P��jݧjc��MMM�:gWf��q׆`(q��<�8���й_�'����>-�C7c��3�s�P�/���Pu�>_��,,R0��@_6]�8�e�3l��\>�P��%�?������D���������F1��}��#� �!�I���7/H3B7�#LOM�P(�?y���Q��	��Ќ������������7T�^UK^ԋ�5�BKLy.��3g�?_�/�����{���o�{7�Gԟ6،�����a]�/BO(�̀�2�W�B��򠈠�!Or�lu��%Æi���9�����v
�4y�1$	��qH%����}���~���z~�G!b�Lӄ����=s�ո�QI�ɉ�R:q���@����}�8|p�t�i\���Lw��Y5���~s�sL�6,�*\x��{tv/��g���ۂ1�#M�#��N���`o����sX�e�pv8�&�,��*�?�!�<R*H�QE���߯�r�aS7��<�T~r���f14C8�R
�|���|�����!O�s�S���D�~��v���y�(����G�0@�}�z�@ M���$&&�QWWIt6��Z���X����[D�A��Q6���O��84����ߛ�>��C6����=0,@}i�ch	�u�,��J?�υ�$c�Ak���f�ޗ/�K�5羣o��C�B�H)X��]>��9�sq.F�R0C!�bqض
�u��b�wE��X:�B6�)��y̾�%�Y�p�Q(phd�B$d�T�{WM,i�����W�B��&�w�O8�^w#̷� ����M��=Ƹ19$�VeIay$�VÜu/˚�5��p���Ek~3��b��ݺ����ՅBBQ\ߗ�l� �
�a@)�U(�{�<&���wȅC���3�L�[	�ߢi�3�p]7�`�f�+0W����{�.8��i��;��-9�*a
�ڤv�9�u�&�T߂���(����YX0/�(�A�AgYR�N��zz�1c|�A��XM�]���e�0�ڰ��Wa͇�Ջ���߯s�kPZ_�P�a�u����Z��"�Ƿ�u�}��9=϶�����4(%�}衇�+�Y�r���u03=]b���~� ��e�\+�.����^DZ�'V�Xq٥պ��’�M��ܮ
W����tI���8��Ԏ"1H"�qu8��*��w�t�*�����۫�۳\M���!5k;Vz0q
(x.t0ؤ�V��������5�W�<‘�_�[��K����?S�ί{�=x��u]��<�w��R��]sͻ��-��rH�S��?0�Qaڗ��琞�m۸�w����\"B2��>�s�-��*cɧ�66����?v5��M�*�hB��\
iυQ����q�g�m�8U }Q�y�J��/
q�UYW���a�`+�bO���_�s�* /]���&�Y�T��_�~�6=5=$4��`O$`!(R�`A�>���__�8nIj��3�����A��~F��eY�<���[�t~}4�cc��,��RA��bTf��k�7Ҳ,D�Q��[q��ߎX,���ɑd2�������o���%/��l����Sm�_4�����ޤ�x)��+���p�-4��.��y��S
��R{n�K�U9\k@����G59�^�#v9σ�9$���LUC}SS�B}�U@}}B��z
H$`�s E��r�
�Y�8W���\=l�U�w���6��-`@*����_r@�8S���q���h��yp],��;�{7���l:<�{v�<0���މ�)#�����~�W�-3��V��3�G�abg>���`��_����H�ҭ�7�\�=��a�*�m�t��4����>�~+���"�
�Y�V��'F'��.�,�FSS��(��~�
�g�{�2H�A�t���npx�BC�PpELw��Rx�?��,��h��-�t��!0�����1����Hٶ�h,�k�~5.��2D�1LMN�ˤS���K>�|J	�"�IN<�xϧ[��,��Y��4�Y��j
��X�_������r�`��Wvێ!N�/ǀ���1#�H��]B(j~�^+��� �9�ǫ��������!.x�eYhmmC4����F��?�J�u]h�O�w

=�V��fY!Q9"�Bz��uuuW��ٞ����E�4=(
*:���)ғ8�p��W������#�~{��W?���|g��}2pJ
x�?��jl���M3����Ѥ�S�!+=�����@;W'S�N�	���c��C��ޑ�_�y�kn`O>��k#�8ck?��ޚ���_w,g�1�g[�::O�!�c�`��435۲��:<����G���8p`G����d!�o�!����9�n1L�Sp]�w>ΑJ+����A4åW\���"cjrrW:���W��j�|����ǂk�G�_>~�1�SK�ܹfW���c�`V��h1	����)�
==ƾãC �*�uM8+��ʓ���_��|3��[�8��h���*X� Zm��;;���+���bw^΂�_���I�|�x��U����_��:����o=��-�M��Ig�V������JI�s�y����E�\
�u016v��W^��Tc~���@]:}�+�?�`��F.nGb�w
��B)N0w
��F9�d�u��x��*0�ںf���R�4�m��,d0���h͚|��q��s�A��r-,�9u�
����Ѿ0 "���"��B7(��=�y�Z���"�y��9�ۖ�\..D�� 0���H$��]���9f(����\.��/���-+N�.p]zr�[�on�Ì�U3�<Caw!7���;q��a�/�%�R���^���w�b��C��_i��2��\S��0� �׮�g��ߜ�
2�j�uq�9g����o����b~G� ��0���<���� *��c�B�k��p$�Iñ}���|A��Bײ,_�
���
2��W����_O�qb��(��ѿ}����.M�#/Ѓ�J�Cd��A�_\ʏ�W��~�u��V�3�9�
J�c0+�`s0(��R.�I�B���5U4���{�6�?��8�>�<455Ó^��� c�8���#�L�0M0�~��O��m�l6/���
���� �θ_sB�����O$�Ie��r�O���|�(?�}G�ɘ`ܢ6��(���JQ��L�T"�$6ڳ[w3�>��k�pNI�S��_{��#���m!��h`M�P�P���?&��l��9矏��V?��}Ŝ~!4p����.���y�'&�Z�}�C
��z�q���f��b���h�
�c}�ta~�4�|�v�+��f���18�˲�%�{3Vj�i;����U߄��T�=�Ƅc!"8��k����������a��9��x�dH`dl��*�&'
� 8x�Ǐ�P������[�9�]�cñ퀾���(�^0a���hZO&N[@��$h�X(
��!	�d8�����a�����������t*���w,�9c�����߯����a��>۱qAo/Z��KI>�V^����9ǞWwabl��Cp��|™�h�Fy��,���E�E`(�x��Z,zON[ Zd��(��A�����>��'6��xj��aZ���F���t뙫�	��ƭ"��	�vM�|_OM���l�F������������}�v��2�FGag�6�ۿU-�f��d�R�cA���*�?��+��nZL����R�ᗵ�@U8�0�o�%�.*Z���
�1cCjU�3��,]�BY�۲i��D�l��|�j�?��?46m���[�8V\r	�;;�y�5?g���8^ޱG�'�
��'?�كբ��"��{e�Q��� 9��Ŧ��8-�ec
zy�P�#��k��o�AK2pCO�1j�
q�U��D�U���Z���#¶\
�va!�5�d���[y���y�϶m���2ttv��2��8�8��p�ض��i��X���/>��eY��_$Q���Z��%�ϜVSD��P�X��i�E3_r
@��W?2:>���`�2V�n3KI(�V
�5��U'¶��O��v��^�O��w�O?�qP��j۱q�e����+�10h��?c۶���#`�!0M_���j�S
�H�fE@��?�i�8?-���2���0g)@���z�M���X�=k�@��_��i�aI*J�P|����k~�����{��'6y�\m;.��rtu/��r#h~M�[^x#�_�i�����c�--�7'LH�����S��F���	��x�Tѩ370?0o���a3Vjۍ��:T_�F��a�`Wh�����{_�I>B�q��r�������W\���e�<��ȳ�>[�50���s���>��0���/~�h���n�@ͱ+-�R p��oS�%�:ȟg���v�.��K�,�8��� z��̝��r�8G��M

Y2���L:��
UO���a)�>_����W�:�x��g�ڞ=�C0B�u�x|�1?$	
`!
|�Q�Y�lF�hIG��������G�/@9ftzI�|Jgc�m�Z��I�U7}�O4�`	�J���p0>�Ʃ��E�w�]��=�$�b5_0.K�u0���3����W
�
�w=��cV��jC�4@SAE���b�R�W@�E!���cZ�>���
R�u��E�6��p"�a�aU�ch�
�D��~�~���7(�U��'����}���+V�k�2����_�k���y�)�ݵ�p����'�X�8�!�"�T��/%����1~�ԋNW�j�\�[����f|
�w/6��H���C���8/�O�q�o����i�]�`�u�b�oW�����M���S�]�7�;���vo|?�ϰi�سk'‘�fh��7>X-zN,��ĕ� ����b)�_�,�5mɧ�N[��3�$�A���&c �����֟76�8�tn�Lhz8�q{�١4.�Yk~�b#aO!��� �9�5�e���MS�R�Վ���/Ggw7\�0��ur��O>�ݻv"���ߴ�H�V]ӹF��TA%Ơi:���Vz1h=Q8��}h���?œ�f��p�
�����䱟�=7�J�6�i�z6sv{V�Ba�k\EA�_����}=����j6���[��Ԧ!�|������h�b��rn?��O>�ݻ^A$�a�6n��`��9�ˆr������ @p�С���/�'�����y�-�Ưڅ�9�yt�]��](9+��
�)�Ur^�'��.:�n�J
����oς�e�P��pI�J�Q����{}�`�l�~��Zzf�)��8.��Rttv������I>Oo,j�"��ӿzzIz��
%/a`�,eR� �\�S �B<��������u��#�z8-�`<��������
�v���L��&��rV�o��@�
Q��m�9;�wށn��M`�?�{8ʰ*K�6#����Uj^n?�]@�sb��v�]�~�6�ڿQ��Xq��An��/���Zx��'�{�+�D�G��|�c~��\0@J�\'>w����=����Ç��746}��Үg?���޶dW�������#
����O	Ʊ��œ�I��`�'����/&_�?6���76�G�HT�m��H|8�y_@�n"*4xD����� J�c!/�@�W�o���a"�s]�W\���x�5?�Y�πg���k�h�ptݩd���|%��e�_�J' ��ma�+����0==�D<�"Q_�o�����f͚�+���SV�[4ڰ��盭���&���<��¯���K	�Ὴ}J!4"h�#&4�P��͛�<qm  Z-��p�n8�E_�
��0�*�#g-S@s,X҃�T��v��G��`�r����s�9�a@h���WO=�=��
&�F��x�8��bݺu1"�/��K�Q�\p{��;r/>�{v�
���ଳ����I�ɽ���/7��楉��=��	0�r)�lz{��s=���/`2I���s��R�9���s
�J�*
 ��p�n8&X_�D����")���tN��`ڑ"Z��*3!W��q\�w��h	:�Qd!�$�}{v#~�4 IDAT�!	�Ԧ��t��� �\!4��y���󎗫���)������B�B���K��BM������-�
Dq��"�.E�,ʺ$�!�+HUji�����~��9�y~<3sg枛�$��I�|�:��sOyN����y
-���X�L��}����۩��?�����_������h�����`�b���tl�:�=Q�gm�}��n�����p?� ����_�/Y��0�Q靏�+�,<��kR;5h�ִ�h�u`\Ӵ�V���Pc�D��A}v�����=Oغ�'��9�礝�2��;o�mmy�_!C�O<�'�|�U�55���U<��?��~�mۺ�{�����1t�2ٲyz�^zA5�no�x�칏�s�}ho����o�_;f|��h�c=vd�<��W}�y5���T�_�����+�
yf %����Bk����4tfi�����ݻ=S�:���7��3��G��tK��_��ٗ��/�=|`k�`Ň�ܴ�駞^��-�<��s���Ң��Y���x�7�x�X��h4�_$��R�Nд\���ݓ&˲p3.O?��<� [�n���qVk[��_���c���a��kj���{�m�"5��jٳ^�8��o�n��l}��<�¹�Ὲ�So��!���ՊKt�$����`�b����_߼�A���[�14��|�/Ϝ`�R`k:�Ɗ���J����4m���̚MSSs���gĩ����O���7����FW��9�� O
���� w�g�0�l��7p��ó�"��=��G/����7���K�='-�7?�i��9R�~n���+N[ӕ�'7����/�d^�Zä�0p��Ƒ��J�k��u���vu�7��P��DJU-��ύ)7�_"I>H����X�����%�\b���F�e����3�Ʀ&c�_�$_���<ͦ
��k�Dc+��/������n��|/ꄱ�2!�JVٶ��<��?r�=w�q�z�ft�u�կ~�O}�S��~!e@E3�К�{0�E�f~;��~T���x[�0�cI�eS}��PI%�ju];����5C��]�M`\׼��З��5���S01�/-tT�b���HYC}������͸tvuS��@�yƘ��ըre�b�8v,��R�����O�D#��y�-�Qh6�oE
;*�a`G"lܰ���k��ӟp2iZ��?��1��K.���̗�Ǩh�>9���i:���m�Q*���`�La�\���h�H丞n�=�N�;�J�ۚ����os^C��F�X:,%r|�O�b��+%�K��Ƞ��?�?��0������ё�қS}����j�/=�<[7o"�aۑU�X�cO�k��H���/���=��,��m��ǃ��uO<���388�_�+�sT48-��|4j̍ՌM��?Y����2�@J�I�i1� �km��Q�$E�#�r0J�i2�]
��ֵM��tXJ\!���1�_��WL�Bu(N��2���˭�����i-u]���VjjkU��~N���K/ѻm+�Xێ^��V�kO�|�K�8���'B�^����3��t��C7t�$��v��ڵk+��DE3W�{z"1,ƈ
����B-��o�&ˢN7�����,=��qZ�>��h��9;�u`�5��m֍�#B�/[l.��ˏKi#�;��&~]3Wۦ���dhjj&^S�T^
T\���.UǞ�ۈFc��������r��R`Y�wE��Z��
��1�XjCN�8�J!%�X��=����s6W*������v�� `�j_h��JL�h6mlM9>�wOc�LC���`��lb�Ѻ�1^����5��q�0�D�Ɇ�
�|"K�B�͆/S�_�7�e�����ڶ�e7C]C�X4��������7^{����D�1t�rJw��|
�=!
�;���+Y�m5^c|���F�[ZI&�#��:ʃ�g6�9!�7[L�N;J����O�7�
�5�6)!��5qR�aŒ" %�TMC,��D��5��iэ���`�I%YƜ|c�@ �4��l#!䊿)�����eFV�VdY&�����H$B D�k*�H��R�a���D1
s��дco��_��4�S=�S���닦��ٔ�P��\	� h�褦����k+��H�3���H�i�D��Xڏ�c�>�mϚ��ԛ&M�Ɉ�'�����4�,�}<!�*áiZ��
��ij[�bXgIɀ��E�I��x?D4�ZCG�4��(��X�Ց��,�q��bX��$]���_���7m`xh�H$�f�~{�oo)�x*
����DM�����{�($�����x���tvv��:��a�\ў�����#%3"q"���s�/���l���	R�jE��
$�O�%E��W�ej�).0�{Hd~��S:���|Wcǚ6�:{H��.	�/fJYbSI?�
�
5�0%���)3�G��5�����ec�f���ƒ'~	[7oftd�H$���+�����?��8��"��/_):���R�GJ���Pc�Y�/%Bb�8m��)ǹo_\��`�`���P��y�M�i�s�����>J`�hk�"*�W2N�?��刘����M�C"�d����7�yts��v�\:([]��@���1�=o�c�a�h��@"�W�sd�l�E���X͚X4�4�ɨ&���dS��ʊ��n#�H`�t]_�/ZtO-�sc��L��&�(�G�)�+��dU�	P� �?��\�}��[hlj"�H�m���8m�R�_0����ZF��M�;Jp�Kp�đ���B�I�'������n�b�>�L���0�Ok2LF�T��H	��E��v�	̷5w��0ͥCB�9�0�{��y�SX̳Ѵh��=H��Ŀ|�r먣�^�Ŗ:����b)W`"
�N��m`�w�qK��S��t�OJ)��/ED_�Y�@ݟ�(0��jA����A,���n���"m���_�9���ܯI[�DG$F ��^�I�/T�'��@
2R�fGh2Mz=��u#}ϗ��֍344�|�)5�@��h5}����εm���_�Ϥ�ݱ£4MT �h�lZL!�~��̑��]]Úh$�4�J��Z9�>��&%M�=�048��U�;).������ΉD�G�����>9M���"B
DP�)B�"�!d�S ��Z�`[6�]�H)�]�"�9� �q/���8G���Y�	���OJ\)pD���X)�8��]Mw��v|Z
���O�Y_5���_�E��4ͥ}��u'ɀ�biz�ѲE�r¡ӎ�fZ�HF�`ř#}e���VG�ѥ�d�uB`Y՟�+�$�d41��ؖ�r����[�5�J�9眣#�+44|�'�j	�3�[�u�u$��:뚡����ab�&�ibY&�ic��iaY�m��������xm����0Gw�y���ԵV
�6�鶡�QO�v	�h��hQC�L$v�� V�z�i������5&�m4����g$P)�RS���ifk,�f�<t@H��N��g�5=�\�֑�d�|w��ò	�$��>�W��˭���ձh|Y2��I�U{n]ϿЊ�Ǵ'�$�}L�B�����X{K��SɈ����b�����.Y=}��T����N��u�40L�01M#O��i��B�aS�
�i��@���g�}��Sv�~��޶-|gG�|	���H�_���n3�v����v3�1p;Ү�����~f���׌KZJ�K�5�/5��ѭCSR��(�='K�dkc�
���4#R0,������,���[W���e�d��h�s�
#k��1 ��u]���I ��k��w�)\t�E)���e3��b& ��h4JSsv�!	�@A)R�a��|)�I]��il3-��w3���4�Q�4���6�6���ж�����7`2��+Y#��$&���vZ�F��H��)�	����p����([][ו��2�BZI~��h
�v_HF|oE9���V뒎��x|Y2�`xx�L&�W�eֳ=�|_�$L����k֬�� ����q2����e^�%�ISs3�8���C�p��q�n*�Ɍ�b���o�y'��?P`w�`}�[��2*|��L֛��ٗ��4��#lq��?�`S��*J͉��cG�d8V�2\>�ѢE��ǟ����fi2�dp`�t:�i*�ײ�~L���ٞv\?�r͚ۧ
�w�y�]�����c.ܗˍ��h4FCc���Ηo���'�����0��D�=�Ͳ"�����f�I=�&�ٔI��M�	�1��c5̊�R2�+O�V�8�I'�����~i:�f{o/�d]Wc-�h2�OP7շO�	|��O��4�;�h���"�XO柡��Ɯ�O���������@��L�>/����LA4��D��%#̬_-�������:���`H���O>���u�
K�[�n!9��4M��Cf+)F�v�-��ɸ�~z�M+�?�ύEc�d\/���\(��Yb���hjj"�<�_5��ߗ���7̲uM?����|"YI�e5]��B�R�G��37��!�[yB���Vw��5���K��7m`dx˲�L*�裁��D�q��(RJ2�s�O��[�5��˗_�m��wA�n��ߘԧ(5)iii%�add����p�]S{�Ӛ�lv�R���>}^]�Ɯ{!Y@�:� �{a]=�"5dd���X<���q�Y�f����_�M�a�
aYv���LI�"���Z��8"�g�m����r�gA4*�F[��t6�G�ԗ���SSWGCc#�t:�R|n����1�}q�>��0��2�������K�&I�52?Z�'}��b�@�������s�444-K�R��k��%�e����jkU�ʌ㮺�'��R���/8���/����t3�L&�)�_9-O�n贵���q�̭�_�����}�i��v&�Ɩ��'�4�� 0&�T�O ��qL]�Fk�HAo�)+�/_���3g����������+��=�K���#��ini�����Ϊ[�[�5����wF�ȿ���[���M�s�A@kk�

$�~�u�0ŗ0%���=�f[7�Kʀ-�S�D�xROnbO���1uM�œ�~�[������k���ijjZ�J&y�//��w�a�_^!d^�!%�mm465�'�Yy�ӏ�?��5��躁�z%�nJv��  ���֊a�n沛o�y�_Ɣ`�j3��[�i��������2�!6�*�����Ց}���}[��ǻ޽���y���(/���[���������Bh�N{GM--�O*�Z���`Zy��=��Fˊ���H���d��_�M$��R�X{G��u��?|��o�/c�0m5����1L���\	���N�@'6�pT�O
�y������5��w�omKK��T*�s�>��͛1-S٬/qH!�1�ֶ6��R�iI��-2M3�&��q3d2���W"��?M�-455�N��B�;ŗ1������6f�����X���<����5
�"`�딝���Y��ں4�L��SO�y�FL�*JVA��e��̚E[GBHR�Ī��{ӎ��<��bg��C&��K��������㴶�c&����nxa��c*1-���3��1�{lʤU��|�%��lb͒�6�Zۀ+z]��2�����o���ֶ��d�����c剿 a%�R2{�\:����?y��[�5��	]x���x�<�uI;���|�I�1�?�3�4::;���$�����믝��jLKЬ�oo6-{��a���O�	xR���7�sL]��ٚqVٷ����������}i2���?���o��O���|$���O���  �H���~T���O��•7��5�\�I�e�4_YH����nF�{�R?�Ӓ��~��ƌC�|$2/��j���F� `K�Yqd��z�?rޅ���ۗ&	���C������]Ƥ6\����.`F�L�  �Yu���R���/X�h���•���񏹮G�qp3��*�(5@I��������'>�)��)Ǵc��5uN
�d��*�����;9��	Glθe'��/\����}Y"������^��Q�:ۻn��G0s�A����Ȫ믟~Ŀ|��Z��xM�<�ːN��8�
��@�/\4M#�L08�O$�0�˧���ӎ���:�^7g��.[]'�M�~Os��7�[�̊�6���/�h���e�d�ﻗ��J�8�zyc+)%G�e!͝��{'�W^�wo)�x��w�ys�j���b��d2��)2��ᗭ�7!��l���m$SI�j�O����wN��M%����q�ds�aD�/3���N�k"lr���n+'�c]���5�]����s��K��x�p���%��������\F�GV��u�M;o�\pZ4 ���q�$�I\'3��/�D/��~1�JK�t���(}�۱#�X�S}�S�i�"�lȆ�r�����M�D�FE�e
��X��5]]]K������~��/����� ΟKa]ṯ�;d>��180���=��ʋ?���-��I�H&*�?�-	)��E�����&�:��-�H&��5���O��wO�N�U&�[Z�
];6lʤ�}���l��O��w�ڎ�Υ����7w�_ �Qv)�� �>��q���7�P'������~��iE��{nK,�n$9O�p'��X��q���|�	��耮錎�лu+���HԾ��^�aZi�F��-�U��s��e0Ȫ��ͤ��
e&�X睷bmW����#�������L4-��.�ڿ�ē9����#CC��6��ժU��j�����}�D"���h��_N�x���<��,���q�����'^�O��g��}*0�4���Y�n�F&EJJ���	u�$}�M��ⰲ���]��՝]�KGF���?��LMM�*6"U��$�|t]��SN�#� �J�?8��o}�r����~�����+�e��a�RJ��d2c]|E��/d�;^D1��j#�Clټ��?3�����S�i�|	]Ӗ�2`C&�{[9���d��q.*��o���K>����k���0�X���}ZI�"�U�����O;�Ï<'��}������k<���/�dUCC��ڿaxp��㨒gy۾X��:�9��~’�r�i���_'1:Jcc��K/���^�kL
`yg�!��6�,�i`A�V��\th߆����%����{���0�\���}�x<(i�����D��z��_p'l�ݲ������5�J��_��ԭ/Y{	@2�$��I;��QA��Ҭ�Rɟ��i	���j��344��
�9r�B"���;��L�����gj[>�e�g;H��(�lr��n+�`���K>���k�2E�k��3cğC�ܘ�̚=��N8�0�}_ڦ�-^|b�C=�z��Ua��⋏?�m�}Ƕ�oF"у܌���#�øn&��,$tƪ�䉾��Ǜ㜅YM)�B�$I�f�P�P?cᢣ�=�����۳O1m��Ե|��0���Y���j�g/�����������gky�?��v�a048�__~]�inm�[ZZ7c�ɧ���ŋOz�^)�����N{�ێ��2�k���H��244H*�D�\5���#�1�:7K�J�*�B�3(�%h$	jjj�97��{�?�<ŷj�aZL��ACC�{jZ��iZ�)!��9++����+����6��{F��d�;~�3}�aU�'���ih����������&�̣���d2I2�x�s3?ھ}��o�����¹����-�Lc�a��ڶM.�/1:BaKs)��|�-��U�Rs>��#' a�/�z�K]}=�x�{���e��˾����jJn�>ƴ��^�~\O4�)WJ6y��e$~���:ʨ�o8ڴ�ņa`Z��c�f^��ɤ������
�6l��}���hni������E'�|��L�ٰu+���PRëIDATn\r�ߟp�q�K,��x<~�mG�}�ё��콑%��$���ư,'�FHU��� ��,"���%�0����7�����^x���q90-4�
�s��cٟ}�qV��ͽW��W�znSs�ͭ�M}������Y��ch��e���u��t=���|������a���چmY$	���K���u��y�W[�v��޺���K.����j��n�݆a,�D�����N�L&��8��g�9۾T�~��淴�2�g&�aп};۶n%�EӴ|g�&Z��$�~��v:�H��o��ޫ���<����D�2��s{���>�g>����~[{�)����SOr�=w�}�v�Ѩ�=_�0��z��_������ì�����E}C#�i�J&I&�[|�{\���'���=����d`o_���X[�4��c��]׎�Lk��N�!�L�H��J���4-w�9/�^���I������nG"��I����e�&FGF��cB'�ܹ�8���hhh����N�uV^y�{�>N5x�dss��G�?�o�/��i����/��5|������7�}���SO���4MG�����FJ� @�t�����kƌlY�zl;�������	!�|�e)Y�r��brݺuC�֭KO�"N9�ȬY�������j�L�v��i�Ƒ�iuD�@��\2N�T6g?�L�yn�Ѧ�������/9�@�#��ilim�{F�

��i2�s��:;�皚ڷ�v�dB�L۴a=#C�h���E>�_�]
�t�9��q��g����m[}�m?��K/���kP�8��T�_�rIKk˵-�mG�ϋ/<����7�x�4U�,t]/`㙀�i���@t]������fZ��ijn����x�۶�4�@܌��8��)��mkN�"�i8RQ�.%�ɨ�1��#"� ;uM�[�eY��R|&��I��,='���"��[)F!��c�~����̘�CKk+�m�H�<�L:�x��@n�O��?/�ؑK㱚S"��h�M�6����B�tt�(��c>'�f��Xrƙ�g���?_��u��pm�'B��e,^�8��|����O���Ɔ��X���<����m�ŲmLS�c�g� o��ϩ�H0-�X,Nm]������QS[K,ǎ�X��i�)pJ�Un��s�BD�>������q�,�;d��Tl��&���-g^�[��Ι;�X���.�;:���%�L�=��+����;�3T{��?�̶���kjN��(��#l\�&���*C�h���TL��䌳�o�v�m?�u�t��9T�>���--�W545�/��m�V�|�Q�=�C�yF01(�h�;��$Ĩa&�ebG"ؖ�>m�21C7��3��8���}_1���
�原�]�Ea��x��r��#�wv���E}C=A�J�~�N'>�
7<3�{���~vY̎}:^SsR$adx�7�x�W_y���tC��uҎ��*�U��q�W-klj������2ٲi�|�g�^�@_�mceU��e,w�xݎ��8�(�d����;�����no�F��Ȣo"D@4������NA�T2�t*�����u�w��3�9'��tMM݉�h���!^����������Yr�Y466���{�m?�eZ?T�T���7�Y�E.mjnY`�۶n���<ͺ'gdx#�?P�� ��3��fLs�o�#�.�Tъ���yO���D��~��
�i$�W���ֽ���+����]�<^�����H4Jׯg��������wۯ�����_����s�2�)��ŋ�˖}`e$��ښ����q��>~��_�F�!����e2If0�3��u���='�VY�A��GI׌ �q�|߿��_��_��׉2�b.��E��n�o\lG" a{_�=��u�]Ӗ���*�5����x���5ؖ5���~'�@	�i!��>�L ������DoTN�g�G-ZDW��#W=��CW=��	�,���?TW[��L������?L���q�gl;�<�de�4�&��e����.A�HM�1I�7hH�ڌ~�R�Djj_�]}��/?�". ��N��|�������ʗ�����UT@��s2�$�R�x&�]O�iRE���Ęd�Y�
�_fÉ��?�P����gPȌ(�6n�R��cY��i�}�;�d���*� ��-tc|����]�Һ̫�hZ�|FNPZ���ʪCSن��H��/�e��9�L�v@64�l��%)RCǴ,�kຩ=�mU�!��B 
� ��,L����P��6�,�,)A���=�\ϧ���C;�T2����f2��K�E3��\\_�����rL��W^�u3*�&Oᅾ�C(���)�@`Y:�i"�M.�m�bQe���m��c��i���T~;hY^˫�c�)�p�ɧ0o�|@%�~�M�
�@���6�W�@%̀F |,���C�D��r�>�w�"�ƜMzJ���=�qU���B�~�<aٶn�&L`��!e���1���8ǝpr��i��#v$�?�5���i�Cy
	�BJ�K)2�������xV,=k���ؼy[6nŽع!P�v<f)�u�2B�z,V��_�G�T�o�.�5�e[�i�vQ���ʪ���f���d�'c�d�W^��kr��z�5���V]]���n۶&�}}�y"�)��c�/~������Eo=�����n��x�'1� �
�L���W^9�nT2��B����Xf�6-kB�D�m/�
���3hmkcӆ
?���ߟܕc|ҎDN�1sf����!�mk������KB`��e�N������̻JĴ�P�J!I��m��aj)%�T��{,�q$Ã�N�����ؾ���&G�IG���U������-"d)��a�j����y�}�PE8��B�ꫯ��1d:�ٹ ������)KN�0L������k��|9�w�׿����_���s��'`���!��v��;�-��B,��2c*��၎*��[���m�0
l�FN���+q}�;�I{{۶ny��˿��r�q��'f4���62��"j)�����&0-�X�u��ܪtT@�u]�г`墓N��c��ȣ�b`���w�9��{�^�ytd�R!G��f��̚9u_��%�m�����r
n%��*��;���&�\ץ�����~�a088�}�k����կ�ҷ��9ᔷcXf���g�_T"��n߯�S�*� )G5M�*)�#䜅���tvv�u�g�Y��U{k��C}?880t�Cx�1Ǫ�A�)0�"��`�t]G F��8��9������k��i�8i�u�a�����ַq�£����ڵk��j}�5׬�H�p"�==d�t��o���<�q0LU�P׍�^�����*�H�7����%g�IϬYX�E�qp�i<�+
z�Kk{;K�8˲��׾��G��X�����m�뻻���S�8�0TT /�j
�8$�I<ץ�����^D��H!�F�[��X���D�
��:}��1g�̛7���(}��l޴�
o���M��'���qڙ��-�6=�����r���!�=����k�=���,��W���uu̘9���3�9���n���5��AӪ��UPA���/� �H=��/1M{�i�g���<�|�cxh�m[��q�z���+�����C��W�5r��7���W}���Ʀ�x�)��
2�4���e���t�����JM<�����a^�A�G����7u��ުtTK�U0.��Y��u�
�:�2��-�:����4M'�&����Y�~õ_��<U�[��������~l;BCc#���L$I%�|���?
��}w?�裏:S5�*�Qe�.���55u�ؑ��0�����;4<��_^xn��7�<�_���?��ú�g>���d%�L�Y�sp}��7^�ԏ~���)��*�Oq�Yg�O?���_}�U�M�x���e�x���o���77L�x����*����*����*����*����*����*����*����*����*����*|Tb*p����W0�꘹�t)`3��$�K���x?���o��Ï��'`6c�
���h�{
�g�(c
�3����)W��(�eX^�
��O|���7%ۼ�Ͳ}8ƽ�Y��s�rP��J������O-�1+a�lK{��8���
�_c�j��PT�0�
��׽p�aϼM�*�*��m/�r`ʊfT�|*�ކ���T�i��>�(;��e�w����G9Ʀ+>�Jֽ9�b�QI`"5�_��Lb�&�*�	�1QL��]݁�צzUT*����䶃��P��R�Wg'�Ъ�P���~Z��4�0x��(F�s™܅�#%����|:ʛ<Yye���SLl��0�C.�!��c���:#�k5ر�@G�H����[��IԽ����K���ڤ�]_���;���Q&f
�i�{����u�ʜ����e���4v_K��_(FP��P�����YH�����>���&���ߒ���F=�1�z�7�¤�Nr<��(S��:?ܳ�}>��D1kc��q�%�|��{�#�����mN~��_:�"��K��	\|e�s�uo�G]�D=�|`;��
�ov-�8x�����agO��1�;���Q�g��{�K����l�.d�]I��j�?,�fJJ�nr��za'z�)d��K�y:d����xQ��(Mfw��l��\n�1J
�p���BƸx`��&�'ˀ�L��N�x��J��)���j���a*�a�t�gQ�swA�oPRcw0���Di0�Q�=9W9��.�+��'I>���$�>������bR���v+Q��Is��jt Qjhڇ�ȡ\�g�Q�cM����4�����c��q��wk�/���f��⛌7�r8
��.k����(^�`��r�
�b�5��QR�g�y%Q� ���%d��(��&�T�w�u({�%}�B������&#�*E�݄?���T��tVQl&��{5H��Ӂ{~_�r���9�F�gƮ�5i��LZ�&{�R��K������|?�^n�`�{��E��J��c!ۜ��2d����B�����s��r܅]Ci�t2>��C�yo�6wNp��X��M�^	��C��Ez�v#@�N�ю򴗞#@�)ٙ�\�ba����@9wö��	�Op��0qmw��rcgm����8�p�`O0X��
������֣�����x����0`�9R�wL��()���ůP���|���>�b�#�[PL|��R�`"��D�׾�d�W��0J�,*�p8�p��Me>׮౐u
���/	Y�p�.�>T��'Q����(�٧�`�������{��C�mD�٧	�?K��X��ਐu�aף����I�ӹ#d�Ǚ;��]�^	��E$QN��z	��|��B�=Gx��r�4�%����{�z��S�0�cgx����6�9������e7εǘ`"U��h���!����!�&C�����p2*,8`Ob��E#��~wfI���S�#�0��}NI��J�Bs�Y�w%b4d�DY���0������
�F�מ���X��
���;�BL�d��&�NR�f�����\�r>*�f"�<U(%~P���%�0�rg��)1I�7G��`�Ď�}:�� ̡Y�Zwaj�D��vWPy��t����&J��8L
`���<ꕎ0�,�/#�����mF�v���ێ�Y=j��Za���\a�Ud=�����aX�/R&�%��K:�ff��ģBN��5j���І*�7�bl*q:��_	3)&*P3�8�M��kTj�ΰ��λ���r��!LR�#�0��{��I�7ÀÌ�s��^Jn���Ʊ�:t�Aµ�W�t��Iܩ�A�?�ܦL��{v���g�bLv��b-�1���3�Y��@fݨXs��x�9L��,����z��6���l�-��k�/s%+�c-&Ex�w&>-a��0��KQq���8OjQ9��p��.L����۝g.`���ϗ�<aǛ�m����XC��Pi�"Kv�_X݈w�k���4\)^$���rT:�������F�s:m�m6>�-,�tT���`w��aǡ����%�\�r�!¥�8�2��m��I�+K6��e�}��C�^�1
���M�oG���{���sTR ,�d�&W�Ě@�[ہ��;ky�Z���Q�+�B1��	v6j>x)&>�h
5G����fa�t~6�x�/�L��K��DU��
*=xW����i7Q]{/f�6�qL�~JT��#J��D��|�37�?��Q����NB�J��a*�!����*Z��$0ы��]���4{����K^��
��-���$cX�k21��K��-Qҧ��uP��]))�+��(H)�Q���5C��J���o0^�x���k�X¿�p-+l��	o3�4{Q��EI�/���ը>��X�bO�*
0V}�TU�2�~�M���p#{^-vG�&v^|qE��Y8�{��@��\2�rU�Q��YH��.�KC	��k(�3�c�Ns�L���F�K��0d��B���$���ⱟAI��w��ח�{�zο�lӽ��c�]�v�B-�Zv�M�!��'���\�R��|Ļ�
���[�p�i��(���|�]�d����'羪����a|y�B|6d�RU���mv��R�˼�c.��߉R�����T��Uf+���:d?
�I���7�2�b�a�r����}}%NPx/p���Y��Rh�u�y���qt���E��NƢ����(	R�P����(f3�66�RuA9*w�x{�Q���<�R�s�&�n-l
�Uv�1�U�x�s�YW�T�އK��Du]z�v��3ε�z
5�x�!��P%�EEr��?��C�K�cmϮ��D����1��]�<����g�s�	�?Q���4���񥊽�kA�4��	RS�J�LW�M��2!(�܋)E%9�+*��b�����b����b����b���-��~�*طK[�>�*�U��f��2����R޺�UTQEUTQEUTQEUT���"w-Ļ
�IEND�B`�assets/img/dropbox-64.png000064400000013057151336065400011245 0ustar00�PNG


IHDR00W��tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5.1 Windows" xmpMM:InstanceID="xmp.iid:759F4053E2FA11E49838FEC0155B9602" xmpMM:DocumentID="xmp.did:759F4054E2FA11E49838FEC0155B9602"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:759F4051E2FA11E49838FEC0155B9602" stRef:documentID="xmp.did:759F4052E2FA11E49838FEC0155B9602"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>gbV��IDATxڴY	xU�>���ӝ���;	��D@�y8�(����"�T��O�A����Y������}�v1 ����tU�s�{��T��f߰a�}�������#�
/�ճw�@S��f���v����(��nr7��7�o�蠫��۞	E�&0Y�w$îxP�`�vR�������Vc6[�	Ѓ����&#A.�A
Ȫl&2K�}��&�5����O*�5)U�OW8}�O�A�4�5_7��Lfm����具T�rI��Zv��3򹊺�����r�m�b��w� zjtt����&w#h�f����C<�v��@��If���@Iy�
�@V�	?���խ�)U#�L��j�v0r*�3ӟ���uk@q�3y��$*���5��ʎl�,��ܩ�Y�Ŕ�mj|$-*ӑ-��MAj���'��#��z��"�O�$�*u�z��3�ud��t1�I�#��-ޑ�D�m{�/#��1C�A&@ xj�=��aWveѱWG�pq9�3��{�?�mI��
��l:Y#'�ҋ?^X�����L�sB	������n�sN͹�23�{�s��O��vt�#/-\Z
�]�f#���.����Or|ᶌ��I#B"&��O7
%6�
" �	�>SD֟(jxmB��o��묝��Qv�u=$=��i�0'���S�|��D!$��R��(�-�L"��'���FnKF!T�enz.eՔ���vf�#�Ii��6
������f�G�Rv���w�L�7*���@�X	*d"�)��*)�/V�;;�MI��K��|Tg0��0O�犎z�2�_��|d�%��?�^�`���y�����d�-f�-(��N�ш_-����OQq��S� :T�`WA)��VC[������Ex��q���᠔I�2���;G@�hAY=Y�}D;I�.��<O������s��\'O�D5N
B�����#eG���)%mk� �3��OWt���ߚ��%����h�F+}l|��(�졠
�H:5�9��_�4��ᩣG�aAל�P�'h#�v����ۭ+	��ДP-Ϋu��9(%�]�pg�� ߱SR�l
����b\�7P&;g 8<A�@�V�Q)�(:�[��(��v��<qL"W���YQX���
�{�6jO�nM��LKƅ�Q�-�q�n��9���wvú��p�b�%!%ZH��A�I��wk8�fz8����T����?S�'��|O�YE�o��ƅy%E��B����Ǜ3N@"&$5 ��
*D/�F1A�,�\��
���o�/O��Ѳ�s���V{zz��DP^"%&�����nX��G
䫆H�Pk�3�&�7�wP�݈g��b�A��
a��0�l�����L_�?p�t���T*�s�,^�p����`	��I��L�Е�G��0�KV�z��~����L�œ�9m�y�{$1��қ���R�޺�MW�Q��:(�-�X�?/'�h��U	vm�̈�,�O�'"�����6G��x��p����a鶳M�3���C?�=��|����&J����'�P)d��֍��u�U��9�K�*��
.u��|�0�����kux�݋8@-��^\$�z)�XX��H�*ԯ��58������7G/�}<nVO��?3SF�}���©�
Tf����7/�<,>2��XLV��Q{��G"3`2<	q�
�2m���+Q�-F�n�0���%,3��h��f(i���U��,��I������	o�ɁҚ��?6�Y�����B�}}�
T⛜r�ڠ�R�S��G��y�N��ZL�ٌ�����/�K����v�q7z����w���uZ�|�Z�]*\l�x?�*t��zW�����lZ����z��h?2&̓ޒ�8WJ�r�ô!�o��~�j6�z|�H���N�X��1�\E��³ ^w����$�2W��P�b���!��>�w�db��ʒ5��J�S��$)ڗޖ��V~W��
��5�j]0w\�)!�5Ğ��_w�; �� ��m�P�l��������!^}~FD�����{C(���`+w���ҫ"�W@qe�
�679r!�-n� �b��W��=ژ,�AјP~s��]J@"B}�A���zn��.j����T?��v�ׄ��]�?�ۄ��FP�ʉ�-�'3Bd�%��{��z@.aM�™*#�1؉aJ�
���?f�hW�'/O
��گ�)��<��s��,���l��KlM��T��0�艣(V��k��&����6E+��`xc2��ɖ�N��W`�x^�j��%�P���C�V�a�A�����>ܝ=V˾���tu� #��!���h���
���ƃE�~�j�d���C�)���
L�Bgѕ��)xGMw����H	�#��5��)�v�C�~��n+�j��H5�LO��c9�D��vN���`2a��|؟U��tb�Qn92l��C)�v_29Y�QnN�G{Vf�w}0c�HELD�!�4��i�Hy��)EG.�[��ӂ�w��q��=���56v��:+8������x`a+qAV��?W9o�k�$�\H��J���υӽ�bu��K���b���3�!��+�s6��Y�Fq~ޞ�b1Gw$v��:%�
�¸*�0C/Z��#ՎDg�؀���֨�b!x�\�ƕG�>�ڒ�|�}2nr�/��9���?�S�Zs���6��Ҥ�L��=�+���	#��B��A�|�e��h�!�m'j��\���o�}<⽤�W�N��6�"�-5B/>\f/2��Î
���P8�5@mQ�%������+b#\���}���uشq)6Q&'V���:n��u+\��gf`���,`@�V�Yn�^:�۫�H�9�0����꿄����3�_X-���]ୟ.��'/Xܘ�k
*ij�	vU�F��H0pr�9F�A`�}��0T�w�lvjp��O�J�` V�#��Lr�d�ge�[�#����=�t�ǖ�<l�D7��ֽGzr��	�r"���v*;3rp8; 9+��yy�]�F�5�G�����r�F1�[vӁ=��K�\*��^�i.Y�9�zi�vѻ
yD0�m�N��2%>�e������ŕ��c��Ӄ�͂����S�V���7�莱�1�Ą��j��db��R��a�+��u����c��=�_N��u=�m�5+��^Q,��[}���N��B!T*wZ����+��%i�B���"A��kdg��ړ�s$�-p�0�:(6������l`7��r+�ذgllv�ٌU��Sr b_�PH�()�"O[Z��cp�Tw��x��Ϥ�8Ӥ�&y{����ւ�u����
�1�-��pΚI����N�A�K�j���QB�}�̆�P�
�\D��N��k�Xő8��Ed��=\D���>R{~Q�̃<�V§�s�C��/�.�Y�VclʼZ	��%��[�i+��ǛkH�踉Dr2�a�/���	��VlnZ,��>���B4ƅ�Z�OPb_���8���ȡ��;up�be�F���:��K���:�衬}���'�M��e�<���
�OLu'[�M.A��/���xe<(!õ�=�Y��de%7�C^*���STkߜ�rFy����*���ȉdo��X��44m���hy����9��n2�m­���
�*N�����f���9y�U�M����!�
9���^50+��l6�x/@o��z��a�؆���F)�[,������A��d���������VU���{Qw���A1Ȋ����8�S��xa֠<g���^�-G��&$s
�Gv[9��+~�Ja�R��T���m���'"ϐ�`'tV�(g'<����w��zsQ�N���:�\�v�H<wFrQ���
d��sp�B��w�B��T��(?���ߴ��&����2��(��{0bպ�&����|�W�H�w��&�T�����P.yi�/��}��8�d�X��'kB@�h��7��g+�B]�-.T-��}��C:���q����oW'�uf"�7׿F1nU�X'fU�}O`%�R�v���^�����j��s/��Y3�$i���F�����+��X�k{B^�}qe��<�b�P��P����jv|���7���xA-hW���r�"��5�O	p��ߧ����ej'J2�ϟ�
.��ݸ��h� 1��:f���ei��>Q��l��_����:�+l�Rb���Tp_g=l^=3~�Tm�e�C
m&�gϾ#��
���]CI����Vz_���,�u��Xa����8���`�η�)h{k39�Su�Y��[9&�w���V�TYȳ��we�]�6m\��m��d?R
Wz
�7g�Vk$��e3�a�o���F3�{Iqq1de_�?��IX��p��\Y�MH&Z�����Cn_e_�v�Z�Z��ȥ��5��S�����;��2�o���7�!�</RG�!c��a���R�_!�e
:�[f��N�xv���c��k���ya���.��-)y�=�yO���h����*�Y�ظH���:Ů���^��K�}]��{���a4��7uR��z�[B���`�s�/��tnIEND�B`�assets/img/index.php000064400000000016151336065400010442 0ustar00<?php
//silentassets/img/logo-dpro-300x50.png000064400000034241151336065400012076 0ustar00�PNG


IHDR^K8G�	pHYs.#.#x�?vtIME�	:TcgY IDATx��wx����sg�5�r�XXڕl�!�`��!��LK5t		���B
B���L
���Cc[H��E�eɒV�>3�|�J�V+K�b�d~ϳ��)�ޙ�y��s�=���������������������������������������J���B�ܻMO��I�/Y�vu��2~��n���)��5+7w{-,,,��aލcv�ѐ�e����1�6���먍��unb��S�FË*#m�p"��h���0N/n[�>�m�����ᯂg}�6�X��税�Cw?'g��O�v���1���Z�AK@��!W(�9#FϝQ��C,ᵰ���Dw1iآ�	��'	��m��wɩ����ҵ{�í��<$� ���Hz�`ww�-,,,��a�8s�A%�S��I���l��d:G�8aC<r�G�-p��D�t�2�7����.����X>r��	P��H��=�@u,��q�ѓ>O� @@v!���&1���$�H��v[XXX'�*�D�O
ƺ�lBu��1T��P��I�U@%BDh54�H�@C2 �%X��v[XXX'r5l=������1�t��f���$0V`
T!R6`�t��@�a�E�hГh7t�I@!�͠���4;&%`�9r��Qi����Ů&�p���%6$ï�G#�>�v�N����T�I�1U�'���ƨ��m<���A 0C����H@%����Y"fK�8KH6�g��9(��������< ֯O�M����N���c��bh/�ژ�!�O�a7��7<���z<
9?�?iH�Ф� T�����0w��ķ��zhQ&8�9��#
�I1C�l��)�Dm�I@���
��1����p\i_S�q_�馛F�|�͛~�,,,,O��w��1�;V}��8iM"���ȴbB�8��v����d@���#TX(�%h�SQ_q@��(n����&�[}<}��-Γ"��?�DŽ�䑡D<�2҆�zB�����B��抍��8ˌL��}��lد���~��m�ٹh@�>�z��p���K�u�;�>2��Nh�p"`^WW4���Krs==7�p�Y

ѝ2�v��	�6ſ3ui��q�-E"(dF+l�h44�m*
U�Q�P��xl�-��o}TS��K}��N.q�O��Sk/�"�
H��x{�sl�e>�3~W<t�b�?���o�8�%�#�AI	 `�
o�[j�+n��_�`L�z��.��^���7�WҶ-p�.h�N�Q��`�p�R��xF�&�_~�Ux����e;�d��Slw�;���&c�I�A���P��� -�q�~
V
���+7��a|���V"��`��_��^ߟ|�k��'�yO���Z����c�5�h[��?�s<9����>���p;�Ń,�
`D�m��cƢ�0۰�r�#t�&(�
��<�����Čă�*a�
*'���?O��~kh���r��j��f�˦>���AMY�� �H����(1����C!�|3z�u����l�q\^v��>�__{N��yђ��Z�r����w8��wo���n�>���A6=�x�2�eWH��ӿ�a�̳�ԋ�vz+vvi?3�Čm,g���}�3#�>�&��+K0ݶ��s��Ǟg�=�ސ��)+�C|	�TTU�2�|�[7.ʆ�=�[џ|����9y#1��ڿ��e:��EKN�Y���G��b��1v��wXu1zZ1C�O`vE����~X������jH�����!�/�����(��D�P��<��휫~��@1�aM�E�p���d<�f �vH�c1�c��C��/GM�ck"v�íD��/�8����2���z��گk��J[[��L
�5�V��e�FH�V�i�9`v�K�`L/��F��}��Hs���5g�[�GB`�ubTaC���?U){q%	��K,�#!��"��'$� a���a���D���>�r︔P�`+Tm�	�!�~�1��l�g#�?��V��AD�ߟ�B�癱���t�C�<~ʷk�,\��sj�֭(.��F���{��c�P������~��
�}~�������4�2o�o��uډ�����Hˏ�-�y_�����`�Q���;q~8�n(�+�Zx�]8�BH혭���QH`=I���ۇVt?,��.����1{z�ȱ�N���ٙ^�w�}�)�6<�֛o��mm���EIi)|^�Cٮ�|�m�!���i��0ݮ��Y�"2��
�}���|V������@ �����[�y֛��_�séD-���5�!�g��0��~�O��`�p6�>_��-[b}�Y	����MZ��F-�P�bL?�ӲqH-ʿ�zLH>}2"���G�/,ݲ�L�{��w�Ը����>�D
����ͅ�`̘�p;��
e�R�ѿ�_���N�Kl�r��z�j!o0�������f([W���׏2#��*�&���8'sp�k����]	�H�n�I0{���@e���pBv�E��-�����grK�~�����tG��֙0]T�0]W›��2oP�e�&�p/@ U��߃;m���(/0%»���7ü1B�t���%����l�0��������u�|a��.�����Y�	T�|�EH*`�C�����M*��%-��x����
�6 K��Y�E)�
�U1�͛�1�F��jnѣn�[

D�T���>;�a]Fѽ��[~����\ͪ�j4Ai �X4�͛7ß�S?nܨe��[>�Z֕	�t�Up_�c�=Cf_L�m�~��܏��9��ޏ�E|���ӎ̿Gf;
�pu�]����?S�?�#ߤ��Q���'{�m�|9���=��_`-�;<��yc�
�$���G�
�����N��}��.t�~ϥ��	��0�c;���6;I�x4�y�r�yU�wD��`�ٍ�L`��I�T U`/�`~�w,��?	�o8ӣu�E���1�	��tiR�cR���vC?�AKB%�G�X��f ����GrqA���q6;�а��L�{�םio~��u�h$�ɓ� ,GUe��Ξ=;r�w9n���RR�ˮDrs�ŴX��O>����oo�k���Sx����0Ũ�-�&��kh��eQ^:#�椁�aN�Ȇ�kiG���kHS��9��®�
���]	�af��k��Q�V�Ž3
�;&���]�fE꒻GZR�n����Xb#�G��r� ���`�<��q��V��3w�kf�����ۡ~�?�/����2kᝦz��c״����t�d^J��6"�1ƝG��
�<����T��D�|q�4՟�I�.��c�[l�hcǏGQѨ
E��������aW�w@O$�Z���m�lv;E��	Q4z��E_�}J/ۇ��0�����n"������Q�����ah�#ر�nCﮉ�i7ŒH鋎�m�h��aZ����߈�=��H�����y�]t;fpn��2�a������3X
�޴�*���D׀yo:=����E'�b7E� ���k/�͝`3�����=�™�(˘naIčSB��s�Ѫ�"_�qG�D�3#���0�+�h���Ѐ)�:R!n$���S~���^�|p],�/�!xU6�–�"fST���@���g��m���+��qv��BU ���ZY.��y˙�ex���`��PȖL$0r�(������PFz=����i�/�K��>*�ۛE�-�X,]�0r�H\u�/efA�Ss�n�98�.d�J�L��`�{[�](f��07��v�
��A*1t S�J�/��^���!]@~�=җE�0��i0��'��S�%Lk8=^|)L�N����ŕ��NO�:��N������n��0��t6�칼�:�����Q0Ɇ�_� %Z:�p�_!oKJ@��1�/@�w`�_.E�����o��"�%5��e��:M�}N2/H�=_����v��q$�n�
�N���~'>��=�����Cx[��!
�\�b��MM�$:�T�P�-:0ʦ��+;���t^�١1��@��|��P��D����;���㱘M7�����5̹�6�p�ͣ\n�T{���`������;������������맿��{��v� �.�;se�L���?�]��̮�?�S|�p��
�<�
f���(WCv�ɾ�)p�����Y�l�L�C;���)�]1`�`������iׁ=/�3a�r;81C�`��V]��"�_�"����b�nAx���A4�|�9]]m��g�("�I�.`Z���7�����N]��G�h3]��.��]7ьsg�>t1zZ�no�Hq�h�qHL�>
"D�L�P��R6���m��vwy��p�7��Q��=j�h�q��ǃ��lRJ��~��I6����5��['TU�ZZBG�B�p:]�����p�`f�47�����k���]=%�?���!���\��Y��݁�fTCW��9p�i�����c3l{;ݮ|
��ۏI��4�1��0�n�0 �bw��v¼h�� )eH��:h������1@�a�~�9��7 l8�+���Kq����l�sn4ڤ�/�FǗc��g�;?�k�C��x���
]iw}��A�7N"DkT���7wۃe��E.4f$u
k��K#�g,�0hq�)�gw�9��np��H&q�y�G;�xHoQ}�x��m����r�@�b1� 5g.���P��~�w���֥���waZz]S�M���l��wP���fڮ"ݚ�<{e�t�e,��B�}���wD����%�5�z�M�̘��7�Ѿ�%s�1�M�R���w@�D����nNp�P���;�,�>#�Uo��}m�
⠬������<y�݊�;��C��]��r�=�6m��m��ozU�}��уkba$��p����_�nXE��L_�%�>$�N�Q�.y5�vz&�=��s8�Krrr��B�B�
��>gѢ���	%n躳����w�[�~÷SC��nG4��Q��Di0��7�͙'��~0�2Td�.;⾳h�i��e�C'�2l���������R���j<�?�@�n�-0�ۺ������]�>������B(�]��sfo:���w��eu�
����@0�1�v�f��۾κ��TS�r�ys5Sa�}�EF�p}͗����E?�+�uk�ќ�4S`�$@�6�+�A<��?�ҩ�h`�&bX
/y3��It�:��x���EE��B4MCCÖ��hd�ҥKW��z�H,�|���o<SӒB�fSQ^>%�%�ƌ����3���A�F戂];��t��T:N~�F^�mC�pw�����䠧%� 4������7�Օ�q��|�۹�1���%�F)�;#z�K�ݮ�f��1'vxw	@�"��P ��q�C���vH�][�m�͸��1��K~ku,l�A�6���6��[!���]Z�˅�1Ŋh��ǣ�/� ��~Աy�yK�O�PU���7n��E�z��z�.���P� ���c�'LDYY��s�#μ��u�l�-4k ܮ"S�g�R\:3l�{3���?��vn�H��^���2��:���5d�.�����e���|�n��t�^u�&�:�u�e��Y}�uҶ�Y*��ަ��[v�{��.+�����`y8���dl����ٳg�����ԩ�9"�0�Y�zcssۜ>x'����?�	$��	��A�݁X4��/�ݥ�����Dj(�黒�r�dzZ�"��o��]`h�gr��I����ט���d���K6䫧�Z{}�Ьn��)�g(�@Y��>�Wc1B3�!/'���������w��@g�!���_����2��|LAA��%%�˅P(�ʊ���榹�~�i��UB���G�}ְ�e�Rv�LS^�*�w�.p����
3�5���ve<��M��
={y6�/�l�e�gy����D�3�懛�UmH�zW�T�9K+;�-�nbPV��)�D�5�3�٭�q�����w��I0�ţXn{�";�����ST4�@���мm>�����s�������L$ �� ���{���������8
zΚ20t�Uf�.�3=ڇa�:��L�m�wG�P;�{��ߟs�2[9��4�y��wjUB]�c:��9�xB�n�E	@2g�v���f������#N�}A����n/40��1|m{ik2z��r�x��)�BY�L�?'--�����TW�vn�����*
�!�s����7��%=_JN|7B�
�3�eC7�ɟ�)�!2M���]`�}G�J+zF� �k�tN+̘k�Nx}W�M-�>y��R��w<�S�Hd7�է�
a?�N��f �}������F����s�r��W��^��t!Ɍ�d+#����So�`�r�!G�*z��|�ӟ�G�mx��77����[_�6�騗^z�R�4�WQT����z�t~�=���VN=ç��}�]�^�9M��
�ɔouz_ţ?d
����3�&&��x�CDzM[9=-�o0t������o`��ʳ��;��/�e�F�9n$9��^E(<~����>�!����6�p	'�U�����d�gcGqo�?�ɽw��u���@�Q-��Xt�D���,��?|n��Q/��\�۶5������vNSSӀ��l��H�0
�4 �@SS#��.���w>x�=�d��$#`�g����q�b��ㄙ	�?�"����}��̩EOKԍ�3�K&�͔��7���Ե�f*��x'öK�=FzG�\�$���y�����E���Ř�"1�yw�)�-�I��D�+c8�Ɨg%Z��]d����5h�ϫB-g}jD�����WT�U����"�1)���{�:\W��

����D��x4t�-aΜysF��˴��]n��-���o��_37

8��wBq�Ԅ�x"��U+k���h��Gy<}Ze6\s����|�K�?��
g�R�G2%k�4=�70��E ö���}M�����t��Ye	�f�~�{9~en��Օ�0���L!n鬃9�$���0�5f�E��3o��>��md�]���唶�I���S!n�`�MZ��Ɏ��%΂�%���=$N�t�M�`�?gۖn~��Q�
H1�����Qh�$�B��@��"WQ����һ�Zn�=~E\��`	���Wl��S.�`���s<���Əw9v����O?ټ�~��M�f�v`�1@砠
�����߮-�1s������C���|�ن����$zϟ�=���/����[����e(�/��`�����v��&�̾�)A�G��[$w�\E#=q�%0_f_��v��l� �+4<Sx��i�v �f�
�l��0�u�g��T_��0u��K�T�`�����n�/ԮL�i��sɨ
0]Ov����a�2��bh3�נ���w;Bc�l�˩��|��?'�.H�1q��*�y1�d�sݠ�KudBk��N
���v����;���S_mނ$3�$Ro	�P��-ǣ.��plY���7�۬�wF�� ��MJ�	9B�I�^���>���I'�v���K��"����F������Դu��u�Wdu%��~dR�Ҧ��v;�lق5/��x�S�N���[��-[�P���fo/��a&��0þ�:����R���D��=�+�4IDAT���ɚ�!s�L|Sx�ճg�~�L`�C�A�[`����dRa��:RK7�|�I��j��)���̃���
;?����5���7��|��a�3���'����ӒD`��X�^"h�Q�}*6e���
�Z�b��ć#U�%*H0t��UT䨶�kk�b�`	���O����w;��n�t$���ڥ|5*8�
��t�Yg��{_��/p!�H�QW�����ֹ�݋.�<�����9E��4}���PU�a���]�s?�AQ_#�i��s�]ɾ��]
ӂ,�`�a��
���)_l����߀)�g���ҵ�0̔�C�2dލ0�����&�s@��^��/o�Ulΰ�?�{0�@Ǫ���
[8�����wF����_
ȶ�����>�ԧ=��3_��~H����3­���=Zhs�c�݅vfD���!1�v��{����Z� |V4�N����,Q��H�^���OAMK��?>�H�����q33t]Æ��B��~�a�م�A&�	!T�0�)��RB�u$�b�(|>?
G��{�}�cK0�Q�(L+n	��YHͮ��o�dl_`2����`���'��R���=2��:C!��,�=` -�y=�еÓ��.�1|�`�[����ȯa�`���͓~�q�k�}f/������L#yL�ӛ�lx��Yt$���a^[��z�o���[�M�13�|����6\D����x��$0M	�oG
�o}��ό�~<��hh���C[��{u�0t)�I�i?F8={����ƾ�Ԓ��v�����k�[��QHS.�P^ks����i�����av;��47�Z��}��׳���K.�$?�˚d"Q�ŠiD���0�i��$&L��i�����?;��E���6�S�iym�����w����Lb��wؕ��������;o���•@�	"��}��J�+2b�u�^:����́��ߚ
�0��z��G:*L��x�n7L߻���X��[�B��1(���wK5?�4�6�Q]�ψ6g�

�WF�r%Z��QUn��2�:?���/��N`�$�ǐ6��$(6Z��\����h��D���7�y�D���Q��$�Q�c†aܿ�f��c�#!��MZSD��i�S��J]^8T��<'�tPѽ��k��
mi,��|�m��x��]�4�jUU��$t]G^~>rrr�*�R�(�f����W����ڢmٌ�nî��a���4�w6}w���oB���J+v�̮Fd?�D���Z��ߟ�cP��;�B���Ǚ˴o�����Z[���=�z�<�Ob����H�	kI$����sm�:3=~�l�7rm���7��_��W����K�mm�D2	��]Ӷ�<��^�r�.�.ݝ��"��08�N�|�
cF�s�5��j����W����� +���[�q$����D
3=>��o���'gH�~�
7��t��o[[�n7TնP�~�'��EW��G�٣%�0tp9wX�kaa�]!;ᝲ��v=ت' �H���b���˦e��o��0Mז�_���������ۨ*���c
��^p��w(��p������f�}5q�dž������&8vH\��R"j8����ޜ7m���It����#ѥ5�Vz�nE^~>
G6:�y,���]p�E_����t]�P���<n�O/��l�,,,,����7��ۘ�!�М(��5�NL��֍�{rv8��g�~�[�~F��	&6:<�yw�y琮{�E����p$��i�
��BQ��[o�u@qv�d����{,,,v@����Yί�n^�b��I���a�܂��z�	b�g=D��'��]�y�+o���oS}=�ee�c������o��
�\r�e����E"a$qH�0t�d�&O�����n��׋���F�猨��5˧��Q�6]ׯZ�re�����t��(Pe*�W��2�(�Mö�{�j�q.�J)�����r�ʕU��dMii�Q�B�ZU��IH3f̘(��%�z�Rꋫ��?l[����U�>�ʪ��>:3���Ku=�\mm�����-V�UKL����>��xN��=Ew�����W�,~޷��5�s����5�s�]uեC&�]}u����hokER� ��4�CJl�����ŋ�pꩧ~'2��h�9��bX�+`ξ����=Db=,��V� �$)�����z=��2}�tO2�/B|-�����	!XJ)t]�`0"*�ٳޡ��~�B#��T�)%)
�0�;����UUU��	N&����8����{<ɧ� �m�E���A��^��DZ��G��.<d���<��㾺�Z��p�1?h������3d��W^y��ZB�U�I��V��i0R��Rb��M(*5sæ��`���N����P"$��*	�)//߷����ѡ��8�􊊊�;*/�q���)ej��QS]]�(--����ݥ�Y]�M+WV�f���^R��@TJ�~UUU=(��J*+W\������O0�V]]�$��!�1k�Z��f�r�ñ�	��*++�3*A�}��ɓ��y<��l6��˗/�{!"PYQQ��\�}�l_��B؎e֗WUU}9}��R�M�#%��M��UUU���%%�*�`fAD��t ؿ�����]�����"�����Pyyy��t�>!1��� ��I�%��e��ph���C�}��4CQ>���xQU�#��Ï?9ws����w�����\�f��i�Pq�Ͼ������?��/O����-Kj�g���&mkjB2�4?�4M3�7�j����Y�֖��/^ܟ�~�F>��^f�,�<;�q�d�`O 0���
�����Y��u"�2�E�;�4E��`��Y�f9��w��dBJ�x����  �Y�A;���@ �3(Z0ܓO	�S؉���`�q(--�D
�3�`pX P��	&�h�ZPr���*�x���[�|y�B�̽��%R8��3Bp���񲲲�UU��L~f։�n�x6�	�@�5B�eH��� bi^�����uK���W3s^0�SJ^D��̆�l�RJ�Yљ�aN���n���O���]3zR���B$2{KOKXJU��<y�cS}=��>�u��tЭ�&M��w����]�q�?�я~�6����/���ufBK�iim?�0��H�p�t)�:\n7Ǝ�X,�͛6!�BJ�d2�D"��k�a�Y��hjj9��N[X%%%�0&//�M��/G"�Ϙ1cĊ+�%����
��θFQ�W���?��x筊��Ιy�a�E������u���m����\�:0eʔW].��B�d��bcee�;�M�^�LU�ut����-*��y���tw"�XY���=(�����3),{����P!�@f^RUU�٫w�|�3����`0��H$2�c��ՙ,|B/+�af�-":���^�b�=%%%ER�$�]���r.//�LJqEyy�����VUUݱ����k�;;��EMן���R�Jf�m��OoK ��F#��]����{��%���J�Of������^{��:����c�=�}���X�~�lٌ7^
#<ӊw?aҤI'x��hmݍu7���:EH(�
�И%麞���8M�'�Y��X��!�ގX,f�aPcƌ�����yo��Kss�.lܺ�]S�
��-�5�;��yO�á�$���B�g�Ҳe�����@�]����r���8s�̽��s�����see�g��H�=���f�Y�>}�(U��%b���0$)JR2�n=ښ���� B�Piv��c���Tr��-0f�,'	��aM3#�(0^�U�}R"Bē��B�6f����:����QEQ���+p���f������@��(��>��ʮ�9967��k8�ڮ�TU�������hf�#�[;���ʁ�z��KxK�7�+'�9����/.=sʔ)7,_�e��{---hooGŊ�Y�~��]P0bFn^�����UUAD`��
=e�&�%�`0����QXX���|��=iW�[����Mp�}�=�_Ppea�ȳk��q�DY��������YXd��;�@�ϻl�3�z��૯��7�����C�qw ���(��4}4CH�����|���a�0� q�}IbEQ�a膮뽺߄�cYD�?���Bȓ
��:��)��a�#��yR�㘈TE��~0�1��MtSإ�_*��@�R
"�WVVUw6�M��}��;�l�2#(���W�l��1K�."�'�T��6$q��kO=鄅/���˻M��±c��z�]w���(<7�4�D�L&�ukE��a��f�ͦBQT��
��!:��́���'`���o:l꯯���n�u~y�U5.z�';n�R�QKt-v�`�x�0㟀�BYM$'���VYY�i���pee�{�@�D@��L��V���)�
C�AD�������>mڴ1��&�0��t7�:� ����>i�򭵵�V"��ȴ��*�\QQ�L��2-�\WWW�cZ~ ��
�e�$��3jkk{Dk����Q�S�넙��c5s�/"��jf����H�dZ�Z"f%Bd�_|q��)m�n���S�/Ö/�����q�]��n4-�H$�h4�x<�h4
M��r�"sP�0@D�u���F��>�pv�^_�}�ە�.�I�U�_v��?��]��3�
��ꊗ���o�T,e�g�JDr���u]�	�L��m̜.>vN)%ܭ���r.3m[�RU��qMyyyok����*s0=����H��nw^�i�B0˜�ꊗ��v�}IIII��`fb��3���* ��[0ܯ�1�p�j"����ϘرO�(3�Re�<�䴴܀����v^�6��iZ�������B"a��������4M0g���mZq]kK��0���ᰇt]�����P+l���ǀ�i�,�x�9霅Ev�r3��*�L���w���%%%SW�Z�Mj3e��hf�3g"rr�����v��4��e6]�iӦ}U[�zs0X�$ [�H�l���3ʂ��)��[JY@�W��+>��IIו���Iil1I�"�])��1
����`��`�� `�>M��n���d;L�V������ʕU
�ۄ�?���\�jժ�d�D�@���(.%kPUU�~��������3��Y&��į��*�eee��rAYY�:f�Q$�ܚ��	!n.++�ƌ�f�R6�͊"�""�R��������'�k��5t-�]xUU����՘�mx0��o�w~z��?������:���|�	'�?�ǧΉ�⏾���p8 2�5
�\�ùt��E�D�ѵ6�-}�ˮ��f;W���TVZ"�tP�9���V�|�r}���!����{�L������K�.�.��#���0��r�����1B�z@>���V����k9UUU�x���d��(���
���Rv�*W�Z���3f�(I��H8�J���1gtm��d2�)�.����ث�+^*.��IN��[��돦\��i�����:������_R��TE�\��5���t�GUVV�6}��UU��B���S�S^^�/)�k!š��
f^�KJf�(���s4U�_��g~l����6l\ͽ�=��I�&3L����w�����z?�5g.����q�y��q\TT�^t������������|ZYYY_�Y�"���ہ�n�9��P��v:�L�vÉ��]���\n7�lٌ-[���=���'N�v�-��)���&"�gW��"3�N�3P�]�������|_]���w�	^r��'�q�O/\|�'/[��;o�dz	&N�����U��r����[�����/����8i����x$3fjI���/�iE���_B����k^N�

�_�w�y�]ߊ����:�_�Ny9XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|�P����L�IEND�B`�assets/img/onedrive-48px.png000064400000001666151336065400011760 0ustar00�PNG


IHDR00W��}IDATx��[HQǿ�ŵ�
u)���@A",i
�,
�"�!|z襢2_�(�z҈0fʞ�P=U$D�CQQ���������̜]wvV��uΜ���f$Z�"9���.��
�N+�8��`[ϲ��>��D,��$b�8�OP��ģ���8�K�y�i���#��c� �M���k�c��d����u�a�d%��q8������PUo�t~^�Fk�{����j+��[�f�@�c ]�������@���@V�_D؏�2�di�|:�NxA-=����E�MEZ7k4���u�@�����X+���u}F�(�7�
��(�$JNI4��Q�>vN�ߍ����N����+�
x�D��g���j33A4��Tv����#e�T)ΠE�xo^�h��g�vz���O1��MPp�n�^�ຏ%P���>k�y R�`y�E<=�=o���B�S�������x�x��/�+n���Ck� +�xr;fiXȗ��@���E��2 ��J5Wa�=��ʷX�N_�"V�@�9Nwj��P������/�y�!�ǰ]zm��d��:�f����,�S�_eq8�Lv�9����2G-��Wi��
�m���0�_?���j����#V���f}V�n3�L�(ubt.�F�.SG�b��*��5B ���ഹ�U�`�Z�=�?O�7s:���`�x��h��d.�qU}��S��y��s������zA��Z�F��� օ{��l�4���^4��t=�/�h�Z.v�9�͘BIc+�i�)|�%e�Fߠ�
��]ڦE��]��H��oA��L�������~�ZtZ\��pZ\��pZ<�_7!�O��nnIEND�B`�assets/img/logo_wasbi.png000064400000005305151336065400011463 0ustar00�PNG


IHDR__����PLTEU��$$U$�$�IIUI�I�mmUm�m���U������U������U۪���U����$$U$�$�$$$$U$$�$$�$I$IU$I�$I�$m$mU$m�$m�$�$�U$��$��$�$�U$��$��$�$�U$۪$�$�$�U$��$��IIUI�I�I$I$UI$�I$�IIIIUII�II�ImImUIm�Im�I�I�UI��I��I�I�UI��I��I�I�UI۪I�I�I�UI��I��mmUm�m�m$m$Um$�m$�mImIUmI�mI�mmmmUmm�mm�m�m�Um��m��m�m�Um��m��m�m�Um۪m�m�m�Um��m����U�����$�$U�$��$��I�IU�I��I��m�mU�m��m�����U����������U����������U�۪������U��������U�����$�$U�$��$��I�IU�I��I��m�mU�m��m�����U����������U����������U�۪������U��������U�����$�$U�$��$��I�IU�I��I��m�mU�m��m�ےےUے�ے�۶۶U۶�۶�����U�۪����U������U�����$�$U�$��$��I�IU�I��I��m�mU�m��m�����U����������U����������U�۪������U�������n.	pHYs���+tIME��":vXIDATh��Z˕�(u�9R ^
�xy����Bр��`��b��v[�ҭK�(�8���������[��|��3���sR��
 �oj�C���E��C�m[9vq����c���{���p�\��Z<�7
��+�K����_A�>��A���F���n�
矎�CTȿ����qw��Hͺ����·b���u2�kJ�L>�]�G�T?S�1�nr��}���4��F�{�?:c��(��5��#|��}F��Ne]ia�#@s@�?(Y���kT7$�Y=~���&��>
�;qlm���@��f�D�7X��
��J�!�=��q*��	�8hEo+��p~�_�ŒL��re������wN����x�5y�1�^0Ɵ�П��~z�ͨ����3s{\�|���3��>�@�$�ΰ{������������a�k>
� b�/s�A�x�?����3�Ҳ>��{?]翆d�+�h�GEO~a�A�xb�@�:~�UBy�zo��?��An��߇�������ƫE&�O]φ?�m�����s��x���;��OX8�O�.-
���}:ђ���1��?�
�<�^���2j�D�������b?�=�F����8P�����/��T�\U���L>�9c`�?7;F��C��D'�.]��>���;�@��fct�Z<t�m�Gy�~���Ii�}^?XX{�!,����
s�F]]��|�E��p���FՖ�0���׸F�.�G�rUR��$;�sU��}��;�Bλ�瀞�����5	�5X3���?�|��II�&����ѳ݇��K�������u�s;��~Q�ű&���2E~qY�0׶�a�ל+
�K5qk[������?E�Kp�B�{y��sUv�k���vN�y�E�<3g�/6�C�'6����~X
o�ə����otO�'����>x���g��#]��XR}�T�?��(q�M���Q�P�S�CU��A��{��d��O��P���Nj��|�?q/⊐�B�����;��}��8��g1˕�'���û}��Px�狻׳ۿw�Q�m��?�ʺ���qF[�U6>�M��y����7�S�����g�_�kp"n�y�p�\5�R?[��[�u��
Y�<���h�>�V33�OS��R�U�c�~W��
��s�L�����n���Ӕ	�2nu��g��bDlc���o7��p���+�k��UO�V8������yv���c]�i��<�T7E������z����c�ǒYV&�lA�f��f���C����h�ߌ���ű^����ǜ(=�s��:�	埲�)}��$ꀩz�ˋ���z,���hg�b�F�J�$�S	�f,��?�J �ɿ澎���^Z���l��}�!����7��^��ɼ���x�׌J��(�9�?)�n�!�1G����Ϳbl�Q��gR�N�{F�~���D/n�`�]l��^�'SkF԰��)b�	8�i��]B�Ϝ�xN��EL�1����d����?ga���eH�/���,E�Ƚ��ӶÉ��/DŽ���a��Iz!���9z�/bRT7�_rmekgQ�X9�g���v������jM���,��s�߬���5�ŏָ�|���ﴷs���-{������G?˭eh�v��n]L�m�X�k`�/���{7퍎k_]�l�7��}�>�u�8�u��Q�j6īo�k&w��kg���7�߬߭^O��qHa���m
i�}����4����=L��?���_���~\����ǤV��s��oR}+�#�xĔ��[���۔������l���%IEND�B`�assets/img/logo-menu.svg000064400000012334151336065400011253 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 width="256px" height="256px" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve">
<g>
	<g>
		<path fill="#A7A9AC" d="M172.103,35.223l-1.395-24.097L153.36,6.478l-13.253,20.171c-6.742-0.675-13.535-0.696-20.276-0.042
			L106.467,6.27l-17.348,4.647l-1.4,24.204c-6.073,2.724-11.93,6.074-17.485,10.039L48.403,34.183L35.704,46.882l10.91,21.701
			c-4.011,5.522-7.396,11.352-10.17,17.397l-24.367,1.41l-4.648,17.348l20.241,13.3c-0.708,6.734-0.785,13.523-0.166,20.265
			l-20.284,13.33l4.648,17.348l23.324,1.349l0.227-0.826l9.106-33.176c-2.125-24.333,6.104-49.397,24.729-68.023
			c27.393-27.393,68.71-32.315,101.145-14.833L54.422,169.447l-2.585-32.355L30.89,213.398l31.614-31.614L182.735,61.553
			l4.204-4.206l7.978-7.978C187.836,43.557,180.15,38.857,172.103,35.223z"/>
		<path fill="#A7A9AC" d="M105.214,9.558l12.231,18.614l0.945,1.44l1.715-0.166c3.182-0.308,6.423-0.465,9.634-0.465
			c3.347,0,6.736,0.17,10.082,0.506l1.719,0.172l0.95-1.444l12.122-18.449l13.365,3.581l1.274,22.041l0.101,1.724l1.573,0.711
			c7.036,3.175,13.652,7.136,19.711,11.791l-5.717,5.718l-4.203,4.203L60.485,179.766l-23.991,23.992l13.792-50.244l1.292,16.162
			l0.493,6.159l4.369-4.367L172.416,55.49l2.709-2.711l-3.372-1.818c-12.829-6.915-27.349-10.571-41.994-10.571
			c-23.62,0-45.823,9.198-62.522,25.897C48.833,84.69,39.52,110.095,41.639,136.061l-8.587,31.288l-18.962-1.099l-3.581-13.363
			l18.562-12.198l1.431-0.942l-0.156-1.704c-0.592-6.436-0.538-13.065,0.161-19.706l0.182-1.728l-1.452-0.955l-18.518-12.167
			l3.581-13.366l22.309-1.291l1.712-0.098l0.717-1.559c2.729-5.948,6.055-11.639,9.885-16.913l1.021-1.406l-0.779-1.552
			l-9.984-19.859l9.784-9.784l19.988,10.049l1.538,0.774l1.401-1.001c5.343-3.811,11.061-7.094,16.997-9.757l1.581-0.712l0.1-1.728
			l1.281-22.145L105.214,9.558 M106.467,6.27l-17.348,4.647l-1.4,24.204c-6.073,2.726-11.93,6.074-17.486,10.039l-21.83-10.976
			l-12.7,12.701l10.91,21.699c-4.011,5.522-7.396,11.353-10.17,17.397l-24.367,1.41l-4.648,17.348l20.24,13.3
			c-0.708,6.734-0.784,13.523-0.165,20.265l-20.284,13.33l4.648,17.348l23.324,1.349l0.227-0.826l9.106-33.176
			c-2.125-24.333,6.104-49.397,24.729-68.023c16.71-16.711,38.607-25.06,60.505-25.06c13.998,0,27.992,3.411,40.64,10.227
			L54.422,169.449l-2.585-32.357L30.89,213.398l31.614-31.614L182.735,61.553l4.203-4.204l7.979-7.979
			c-7.083-5.815-14.767-10.513-22.814-14.147l-1.395-24.097L153.36,6.478l-13.254,20.17c-3.447-0.346-6.907-0.52-10.366-0.52
			c-3.307,0-6.614,0.16-9.91,0.479L106.467,6.27L106.467,6.27z"/>
	</g>
	<g>
		<path fill="#A7A9AC" d="M87.802,222.21l1.394,24.097l17.348,4.649l13.255-20.17c6.742,0.675,13.533,0.693,20.274,0.041
			l13.365,20.335l17.347-4.646l1.399-24.202c6.073-2.725,11.93-6.074,17.486-10.038l21.831,10.974l12.699-12.698l-10.91-21.701
			c4.012-5.521,7.396-11.352,10.169-17.398l24.369-1.408l4.646-17.348l-20.239-13.3c0.708-6.736,0.784-13.523,0.164-20.266
			l20.284-13.328l-4.647-17.348l-23.323-1.349l-0.228,0.825l-9.107,33.175c2.127,24.332-6.104,49.397-24.729,68.024
			c-27.392,27.393-68.709,32.315-101.144,14.831L205.48,87.984l2.586,32.356l20.948-76.305l-31.615,31.613L77.169,195.88
			l-4.206,4.205l-7.978,7.979C72.068,213.876,79.752,218.575,87.802,222.21z"/>
		<path fill="#A7A9AC" d="M223.409,53.676l-13.793,50.24l-1.29-16.16l-0.494-6.159l-4.368,4.37L87.487,201.942l-2.709,2.712
			l3.373,1.818c12.828,6.914,27.351,10.568,41.997,10.568c23.618,0,45.821-9.195,62.52-25.896
			c18.403-18.402,27.717-43.807,25.598-69.775l8.588-31.283l18.961,1.097l3.582,13.364l-18.563,12.197l-1.43,0.941l0.155,1.705
			c0.592,6.436,0.539,13.067-0.16,19.706l-0.183,1.727l1.451,0.954l18.521,12.171l-3.582,13.365l-22.311,1.291l-1.712,0.099
			l-0.716,1.56c-2.727,5.944-6.053,11.633-9.886,16.911l-1.02,1.404l0.78,1.554l9.983,19.859l-9.785,9.783l-19.99-10.05
			l-1.536-0.772l-1.402,0.999c-5.341,3.814-11.059,7.096-16.994,9.758l-1.582,0.71l-0.099,1.729l-1.283,22.146l-13.363,3.581
			l-12.233-18.615l-0.946-1.438l-1.713,0.163c-3.18,0.31-6.417,0.465-9.626,0.465c-3.348,0-6.743-0.169-10.09-0.505l-1.719-0.171
			l-0.95,1.443l-12.122,18.448l-13.366-3.581l-1.275-22.038l-0.1-1.727l-1.574-0.709c-7.035-3.18-13.653-7.139-19.71-11.792
			l5.716-5.715l4.205-4.207L199.418,77.666L223.409,53.676 M229.015,44.036l-31.615,31.613L77.169,195.88l-4.206,4.205l-7.977,7.979
			c7.08,5.812,14.765,10.511,22.814,14.146l1.394,24.097l17.348,4.649l13.254-20.173c3.448,0.348,6.912,0.523,10.374,0.523
			c3.304,0,6.607-0.162,9.9-0.479l13.365,20.335l17.347-4.646l1.399-24.202c6.073-2.725,11.931-6.077,17.486-10.038l21.831,10.974
			l12.699-12.698l-10.91-21.701c4.012-5.521,7.396-11.352,10.169-17.398l24.369-1.408l4.649-17.348l-20.242-13.3
			c0.708-6.736,0.784-13.523,0.164-20.266l20.285-13.328l-4.648-17.348l-23.324-1.349l-0.227,0.825l-9.107,33.175
			c2.127,24.332-6.104,49.401-24.729,68.024c-16.709,16.71-38.604,25.061-60.501,25.061c-13.998,0-27.995-3.41-40.643-10.229
			L205.48,87.984l2.586,32.356L229.015,44.036L229.015,44.036z"/>
	</g>
</g>
</svg>
assets/img/5star.png000064400000027467151336065400010411 0ustar00�PNG


IHDRd.�!�^	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-� cHRMz%������u0�`:�o�_�F$bIDATx��y�e�u�����~���Fcj�	eN&iP&-RMZJ"ɶ�NũJ%�J��*W�J*V\�]mS�dK�bJ�d
%� ����߻�=���m�)�-�*����=���׷��k��}O���ۏNӯ���ɓH!�Q�6)�9��m�<!�Z&�	Z��q��Zc�y��K)�E�1�4MI��u�z�y��#����,������Z�C)�ڛ
��h��ʲd0�B Ib�8~��4�^���ﳼ`<���D�4����g/P!@U�4u����G��7k�;@��	(/�#����5eY"�=#4������Z@������/�|0F!�oK)�$����>)������n1���3��7��Fk���!�WY$xY���D�c"�/_7F�ݥ��{}�ֱoyι׾��4��B�����koRJ"��&���:����c�w�W��6Z�
�����Z��3���J'���z�e��&�:^��^��1D���?���Z��[|p!����K�w���Fۻ�����b�%O�ڐg&YΡÇ��U3�Z��*�~~Rp4��BG����2dMC���c���s�����0q�/U�x����q:|U� �x5 ��'\��P8�Ag�؄u!��ᕞ.�@MUY^��R��If�Vw��7���+�B\��@J��,�* �{���>��^?4魽/[�j���W��S!�BH��cp�2PR"_�<d��kY���l��Q��U�v�7�KkF������:_��w�O�Y���E��7��'�����k$I�+N�B"��DӋ�c�x���S�l�@a��[��Z
c�t
��4�s�~z�*ğ�.=8^�z-�_~w��ǝ5k-Y������n�@�����౤�g���]�����+��E9�؟��;ᝓ/u&/
�������*  �ϔ���]�2��/��ɸ4g�y���W�ȳb�R�<��q���
K��w�>Lg�v���%��CUYμv�P(��IHB��|��|��X_�פ��)��k<)~Rk݈"C"���Z���ZO�[&����z���o�G�Բ2|dR��Y[2������&�7YC�!^��B����{���~�9�ј|����q�W˼Z��8�"��{DQ�R�%�
!�ݎ����V��5�&�Ҫ�������'̽��h�_5�BC�� ���y�Ɨh�!��Dc�8Fd�?q�w�e��*��!:Y��b�u�����Ҝ<B�w�$w�*+w� ����B
�Da"�F��(vOݒ�|E.Vg����Ǘ����%�D+5ße�zMz��l���E��%���,�4�g�P�<E����OJ)��H)_��
�(U�_��b�i�-j)ԫ��e'�<��f�GHk�ӣ��B%?��{IX�2��I�F���5��Y���� �x���TU��&�`�L��4>Z��{���R}�fM��4Ə!��a0�|��ܲ��?����!���'�ꗢ���-�"q��ԕ�V!��)
���1�?(�N8k?V�}�p:�c��_��z��|]m��OU�A
�4��jAMGɇ� *׿���`���s�E�Α��Ez��I��u���t��E���r�T���;q[��4���H,3ڴ�����Qj�Oa�;���r�^6��ZhS�#��_)w�ݯ7���6���R�U�?��:�I��ʅw
A�
;H@	����l���b}�0���X�� u�C�r|��(s�)l8�/�@����[D-!Ċ��E���7��l����o3�ܤ}� Q�PkB\�&��<|�7���������!�c!�T ����ӓ���%��s�1w��,P{��N�5��z�ѧ��/Y2�@%�������I�js3,\ۡ=_C��ߡ^��by���T��-�Uv�"�|�w���O=�ٕsG�iv"��q��_���?��J	-�!�R}��?�w/��l���4̑t�$	��)L�1U�����]��7�?(��oRR*�O*s���TV�H5�*ǽ�&�n'�^�%[_�Գ��`)�����l㋰ӭ����.ݯ�f��t^�]Zy�4,t���W~G��ghj��7�EFZ��K����?�������J�T�8���ҧ{��J��U��o�&����f�	j����e��7I��q𮝽��4��4�I��d��u?nW�Y�>����:�$� �K���o������3�jXyDgűj��r{/$f��t�z���u�DPstR�����2�F]���o�Vz��l���⤔b�) Z��P+���'v/<��j�]��&rp!���HW�4�Mj��!n��fTyI2w���
�9�����;��L3�|֕����O�j����h�=����v� |A�e����2�=����t�����F��W�ɕ���e��E���e��
\U|E��0f��!�_O��W:�I����g]Qe�Q5'݋�ƕ?d.����ـ�wQ>�5Q�=�2.t��޿NFYd�׮���q��*��>d��r�	h�:�b�l���E�L䢩������ޔ;�Y�F��^��?����iK�T��O�	�����9KR�����"Biq�[)&�����O��!�Ci���(����Ȳ{����s��[��(5"4(½����8v���Jo 4��{UU4����sd{�i���I�Fc��V�b`����Кk�G������@o^��A�W��7��(ofRk1O���H�
d�G-�4g�'1k��偸0KT�2.Z�Ru��{�[9���R���g�
�e�P1�#�ˤ��x��$;͠��Q�jy�Xm<�cs"j�>,���U���~+Mk�}��u:ٷX>�i]w�h�P����M���lLn�{�8���#��*�[��i��")���9t"H;mL��G��� ԯ!�3���c/=��lQ
/Pu�c����E��*�"���%>+�,*8�g[��.6~�X� �e�x-buof�5��p��.��:�p���[�h4��q(�"�ɋd��kQF��#� C_c�9.�n�9�l\!����4t���P�<#�����d� [�5W��oQ<���چr;�k��|�ݝQ��[�3W�FO�fm�DRh��(�1���������ϣ/�#fc���<h�uRt}�c�S`-e>�����7��9����(�EU���9"�E�h�>���T����[�l x�s�q�H��f��M�H�5���-���ŋ��A&�!r�����,fr����%�ϱxM���
�IN6,Ȇ]F�]��g1��~򕟡�W��g�ftj��Rd����h!5�('4�R�}�/~�՚�f��9���d��H��WlU�c�8q�d��߹~�� <}�������Q�|�c��/�p��=�I��y���07����(f~+��0�	�n��v�7[��"��#\|��X<�9Hk�j-H�
݈q'#�0D�@���(\@p��'��#5�K	�8'dd��x�|t��o�d�J4i�P̽�q�.�o3*[X!��ct��4A��*��;l�p��H���Ey��K��RT#�L�I	�xL�&���ֈI� ���P��~�-�_�TgJ��������eV�R�ユ����MLT�D�Ӫ#��^Q�|��g?����;�GJvw&��!�:^)l��K9�T�bp�wh�n�c���߇>�4�j�����|]K!1 Aa��F9���C�z
�j�EbRM��V
�;���Q�J�^Fw�Os���E�,�g��`�{D~�B�P2"1�(�h	"xJS��gp+�yoD��E��$�l��i!����e���f���͠��a�9S�0�qt��.
�_��_|����Te�x�
/p���Wn�3[���B�B(���=BC0
/%�W�!�����F��6���3� d%堠���d��)F�]����}�<��P�&�r��y�}t��Jb�`=_8�
�B�TK�S7�V��#�6�4B��NJ}.��N	�[����m�5̾��=ҍ_�����w����|��h�
�͌��c���<;O����׿LgF2��E�
Z[�� �
���υat�b������m"k�zs@�76���Y;-��`q�)ejG{Y|}�&e�٥��L
K�����a�O�B�d���z�|�9D���;)ɇe�!�t�}�Y�I�̑w`��bowH����G�
_x|����] 5]Ϝ%A5q	�L�i&`"B�1x!���1����=l�\��ſH��<��Ì���!��Q"'D1�eCʱ%O��x��f������P���‚�=S�9j-�M��$Ȇ��vz׳�>T��o_���w�$/r�,�(r�����+�/�Q�j�l��ǣ�ͺ9O\��1�^N6�0
ITW�z�=z��'��rr���/�`������R�:�Ƅ�����c������2�\��.2L�CE#���Ƞ�BDd��z��*T� bQZ��0c��b`nw	�!X�,���=�;����oS[h`jQ���U� 4菱���uLN�Sҭ�e~��^���D"QrZ�Z���R�*_��F�s��r�7���7:�*o2�IW�*C�Q��O<�	R�4f#LC��A����ClY#Z���E���l$��XtXa���`�&[�}ϱp�Oa������Q&Pky�%΂0S���2I@*�p����	�h�+�1�2B��N����R�5&���l3>��D��K}�Қm��,Q]��1FE��2)��|�.w����`���])i�T�1��#��,�����"
B�4g�DŽ����I�V�CK�pRֳa_(J�f�-��}�{Ҧ��iI��d6��j��&ٕ�29��M�@nn���E��]��q! �������6a�J��?E%s4�`t賌.
���b�H`�;.PCG�(If�F�,+"
�OK��>���y� d�D�n�'w>��_`/�i��4j#Z�uh��%1�c�v7Ɋ�A��֕+l<�[�י�Yb�"�1A�`���	�}q*Pq
���H_��,:R)�`�����X�eY�O&}U�ý�=z{���BϞ`:�H�u��L��өWؼK1�e��`d���t��`2���3W#��w���s�d��6��:r�_"��T"�B8���'x£�� ��U	�B�J$�+Ba"%���Q��L��j��m�;��E�6�74�F �:�H"#Z|�+2l>$��zk��@}��������_?O��s[:+)��p�D`���	��_=�: ���ۗ(�����l�.]w����E+'h};U��<E4/�)�����T}0s�G1ꢫ�
:�B�ߙ0��XPoC=���{�����X�9��;�
.����x��R���GiER�7M-U2=œF�AF"G�3���n}���P��>z��P�E�NH"M�1��)�հc�7!�-��)�$�Y�+7S;|/�s�!������|����1���@5⚎#��gDo���7����;�js�|��L��E�A���}�1��a8��o�CKb��.���^�t%U�C�������[��	�d��Ѫ��lԈ���(�7��?Ķ=H���o�NR7T��q��2\U��!5"�	"Q�z
l���䙤51r�#��Yc""1če/�ՑD(<BNAqU�/���13Gn�w#��{�f��6ir��]��K,.,p��GX�?z
v�Ex��V�2�G�Ero�� 7�tӫ����$<���O|�;��hN�G�m��V����O��z���0��̡�7r���p��;|�����5�b�pg��]�"#�
�d�j�G���m3��)�!�~X��b��Ҍz�^IR| ث�vJ!�%	J�[�6b|5�xd�h��A�p0fnoDk_J��"Z�-����K�I���_����^�ٳ\�p�lԥ5����o�wp�5�bq�N�D&3����jL��_�o	��x������8���yq�_c��e._<��e�bB�Ĥ�&��6O>���S�p��۹���Y���]���R���	�����t�MԺ���ƫO���4�A#E�QU���BP�q���=B�@�4H#�kJ�n�A���Zj9�	&����mC����w'�d�q����ion�Yآs��W�d��ڰ�7y����'��]��FDQ���,�d���>̹���;8q�]��7�-C6-DQ��$��L]�
 ���{�h���r��'�=����%��px�,�^�Ѩ��(�(���`�pاȶ�|�$Qj�n�-nj���<:����r�v¾{�ңTV#�\�l�+����aMNp9�{��ĉ���݌��!���7
�x�@�*v�Z	B�D�BBQ��5��܈��}T͛�h�]�wP�	��'�֩��bdq�	�UW����}m�Y��hP�50qDU�=��.�d�/>N$n��Po4��H������+?p��+�k������l��4�+.|�>20%�j� ��E��H�����FDs���P;pz�z�f���Ο{��s�е��0f�N��pr�2�1�{�1�5�dX�}iH1)I4����%�E�<!+	q�|W�9�{K���ㄙk�R����9��7�[\�起�Z���w�l���WȻ�f���1Ǐf��&JR!Dxy�|�w�'�0J�hD,.t��ĵ��o�[c.��p]��C��
�تY(��(J���9K�#)��&�"z�1[Ϝ!��̭�����:Ž��9��3�p��Sl�lᬥ�lq��
�y��>t'֖��hD�=I]S���n��
U����ft7s:��yC2*�A�<���1�R��a.�N8w�1.�=˕�dYA��\9�m���-��‰�E�C���e	Q֣=;�^�&�i�����= ��xJ��J �A�x�L�D噄��T���Lވ]gv��bޗ��>�f*"B��w��;��W�|�*p���O�8c�����g�r�2/�2�1F�1*Iȋ�o~�[<�ȟp��w��_x��*�bB*��k��n�
K$5S'�÷n#�ɶ�8w��Ƙ朡�Ra:	aJ[75�ŋ���/|�K�.�j4H҈F�AUY^x�'O�d��?�{����{�w~�$Fj&�mBY�uҤ��"��Q�`�AIP"�R�e��y�M� ��[�V�W�2��Z�nq>H�C�a/�B��S����zA��aee?���
��!���*���O|8!Mb�8B)����`D���d8FPP#��r�B�XRS_�����$���MX�B%v�A�ۏ��}��Swvi�
�H	.ƕc|� �f��_ρ}K�� ��YG�e�y�h4�;�=ƙ3����۹���h�5�+��ԓQ%1JGA)]
!
�ۃpFINK�6�i��W��˲��X�5P��$����kB ��j��A%J�RG�Z�5s�IQ&��:y^!9�
R	�R��n_U��%)�v)�;Ԃ�Rmj�o�}��F��!���.[�#Mk,���[p���?���Wٹ�$��	��"�&<����<�v)%��k+B��EQPVJI6�\��������tPB�I%W��/!6��=)�A]���!D%ş)����*���,��B	%kƘ#q�"��?v$>x`���9ʲ�*K��⼟�`���*a�
ƬmmSfc�K�������.�
�;Y�Ƴg�p�Ν=���&�����Qn�����6�o�,���>����/>�f�A��g�����2�-�7�0e����x�$������w�d��`nnn=��~�;�D@�¯���j$)"'���Oi��k*��D>��8�zm��V����s��Rي����a���������ۣ��M��M ]:�Pϱ�Vpe�ۜ;�<ξ����IF�<O=�4��׸��q�;9q����4W�G.?B��:I��"�q�nէT߫<bmF"c0��h�V�5�$��_�?Bl� ,��@���JA��1������b�i��s�EE�ҡPR�i�К����m�6�b��E6�V��v)JGd"ff�I��<���˫;���e��w����uϻ�鶻�?�nnX�P����Z�z�l�I�ٚj8�"�� h�P�W51c��L�~�g������k��[Wμ�R�h��W�RM�"~*S��4B ��S�W���B�Q�:*�SUTUA��l�����s\�ئ����f��#/K@')�z�zZ#I�< @Yy����n���i7����q/ǯ;�V�lإ���fi��h��AG%����B2�]��3R�J���7p|�H�K��eaN��Ej�@QY��o��]:x��!�<M	��P����K"p��	+�s!,HM�訡tՒZ�udHj	&�I����]f�q�8���m"�V�N)����T�c+�x4a8�Q�[W�"�!sY9������JyE]�tOJF�`%��T\TR�R�I��Bx��ɐ���!�'@>R DS�0BhJ!��`�8���]�p�VU+d-������8k���0��p�,-��ϼ���%�k�6W���ᝥQo��o�v�=B��8%�xT��a
�P*Av��D�"��B@^{���5
sA��@�ڨcR������ٙ��>M�t�WEIY�8�p��%���1$�YR�1�.P��!I�Ma�oJ!~˻p2��*��Kz�?o���g���3!��J�k���s�^v�Dx��z}��⬥�ӵ'L�)0�`�Ak5MeC@���L��҉��_UB���ڏ�?��ha"��r��������B�T�,{�q��J ��*�J_
Q�*�#�Bi��}C*�p�6�<��?C@�	����Q�O�P}�C=��t@F%����_���o�
�X#Ȯ�RH!� ���/�R�j2��ڠ�᪐e���!�o����;�Tj	b��o�P�"8��	ދR��"��B�"���n;�~����Km�7�G��	�Y�#g���ij@�'!l~_"�4�ߟ{���V��
CIEND�B`�assets/img/google_drive_64px.png000064400000005711151336065400012665 0ustar00�PNG


IHDR@>�AosRGB���gAMA���a	pHYs���o�dtEXtSoftwarepaint.net 4.0.6��c�:IDAThC�STW�����(N��J'S����kH&3���&��(����%5�5�4���hT�f&�Ѩ���
pk�c�q�8:Uh�3�~^��ݼ�[�n�����}���{��f���cp�{$����ړy����� �G'"��e�j����=>=�v��a�;�Z?� ��G2�X�l�Yڐ+�՜����1���8�.~S9�N��=ޙi��f`�O���ܷ�w���<��/�QN,�g��$�2.��9���
�1��*���4�CjSa\E
�6�	^�ɕ�#�s����5"����>��J��fAU
h��Y`O�`��[0��_h��=B�4�u@�<�L���«�c�Ry;է��yf�������/���yV�݉?W����|�%N�N@{Jg��h�Y3Qy���g1�6�
)��7�I:!o/�1�"�:��~[�Ѹ�HK�cg
7Ɩ%��oqhc��	�U}!z�c��m�X����?�.�15�!b�b��y�!o7���� ����G�xDқFץ���P��0�<	�?��8g�%�M�Y�n�����'�#(1Ry�q\~5��gHUe<����.��ٙ�f��#�
����Ry�P8�*����m�d��@�'c[�R�`�������"���Y0�*	&U��0�y����:��L[�ud�jJC���lj1
gAڮ���<�1�	���c1�L��oL;�7��V��u��Ž`tY��7�Cq���蹎���g6��}P��G�������I�[�3+���&�x�[�Y�8�f���\���;Xh�ٙ6rr�ſ�L�ћ�6u���D]��Y��m1�mqF�*��==�R��"���[�3���x<?a�<!
��:;3��Q^��}��D �2΢�J�]��C����8GBRq'��$b[\ྶ��\/ �%����͇�ND���
��<ٹ�=mqz�*Շ�ra�D�����W��l��Ջ3(㪼��h����i
SbXr}R��/�5�/m3�}��!,Ʈ�$�6|�=͵�8��^7��LQ�`��,�rU����>�x~�.�!Nȕ��͂��E<�x��H^+9��J���>wgA��<
�*�F�'�0��"��;�J^
K�>�0�>/��X�dza�Y�N�t�Б�\[DyE@���bX!��{~����8�SCн8Kr.�-���:2�ň�E
��I�Iu�*�sz3zv<�-.���L�Ȱ��Z
�WM�ρ�jt=�B��YO�w�uQ��Dr�	��}�Б�uh�lQ�`�Vv��,��������\�o	�<֞�ʿ4{�*ҍ�3ޭ���SZĈ�f��GR@�d��ey�>�#���*�ޟoˋa��x�=��A�����	��t�Бnۍ0��]��+�����n���w!x��y�>}�H�.w�[�#/������8���>��V��4J�w ϡŶC!�.M����WU+�%nCU</�q�GSώi�-J�#OОҞ���y)� X�Wӿ��)f�-c��{Ƅm�K�K�'���}U��~|�u%G=q�B6{����v�^��Q��*bP8�&VRޭ������g!|�m�X��mxӾx�<u��l"�o�%L�zkBE��{
�U� 0��&^��û$�l	@��+�����
���� b�/(aGE�'���=y"8�ˌXw!�wHa� ƻ"&����3�ʽ��� b=^�X�R��k���=�Y
��Q&Ofbp�ߖ��'A���y�ɿ���LQ1,Y1��	^ڑ<��d�=�,���B�A��]����X���^r
��@����PD��K�pV\*�Zq]wܞ��E=
��9�w����2Oa�[A���Ko����,�
!Ew��RX�r��׮}A�o�ݞ��Ν�Um���p�|���s΁2������f�m�?�]q�֘�`�(�H\*O(�ݡ����0�2�,� h�|�x#f6A0V_����&P/�5�kP^��G�݃�O��R��(֗�T\�h�<&y�w��³$�, F��i0%��>�տ�%�A�S_���
�'�ޅ��G�(�B*nO�^�mo�u��J1���h�<wDÄ�eX��X�����`����r�_�#������-)e�!G\,��CϢ��ߕzn���m�i�!�py�l̅��'���X�+X�����`��P~V%���Y��-L��#��3�I=r���#�@=6i�n������U��-��c����g]�_� �4�'�����}]�uN��JQQ෾柄��V�m���V_��Waj��P��_���嵫��,xĔ`	��	��v-��	��n:�L��e�jhY����vL^�/�<A�.Ap�5��*��E��E�f�pxZ\�k{gKT
K��'HQ�����ޡYP���S�7A`v�v`7A��W��W	`�ո��8�58�5���bf��a	8'4ŏI^���r�Z2�����i�j�����du�X}e~�U*\��<�������@�Bp�&�҄H\ ��L]�d��k�:g�o�j`rjLN?S��Ԭ���9���*��kt��3�;!(��Kna��z1ކ��RbPt2���
CbB�ف��
�-/���{������2�7���PefAIEND�B`�assets/img/ftp-64.png000064400000013610151336065400010354 0ustar00�PNG


IHDR00W��tEXtSoftwareAdobe ImageReadyq�e<0iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmpRights:Marked="True" xmp:CreatorTool="Adobe Photoshop CS5.1 Windows" xmpMM:InstanceID="xmp.iid:AC28B9DDE2FA11E4A298DAA43CCB378C" xmpMM:DocumentID="xmp.did:AC28B9DEE2FA11E4A298DAA43CCB378C"> <dc:rights> <rdf:Alt> <rdf:li xml:lang="x-default">Public Domain http://creativecommons.org/licenses/publicdomain/</rdf:li> </rdf:Alt> </dc:rights> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:AC28B9DBE2FA11E4A298DAA43CCB378C" stRef:documentID="xmp.did:AC28B9DCE2FA11E4A298DAA43CCB378C"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�(�*�IDATx��Z	p�gy~�=���J+�V�a˱���c�j�Ď�LƥӖi)$u:-�v t8:L��IH&LH�bh�I�I;�c[�m˒u��ծV{����>�S�QtX��]����>��~k��,�>�l�=��;�m���q|�ٟ�N˸�����7���ލ��]�e���|��T*s�?��(JΦRI	��3����r�.��T}�R�����������--u��cx��پ�۽����КU�]h�n�.�`�p�"lvB�e��+��+`v|s�	�f�$f�/}�#�c�z�;��8P*U�կ����s��*z��"�mQ4�5#WR0E��eT
�����-�e��1Â�.@)��Kbft����?���O?���)��r�E˭���Gv���O?t���}�l� y�y�i:�<r����HN�ld����=���&���e�@e��t�I��ϧp��IL��܎O}���ʕ�����i��r���w�t"���v�'��̔QW�Ƶ��{DD2�����%"����*[��	���bY�������}���q�g��\�s�?��GW��~SXi5�j���-�ŷ�^�l�z�,G2[�j��zO$1<���?�E�+���0��e���^�$s�<9 @��+:j�4$8�CUt*�b������o��G����[r��Z���=?�y��Y�yM'T̈́���fG�"��l'"u~*VCbh�󡫭��O&��D�I���8���g�0�,�C�S(��!��+eӨ$���w��N��u��ZN�n}饷�N��w�ٰ5~7|L*���C]��W��1	x���h�_���x᪺	��PPq~*��#�8t|��h �ƹ�(��M��/�����I��O>�Ȯ�֭[�jd"�kh����>�)o���uhyQ�	=�)$����:�=�@�'Ǟ���E�@ˎLY��Fb��h��P�h�����t��4	b*fSE�76a��ؗw����W+%س��LM%lG�/|pE�2�����\(0C-h�IQUpv,�d�@Q�6ɓ_�)%.����[�a]�+�<�2Qn�S.c+�\��������~��~����Fн��z��{��=Gۢ[�jh������ϖp|h�rKK#��D��8�$y��2H�c9*�tQG�">:��)���V�(R�����S�9���n�;:�jQ�ũ�f<7�O߮�����,~�Y���vmKG����|Ώ��=/B
>�n	��	��g���;�٩���(K:�XR,(��X|G��0Ϣ(�+lX��ƕQl�ԍљ4���)��ק(P�H��J~��`�'>�W���nD����XP��5=���h�h��XU���u�������w��H�9��Ģό�����L�#�y�:�ڠ[6�8;��x~}�ۮ����(I�˞~�M��������G^��߹R
���f{>�I�a4���\�ɹ���9���ի:�&6��\�9���@(!�E���i����A��E�6�1_,���ވkWw�����ϟ�G}�7����]x�m+����:Ȇ�
L_BS�ku�����7�pI�d��(��0�����|�WOTύg��j�;ţO��f*y�P	��秐%�d�oo�"��J�#
u�|$�G�݋�:����(���ct�܆���}><wIEKr��m[��y�������ҭ�l�[�P(D�h�I��Q	f<���Jt��l��7�7����!
��e�a��$Ƨ��$����tM���īG�p!��_�܈�n�wN
��z�s��P�����I�wE#��m�
���uع�F�v��\.(�2Y�䷸��ł���,SJ�l���j���4���8;�J;�_�FV(�x���
J�@ @TJA#A����'Q�a��n��!��l
����#��8޷y����#B.��#�F�R�4�Rc�3���@�"mp��g���"�S&
$�O�'�hT�6�$s��^������0DP�� ��	b�׎�`UO3N����Ԝ$���?=�ޮz���\|���A�3|[����1�Rx1�L�W߹M���j���ē�Kv�����_��%�-f�X$�%a焝�7�j���X���"6U�������s7y|>��?��:.A�@Qw��	�h	��g���3��P��ŜP
.�҅jԙ������{���T��-f�E��H�3�1C�Vׅ���/�B&uB%�P���L�Lz���r���I�d�
�_���
�K5k�b��d�Q�u�����;)>����2�w�Bj�R�a��!���;�R�B�P�rjX�EU�SU�F�.�
C��U���۩�b���d$U�"E��
\4�f�Q�Hmm
�Xg�	v����� �c=Y�a�T1P;�>7\t�pe�~�CS*�'�28STYqs�٫���&���y���)�d��r��w`E&�wU�U7^�$j�n�4��j6��v�H�����Z/�sύ�[o]s�FF�WS<�G
t#�������{-��ˡ������3�A��`�2x1�ꢮͺw��e��]���1:2���FQg9a����e���h�ik��-
T�9�osⲝ�f�7�M�$�����.):��9c&w{��#Y�-V0��#�*`5Mk!L�3��������"�X��+D]��+�]
�
��fױ��z
�W[c����<
�\�RR^ցh4��~�ޣ�~m�T�M}mvJwK��������J��U���z�2������@�R��Ҁ��z
��Â;`,:�qiap���d��-ab�75F���T�~��u�"�06��p�-%o�a�+Nd�j���O�N'�BMQ�\Da%��fQ�NY!l��0��Zl��,B���{E���6�Lc�u�8�1�8��3�M�3Jf#�3�\�s�0-��_*)�x�iu�&�$��i�������KW�ܽ��u����Koҍ�yN��*&�&���Y���3����rM��;H9�Hrۨ��DQ"��Ƌ��$�I4b�E��x6ذ �ᦡ���;7v�M�n>K$��)"T�U��n��-w�}��#��:16yM�����4��Y�D|n�pjp���ϻa]O#��׭�		��F$I���GO'��b�gd6^��/�F��!���$�E�<[�I:��n��^Z������徫ޝޱ���3ϼ���SC�����C�!8�$v"�+pV�U�u������4���z�mC-&O���1pPg��ac�Sh���h�x&5�gI�����vR��f���p��r���y������q`vr�f��6M���:��l���%X�t>6L���F[�]�u���S%�y�(�ò�:�A�!�e�h{���1�t^���,���#�������4ZW����1lݺ�1>~Z�����鑢���)lTM�p�$���C���@ø�f�,~6��7Fpt(�a�� g�ho�>�B�_D���7�����ˮ�k�4�dzzܷm�v�ѣG��;}��Ç����ڱ��cs3瞜9~�rh2��d4gTe¢l�J��0�$�e�Ҭ`YS*U�O�3Sx��4�h@ɐ��;,��_ڔ"�t9W�;;}����L&矞���n�.����z�M�NZR"�p���g4r��g'��c*����L���E
H����-��
�t�rO�2��!�m5�N.͋6ؽ�t<G}%Tc?�ZCd�4??O��8R��cpp�)�IB�9��6>>a	��s�B��U�ܶi�&��|paM�E�:!-�my�c&	ػak�4�bY$�;�:i�r���	��.�FC|�ljjScq���N�l��\�`R=j�X�����$IX� ~Ɂ��4���o�Փ������Ê��$�~O{����"Q)�>R�"E^�Ī�)d�i�\��$����u56�j��dgFf�l�&9���E�B���c�s�B���J�l�t����mB�i]2>"6o���XS���.�f|���R��?���D.�otԵD �=�4#h]��I��Iݾa���C�/���G����7D��ՉI�3�s���O�H:E~����^���`Xۺu��s����hkk�U__/��Z�W!�a54|��{n�dm�m��}��:c���;T�^��t�15�]��l��
kW4sq����?3���I���M^ř8y��3�^aB�me]��t�P�����{����͕4�|��X������ߏ;��A���?�-kֵ���]�����6e��D.`9�`������A&�GFgq���c\��}k�Ս)'%Q
�355b��J�(6��dF�^���I���q"�,�i��<��U��1;;�^x�N5�f�b�W`K"��tuu4�{�=mk֬� �{��ǦR�!d�j�P1B�fX��f]ΪJ)��NMhZv�!���z��!���LƓ�<Afa`` M�)vtt�>��O��v�~�{�駙#���?�f�UuF�BL�.�E�s\�doK�)i�K�4;�P��x<��nW*�J9�d?۠���W�zT{�1�]������x�	��Ç��Ru]���*��0��Q��ٻ��\߶m�I���N�4R:���>��öW^y�G�R��d��*�	��1�!�X�(�$i��W�jvp�С��ք_a���Ro1���/~�7z�0hh�P����IEND�B`�assets/img/cpanel-48.png000064400000002321151336065400011024 0ustar00�PNG


IHDR0 T�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�C�	pHYs��~�5IDATXý�[�U�g�[E;h'�Z"VR�AY�;R�`
.��.�(��H(�����f.D��3�D(K���TʦHfa���ҽ=Mk��ꞙ_�o���7�ַ�����$�����&�q;�4;^
�v��z9�$>�:��Ҭs��I<;1�iNc=^��l��[S���`��y/j�1z�rMƲ<����ۄ(��KyOty��5��z�I�
�Mi�ոH(��69�ŝ��"�$;�B9F��&D�:��R��{0�W׵"t`�0��*b����bNaB�[1v"�(�'�-X���Y�
>�1�ZӅ�Q������<�7ᝊw���<�߻`�j
�y؊6̩�9�
e�4[�Wk�s	Z�Y�<��2�\��N�•�K��ɵQ8�ʺ���
��r?���sU��G��&�)a���N��G����
����Q����i����8�(�y��D��Ҩ��Mx
�	ݤ��2y��"�]�򆀻U��ƀO��P�H>L�:�4�5O�%����эl�p���pL�bի؉�Q��y�G\C~7�ƶ:.�a��{�f'�$��'
�Å
ۊ�W��v*�h�	~*J��5I�arE�Ql̓�
,�캜%X��n�ҍ������d�v�^�|��WǬ>�ߋ�yG
uW��{��M�Le�#����e�K8�Di�7ԡns�<��%QF,���@�4^��lE�?�p��h`BM�i�|fbj/��sQ����o؇?+_���$�U�q�Ц�
���\�$�#xs�4[�S@+~|�ŠDwa%��I�!��������<(beX��O:�g�Ђ�M���٦*��I�K�9�)f�c�tA�f��$�(쫞�DT���X3��]���̠�^8R8y����/��>LT)Z����9���]�R�U	�
�@?G@!b�W�ӻ�`��W���}Y0����=�`���
FnvE�q|6�/P�x�/��W	%T��:4
��!<)��mB{��Y��Y��m�p�;2X��#E���=7<�ׅ���I�=�	����"�v�%�lt^IEND�B`�assets/img/logo.png000064400000011732151336065400010277 0ustar00�PNG


IHDR<<:��r	pHYs��tIME�	�
yIDATh��{tTսǿ{�s���'�$$B@��"(jMڢX���j��*�J�E��+H��[mՋ��^Kբ�Eu�(� �$B���̜��l/$�$`��]��Z�f�:{���3g����B_h<b��ʲ�֮��yɂ����L��N�R3�uJ�B��Y>�ec^��>�O{v���Z��
���;a�s�5UM����dl��������z3�V4��ڳ)����f��!*����&�6�щ034ڠ$�s�B(�FCh�Ǟf����e����x����� �2'�H��>q"�*�2� †��xd������`7L'�h�0�������u
B�A��މ�mB�U�M�RH����:%!��)�Y��,�4Gu"
���0���m��y%���l<�u>�R�x��B:iR���O�p��9��C��P0�3�n���鋏�����:Q�gήK�w$
Òm�>�.ʿ���=�&GCV�w#���-1�GU@	�DdB �w�s�3$
qf a0�B�r�;9<��6�C���3�r�>�ԅ�ī{"}Qf`���l��$ӓ6�;�Yj��i�;��A"A�S�	�HI�D�V��n�I���v1ƲR�(P
}RRWѮ$ѫ�H��G��p���ڑ.��-��ߚ5k��E��������&��q���fM�U�X��\��(a@U0`��O!"$B�XE�vN�v&�����g�η'�pqHU/�3�k����OQ�h*4�����i��l�������x��&�t{,2�рǴ�	�VA|�+[.h�5�D�@	Bѩ�t
�P�$	.A�(��D|xn��w�i�kd��aw@է�
�`��i6�wB=S&�8'�@�0+�=����ގ�7��c��h���d�ɐdPJ 
�P�T��
ȑLp��V5]�����S�Y�yLIx�)IL%\��*v{/��տyr���F���{߮�=���7��c�=f`B<�ym��

�R��B�9�	�(�j�s��k�6^����R����+��S�/y3�Ӝ�2�t�0���ƿ����|vZ8i^y����W��l�&�b�O4A "!ȖL` �.��bqwK�x�
����=�D�hNAą��p��Q:��w����ׂO?�_�x|%%%�B���1.����lpd1!�%����%�}<vN�3��ET��>�C�0ϕʴ:Jmm���n۶Ϳ�/��5��~�,�?7�͑�ո�>��6�ky)pd
��R_���q:��'
��SI�&�7��^��,{��͛������;]]]HKKǤI9J���:֘�k&�?�Ү��5��Ad߼�TIue�Ĩ�5X)E����bi�W�Gy��x�%x��&	G���EQ�����fu�u��w�J���7�9���Abx"�~cH�@	�G�P�����ֳ�}��-��RaBa�Đ(�es����n�:WwG���-�D�d�R��!��	[��q��iI�#-QR25r�СTII���1��SgO�
�7��I�p��A�gQ�@�#���VW�g
���*ϑ͕&A��D���t;����,��!7/����=t�*P�⋖�a
�
�u���ZA)�,Vk</77�p��E+V��9�ް������a4��DG�$ZUQÀH�T�$�G��I��<�$W:%$B�s�16���n�j,���D���z<w���k�k6������7����o�G�����K���e��jϞ�L���=�+���[M�"���i�A@?
��1��?�)�Dsy�,Wf������ҫBݧ��t�M~��
#�j*2�� �b�/���[�n����-�����,�H ==��(����kyT`���l�D�A@>��vJ!P�����3������V[e���q%>�'˾��b�
?�R�$���N']�x��\+W�d�h�
Dx}�';m�ht6�
��H�B(��4h�1w��Z.�z����$�~і��:$A�'��3��P>��,���2��d<|LQKoWb��^~��~��t���0 ��X�3�~���Co5��Ƈ�|t�n�I6!�J�b���_�s�;�e��s�����N�HA`�M2=z4���KSOB� �ㅽ(�owW�s��0���PKj�l����d��ח��=)B��R���x�����4t�����Gk�'�LB�L���G�̙��ϙsύ7|��e�}��R�	��d忢2cy�3���9:؟���ݕ�\iH1��X8ܔ���T�O��?�?33;XXXE	��=�ho�x啗�����*{�1S]}�D���9�zV���ƕ�#�3jh9�)�9(A��$<V؟����s]iP��H�6+
[\\��˛�Q<3`�;��ݍ���a`�ƍ�t]�i���e��D�g�c��8�.'�k�0�c�}���%vg��)f`_$�I���p�)S�gϙp�8|�0j?��ؽg����PT��DE�10Ɯ����	lj|��Ӭ�Ί_���iV[e��B�8��k�p��bQ���n����E՞=uu�G��r�BAN�Q9��.���HA��� I��S����F���(�nsTXP��O��pc*V��4�x��</>�ڃo�=vX1]wp��s��Ţ�1p"֒�PՇM���^]��RX��;��:i���y��*ϷX*3�h��)1jV�����g̘<gΜ����G��;*::��xB�!��A��8����\����n��30+X��N{�:��]��y
��Q^Q|y�;�/�ih��oy�d�tH&��=�w)J�e��ST4-8}Fq�f������Wtvv�T55����147�}R���]{7m�rը�@G��/Uុ��F��B"�Dp/P#��{�)��%B����5ov�O2U
��1�~M��^z�i�����`aQa@�e455�@uuEssӸa@�e�q"�'�@E��4cǎ`��?ض��L`����`� �9��M�ꝍ���WtνKx��/�T&�)�B�:J�54\\�ҟ=����P*�xg'��*�F��V���q���߲�C�L�F����]�
?r�����8G��:���hzR�X�0B�Q��w5�Qٯ� �	���]�"��t�nO�s�P(��֖��;w�,�
I�uMc�a@�u���db9�r������~ö%����Y��2A�0Ρ����PӶ��E�2T�C
9S�9�\ߩ$a�Q
��.�>>��.?��@��B����*�x�3���;u]��$I��f38�.���cʔ�p9��R?À�m����%3yz3����3twmG�����;�
Q49��M�(���l�2	b���S3w�{�_�
S)#�+)X�V�C��m/>V��������h�("==���j�&	B�d6E����+W�82���d����]ƨ�3�f8�a��R:sHjݺu��p,���)��ҐJ&*6mz��`o��'��ê���b1dff��}mݺ�/����Ӵ|�R_T���*z�$�f;���>���x"��:
���?kX B�	!9��A�mvH&i�Xa���2TG�1x��B�Vg��“��=��<�<�����?7�����{ְ�޺�>Q��F� ���t8<��,��1�����|������VGY��$�����`՞݁�G�0-0���_=x���n�	���p��AH��n����x�	�s�V%�LeW���3��R�ت�*�G��o��j���s��GΤ�����;;X�q��C�
�P���`�p�T�_>��E�17�D|�h^�d�;-pz�����4�_z��`��
?މ�W�Hϼw���f<����?:G����u}i8�n`�1�tS��u�ec�9��t����)ِ��Ҵ�u{N�VY����5���[�t�����Ǎ7}���_��T��''k�ڵ�����d����X���s�Ơi"�f͚�9s�^z�����Q��@���s~e�XP
uY2����}"߽�>$����mذ�W�23�N-��kٲEݟ5�#O=��w^Oį���J�5G4AJQ �2����F���]ס��hh�G��N�:�F��;�~9_�2��ZFL�Tn}�Çj
��fᇻ?��.M��¢"x�ވ�ᬓ��Z�(���0�
��TT5OӔ銢�`��M�R�CQPJ�������M�=�J&�F��k�Z[p�H!�x�%z`Z����1�n�n�w��j��7��ZZ�a�Z!I'|></l6;d�Qp���P�1B�9���@Vv֠��}��������ǟڴ���kMKs�
�Պ�.Z�����X������d�}��������&�	V�
f�&�	�s������I:�m�X@)!�p��x款��.��jO7Ζg�+KD�X��{�����^��v[ZV��nI��UUc�~����%!--
���R
Y�����P��B�Q����7]_>.�hBJ*��(B�4躆x\ìY�����/,|���íC��u��	��������9dY�@�Q+r�Dl1[*��,�(��Wz�u�u��Ng��m���kow��
���T*B��
Q��ۄ��l6�7y�?u��X|��;����y��/X��/\���;�������}V�#iB�l�<u󷿣4��/J&�%%�^�ꪯl�}��k���௮#�\)��H �g�Z7O�o*ι�v_�iӦ���nܸ1��^�<�_���B_������<�IEND�B`�assets/img/amazon-64.png000064400000011402151336065400011045 0ustar00�PNG


IHDR00W��tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5.1 Windows" xmpMM:InstanceID="xmp.iid:7E8F0ED3E2FA11E4B071BC1249967C98" xmpMM:DocumentID="xmp.did:7E8F0ED4E2FA11E4B071BC1249967C98"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:7E8F0ED1E2FA11E4B071BC1249967C98" stRef:documentID="xmp.did:7E8F0ED2E2FA11E4B071BC1249967C98"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>"��.vIDATxڴZy�]�y��s��y��<cc��&6�(@L�H�J����꒴���@E%ڒ��%U#RUm�:Q��D�i	�$�R0�,��1��㉍�yo�z�sN��7���gl��y˽��������"[?�}�DW]@����!w�M:&r�sԤ�tǧ����h��ÒDaX�T-'cʨ�Ebc�������nF���9'�^3ΥD�v��*QD���K�b�����H*X?B��a���\Qz��P�N�'G����p�!I�1���oi�D&�F�:�8n��VM��C�:��Ȝ��Hf��T5!�3>��dT!B�&��TE�������T@�Wc|�Հ�ΰ9"/����U��}���*`�6��h����� Sٛf��j�_�q!�
��cE�`갠I�tcך�֡1�V�X�ί
a����N�Ɏ�i���,V�[��zn|�o�e�Zܛ9=ƹ�N��QD�ԄB{\A�Ia�O��b�]�~E���ś�Us��ZVvS��절��[]7_���bV��B<�3^m��o��7
�O��ԕ�q(�3�&c:��ջ86G�;W@���4,}.!�4�����s�L(��6T�(�x��F_�<��v\�k�
qX�%c�X�bѽ@GR��vcD�e�H��
T��?���s~1e��`+��oE�w�u-B�j<�(��ReԚD�p1\:_x&-F��f��h��Y�.���~z��P�4_�C~0뚯8�<�<(�9ZG^6��ڇ8�v_�8��]eڡ��2�0�c-�4�?��>;9�A+��_6a"CArO��{PMu(�e��V\�h6^޼,7>1[g`!������Plq 
߅����6[{`t��r���飢T1�'���&0T@8ݟwM�az�<S���r
�/�l;��	6[>]Y��a&���2�+؄���%���`�'ʿW$�b���$��Q^�j������z�t{���[�#I�c:���ބ�\b�ƍ��5'*p��kN��c3 �h(�J�2�wp��3�	�X]^|+�
Dbh��]bn%^�涇(��$���}�r� W�syW?`�&)���H:aCT��
�#�nx�E�E*@߽��ƆG��{ȹ�$F߿��ݰrǮ��mߤ�U�M:lt�|�\@b���� ��&7E.j�N��~�c�$�W�'ޱl�GM��~�����zOP�Aߍ_Å}To�'�����Q|l�u��P���\#s]]F�]�sRaψ�����$7޳�pg��/�P��{��—I�.tFn��Kn%u��{,w��ۈ#G�����*Ph�$�=�,E0��m�Ee��Zf��6��BT)�Y���Wj�B2{����g�2w�*�q�@�a���I�5�
T��_Ȑ����6�?�O�eq�2h�l�)u7u`+�?H��R"tt����Ņ^�VRzh�^X��^�z�bΈݙ�ï*i�D�=����ԓ9��ߧ���I(���?��ݺ�0�0��E���ߦ�"�Y6�7I6?���9�E'�dQo
�o%`}o�(͉]��P�L�N����a!^��y�����B9��p��	yy��,�%Ӵ8mF
=�[iE!A#r��� �� 1p����0��ڀD;�OL�/�8�oV벺w��U"�&�Ur���U7"���nm�6�����p{�a�~U��aW��吼|�f�~��<�-��T�D��t!�v�|�a�����,"5����
w�w."���
�9I�-d�@���iԨ�[(s���,�I���,���x����3P���U��X_3��?s����<gn_y�
$r�*���f�ho�]H�!$�op�E�G�2(�@$�4���Yb����n�d�:=-.�%��P��.=}�u��$KXu�k)����"��.���AI")'��u�׳��=A�G�7j䭾�d�҅K�5$�F1��s�!;��D2hw�$�����C9��'j��#c�'^qM�����H��bQ�o	]n��F��	��I.%�g'O��U���:,��A��am�>ܱ孆�<���]l%S�$�`�}c�~xh���G}k?�����՟�p�9j��9�SyqneHv|�
N)�,�2nV���º#��m4�i��`>d���l����N��j�8��z�$���\׷���`�G��G�����^49�B��1g8ɳ�>O�ݏa_���bM�x�
��"�g�0���~��A����<��f�HZ�S��T;����Km?M��'iz�=)�,;N�ꣿE�/_B�;A�?�����E��'i79SL��M�XQ�;�͒:%��]�A��ф����i�pG�bw�XB���7��Dl'+#��ӟ'����C��ߦ��~���m��$՟�넝F�/R���S��'��`�;({ŝ�Y�	��q�ا� �a��1�E�
�0��[�G�)n����.�έ2/��y�їp��<�.��%r6}E�"2��"
Οl��ZȮ��1��*o`Q:�5��B;��[v
��1��Mn��]|eQ��7#�ߠ�Sw�;�^�m��z䣩a�V������{�}Ŧ�6�{��
6��Խ-���B�(��FD�ɹbԅK��u��� ����
�}���k����y8E�D��"2��4
�Cz$��X䑥����I�ݢNs�W����`�c��C������9�Ȓ5�s(O_�ͬB����&|���W�8\F�W*IY�T;�?F.�_�E–lZ�̹a��䥷��^���"�ƉZG�����'�^����
��tASS����	j��-R'������T�@b�X1ub�遬C��-�@���$ǿ��QLusL�����[}��>nI�,ki���n"a������q��<C�ij��:Y#��6��)p�f��ϧ�*��+@�>�A�f�_�h$�m�Dv���i�?.��c��25�pI=�o;�W�}N�辞ZF�b4-\@+�`�g*I��P8
���t����C�d��XCX��$�P
{�B�ڸ�$���SK�u�ysY�3w]k?�Hc>6oM���FwTV�ΡP��XӇ����P�{�r���4��qJt�ѭY�� sA>d�7�l��9�V��V�d3J0�s�#���M�o;�+�p�O��οʀO��|��1R�m���_o��0�`�er�REn7��Zqwu�PO�-��!<,?>���r%�N[HQ�C�y���6G��}���RaeA�=�-�=��_��U�qC#�!�ZȔumYg:�X���Y��S���q�@ƥ�+Y�{X~�V��Fw����EQU��-Ƶc$U��К�My�!���i���2��*��H��
)NK��Ϻ�
�&�5�^�?C��>���}�d��D�5.���rC��gd6�cjV��T`�+�Cy���
z�����uֺ���"�C�t�yl�Z�C�X��2�
��#x�MI�������Z��!_���pZ���a*R�D�ׂv<�r�@ѝx_�Ʒ'Hh�����[���H�>K��L7bf�A���s�	ߥg0���v��y�s�u.��<�ǬɢY;�Cf���!�d���������H��7@�|@��[� @hyL�Tނ�UX�(��n�<�}H���X��%��Mg'�np�9?'>.1��&J�~Cf���u�ΠC�lH��B�2d�X��F�	�"�sv1!v�xf

�U�-�DY���<���?���E�8��x�bQ
u\�
a+aѮUڟ ��c�	w��Hw�^%���M{n�XԾ3�����w�|Z�H�V=�[�����Ì��M�]krM��b�c��E�oڞ
�0
e�q��)�1��Lq=���+��5IIEND�B`�assets/css/images/ui-icons_2e83ff_256x240.png000064400000012353151336065400014435 0ustar00�PNG


IHDR��Nzo�PLTE,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��,��ˬ�MNtRNS2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
��b���lߝF>n~�hh�H�_IDATx��]c۶�JZ�����gv�,ٲ&{?:-[3��Ү��3�q�����J�O����p��t�B���	�}6x9��sSm�C��Xȸ��������R<QήF� ?S�����Hf+&�y��t�SE-G��8�>�A��m٪d���� ~Z#��s�կ6�'�аfN�����(
���0%��#r(DXXK�Q�L�^J�*�K����ʱzT��A�����~�yd-TLie�S�S(K��ň�< ��b��ۜ���E%N����S~�._��c�$��QUb=+C�5���>W-��Z�8BH����ؗ+$~��ǫ�+e����9*9�J*�VD���o�����q�@�.��i���
���o���v�R~S��H�6w�_v�
cU˂5�y�@~�Rת��#�J9��"�!ꎾ�J�:�d�$�.
�3@nVew��%�w�>#��v����S��v�ᤵ���#,e��]Tq�/��|�c����թb�fpp�ߋbH1F��S �s��L��(?"�����#Y����P�)�C6C\$V-�A��$���b��ߏ�3�R4��m��`G\�����~�
c:C.��U�a���s�uC]7<e7,��4	�����ʯ�U���W��-���C���v7��uT{%*��9��"��V���z��O�F��U�8�ь)Y~�+�%�X�4�STaWD�SW��eju�^�ѓI��Mg/_M�oe"�&�~m �'�
s�O���W�7�-����;�3�x�f��7y�r��#C���+9ckM].�8qY�d#R��`�������kaU^k���#�/P?*u�$�~����HY���52��֟�����^|������b�{|a�,?k��E/v���kL��?��o=;d�xl��E�{��A:?a�M2�$Gq�B+�h�C>t�e_O8���d���0wPl�E�`�
�AAɂ��[�.����zd�aVĀ�#O�4&���k�?���V����
���`]�ْP�#N�J7Ybe�7�,H[�F�2�4eY���S�ۉ|�B&�]K�R�˥ŶAT�S��6?��h{����9���"�\��v���r9U{�q�v�k�����/�0�W��+?����q�"GW˨���`wͤ��W�A����F�-�`a��e�]�n"��bMB]�p+5�޿��
3�G]SÎ.1Yax��)��Ã��[��<���+�>��sm���T��؆*�sɴ���,K۶�\����ij`e��rY���9ya�Щ
�L�|Ϟ)L[�T7G������R���P�P��$�/0���*vS��tWF��CE���/2:��ht�L���?�8;>l<Q7F��v��A@l����ˠU������lF(�t�6��?��sS�\���VOø����vW���"�O�У
�3�u������&�Xz����xv3\w?�w?=2�V\����@%��q���@F[�;����U(
�R�^8��k�?tK���wJ(�料͋t�3T��
K`k�������"B=����(���Y���{��"N�|��X�H=P ��22��������� }pw=��l��<��]�T�-��c�H�̍�s�&�I	d<x�1nͷ��p?����5�Q/^O<k-��Ed:��z�/'�<���I=�jZP���s'AV��-�fT���}�G2v{�,|XA����6A�NYɸB���z�ٺ����r"V�S@��(���|�?���@0�:���㊏�;���q�;����ճ�v�
����.8of%zSRO���F�F�x���&\�8� w�O�(��_�G���
ؽ-�?��q�w��Ǐ�Y�G4��T+N[�>�fYd���6ɩ��}{Zi��uk���D���Jӟ���S\^zL,uF��t��Kyh��}j��drf$��3�<A10�ǟ{q>���:Cd��.��U��ٽ{�A��ojRN��	�簐��џQ	�S�����/]��VT��q_�G���9�sE$Zw���a��͏�FU�H#���	e G��1�Zw��V7>�na�O[��+ʀ���4�HF��^�
׆����O�Nf����Tpza��ƀV@O//���S��]S�ύ�wx�Tn�ځ�ZG�#N�"����a]s���՜�X7
�`����G{v�´��?�V��W_���FYͩi+�U'���4V����7��%yT`뇪r��X�f�O���o�@�Ao>W��n2�K*�fǦM���h:�7��5�M�+Џ�y�N��<ÊP	Lon��>�h:Ǚv�I~�9�畺K 5f�
d��ķc��=�8��983��K4j�v����y�i�|@v0cN����������v+̩1�W���rJ��<=Q��m��[=���(�A3L����J��L�X	���H˦�6:խ�ziJ�c�'��f&����L��t����v}1��5��|���%�۶�%�2���oC��m ���_x�\���c�)V�aF�3<nF|w�a
���,��~����sK�p=��Bb֊v�91��n%c�����N��X8��;���T�!�C�	���7��Ǎ0��=���v�wOӡ�����O?a���1s�x�22�az�2p#�O��|@UT���ǝ�`�S�M�\�7f����~7��
�!�`�Y��QP2 ��A�c�%�� ���TY��{�����mWn��A%���D(��q��Q����ݤ]���^�JD�`��A0�( x���z������A�{�,����+���z+
����`��x<x������ޕ�<>p[��<�o'�
av}f�PK���	@t�âxfj�8�~?|h�pP��'�222:�^v�2�`v�{'`���	�
�^}9@�#p����=�,'�@H�C~XH���U0|�bO∀|c���p	=���kc����w*##㡣�7�K>��oǽ�$\�����F�F�O�"v�������p�30��F�z8L�&2pG�>��0V~X�Q���O���~��!E�
���0t$��{�
���
F0�{F�「��{��bZ),\�(<�`��0��o����%��J�VA=��#J֟߆��L4�����lO/ܫbĪ���(X���&����ܮ��`���X�Z�w��222���>*Dg��)�	����0�ݱ���*�ouJ(=���M�^ 8IV },�f�����>�+!�>��?� ��@����e�jB�D8�pO�agd|P�T�q��g�$��Ǐ8i�)�s�0,C~\:U�V�6��U�
\��`�77��`V1�����c@f�N/�ɪǿf���PʃV]*h������w.�藢�{7�iH�u}��Jn3�����@ �ve����b�d�?w�P���y�W�˂����E��rٵ��yI�*�RV2~E�T�~�=N���8e�!	*{�,F�-���:.Y���g (����^!.�j��4�^6�Ե�5�o	�B}|~�[
�]�;CU�
[�R�)���a��T>�7���/{�Ky&��Ϥ�{QO��y�)��#�â��r�ύ~��a!�&W���z
Z��졽�T��ץ<vhA�'^��ٕg"����Ӗ���zT@��z����S2Z���9}T Ua�-����H��M�N7*����g��1;n��I�
fp�Bk%������y�!է#]@	X�5�B����W�@�_aEW�&���u@�Ѩ��eC�N�絷6�!d�Y��GF'����sÀ�rA��/X&��f�ӂ�Xt��V_���B���_��W�o�^��-�9
�m����)�K-�}���X�l:}��oB��U;M�8���N)�S�_N��]�����rdɕ���/N�����t�3��
_�B�
��gZ��z>��R��ҥ_�s��]4"���oE�D��AwU�T�8�H����v��o%sn\H�y$ȴ��h��z��4q�R��;yu5:??�@�V'.�vl�c�l77��^���W����Qg���Z-&�5�_�D��?��1E�����B��T���N��N	ٞ�qJ�/{�^��b�!#��{ ��~�M�{��x/-J��n��)��Ql�jk=%��4���6��}����t��
�yX�����3KȊ7D�:��m�����{μ���0-��2�TU�L��PĆ��X@ �׎|M#�D��/v�z��X�p�<� %#������_%�=���/�9�(@C@��	��YM��kf�#�-r�@�C�ʭd8��aG�@�ƌ<���@�޻@Fƃǃ~?l��l�dž�/��wl�T���L��džR�n��F����Wb��A%����I�gש���½���'�39R�^�MR�V��֡���U�u�C
���+���0�i�=��YS��}�!�����u�ۖ��,�V/B�5���,
���.�C�|��r�������������	Z^;��0p&�h"��?ȏ�o��7~ol�ap,l�r_U��a���FH\���zh�������+G_mB�[޶��C�շ���jSz��322`t��裇����:����{���G�C��@�{E�
�:�\����^��	
�?*;ۢ9�/�B�Ao_���
@����[@�] Q���lu��f;���s���IEND�B`�assets/css/images/ui-bg_glass_55_fbf9ee_1x400.png000064400000000170151336065400015373 0ustar00�PNG


IHDR�oX
�?IDAT8���1
�0Bѯ��l��`�6C�s��<]�:����[��&�B�A	��e7�l�QJ��ŜQY�*IEND�B`�assets/css/images/ui-bg_glass_65_ffffff_1x400.png000064400000000151151336065400015456 0ustar00�PNG


IHDR�oX
�0IDAT8���! �����+	��̼��J�HR)�[lk�=O_��(�<`�
H�"�IEND�B`�assets/css/images/ui-icons_454545_256x240.png000064400000010421151336065400014204 0ustar00�PNG


IHDR��IJ��PLTEDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDDFDm�:NtRNS2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
��b���lߝF>n~�hh�H��IDATx��]�b۶�H�儒-{i�ZK:g�lk�n��-��tI��q�q?  E�$�dK>$�>�;������P�Z����s�V��h!�Sy��0E�0}H�)-���tk��o�ܪKp�\R�Ϡ ��.�E�7��
�)�*V;~�Pe��
Bx�*�,=$z��Dؾ���� ��J����Ҹٻ����9�{ ��������Ǹ�Hp�qW@��"2'���B��[�$�� @T��i�H�/��b٥9�6�!�X�Hq`DE��*R����
HV!�%�����;�������"����
�i��]�dddddddd�����4y���5 ��	�Rb�@(�8���Cd��Ū�ݡ�,�@T�@i���b�rq0a�lX!�������p��e�,	��=4bW �{�
5���Ƭhu~�(�Q�^@���3�=��"�b��5XC@J����C�����T��7��6�������q_����5��@,r	šɩ�D�)�T�|�O��@�
ON-ՙ��	�������[n@��R���X�Im�݋(���F �@�?��=0��puL��;g$��@6η��
�K`�>п� @h գ�KV�n�"a�"���%l�@.v�$/��U^��G�:#`�`�� �u��TtK��~�ŋ�Z��5T���%�k�x�����������k��]\*�Q��
,҇���B��44�OXK�|�y��g���+_M�(�lоE�O���
 V$�T1BX���b�-�|?@ �f��B�Xr�%'@ҹA\�I��J,}��BBc��\V
��r����h(�]tI��^���}���o�צo�S3�	";��ʙ���b}��"߰	��){b$�������Gwwݾ����������a���b"��)���T@p��F_er6JvШ���"m�ޭ�M-��d7��6��x����˰6ӥ;��/����`>KrP\��_���^u�1%��O�T�M���.�}���Q3���.Nس��}��)���>����-�w�`���a�����+sy$���t���)�N�bFFFF�Be�j��nN��Vn4��,��A*��X��*��5��>��P���G��a��3	�{�oB�
�&<�L[���Nc.���ö�i=�`�Q@�d���
͆I��.I��l�`\t�[< �Cit�48��4�-r���+��f��쑱�B��CB ��MH�	i����y}���>���rx����p|z�;B��Ǐ;�b�u��r���c�K����4t��z��1�G~����`���ؚ��K��|	̔>��ۡ��O$�����~
�Ao)���0pzz
�}i�����`;AD�����m8n:�cf�A@s7�����L��� Z�/..�����h8�o��r?
�
�N��9��3B��~o_��'`��o���pO-��
:�TG�	L;��7���]`���B���%�˛>��*wT���pM��0H�}&t����^1��'Oq�r'�2P�͡��+�z,tIW''|en������=dzg��R�m�[N�S�t�K{��҉m���ؓV�t�6���ҲR`����ζN�&}�B	U��(�r<�qȁVyr�rA**��دzg6�D#��	�����YP�`�����v���s���~(�z�Ml�e�|u���Q�a�*}�+T��
�����R��Xc"+*�N�l�N�hc�Ft�<N+;-}�،Xtٕ$��à^��|uv���*��~�'E�_�5���1�q�s�*�R�`�OΒ��9�#x4�4�9�#�������WHۏ����Z��)]0�`p�<��ߝ��N��oY{�4�7��6�ǹ�>�ۗ&��������1%�Q''���?�l��׸�+&�r{�j�N�಻���4�)���`�N狌�.��߭�� ���ǣ������������)q	�2�?���n�3H�b��`�}� ����.`�������pqY1�e_b����u�7��e+N�_F����(�D�T��,���L}LL�r��mP5��|��x芥1�c���x DAb������`��M(��7���NED�~<v\	%,�ߚ/����p���R��~/^����l��np�
��7t����0_���0���l4�����_����b�0�MWΦj�m����б�Ɏ�l
|re����
�ȫ`B-����v.i��Ro�x}�
�)����%#`�Ђ�R5C���A�2su���a���sYy3��=jaeoI�7�~�.�plA��΃�
`O��)��	^�>��Mz�	�+4���BXd.��Mz��v͈������P�d8�p��<6?��8�N��*x����.��6ڍ6G����F�Z�����)���O���	!��l�S�s���h����ss�N�p8�`'�0�/<����s���}�.�@Ǩ�s�7ξ�O۟V�D���a5��a�v��]������m1��+���3��y�6�۠���>@�u50��P�s����5��1=��=�p�� *��KV�ҫ܂�����ݻc$N�4�(�X�r2###c-��賟L���δ�>��]���5�.�s���Ys�1��f0�;�'̨��Y�g銛�{�@9��	���`aC(��=%b�o�2��=���n��1�	j��B��o��S$n���#���m����=i��0�c���������i9�}�oI��	���q�T��]�W%.��(��؅�]z�\�x�
f��"]o��'u�䫵�t�k{�v;A��C3ֆw��w�R_#��X��(x��ҋ/q%��W��������hp��k_I�X���'b��/fX��K�i�"#####�QCL�i��2t��
���5���L0
����Qi�H�2;y�T�Ook;ע�ٶ`��R��Ng{z�y�!�Kx�����m�?A(v��U�~���mL�(`o/!n���mX��-{�v����[�� d�w�=�n「�������sdw��z��n�(��}O�y�~����m�
���?XU�;,���V'+��V�&�J�R��Z]᧭�:����zC'��-߆����@�y
�4���u���`Vۓw��ъ#��zP@Q�
N>2/��{�\o)����W���~a�3xL�w
:_Q�;��=p�ּ�dt���\'8�����~3�SRP���6��y+�������X�����Q�*��޺r
����̗ѭ*��޺r
g��l�/�\U^��u�$����|mb��Vn����w�\V��|���D�͊NVN���y��7�������k<;��/�E}?E*dzg�O ���~���g��/9��6����f
c�D}%��g$�Q�G�7�o��)����UJ���o�,O@�0߾Q(����;�b����w����:5�	�N�wR��N5�I�y'K�?}��:9�m��ֽ��*���@f�@jU9�m���ҫ���Í�{����$�ؗ�}��dF���p��|%!DdF��>����}G��{���@FFFFFFƦQܞH �
�����3
��u	���M�o�����~�vy�}�m�wz<�7���nP9�r�Wk���u=����|��_�n����z쿳}@���IX�n�����?��s<uPIEND�B`�assets/css/images/ui-bg_flat_75_ffffff_40x100.png000064400000000262151336065400015357 0ustar00�PNG


IHDR(d�drzyIDATh���1� �R��	7��(Ț�����V��`%X	V��`%X	V��`%X	V��`%X	V��`%X	V��`%X	V��`%X	V��`%X	V��`%X	V��`%X	V��`%X	V��`%X	Vj��)2�NIEND�B`�assets/css/images/ui-bg_glass_75_e6e6e6_1x400.png000064400000000156151336065400015241 0ustar00�PNG


IHDR�oX
�5IDAT8���1
 �����y�U�X��H�a��@�[�{UU�u@��7���	��D�FIEND�B`�assets/css/images/ui-icons_cd0a0a_256x240.png000064400000010421151336065400014462 0ustar00�PNG


IHDR��IJ��PLTE�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�FcNtRNS2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
��b���lߝF>n~�hh�H��IDATx��]�b۶�H�儒-{i�ZK:g�lk�n��-��tI��q�q?  E�$�dK>$�>�;������P�Z����s�V��h!�Sy��0E�0}H�)-���tk��o�ܪKp�\R�Ϡ ��.�E�7��
�)�*V;~�Pe��
Bx�*�,=$z��Dؾ���� ��J����Ҹٻ����9�{ ��������Ǹ�Hp�qW@��"2'���B��[�$�� @T��i�H�/��b٥9�6�!�X�Hq`DE��*R����
HV!�%�����;�������"����
�i��]�dddddddd�����4y���5 ��	�Rb�@(�8���Cd��Ū�ݡ�,�@T�@i���b�rq0a�lX!�������p��e�,	��=4bW �{�
5���Ƭhu~�(�Q�^@���3�=��"�b��5XC@J����C�����T��7��6�������q_����5��@,r	šɩ�D�)�T�|�O��@�
ON-ՙ��	�������[n@��R���X�Im�݋(���F �@�?��=0��puL��;g$��@6η��
�K`�>п� @h գ�KV�n�"a�"���%l�@.v�$/��U^��G�:#`�`�� �u��TtK��~�ŋ�Z��5T���%�k�x�����������k��]\*�Q��
,҇���B��44�OXK�|�y��g���+_M�(�lоE�O���
 V$�T1BX���b�-�|?@ �f��B�Xr�%'@ҹA\�I��J,}��BBc��\V
��r����h(�]tI��^���}���o�צo�S3�	";��ʙ���b}��"߰	��){b$�������Gwwݾ����������a���b"��)���T@p��F_er6JvШ���"m�ޭ�M-��d7��6��x����˰6ӥ;��/����`>KrP\��_���^u�1%��O�T�M���.�}���Q3���.Nس��}��)���>����-�w�`���a�����+sy$���t���)�N�bFFFF�Be�j��nN��Vn4��,��A*��X��*��5��>��P���G��a��3	�{�oB�
�&<�L[���Nc.���ö�i=�`�Q@�d���
͆I��.I��l�`\t�[< �Cit�48��4�-r���+��f��쑱�B��CB ��MH�	i����y}���>���rx����p|z�;B��Ǐ;�b�u��r���c�K����4t��z��1�G~����`���ؚ��K��|	̔>��ۡ��O$�����~
�Ao)���0pzz
�}i�����`;AD�����m8n:�cf�A@s7�����L��� Z�/..�����h8�o��r?
�
�N��9��3B��~o_��'`��o���pO-��
:�TG�	L;��7���]`���B���%�˛>��*wT���pM��0H�}&t����^1��'Oq�r'�2P�͡��+�z,tIW''|en������=dzg��R�m�[N�S�t�K{��҉m���ؓV�t�6���ҲR`����ζN�&}�B	U��(�r<�qȁVyr�rA**��دzg6�D#��	�����YP�`�����v���s���~(�z�Ml�e�|u���Q�a�*}�+T��
�����R��Xc"+*�N�l�N�hc�Ft�<N+;-}�،Xtٕ$��à^��|uv���*��~�'E�_�5���1�q�s�*�R�`�OΒ��9�#x4�4�9�#�������WHۏ����Z��)]0�`p�<��ߝ��N��oY{�4�7��6�ǹ�>�ۗ&��������1%�Q''���?�l��׸�+&�r{�j�N�಻���4�)���`�N狌�.��߭�� ���ǣ������������)q	�2�?���n�3H�b��`�}� ����.`�������pqY1�e_b����u�7��e+N�_F����(�D�T��,���L}LL�r��mP5��|��x芥1�c���x DAb������`��M(��7���NED�~<v\	%,�ߚ/����p���R��~/^����l��np�
��7t����0_���0���l4�����_����b�0�MWΦj�m����б�Ɏ�l
|re����
�ȫ`B-����v.i��Ro�x}�
�)����%#`�Ђ�R5C���A�2su���a���sYy3��=jaeoI�7�~�.�plA��΃�
`O��)��	^�>��Mz�	�+4���BXd.��Mz��v͈������P�d8�p��<6?��8�N��*x����.��6ڍ6G����F�Z�����)���O���	!��l�S�s���h����ss�N�p8�`'�0�/<����s���}�.�@Ǩ�s�7ξ�O۟V�D���a5��a�v��]������m1��+���3��y�6�۠���>@�u50��P�s����5��1=��=�p�� *��KV�ҫ܂�����ݻc$N�4�(�X�r2###c-��賟L���δ�>��]���5�.�s���Ys�1��f0�;�'̨��Y�g銛�{�@9��	���`aC(��=%b�o�2��=���n��1�	j��B��o��S$n���#���m����=i��0�c���������i9�}�oI��	���q�T��]�W%.��(��؅�]z�\�x�
f��"]o��'u�䫵�t�k{�v;A��C3ֆw��w�R_#��X��(x��ҋ/q%��W��������hp��k_I�X���'b��/fX��K�i�"#####�QCL�i��2t��
���5���L0
����Qi�H�2;y�T�Ook;ע�ٶ`��R��Ng{z�y�!�Kx�����m�?A(v��U�~���mL�(`o/!n���mX��-{�v����[�� d�w�=�n「�������sdw��z��n�(��}O�y�~����m�
���?XU�;,���V'+��V�&�J�R��Z]᧭�:����zC'��-߆����@�y
�4���u���`Vۓw��ъ#��zP@Q�
N>2/��{�\o)����W���~a�3xL�w
:_Q�;��=p�ּ�dt���\'8�����~3�SRP���6��y+�������X�����Q�*��޺r
����̗ѭ*��޺r
g��l�/�\U^��u�$����|mb��Vn����w�\V��|���D�͊NVN���y��7�������k<;��/�E}?E*dzg�O ���~���g��/9��6����f
c�D}%��g$�Q�G�7�o��)����UJ���o�,O@�0߾Q(����;�b����w����:5�	�N�wR��N5�I�y'K�?}��:9�m��ֽ��*���@f�@jU9�m���ҫ���Í�{����$�ؗ�}��dF���p��|%!DdF��>����}G��{���@FFFFFFƦQܞH �
�����3
��u	���M�o�����~�vy�}�m�wz<�7���nP9�r�Wk���u=����|��_�n����z쿳}@���IX�n�����?��s<uPIEND�B`�assets/css/images/ui-icons_222222_256x240.png000064400000010421151336065400014165 0ustar00�PNG


IHDR��IJ��PLTE$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$$"$�ÈNtRNS2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
��b���lߝF>n~�hh�H��IDATx��]�b۶�H�儒-{i�ZK:g�lk�n��-��tI��q�q?  E�$�dK>$�>�;������P�Z����s�V��h!�Sy��0E�0}H�)-���tk��o�ܪKp�\R�Ϡ ��.�E�7��
�)�*V;~�Pe��
Bx�*�,=$z��Dؾ���� ��J����Ҹٻ����9�{ ��������Ǹ�Hp�qW@��"2'���B��[�$�� @T��i�H�/��b٥9�6�!�X�Hq`DE��*R����
HV!�%�����;�������"����
�i��]�dddddddd�����4y���5 ��	�Rb�@(�8���Cd��Ū�ݡ�,�@T�@i���b�rq0a�lX!�������p��e�,	��=4bW �{�
5���Ƭhu~�(�Q�^@���3�=��"�b��5XC@J����C�����T��7��6�������q_����5��@,r	šɩ�D�)�T�|�O��@�
ON-ՙ��	�������[n@��R���X�Im�݋(���F �@�?��=0��puL��;g$��@6η��
�K`�>п� @h գ�KV�n�"a�"���%l�@.v�$/��U^��G�:#`�`�� �u��TtK��~�ŋ�Z��5T���%�k�x�����������k��]\*�Q��
,҇���B��44�OXK�|�y��g���+_M�(�lоE�O���
 V$�T1BX���b�-�|?@ �f��B�Xr�%'@ҹA\�I��J,}��BBc��\V
��r����h(�]tI��^���}���o�צo�S3�	";��ʙ���b}��"߰	��){b$�������Gwwݾ����������a���b"��)���T@p��F_er6JvШ���"m�ޭ�M-��d7��6��x����˰6ӥ;��/����`>KrP\��_���^u�1%��O�T�M���.�}���Q3���.Nس��}��)���>����-�w�`���a�����+sy$���t���)�N�bFFFF�Be�j��nN��Vn4��,��A*��X��*��5��>��P���G��a��3	�{�oB�
�&<�L[���Nc.���ö�i=�`�Q@�d���
͆I��.I��l�`\t�[< �Cit�48��4�-r���+��f��쑱�B��CB ��MH�	i����y}���>���rx����p|z�;B��Ǐ;�b�u��r���c�K����4t��z��1�G~����`���ؚ��K��|	̔>��ۡ��O$�����~
�Ao)���0pzz
�}i�����`;AD�����m8n:�cf�A@s7�����L��� Z�/..�����h8�o��r?
�
�N��9��3B��~o_��'`��o���pO-��
:�TG�	L;��7���]`���B���%�˛>��*wT���pM��0H�}&t����^1��'Oq�r'�2P�͡��+�z,tIW''|en������=dzg��R�m�[N�S�t�K{��҉m���ؓV�t�6���ҲR`����ζN�&}�B	U��(�r<�qȁVyr�rA**��دzg6�D#��	�����YP�`�����v���s���~(�z�Ml�e�|u���Q�a�*}�+T��
�����R��Xc"+*�N�l�N�hc�Ft�<N+;-}�،Xtٕ$��à^��|uv���*��~�'E�_�5���1�q�s�*�R�`�OΒ��9�#x4�4�9�#�������WHۏ����Z��)]0�`p�<��ߝ��N��oY{�4�7��6�ǹ�>�ۗ&��������1%�Q''���?�l��׸�+&�r{�j�N�಻���4�)���`�N狌�.��߭�� ���ǣ������������)q	�2�?���n�3H�b��`�}� ����.`�������pqY1�e_b����u�7��e+N�_F����(�D�T��,���L}LL�r��mP5��|��x芥1�c���x DAb������`��M(��7���NED�~<v\	%,�ߚ/����p���R��~/^����l��np�
��7t����0_���0���l4�����_����b�0�MWΦj�m����б�Ɏ�l
|re����
�ȫ`B-����v.i��Ro�x}�
�)����%#`�Ђ�R5C���A�2su���a���sYy3��=jaeoI�7�~�.�plA��΃�
`O��)��	^�>��Mz�	�+4���BXd.��Mz��v͈������P�d8�p��<6?��8�N��*x����.��6ڍ6G����F�Z�����)���O���	!��l�S�s���h����ss�N�p8�`'�0�/<����s���}�.�@Ǩ�s�7ξ�O۟V�D���a5��a�v��]������m1��+���3��y�6�۠���>@�u50��P�s����5��1=��=�p�� *��KV�ҫ܂�����ݻc$N�4�(�X�r2###c-��賟L���δ�>��]���5�.�s���Ys�1��f0�;�'̨��Y�g銛�{�@9��	���`aC(��=%b�o�2��=���n��1�	j��B��o��S$n���#���m����=i��0�c���������i9�}�oI��	���q�T��]�W%.��(��؅�]z�\�x�
f��"]o��'u�䫵�t�k{�v;A��C3ֆw��w�R_#��X��(x��ҋ/q%��W��������hp��k_I�X���'b��/fX��K�i�"#####�QCL�i��2t��
���5���L0
����Qi�H�2;y�T�Ook;ע�ٶ`��R��Ng{z�y�!�Kx�����m�?A(v��U�~���mL�(`o/!n���mX��-{�v����[�� d�w�=�n「�������sdw��z��n�(��}O�y�~����m�
���?XU�;,���V'+��V�&�J�R��Z]᧭�:����zC'��-߆����@�y
�4���u���`Vۓw��ъ#��zP@Q�
N>2/��{�\o)����W���~a�3xL�w
:_Q�;��=p�ּ�dt���\'8�����~3�SRP���6��y+�������X�����Q�*��޺r
����̗ѭ*��޺r
g��l�/�\U^��u�$����|mb��Vn����w�\V��|���D�͊NVN���y��7�������k<;��/�E}?E*dzg�O ���~���g��/9��6����f
c�D}%��g$�Q�G�7�o��)����UJ���o�,O@�0߾Q(����;�b����w����:5�	�N�wR��N5�I�y'K�?}��:9�m��ֽ��*���@f�@jU9�m���ҫ���Í�{����$�ؗ�}��dF���p��|%!DdF��>����}G��{���@FFFFFFƦQܞH �
�����3
��u	���M�o�����~�vy�}�m�wz<�7���nP9�r�Wk���u=����|��_�n����z쿳}@���IX�n�����?��s<uPIEND�B`�assets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png000064400000000145151336065400017244 0ustar00�PNG


IHDRdG,Z`,IDAT�cx���&�!D���J�qш��/��Cc
;��:*C��OIEND�B`�assets/css/images/ui-bg_glass_75_dadada_1x400.png000064400000000157151336065400015440 0ustar00�PNG


IHDR�oX
�6IDAT8�cx���&�Qb�%�-���7(����`bbBf!�؈���(1J���c	ܠ��IEND�B`�assets/css/images/ui-bg_glass_95_fef1ec_1x400.png000064400000000225151336065400015371 0ustar00�PNG


IHDR�_:M\IDAT8���1�0��&�+�O )B3��ɒ���	0�z`�#�����HY�����Hʈ�e|������	#�������a�GGIEND�B`�assets/css/images/index.php000064400000000016151336065400011723 0ustar00<?php
//silentassets/css/images/ui-bg_flat_0_aaaaaa_40x100.png000064400000000264151336065400015227 0ustar00�PNG


IHDR(d�drz{IDATh���1� 1���7Y$t���3�;_�TUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTUAUPTüŝc�)IEND�B`�assets/css/images/ui-icons_888888_256x240.png000064400000010421151336065400014231 0ustar00�PNG


IHDR��IJ��PLTE����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ƁONtRNS2P���."Tp@f`� <BHJZ&0R,�4���j���8D��|�������(��$�
��b���lߝF>n~�hh�H��IDATx��]�b۶�H�儒-{i�ZK:g�lk�n��-��tI��q�q?  E�$�dK>$�>�;������P�Z����s�V��h!�Sy��0E�0}H�)-���tk��o�ܪKp�\R�Ϡ ��.�E�7��
�)�*V;~�Pe��
Bx�*�,=$z��Dؾ���� ��J����Ҹٻ����9�{ ��������Ǹ�Hp�qW@��"2'���B��[�$�� @T��i�H�/��b٥9�6�!�X�Hq`DE��*R����
HV!�%�����;�������"����
�i��]�dddddddd�����4y���5 ��	�Rb�@(�8���Cd��Ū�ݡ�,�@T�@i���b�rq0a�lX!�������p��e�,	��=4bW �{�
5���Ƭhu~�(�Q�^@���3�=��"�b��5XC@J����C�����T��7��6�������q_����5��@,r	šɩ�D�)�T�|�O��@�
ON-ՙ��	�������[n@��R���X�Im�݋(���F �@�?��=0��puL��;g$��@6η��
�K`�>п� @h գ�KV�n�"a�"���%l�@.v�$/��U^��G�:#`�`�� �u��TtK��~�ŋ�Z��5T���%�k�x�����������k��]\*�Q��
,҇���B��44�OXK�|�y��g���+_M�(�lоE�O���
 V$�T1BX���b�-�|?@ �f��B�Xr�%'@ҹA\�I��J,}��BBc��\V
��r����h(�]tI��^���}���o�צo�S3�	";��ʙ���b}��"߰	��){b$�������Gwwݾ����������a���b"��)���T@p��F_er6JvШ���"m�ޭ�M-��d7��6��x����˰6ӥ;��/����`>KrP\��_���^u�1%��O�T�M���.�}���Q3���.Nس��}��)���>����-�w�`���a�����+sy$���t���)�N�bFFFF�Be�j��nN��Vn4��,��A*��X��*��5��>��P���G��a��3	�{�oB�
�&<�L[���Nc.���ö�i=�`�Q@�d���
͆I��.I��l�`\t�[< �Cit�48��4�-r���+��f��쑱�B��CB ��MH�	i����y}���>���rx����p|z�;B��Ǐ;�b�u��r���c�K����4t��z��1�G~����`���ؚ��K��|	̔>��ۡ��O$�����~
�Ao)���0pzz
�}i�����`;AD�����m8n:�cf�A@s7�����L��� Z�/..�����h8�o��r?
�
�N��9��3B��~o_��'`��o���pO-��
:�TG�	L;��7���]`���B���%�˛>��*wT���pM��0H�}&t����^1��'Oq�r'�2P�͡��+�z,tIW''|en������=dzg��R�m�[N�S�t�K{��҉m���ؓV�t�6���ҲR`����ζN�&}�B	U��(�r<�qȁVyr�rA**��دzg6�D#��	�����YP�`�����v���s���~(�z�Ml�e�|u���Q�a�*}�+T��
�����R��Xc"+*�N�l�N�hc�Ft�<N+;-}�،Xtٕ$��à^��|uv���*��~�'E�_�5���1�q�s�*�R�`�OΒ��9�#x4�4�9�#�������WHۏ����Z��)]0�`p�<��ߝ��N��oY{�4�7��6�ǹ�>�ۗ&��������1%�Q''���?�l��׸�+&�r{�j�N�಻���4�)���`�N狌�.��߭�� ���ǣ������������)q	�2�?���n�3H�b��`�}� ����.`�������pqY1�e_b����u�7��e+N�_F����(�D�T��,���L}LL�r��mP5��|��x芥1�c���x DAb������`��M(��7���NED�~<v\	%,�ߚ/����p���R��~/^����l��np�
��7t����0_���0���l4�����_����b�0�MWΦj�m����б�Ɏ�l
|re����
�ȫ`B-����v.i��Ro�x}�
�)����%#`�Ђ�R5C���A�2su���a���sYy3��=jaeoI�7�~�.�plA��΃�
`O��)��	^�>��Mz�	�+4���BXd.��Mz��v͈������P�d8�p��<6?��8�N��*x����.��6ڍ6G����F�Z�����)���O���	!��l�S�s���h����ss�N�p8�`'�0�/<����s���}�.�@Ǩ�s�7ξ�O۟V�D���a5��a�v��]������m1��+���3��y�6�۠���>@�u50��P�s����5��1=��=�p�� *��KV�ҫ܂�����ݻc$N�4�(�X�r2###c-��賟L���δ�>��]���5�.�s���Ys�1��f0�;�'̨��Y�g銛�{�@9��	���`aC(��=%b�o�2��=���n��1�	j��B��o��S$n���#���m����=i��0�c���������i9�}�oI��	���q�T��]�W%.��(��؅�]z�\�x�
f��"]o��'u�䫵�t�k{�v;A��C3ֆw��w�R_#��X��(x��ҋ/q%��W��������hp��k_I�X���'b��/fX��K�i�"#####�QCL�i��2t��
���5���L0
����Qi�H�2;y�T�Ook;ע�ٶ`��R��Ng{z�y�!�Kx�����m�?A(v��U�~���mL�(`o/!n���mX��-{�v����[�� d�w�=�n「�������sdw��z��n�(��}O�y�~����m�
���?XU�;,���V'+��V�&�J�R��Z]᧭�:����zC'��-߆����@�y
�4���u���`Vۓw��ъ#��zP@Q�
N>2/��{�\o)����W���~a�3xL�w
:_Q�;��=p�ּ�dt���\'8�����~3�SRP���6��y+�������X�����Q�*��޺r
����̗ѭ*��޺r
g��l�/�\U^��u�$����|mb��Vn����w�\V��|���D�͊NVN���y��7�������k<;��/�E}?E*dzg�O ���~���g��/9��6����f
c�D}%��g$�Q�G�7�o��)����UJ���o�,O@�0߾Q(����;�b����w����:5�	�N�wR��N5�I�y'K�?}��:9�m��ֽ��*���@f�@jU9�m���ҫ���Í�{����$�ؗ�}��dF���p��|%!DdF��>����}G��{���@FFFFFFƦQܞH �
�����3
��u	���M�o�����~�vy�}�m�wz<�7���nP9�r�Wk���u=����|��_�n����z쿳}@���IX�n�����?��s<uPIEND�B`�assets/css/modal.css000064400000010321151336065400010444 0ustar00.duplicator-modal {
    position: fixed;
    overflow: auto;
    height: 100%;
    width: 100%;
    top: 0;
    z-index: 100000;
    display: none;
    background: rgba(0, 0, 0, 0.6);
}
.duplicator-modal.active {
    display: block;
}
.duplicator-modal.active:before {
    display: block;
}
.duplicator-modal a[disabled] { pointer-events: none; }

.duplicator-modal .duplicator-modal-dialog {
    background: transparent;
    position: absolute;
    left: 50%;
    margin-left: -298px;
    padding-bottom: 30px;
    top: -100%;
    z-index: 100001;
    width: 596px;
}
.duplicator-modal.active .duplicator-modal-dialog {
    top: 10%;
}
.duplicator-modal .duplicator-modal-body,
.duplicator-modal .duplicator-modal-footer {
    border: 0;
    background: #fff;
    padding: 15px;
}
.duplicator-modal .duplicator-modal-body {
    border-bottom: 0;
}
.duplicator-modal .duplicator-modal-body p {
    font-size: 1.3em;
}
.duplicator-modal .duplicator-modal-body h2 {
    font-size: 1.6em;
    font-weight: bold;
    margin-top: 0;
}
.duplicator-modal .duplicator-modal-footer {
    border-top: #eeeeee solid 1px;
    text-align: right;   
}
.duplicator-modal .duplicator-modal-footer .duplicator-modal-button-deactivate {
    min-width: 124px;
    text-align: center;
}
.duplicator-modal .duplicator-modal-footer .button {
    margin: 0 5px;    
}
.duplicator-modal .duplicator-modal-footer .button:last-child {
    margin-right: 0;
}
.duplicator-modal .duplicator-modal-panel>.notice.inline {
    margin: 0;
    display: none;
}
.duplicator-modal .duplicator-modal-panel:not(.active) {
    display: none;
}
body.has-duplicator-modal {
    overflow: hidden;
}
.duplicator-modal.duplicator-modal-deactivation-feedback .duplicator-modal-reason-input,
.duplicator-modal.duplicator-modal-deactivation-feedback .duplicator-modal-internal-message {
    margin: 3px 0 3px 22px; background-color:#e0f3e8;
}
.duplicator-modal.duplicator-modal-deactivation-feedback .duplicator-modal-reason-input input,
.duplicator-modal.duplicator-modal-deactivation-feedback .duplicator-modal-reason-input textarea,
.duplicator-modal.duplicator-modal-deactivation-feedback .duplicator-modal-internal-message input,
.duplicator-modal.duplicator-modal-deactivation-feedback .duplicator-modal-internal-message textarea {
    width: 100%;
}
.duplicator-modal.duplicator-modal-deactivation-feedback li.duplicator-modal-reason.has-internal-message .duplicator-modal-internal-message {
    border: 1px solid #ccc;
    padding: 7px;
    display: none;
}
.duplicator-modal.duplicator-modal-deactivation-feedback .duplicator-modal-anonymous-label {
    padding-top: 15px;
}
.duplicator-modal.duplicator-modal-deactivation-feedback .duplicator-modal-panel {
    margin-top: 0 !important;
}

.duplicator-modal .duplicator-modal-resp-msg {
    font-size: 11px;
    font-weight: bold;
    margin-top: 10px;
    display: block;
}

.duplicator-modal .duplicator-modal-button-skip, .duplicator-modal .duplicator-modal-resp-msg {
    /*display: none;*/
}


@media (max-width: 650px) {
    .duplicator-modal .duplicator-modal-dialog {
        margin-left: -50%;
        box-sizing: border-box;
        padding-left: 10px;
        padding-right: 10px;
        width: 100%;
    }
    .duplicator-modal .duplicator-modal-dialog .duplicator-modal-panel>h3>strong {
        font-size: 1.3em;
    }
    .duplicator-modal.duplicator-modal-deactivation-feedback li.duplicator-modal-reason li.duplicator-modal-reason {
        margin-bottom: 10px;
    }
    .duplicator-modal.duplicator-modal-deactivation-feedback li.duplicator-modal-reason li.duplicator-modal-reason .duplicator-modal-reason-input,
    .duplicator-modal.duplicator-modal-deactivation-feedback li.duplicator-modal-reason li.duplicator-modal-reason .duplicator-modal-internal-message {
        margin-left: 29px;
    }
    .duplicator-modal.duplicator-modal-deactivation-feedback li.duplicator-modal-reason li.duplicator-modal-reason label {
        display: table;
    }
    .duplicator-modal.duplicator-modal-deactivation-feedback li.duplicator-modal-reason li.duplicator-modal-reason label>span {
        display: table-cell;
        font-size: 1.3em;
    }
}assets/css/global_admin_style.css000064400000001500151336065400013177 0ustar00/* ================================================
 * DUPLICATOR STYLE 
 * Included in all admin pages
 * ================================================ */

.no_display {
    display: none;
}

.dup-updated,
.dup-notice-success {
    margin-left: 0;
    background: #fff;
    border-left: 4px solid #fff;
    box-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 );
    margin: 5px 15px 2px 2px;
    padding: 1px 12px;
}

.dup-notice-success {
    border-left-color: #46b450;
}

.dup-updated p {
    margin: 0.5em 0;
    padding: 2px;
}

.dup-updated a {
    padding-bottom: 2px;
}

.dup-updated {
    border-left-color: #46b450;
}

.wrap .dup-updated {
    margin: 5px 0 15px;
    margin: 20px 0 10px 0;
    padding: 5px 10px;
    font-size: 14px;
    line-height: 175%;
}

.duplicator-plugin-activation-admin-notice {
    display: block;
}assets/css/jquery-ui.css000064400000044275151336065400011321 0ustar00/*! jQuery UI - v1.11.2 - 2014-12-20
* http://jqueryui.com
* Includes: core.css, progressbar.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
* Copyright 2014 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-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:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-widget{font-family: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:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;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 #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.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:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% 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:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.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_222222_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_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:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}assets/css/fontawesome-all.min.css000064400000151030151336065400013232 0ustar00.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}assets/css/style.css000064400000021561151336065400010520 0ustar00/* ================================================
 * DUPLICATOR STYLE
 * Common elements shared across the duplicator plugin
 * ================================================ */

/*Global Elements*/
input[type=button]{cursor:pointer;padding:5px;cursor:pointer;}
input[type=submit]{cursor:pointer;padding:5px;cursor:pointer;}
fieldset {border:1px solid gray; padding:0px 5px 5px 5px; }
label {font-size:13px}
.no-select {user-select:none; -o-user-select:none;  -moz-user-select:none; -khtml-user-select:none; -webkit-user-select:none;}
hr {border:0; border-top:1px solid #cecece; border-bottom:1px solid #fafafa; margin:10px 0px 2px 0px;}
i[data-tooltip].fa-question-circle {cursor:pointer; color:#C3C3C3}
i[data-tooltip].fa-lightbulb-o {cursor:pointer; color:gray}
span.btn-separator {content:''; display:inline-block; background:silver; margin:2px 3px; height:25px; width:1px; vertical-align:top;}
a.grey-icon i.fa {color:#777}
i.grey-icon {color:#777}

.no-display {display:none !important;}
.link-style {color:#0074ab; cursor:pointer; text-decoration:underline;}
.link-style:hover {color:#00a0d2;}
.no-decoration {text-decoration:none;}
p.description {padding-top:3px}
.dup-guide-txt-color {color:#b0b0b0;}

/*TABS*/
ul.category-tabs li {cursor:pointer;user-select: none;}

/*BOXES:Expandable sections */
div.dup-box {padding:0px; display:block; background-color:#fff; border:1px solid #e5e5e5; box-shadow:0 1px 1px rgba(0,0,0,.04);}
div.dup-box-title {font-size:20px; padding:12px 0 3px 12px; font-weight:bold; cursor:pointer;  height:30px;  margin:0; color:#000; }
div.dup-box-title:hover {color:#555;}
div.dup-box-arrow {text-decoration:none!important; float:right; width:27px; height:30px; font-size:16px; cursor:pointer; padding:1px 0 0 0; white-space:nowrap}
div.dup-box-panel {padding:10px 15px 10px 15px;  border-top:1px solid #EEEEEE; margin:-1px 0 0 0;}
div.dup-redirect {font-size:16px; font-weight:bold; padding:10px}

/*PANELS:Boxes that do not exapand */
div.dup-panel {padding:0px; display:block; background-color:#fff; border:1px solid #e5e5e5; box-shadow:0 1px 1px rgba(0,0,0,.04);}
div.dup-panel-title {font-size:14px; padding:10px 0 0 15px; font-weight:600; height:28px; margin:0px; color:#000; }
div.dup-panel-panel {padding:10px 15px 10px 15px;  border-top:1px solid #EEEEEE; margin:-1px 0 0 0;}

/*INFO-BOX:Simple box with no title */
div.dup-info-box {padding:8px; border:1px solid #ccc; border-radius:4px; background-color:#F7FCFE;  margin:0px 0px 5px 20px; line-height:16px}
div.dup-info-box small {margin-top:10px; display:block}

/*PACKAGE:Progress Boxes */
div#dup-progress-bar-area {width:500px; margin:40px auto 0px auto; padding:25px 50px 35px 50px; border:1px solid #ccc; box-shadow:0 8px 6px -6px #999; text-align:center; border-radius:4px; color:#000;}
div#dup-progress-bar-area h2 {margin-bottom:15px}

/*HEADER MESSAGES*/
div.dup-hdr-success {color:#23282d; font-size:22px; font-weight:bold}
div.dup-hdr-error {color:#A62426; font-size:22px; font-weight:bold}

/*DIALOGS:THICKBOX   */
#TB_title { padding-bottom:3px!important; margin-bottom:5px!important; font-size:16px!important;}
div.dup-dlg-alert-txt {padding:10px 0; font-size:16px; line-height:22px}
div.dup-dlg-alert-btns {position:absolute; bottom:20px; right:20px;}
div.dup-dlg-confirm-txt {padding:10px 0; font-size:16px}
div.dup-dlg-confirm-btns {position:absolute; bottom:20px; right:20px;}
div.dup-dlg-confirm-progress {display:none}

/*ADMIN:NOTICES   */
div.dup-global-error-reserved-files p {font-size:14px}
div.dup-global-error-reserved-files b.pass-msg {color:green; font-size:20px}
div.dup-global-error-reserved-files p.pass-lnks {line-height:24px; margin:-7px 0 0 5px}
div.dup-global-error-reserved-files div.pass-msg {padding:5px 0 0 10px; font-size:11px; color:#999; font-style:italic}
div.dup-wpnotice-box {display:none;}

/*================================================
PARSLEY:Overrides*/
input.parsley-error, textarea.parsley-error {
    color:#B94A48 !important;
    background-color:#F2DEDE !important;
    border:1px solid #EED3D7 !important;
}
div.qtip-content {line-height:16px}
ul.parsley-error-list {margin:1px 0px -7px 0px}
div.notice-safemode {color:maroon;}
div.cleanup-notice b.title {color:green;font-size:20px;}

/*SCREEN TABS*/
div.dup-screen-hlp-info {line-height:26px; padding:10px 0 10px 0}
#screen-meta-links .button { font-size:13px !important; height:auto !important;font-weight:normal; padding:3px 6px 3px 16px !important;min-width:72px !important}

/*= Duplicator Message
---------------------------------------*/
.notice.duplicator-message {
    border:none;
    padding:20px;
}

.notice.duplicator-message .duplicator-message-inner {
    display:-webkit-box;
    display:-webkit-flex;
    display:-ms-flexbox;
    display:flex;
    -webkit-box-align:center;
    -webkit-align-items:center;
    -ms-flex-align:center;
    align-items:center;
}

.notice.duplicator-message .duplicator-message-icon {
    font-size:20px;
}

.notice.duplicator-message .duplicator-message-content {
    padding:0 20px;
}

.notice.duplicator-message p {
    padding:0;
    margin:0;
}

.notice.duplicator-message h3 {
    margin:0 0 5px;
}

.notice.duplicator-message .duplicator-message-action {
    text-align:center;
    display:-webkit-box;
    display:-webkit-flex;
    display:-ms-flexbox;
    display:flex;
    -webkit-box-orient:vertical;
    -webkit-box-direction:normal;
    -webkit-flex-direction:column;
    -ms-flex-direction:column;
    flex-direction:column;
    margin-left:auto;
}

.notice.duplicator-message .duplicator-message-action .duplicator-button {
    background-color:#D30C5C;
    color:#fff;
    border-color:#7c1337;
    -webkit-box-shadow:0 1px 0 #7c1337;
    box-shadow:0 1px 0 #7c1337;
    padding:5px 30px;
    height:auto;
    line-height:20px;
    text-transform:capitalize;
}

.notice.duplicator-message .duplicator-message-action .duplicator-button i {
    margin-right:5px;
}

.notice.duplicator-message .duplicator-message-action .duplicator-button:hover {
    background-color:#a0124a;
}

.notice.duplicator-message .duplicator-message-action .duplicator-button:active {
    -webkit-box-shadow:inset 0 1px 0 #7c1337;
    box-shadow:inset 0 1px 0 #7c1337;
    -webkit-transform:translateY(1px);
    -ms-transform:translateY(1px);
    transform:translateY(1px);
}

.notice.duplicator-message .duplicator-message-action .duplicator-link {
    padding-top:5px;
}

.notice.duplicator-message .duplicator-message-actions {
    margin-top:10px;
}

.notice.duplicator-message .duplicator-message-actions .button.button-primary {
    margin-right:5px;
}

.notice.duplicator-message-announcement {
    border-color:#D30C5C;
}

.notice.duplicator-message-announcement a {
    color:#D30C5C;
}

@media (min-width:1200px) {
    .duplicator-message-action {
        padding-right:10px;
    }
}

@media (max-width:600px) {
    .notice.duplicator-message {
        padding:20px;
    }
    .notice.duplicator-message .duplicator-message-inner {
        display:block;
        text-align:center;
    }
    .notice.duplicator-message .duplicator-message-inner .duplicator-message-icon,
    .notice.duplicator-message .duplicator-message-inner .duplicator-message-content,
    .notice.duplicator-message .duplicator-message-inner .duplicator-message-action {
        display:block;
    }
    .notice.duplicator-message .duplicator-message-inner .duplicator-message-action {
        text-align:center;
    }
    .notice.duplicator-message .duplicator-message-inner .duplicator-message-icon {
        width:auto;
    }
    .notice.duplicator-message .duplicator-message-inner .duplicator-message-content {
        padding:10px 0;
    }
}

/** Settings **/
#installer-name-mode-option {
    line-height:25px;
}

#dup-lite-inst-mode-details {
    display:none;
    max-width:825px;
    padding-left:20px;
    line-height:18px;
}

#dup-lite-inst-mode-details p {
    margin:1em 0;
}

.storage_pos_fixed_label {
    display:inline-block;
    width:90px;
}

/** Call to action **/
div.txt-call-action-title {
    margin:40px auto 20px auto;
    font-size:22px;
    line-height:30px;
    font-weight:bold;
    width:100%;
}

div.txt-call-action-sub {
    font-size:16px; line-height:24px; font-weight:bold; width:100%;
    margin:20px auto 40px auto;
}

a.dup-btn-call-action {
    box-shadow:0px 10px 14px -7px #3e7327;
    background:linear-gradient(to bottom, #5ca53a 5%, #72b352 100%);
    background-color:#4f8e32;
    border-radius:4px;
    border:1px solid #4b8f29;
    display:block;
    cursor:pointer;
    color:#ffffff;
    font-family:Arial;
    font-size:18px;
    font-weight:bold;
    padding:10px 30px;
    text-decoration:none;
    text-shadow:0px 1px 0px #5b8a3c;
    width:150px;
    margin:auto;
    text-align:center;
}

a.dup-btn-call-action:hover {
	background:linear-gradient(to bottom, #72b352 5%, #337114 100%);
	background-color:#337114;
    color:#fff;
}

.dup-btn-call-action:active {
    color:#fff;
}

td.dup-store-promo-area {padding:7px 0 7px 7px; border-top:1px solid silver; background-color: #F0F0F1}
assets/css/index.php000064400000000016151336065400010456 0ustar00<?php
//silentassets/css/parsley.css000064400000001353151336065400011034 0ustar00div.parsley-success,
input.parsley-success,
select.parsley-success,
textarea.parsley-success {
  color: #468847;
  background-color: #DFF0D8;
  border: 1px solid #D6E9C6;
}

div.parsley-error,
input.parsley-error,
select.parsley-error,
textarea.parsley-error {
  color: #B94A48;
  background-color: #F2DEDE;
  border: 1px solid #EED3D7;
}

.parsley-errors-list {
  margin: 2px 0 3px;
  padding: 0;
  list-style-type: none;
  font-size: 0.9em;
  line-height: 0.9em;
  opacity: 0;
  -moz-opacity: 0;
  -webkit-opacity: 0;

  transition: all .3s ease-in;
  -o-transition: all .3s ease-in;
  -moz-transition: all .3s ease-in;
  -webkit-transition: all .3s ease-in;
}

.parsley-errors-list.filled {
  opacity: 1;
}
assets/js/javascript.php000064400000027006151336065400011351 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<script>
/* DESCRIPTION: Methods and Objects in this file are global and common in 
 * nature use this file to place all shared methods and varibles */	

//UNIQUE NAMESPACE
Duplicator			= new Object();
Duplicator.UI		= new Object();
Duplicator.Pack		= new Object();
Duplicator.Settings = new Object();
Duplicator.Tools	= new Object();
Duplicator.Debug	= new Object();

//GLOBAL CONSTANTS
Duplicator.DEBUG_AJAX_RESPONSE = false;
Duplicator.AJAX_TIMER = null;

Duplicator.parseJSON = function(mixData) {
    try {
		var parsed = JSON.parse(mixData);
		return parsed;
	} catch (e) {
		console.log("JSON parse failed - 1");
		console.log(mixData);
	}

	if (mixData.indexOf('[') > -1 && mixData.indexOf('{') > -1) {
		if (mixData.indexOf('{') < mixData.indexOf('[')) {
			var startBracket = '{';
			var endBracket = '}';
		} else {
			var startBracket = '[';
			var endBracket = ']';
		}
	} else if (mixData.indexOf('[') > -1 && mixData.indexOf('{') === -1) {
		var startBracket = '[';
		var endBracket = ']';
	} else {
		var startBracket = '{';
		var endBracket = '}';
	}
	
	var jsonStartPos = mixData.indexOf(startBracket);
	var jsonLastPos = mixData.lastIndexOf(endBracket);
	if (jsonStartPos > -1 && jsonLastPos > -1) {
		var expectedJsonStr = mixData.slice(jsonStartPos, jsonLastPos + 1);
		try {
			var parsed = JSON.parse(expectedJsonStr);
			return parsed;
		} catch (e) {
			console.log("JSON parse failed - 2");
			console.log(mixData);
			throw e;
            return false;
		}
	}
	throw "could not parse the JSON";
    return false;
}


/* ============================================================================
*  BASE NAMESPACE: All methods at the top of the Duplicator Namespace  
*  ============================================================================	*/

/*	Starts a timer for Ajax calls */ 
Duplicator.StartAjaxTimer = function() 
{
	Duplicator.AJAX_TIMER = new Date();
};

/*	Ends a timer for Ajax calls */ 
Duplicator.EndAjaxTimer = function() 
{
	var endTime = new Date();
	Duplicator.AJAX_TIMER =  (endTime.getTime()  - Duplicator.AJAX_TIMER) /1000;
};

/*	Reloads the current window
*	@param data		An xhr object  */ 
Duplicator.ReloadWindow = function(data) 
{
	if (Duplicator.DEBUG_AJAX_RESPONSE) {
		Duplicator.Pack.ShowError('debug on', data);
	} else {
		window.location.reload(true);
	}
};

//Basic Util Methods here:
Duplicator.OpenLogWindow = function(target)
{
	var target = "log-win" || null;
	if (target != null) {
		window.open('?page=duplicator-tools&tab=diagnostics&section=log', 'log-win');
	} else {
		window.open('<?php echo esc_js(DUP_Settings::getSsdirUrl()); ?>' + '/' + log)
	}
};


/* ============================================================================
*  UI NAMESPACE: All methods at the top of the Duplicator Namespace  
*  ============================================================================	*/

/*	Saves the state of a UI element */ 
Duplicator.UI.SaveViewState = function (key, value) 
{
	if (key != undefined && value != undefined ) {
		jQuery.ajax({
			type: "POST",
			url: ajaxurl,
			dataType: "text",
			data: {
				action : 'DUP_CTRL_UI_SaveViewState',
				key: key,
				value: value,
				nonce: '<?php echo wp_create_nonce('DUP_CTRL_UI_SaveViewState'); ?>'
			},
			success: function(respData) {
				try {
					var data = Duplicator.parseJSON(respData);
				} catch(err) {
					console.error(err);
					console.error('JSON parse failed for response data: ' + respData);
					return false;
				}
			},
			error: function(data) {}
		});	
	}
}

/*	Saves multiple states of a UI element */ 
Duplicator.UI.SaveMulViewStates = function (states)
{
	jQuery.ajax({
		type: "POST",
		url: ajaxurl,
		dataType: "text",
		data: {
			action : 'DUP_CTRL_UI_SaveViewState',
			states: states,
			nonce: '<?php echo wp_create_nonce('DUP_CTRL_UI_SaveViewState'); ?>'
		},
		success: function(respData) {
			try {
				var data = Duplicator.parseJSON(respData);
			} catch(err) {
				console.error(err);
				console.error('JSON parse failed for response data: ' + respData);
				return false;
			}
		},
		error: function(data) {}
	});
}

/* Animates the progress bar */
Duplicator.UI.AnimateProgressBar = function(id) 
{
	//Create Progress Bar
	var $mainbar   = jQuery("#" + id);
	$mainbar.progressbar({ value: 100 });
	$mainbar.height(25);
	runAnimation($mainbar);

	function runAnimation($pb) {
		$pb.css({ "padding-left": "0%", "padding-right": "90%" });
		$pb.progressbar("option", "value", 100);
		$pb.animate({ paddingLeft: "90%", paddingRight: "0%" }, 3000, "linear", function () { runAnimation($pb); });
	}
}

Duplicator.UI.IsSaveViewState = true;
/* Toggle MetaBoxes */ 
Duplicator.UI.ToggleMetaBox = function() 
{
	var $title = jQuery(this);
	var $panel = $title.parent().find('.dup-box-panel');
	var $arrow = $title.parent().find('.dup-box-arrow i');
	var key   = $panel.attr('id');
	var value = $panel.is(":visible") ? 0 : 1;
	$panel.toggle();
	if (Duplicator.UI.IsSaveViewState)
		Duplicator.UI.SaveViewState(key, value);
	(value) 
		? $arrow.removeClass().addClass('fa fa-caret-up') 
		: $arrow.removeClass().addClass('fa fa-caret-down');
	
}

Duplicator.UI.readonly = function(item)
{
	jQuery(item).attr('readonly', 'true').css({color:'#999'});
}

Duplicator.UI.disable = function(item)
{
	jQuery(item).attr('disabled', 'true').css({color:'#999'});
}

Duplicator.UI.enable = function(item)
{
	jQuery(item).removeAttr('disabled').css({color:'#000'});
	jQuery(item).removeAttr('readonly').css({color:'#000'});
}

//Init
jQuery(document).ready(function($) 
{

    Duplicator.UI.loadQtip = function()
    {
        //Look for tooltip data
        $('[data-tooltip!=""]').qtip({
            content: {
                attr: 'data-tooltip',
                title:  function() { 
                    if ($(this)[0].hasAttribute("data-tooltip-title")) {
                        return  $(this).data('tooltip-title');
                    } else {
                        return false;
                    }
                }
            },
            style: {
                classes: 'qtip-light qtip-rounded qtip-shadow',
                width: 500
            },
            position: {
                my: 'top left',
                at: 'bottom center'
            }
        });
    }

    Duplicator.UI.loadSimpeQtip = function()
    {
        //Look for tooltip data
        $('[data-simpletip!=""]').qtip({
            content: {
                attr: 'data-simpletip'
            },
            style: {
                classes: 'qtip-light qtip-rounded qtip-shadow'
            },
            position: {
                my: 'top left',
                at: 'bottom center'
            }
        });
    }  

    Duplicator.UI.Copytext = function () {
        $('[data-dup-copy-text]').each(function () {
            $(this).click(function () {
                var elem = $(this);
                var message = '';
                var textToCopy = elem.data('dup-copy-text');
                var tmpArea = jQuery("<textarea></textarea>").css({
                    position: 'absolute',
                    top: '-10000px'
                }).text(textToCopy).appendTo( "body" );
                tmpArea.select();
                try {
                    var successful = document.execCommand('copy');
                    message = successful ? '<?php echo esc_html_e('Copied: ', 'duplicator'); ?>' + textToCopy : '<?php echo esc_html_e('unable to copy'); ?>';
                } catch (err) {
                    message = '<?php echo esc_html_e('unable to copy', 'duplicator'); ?>';
                }
                elem.qtip('option', 'content.text', message).qtip('show');
                setTimeout(function(){ 
                    elem.qtip('option', 'content.text', '<?php esc_html_e('Copy to Clipboard!', 'duplicator'); ?>');
                }, 2000);
            }).qtip({
                content: {
                    text: '<?php esc_html_e('Copy to Clipboard!', 'duplicator'); ?>'
                },
                style: {
                    classes: 'qtip-light qtip-rounded qtip-shadow'
                },
                position: {
                    my: 'top left',
                    at: 'bottom center'
                }
            });
        });
    };

	//INIT: Tabs
	$("div[data-dup-tabs='true']").each(function () {

		//Load Tab Setup
		var $root   = $(this);
		var $lblRoot = $root.find('ul:first-child')
		var $lblKids = $lblRoot.children('li');
		var $pnls	 = $root.children('div');

		//Apply Styles
		$root.addClass('categorydiv');
		$lblRoot.addClass('category-tabs');
		$pnls.addClass('tabs-panel').css('display', 'none');
		$lblKids.eq(0).addClass('tabs').css('font-weight', 'bold');
		$pnls.eq(0).show();

		//Attach Events
		$lblKids.click(function(evt) 
		{
			var $lbls = $(evt.target).parent().children('li');
			var $pnls = $(evt.target).parent().parent().children('div');
			var index = ($(evt.target).index());
			
			$lbls.removeClass('tabs').css('font-weight', 'normal');
			$lbls.eq(index).addClass('tabs').css('font-weight', 'bold');
			$pnls.hide();
			$pnls.eq(index).show();
		});
	 });
	
	//Init: Toggle MetaBoxes
	$('div.dup-box div.dup-box-title').each(function() { 
		var $title = $(this);
		var $panel = $title.parent().find('.dup-box-panel');
		var $arrow = $title.find('.dup-box-arrow');
		$title.click(Duplicator.UI.ToggleMetaBox); 
		($panel.is(":visible")) 
			? $arrow.html('<i class="fa fa-caret-up"></i>')
			: $arrow.html('<i class="fa fa-caret-down"></i>');
	});

    
    Duplicator.UI.loadQtip();
    Duplicator.UI.loadSimpeQtip();
    Duplicator.UI.Copytext();

	//HANDLEBARS HELPERS
	if  (typeof(Handlebars) != "undefined"){

		function _handleBarscheckCondition(v1, operator, v2) {
			switch(operator) {
				case '==':
					return (v1 == v2);
				case '===':
					return (v1 === v2);
				case '!==':
					return (v1 !== v2);
				case '<':
					return (v1 < v2);
				case '<=':
					return (v1 <= v2);
				case '>':
					return (v1 > v2);
				case '>=':
					return (v1 >= v2);
				case '&&':
					return (v1 && v2);
				case '||':
					return (v1 || v2);
				case 'obj||':
					v1 = typeof(v1) == 'object' ? v1.length : v1;
					v2 = typeof(v2) == 'object' ? v2.length : v2;
					return (v1 !=0 || v2 != 0);
				default:
					return false;
			}
		}

		Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) {
			return _handleBarscheckCondition(v1, operator, v2)
						? options.fn(this)
						: options.inverse(this);
		});

		Handlebars.registerHelper('if_eq',		function(a, b, opts) { return (a == b) ? opts.fn(this) : opts.inverse(this);});
		Handlebars.registerHelper('if_neq',		function(a, b, opts) { return (a != b) ? opts.fn(this) : opts.inverse(this);});
	}

	//Prevent notice boxes from flashing as its re-positioned in DOM
	$('div.dup-wpnotice-box').show(300);

});

jQuery(document).ready(function($) {
    $('.duplicator-message .notice-dismiss, .duplicator-message .duplicator-notice-dismiss, .duplicator-message  .duplicator-notice-rate-now').on('click', function (event) {
		if ('button button-primary duplicator-notice-rate-now' !== $(event.target).attr('class')) {
			event.preventDefault();
		}
        $.post(ajaxurl, {
            action: 'duplicator_set_admin_notice_viewed',
            notice_id: $(this).closest('.duplicator-message-dismissed').data('notice_id'),
			nonce: '<?php echo wp_create_nonce('duplicator_set_admin_notice_viewed'); ?>'
        });
        var $wrapperElm = $(this).closest('.duplicator-message-dismissed');
        $wrapperElm.fadeTo(100, 0, function () {
            $wrapperElm.slideUp(100, function () {
                $wrapperElm.remove();
            });
        });
    });   
});

</script>assets/js/parsley.min.js000064400000115350151336065400011271 0ustar00/*!
* Parsley.js
* Version 2.3.5 - built Sun, Feb 28th 2016, 6:25 am
* http://parsleyjs.org
* Guillaume Potier - <guillaume@wisembly.com>
* Marc-Andre Lafortune - <petroselinum@marc-andre.ca>
* MIT Licensed
*/
function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t<e.length;t++)i[t]=e[t];return i}return Array.from(e)}var _slice=Array.prototype.slice;!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):e.parsley=t(e.jQuery)}(this,function(e){"use strict";function t(e,t){return e.parsleyAdaptedCallback||(e.parsleyAdaptedCallback=function(){var i=Array.prototype.slice.call(arguments,0);i.unshift(this),e.apply(t||A,i)}),e.parsleyAdaptedCallback}function i(e){return 0===e.lastIndexOf(D,0)?e.substr(D.length):e}var n=1,r={},s={attr:function(e,t,i){var n,r,s,a=new RegExp("^"+t,"i");if("undefined"==typeof i)i={};else for(n in i)i.hasOwnProperty(n)&&delete i[n];if("undefined"==typeof e||"undefined"==typeof e[0])return i;for(s=e[0].attributes,n=s.length;n--;)r=s[n],r&&r.specified&&a.test(r.name)&&(i[this.camelize(r.name.slice(t.length))]=this.deserializeValue(r.value));return i},checkAttr:function(e,t,i){return e.is("["+t+i+"]")},setAttr:function(e,t,i,n){e[0].setAttribute(this.dasherize(t+i),String(n))},generateID:function(){return""+n++},deserializeValue:function(t){var i;try{return t?"true"==t||("false"==t?!1:"null"==t?null:isNaN(i=Number(t))?/^[\[\{]/.test(t)?e.parseJSON(t):t:i):t}catch(n){return t}},camelize:function(e){return e.replace(/-+(.)?/g,function(e,t){return t?t.toUpperCase():""})},dasherize:function(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()},warn:function(){var e;window.console&&"function"==typeof window.console.warn&&(e=window.console).warn.apply(e,arguments)},warnOnce:function(e){r[e]||(r[e]=!0,this.warn.apply(this,arguments))},_resetWarnings:function(){r={}},trimString:function(e){return e.replace(/^\s+|\s+$/g,"")},namespaceEvents:function(t,i){return t=this.trimString(t||"").split(/\s+/),t[0]?e.map(t,function(e){return e+"."+i}).join(" "):""},objectCreate:Object.create||function(){var e=function(){};return function(t){if(arguments.length>1)throw Error("Second argument not supported");if("object"!=typeof t)throw TypeError("Argument must be an object");e.prototype=t;var i=new e;return e.prototype=null,i}}()},a=s,o={namespace:"data-parsley-",inputs:"input, textarea, select",excluded:"input[type=button], input[type=submit], input[type=reset], input[type=hidden]",priorityEnabled:!0,multiple:null,group:null,uiEnabled:!0,validationThreshold:3,focus:"first",trigger:!1,triggerAfterFailure:"input",errorClass:"parsley-error",successClass:"parsley-success",classHandler:function(e){},errorsContainer:function(e){},errorsWrapper:'<ul class="parsley-errors-list"></ul>',errorTemplate:"<li></li>"},l=function(){};l.prototype={asyncSupport:!0,actualizeOptions:function(){return a.attr(this.$element,this.options.namespace,this.domOptions),this.parent&&this.parent.actualizeOptions&&this.parent.actualizeOptions(),this},_resetOptions:function(e){this.domOptions=a.objectCreate(this.parent.options),this.options=a.objectCreate(this.domOptions);for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.actualizeOptions()},_listeners:null,on:function(e,t){this._listeners=this._listeners||{};var i=this._listeners[e]=this._listeners[e]||[];return i.push(t),this},subscribe:function(t,i){e.listenTo(this,t.toLowerCase(),i)},off:function(e,t){var i=this._listeners&&this._listeners[e];if(i)if(t)for(var n=i.length;n--;)i[n]===t&&i.splice(n,1);else delete this._listeners[e];return this},unsubscribe:function(t,i){e.unsubscribeTo(this,t.toLowerCase())},trigger:function(e,t,i){t=t||this;var n,r=this._listeners&&this._listeners[e];if(r)for(var s=r.length;s--;)if(n=r[s].call(t,t,i),n===!1)return n;return this.parent?this.parent.trigger(e,t,i):!0},reset:function(){if("ParsleyForm"!==this.__class__)return this._resetUI(),this._trigger("reset");for(var e=0;e<this.fields.length;e++)this.fields[e].reset();this._trigger("reset")},destroy:function(){if(this._destroyUI(),"ParsleyForm"!==this.__class__)return this.$element.removeData("Parsley"),this.$element.removeData("ParsleyFieldMultiple"),void this._trigger("destroy");for(var e=0;e<this.fields.length;e++)this.fields[e].destroy();this.$element.removeData("Parsley"),this._trigger("destroy")},asyncIsValid:function(e,t){return a.warnOnce("asyncIsValid is deprecated; please use whenValid instead"),this.whenValid({group:e,force:t})},_findRelated:function(){return this.options.multiple?this.parent.$element.find("["+this.options.namespace+'multiple="'+this.options.multiple+'"]'):this.$element}};var u={string:function(e){return e},integer:function(e){if(isNaN(e))throw'Requirement is not an integer: "'+e+'"';return parseInt(e,10)},number:function(e){if(isNaN(e))throw'Requirement is not a number: "'+e+'"';return parseFloat(e)},reference:function(t){var i=e(t);if(0===i.length)throw'No such reference: "'+t+'"';return i},"boolean":function(e){return"false"!==e},object:function(e){return a.deserializeValue(e)},regexp:function(e){var t="";return/^\/.*\/(?:[gimy]*)$/.test(e)?(t=e.replace(/.*\/([gimy]*)$/,"$1"),e=e.replace(new RegExp("^/(.*?)/"+t+"$"),"$1")):e="^"+e+"$",new RegExp(e,t)}},d=function(e,t){var i=e.match(/^\s*\[(.*)\]\s*$/);if(!i)throw'Requirement is not an array: "'+e+'"';var n=i[1].split(",").map(a.trimString);if(n.length!==t)throw"Requirement has "+n.length+" values when "+t+" are needed";return n},h=function(e,t){var i=u[e||"string"];if(!i)throw'Unknown requirement specification: "'+e+'"';return i(t)},p=function(e,t,i){var n=null,r={};for(var s in e)if(s){var a=i(s);"string"==typeof a&&(a=h(e[s],a)),r[s]=a}else n=h(e[s],t);return[n,r]},f=function(t){e.extend(!0,this,t)};f.prototype={validate:function(t,i){if(this.fn)return arguments.length>3&&(i=[].slice.call(arguments,1,-1)),this.fn.call(this,t,i);if(e.isArray(t)){if(!this.validateMultiple)throw"Validator `"+this.name+"` does not handle multiple values";return this.validateMultiple.apply(this,arguments)}if(this.validateNumber)return isNaN(t)?!1:(arguments[0]=parseFloat(arguments[0]),this.validateNumber.apply(this,arguments));if(this.validateString)return this.validateString.apply(this,arguments);throw"Validator `"+this.name+"` only handles multiple values"},parseRequirements:function(t,i){if("string"!=typeof t)return e.isArray(t)?t:[t];var n=this.requirementType;if(e.isArray(n)){for(var r=d(t,n.length),s=0;s<r.length;s++)r[s]=h(n[s],r[s]);return r}return e.isPlainObject(n)?p(n,t,i):[h(n,t)]},requirementType:"string",priority:2};var c=function(e,t){this.__class__="ParsleyValidatorRegistry",this.locale="en",this.init(e||{},t||{})},m={email:/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,number:/^-?(\d*\.)?\d+(e[-+]?\d+)?$/i,integer:/^-?\d+$/,digits:/^\d+$/,alphanum:/^\w+$/i,url:new RegExp("^(?:(?:https?|ftp)://)?(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:/\\S*)?$","i")};m.range=m.number;var g=function(e){var t=(""+e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0};c.prototype={init:function(t,i){this.catalog=i,this.validators=e.extend({},this.validators);for(var n in t)this.addValidator(n,t[n].fn,t[n].priority);window.Parsley.trigger("parsley:validator:init")},setLocale:function(e){if("undefined"==typeof this.catalog[e])throw new Error(e+" is not available in the catalog");return this.locale=e,this},addCatalog:function(e,t,i){return"object"==typeof t&&(this.catalog[e]=t),!0===i?this.setLocale(e):this},addMessage:function(e,t,i){return"undefined"==typeof this.catalog[e]&&(this.catalog[e]={}),this.catalog[e][t]=i,this},addMessages:function(e,t){for(var i in t)this.addMessage(e,i,t[i]);return this},addValidator:function(e,t,i){if(this.validators[e])a.warn('Validator "'+e+'" is already defined.');else if(o.hasOwnProperty(e))return void a.warn('"'+e+'" is a restricted keyword and is not a valid validator name.');return this._setValidator.apply(this,arguments)},updateValidator:function(e,t,i){return this.validators[e]?this._setValidator(this,arguments):(a.warn('Validator "'+e+'" is not already defined.'),this.addValidator.apply(this,arguments))},removeValidator:function(e){return this.validators[e]||a.warn('Validator "'+e+'" is not defined.'),delete this.validators[e],this},_setValidator:function(e,t,i){"object"!=typeof t&&(t={fn:t,priority:i}),t.validate||(t=new f(t)),this.validators[e]=t;for(var n in t.messages||{})this.addMessage(n,e,t.messages[n]);return this},getErrorMessage:function(e){var t;if("type"===e.name){var i=this.catalog[this.locale][e.name]||{};t=i[e.requirements]}else t=this.formatMessage(this.catalog[this.locale][e.name],e.requirements);return t||this.catalog[this.locale].defaultMessage||this.catalog.en.defaultMessage},formatMessage:function(e,t){if("object"==typeof t){for(var i in t)e=this.formatMessage(e,t[i]);return e}return"string"==typeof e?e.replace(/%s/i,t):""},validators:{notblank:{validateString:function(e){return/\S/.test(e)},priority:2},required:{validateMultiple:function(e){return e.length>0},validateString:function(e){return/\S/.test(e)},priority:512},type:{validateString:function(e,t){var i=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],n=i.step,r=void 0===n?"1":n,s=i.base,a=void 0===s?0:s,o=m[t];if(!o)throw new Error("validator type `"+t+"` is not supported");if(!o.test(e))return!1;if("number"===t&&!/^any$/i.test(r||"")){var l=Number(e),u=Math.max(g(r),g(a));if(g(l)>u)return!1;var d=function(e){return Math.round(e*Math.pow(10,u))};if((d(l)-d(a))%d(r)!=0)return!1}return!0},requirementType:{"":"string",step:"string",base:"number"},priority:256},pattern:{validateString:function(e,t){return t.test(e)},requirementType:"regexp",priority:64},minlength:{validateString:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxlength:{validateString:function(e,t){return e.length<=t},requirementType:"integer",priority:30},length:{validateString:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},mincheck:{validateMultiple:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxcheck:{validateMultiple:function(e,t){return e.length<=t},requirementType:"integer",priority:30},check:{validateMultiple:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},min:{validateNumber:function(e,t){return e>=t},requirementType:"number",priority:30},max:{validateNumber:function(e,t){return t>=e},requirementType:"number",priority:30},range:{validateNumber:function(e,t,i){return e>=t&&i>=e},requirementType:["number","number"],priority:30},equalto:{validateString:function(t,i){var n=e(i);return n.length?t===n.val():t===i},priority:256}}};var y={},v=function T(e,t,i){for(var n=[],r=[],s=0;s<e.length;s++){for(var a=!1,o=0;o<t.length;o++)if(e[s].assert.name===t[o].assert.name){a=!0;break}a?r.push(e[s]):n.push(e[s])}return{kept:r,added:n,removed:i?[]:T(t,e,!0).added}};y.Form={_actualizeTriggers:function(){var e=this;this.$element.on("submit.Parsley",function(t){e.onSubmitValidate(t)}),this.$element.on("click.Parsley",'input[type="submit"], button[type="submit"]',function(t){e.onSubmitButton(t)}),!1!==this.options.uiEnabled&&this.$element.attr("novalidate","")},focus:function(){if(this._focusedField=null,!0===this.validationResult||"none"===this.options.focus)return null;for(var e=0;e<this.fields.length;e++){var t=this.fields[e];if(!0!==t.validationResult&&t.validationResult.length>0&&"undefined"==typeof t.options.noFocus&&(this._focusedField=t.$element,"first"===this.options.focus))break}return null===this._focusedField?null:this._focusedField.focus()},_destroyUI:function(){this.$element.off(".Parsley")}},y.Field={_reflowUI:function(){if(this._buildUI(),this._ui){var e=v(this.validationResult,this._ui.lastValidationResult);this._ui.lastValidationResult=this.validationResult,this._manageStatusClass(),this._manageErrorsMessages(e),this._actualizeTriggers(),!e.kept.length&&!e.added.length||this._failedOnce||(this._failedOnce=!0,this._actualizeTriggers())}},getErrorsMessages:function(){if(!0===this.validationResult)return[];for(var e=[],t=0;t<this.validationResult.length;t++)e.push(this.validationResult[t].errorMessage||this._getErrorMessage(this.validationResult[t].assert));return e},addError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.message,n=t.assert,r=t.updateClass,s=void 0===r?!0:r;this._buildUI(),this._addError(e,{message:i,assert:n}),s&&this._errorClass()},updateError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.message,n=t.assert,r=t.updateClass,s=void 0===r?!0:r;this._buildUI(),this._updateError(e,{message:i,assert:n}),s&&this._errorClass()},removeError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.updateClass,n=void 0===i?!0:i;this._buildUI(),this._removeError(e),n&&this._manageStatusClass()},_manageStatusClass:function(){this.hasConstraints()&&this.needsValidation()&&!0===this.validationResult?this._successClass():this.validationResult.length>0?this._errorClass():this._resetClass()},_manageErrorsMessages:function(t){if("undefined"==typeof this.options.errorsMessagesDisabled){if("undefined"!=typeof this.options.errorMessage)return t.added.length||t.kept.length?(this._insertErrorWrapper(),0===this._ui.$errorsWrapper.find(".parsley-custom-error-message").length&&this._ui.$errorsWrapper.append(e(this.options.errorTemplate).addClass("parsley-custom-error-message")),this._ui.$errorsWrapper.addClass("filled").find(".parsley-custom-error-message").html(this.options.errorMessage)):this._ui.$errorsWrapper.removeClass("filled").find(".parsley-custom-error-message").remove();for(var i=0;i<t.removed.length;i++)this._removeError(t.removed[i].assert.name);for(i=0;i<t.added.length;i++)this._addError(t.added[i].assert.name,{message:t.added[i].errorMessage,assert:t.added[i].assert});for(i=0;i<t.kept.length;i++)this._updateError(t.kept[i].assert.name,{message:t.kept[i].errorMessage,assert:t.kept[i].assert})}},_addError:function(t,i){var n=i.message,r=i.assert;this._insertErrorWrapper(),this._ui.$errorsWrapper.addClass("filled").append(e(this.options.errorTemplate).addClass("parsley-"+t).html(n||this._getErrorMessage(r)))},_updateError:function(e,t){var i=t.message,n=t.assert;this._ui.$errorsWrapper.addClass("filled").find(".parsley-"+e).html(i||this._getErrorMessage(n))},_removeError:function(e){this._ui.$errorsWrapper.removeClass("filled").find(".parsley-"+e).remove()},_getErrorMessage:function(e){var t=e.name+"Message";return"undefined"!=typeof this.options[t]?window.Parsley.formatMessage(this.options[t],e.requirements):window.Parsley.getErrorMessage(e)},_buildUI:function(){if(!this._ui&&!1!==this.options.uiEnabled){var t={};this.$element.attr(this.options.namespace+"id",this.__id__),t.$errorClassHandler=this._manageClassHandler(),t.errorsWrapperId="parsley-id-"+(this.options.multiple?"multiple-"+this.options.multiple:this.__id__),t.$errorsWrapper=e(this.options.errorsWrapper).attr("id",t.errorsWrapperId),t.lastValidationResult=[],t.validationInformationVisible=!1,this._ui=t}},_manageClassHandler:function(){if("string"==typeof this.options.classHandler&&e(this.options.classHandler).length)return e(this.options.classHandler);var t=this.options.classHandler.call(this,this);return"undefined"!=typeof t&&t.length?t:!this.options.multiple||this.$element.is("select")?this.$element:this.$element.parent()},_insertErrorWrapper:function(){var t;if(0!==this._ui.$errorsWrapper.parent().length)return this._ui.$errorsWrapper.parent();if("string"==typeof this.options.errorsContainer){if(e(this.options.errorsContainer).length)return e(this.options.errorsContainer).append(this._ui.$errorsWrapper);a.warn("The errors container `"+this.options.errorsContainer+"` does not exist in DOM")}else"function"==typeof this.options.errorsContainer&&(t=this.options.errorsContainer.call(this,this));if("undefined"!=typeof t&&t.length)return t.append(this._ui.$errorsWrapper);var i=this.$element;return this.options.multiple&&(i=i.parent()),i.after(this._ui.$errorsWrapper)},_actualizeTriggers:function(){var e=this,t=this._findRelated();t.off(".Parsley"),this._failedOnce?t.on(a.namespaceEvents(this.options.triggerAfterFailure,"Parsley"),function(){e.validate()}):t.on(a.namespaceEvents(this.options.trigger,"Parsley"),function(t){e._eventValidate(t)})},_eventValidate:function(e){(!/key|input/.test(e.type)||this._ui&&this._ui.validationInformationVisible||!(this.getValue().length<=this.options.validationThreshold))&&this.validate()},_resetUI:function(){this._failedOnce=!1,this._actualizeTriggers(),"undefined"!=typeof this._ui&&(this._ui.$errorsWrapper.removeClass("filled").children().remove(),this._resetClass(),this._ui.lastValidationResult=[],this._ui.validationInformationVisible=!1)},_destroyUI:function(){this._resetUI(),"undefined"!=typeof this._ui&&this._ui.$errorsWrapper.remove(),delete this._ui},_successClass:function(){this._ui.validationInformationVisible=!0,this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass)},_errorClass:function(){this._ui.validationInformationVisible=!0,this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass)},_resetClass:function(){this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass)}};var _=function(t,i,n){this.__class__="ParsleyForm",this.__id__=a.generateID(),this.$element=e(t),this.domOptions=i,this.options=n,this.parent=window.Parsley,this.fields=[],this.validationResult=null},w={pending:null,resolved:!0,rejected:!1};_.prototype={onSubmitValidate:function(e){var t=this;if(!0!==e.parsley){var i=this._$submitSource||this.$element.find('input[type="submit"], button[type="submit"]').first();if(this._$submitSource=null,this.$element.find(".parsley-synthetic-submit-button").prop("disabled",!0),!i.is("[formnovalidate]")){var n=this.whenValidate({event:e});"resolved"===n.state()&&!1!==this._trigger("submit")||(e.stopImmediatePropagation(),e.preventDefault(),"pending"===n.state()&&n.done(function(){t._submit(i)}))}}},onSubmitButton:function(t){this._$submitSource=e(t.target)},_submit:function(t){if(!1!==this._trigger("submit")){if(t){var i=this.$element.find(".parsley-synthetic-submit-button").prop("disabled",!1);0===i.length&&(i=e('<input class="parsley-synthetic-submit-button" type="hidden">').appendTo(this.$element)),i.attr({name:t.attr("name"),value:t.attr("value")})}this.$element.trigger(e.extend(e.Event("submit"),{parsley:!0}))}},validate:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling validate on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1],s=i[2];t={group:n,force:r,event:s}}return w[this.whenValidate(t).state()]},whenValidate:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force,s=i.event;this.submitEvent=s,s&&(this.submitEvent=e.extend({},s,{preventDefault:function(){a.warnOnce("Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`"),t.validationResult=!1}})),this.validationResult=!0,this._trigger("validate"),this._refreshFields();var o=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValidate({force:r,group:n})})}),l=function(){var i=e.Deferred();return!1===t.validationResult&&i.reject(),i.resolve().promise()};return e.when.apply(e,_toConsumableArray(o)).done(function(){t._trigger("success")}).fail(function(){t.validationResult=!1,t.focus(),t._trigger("error")}).always(function(){t._trigger("validated")}).pipe(l,l)},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling isValid on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={group:n,force:r}}return w[this.whenValid(t).state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force;this._refreshFields();var s=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValid({group:n,force:r})})});return e.when.apply(e,_toConsumableArray(s))},_refreshFields:function(){return this.actualizeOptions()._bindFields()},_bindFields:function(){var t=this,i=this.fields;return this.fields=[],this.fieldsMappedById={},this._withoutReactualizingFormOptions(function(){t.$element.find(t.options.inputs).not(t.options.excluded).each(function(e,i){var n=new window.Parsley.Factory(i,{},t);"ParsleyField"!==n.__class__&&"ParsleyFieldMultiple"!==n.__class__||!0===n.options.excluded||"undefined"==typeof t.fieldsMappedById[n.__class__+"-"+n.__id__]&&(t.fieldsMappedById[n.__class__+"-"+n.__id__]=n,t.fields.push(n))}),e(i).not(t.fields).each(function(e,t){t._trigger("reset")})}),this},_withoutReactualizingFormOptions:function(e){var t=this.actualizeOptions;this.actualizeOptions=function(){return this};var i=e();return this.actualizeOptions=t,i},_trigger:function(e){return this.trigger("form:"+e)}};var b=function(t,i,n,r,s){if(!/ParsleyField/.test(t.__class__))throw new Error("ParsleyField or ParsleyFieldMultiple instance expected");var a=window.Parsley._validatorRegistry.validators[i],o=new f(a);e.extend(this,{validator:o,name:i,requirements:n,priority:r||t.options[i+"Priority"]||o.priority,isDomConstraint:!0===s}),this._parseRequirements(t.options)},F=function(e){var t=e[0].toUpperCase();return t+e.slice(1)};b.prototype={validate:function(e,t){var i=this.requirementList.slice(0);return i.unshift(e),i.push(t),this.validator.validate.apply(this.validator,i)},_parseRequirements:function(e){var t=this;this.requirementList=this.validator.parseRequirements(this.requirements,function(i){return e[t.name+F(i)]})}};var C=function(t,i,n,r){this.__class__="ParsleyField",this.__id__=a.generateID(),this.$element=e(t),"undefined"!=typeof r&&(this.parent=r),this.options=n,this.domOptions=i,this.constraints=[],this.constraintsByName={},this.validationResult=[],this._bindConstraints()},$={pending:null,resolved:!0,rejected:!1};C.prototype={validate:function(t){arguments.length>=1&&!e.isPlainObject(t)&&(a.warnOnce("Calling validate on a parsley field without passing arguments as an object is deprecated."),t={options:t});var i=this.whenValidate(t);if(!i)return!0;switch(i.state()){case"pending":return null;case"resolved":return!0;case"rejected":return this.validationResult}},whenValidate:function(){var e=this,t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],i=t.force,n=t.group;return this.refreshConstraints(),!n||this._isInGroup(n)?(this.value=this.getValue(),this._trigger("validate"),this.whenValid({force:i,value:this.value,_refreshed:!0}).always(function(){e._reflowUI()}).done(function(){e._trigger("success")}).fail(function(){e._trigger("error")}).always(function(){e._trigger("validated")})):void 0},hasConstraints:function(){return 0!==this.constraints.length},needsValidation:function(e){return"undefined"==typeof e&&(e=this.getValue()),e.length||this._isRequired()||"undefined"!=typeof this.options.validateIfEmpty?!0:!1},_isInGroup:function(t){return e.isArray(this.options.group)?-1!==e.inArray(t,this.options.group):this.options.group===t},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling isValid on a parsley field without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={force:n,value:r}}var s=this.whenValid(t);return s?$[s.state()]:!0},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=void 0===n?!1:n,s=i.value,a=i.group,o=i._refreshed;if(o||this.refreshConstraints(),!a||this._isInGroup(a)){if(this.validationResult=!0,!this.hasConstraints())return e.when();if(("undefined"==typeof s||null===s)&&(s=this.getValue()),!this.needsValidation(s)&&!0!==r)return e.when();var l=this._getGroupedConstraints(),u=[];return e.each(l,function(i,n){var r=e.when.apply(e,_toConsumableArray(e.map(n,function(e){return t._validateConstraint(s,e)})));return u.push(r),"rejected"===r.state()?!1:void 0}),e.when.apply(e,u)}},_validateConstraint:function(t,i){var n=this,r=i.validate(t,this);return!1===r&&(r=e.Deferred().reject()),e.when(r).fail(function(e){!0===n.validationResult&&(n.validationResult=[]),n.validationResult.push({assert:i,errorMessage:"string"==typeof e&&e})})},getValue:function(){var e;return e="function"==typeof this.options.value?this.options.value(this):"undefined"!=typeof this.options.value?this.options.value:this.$element.val(),"undefined"==typeof e||null===e?"":this._handleWhitespace(e)},refreshConstraints:function(){return this.actualizeOptions()._bindConstraints()},addConstraint:function(e,t,i,n){if(window.Parsley._validatorRegistry.validators[e]){var r=new b(this,e,t,i,n);"undefined"!==this.constraintsByName[r.name]&&this.removeConstraint(r.name),this.constraints.push(r),this.constraintsByName[r.name]=r}return this},removeConstraint:function(e){for(var t=0;t<this.constraints.length;t++)if(e===this.constraints[t].name){this.constraints.splice(t,1);break}return delete this.constraintsByName[e],this},updateConstraint:function(e,t,i){return this.removeConstraint(e).addConstraint(e,t,i)},_bindConstraints:function(){for(var e=[],t={},i=0;i<this.constraints.length;i++)!1===this.constraints[i].isDomConstraint&&(e.push(this.constraints[i]),t[this.constraints[i].name]=this.constraints[i]);this.constraints=e,this.constraintsByName=t;for(var n in this.options)this.addConstraint(n,this.options[n],void 0,!0);return this._bindHtml5Constraints()},_bindHtml5Constraints:function(){(this.$element.hasClass("required")||this.$element.attr("required"))&&this.addConstraint("required",!0,void 0,!0),"string"==typeof this.$element.attr("pattern")&&this.addConstraint("pattern",this.$element.attr("pattern"),void 0,!0),"undefined"!=typeof this.$element.attr("min")&&"undefined"!=typeof this.$element.attr("max")?this.addConstraint("range",[this.$element.attr("min"),this.$element.attr("max")],void 0,!0):"undefined"!=typeof this.$element.attr("min")?this.addConstraint("min",this.$element.attr("min"),void 0,!0):"undefined"!=typeof this.$element.attr("max")&&this.addConstraint("max",this.$element.attr("max"),void 0,!0),"undefined"!=typeof this.$element.attr("minlength")&&"undefined"!=typeof this.$element.attr("maxlength")?this.addConstraint("length",[this.$element.attr("minlength"),this.$element.attr("maxlength")],void 0,!0):"undefined"!=typeof this.$element.attr("minlength")?this.addConstraint("minlength",this.$element.attr("minlength"),void 0,!0):"undefined"!=typeof this.$element.attr("maxlength")&&this.addConstraint("maxlength",this.$element.attr("maxlength"),void 0,!0);var e=this.$element.attr("type");return"undefined"==typeof e?this:"number"===e?this.addConstraint("type",["number",{step:this.$element.attr("step"),base:this.$element.attr("min")||this.$element.attr("value")}],void 0,!0):/^(email|url|range)$/i.test(e)?this.addConstraint("type",e,void 0,!0):this},_isRequired:function(){return"undefined"==typeof this.constraintsByName.required?!1:!1!==this.constraintsByName.required.requirements},_trigger:function(e){return this.trigger("field:"+e)},_handleWhitespace:function(e){return!0===this.options.trimValue&&a.warnOnce('data-parsley-trim-value="true" is deprecated, please use data-parsley-whitespace="trim"'),"squish"===this.options.whitespace&&(e=e.replace(/\s{2,}/g," ")),("trim"===this.options.whitespace||"squish"===this.options.whitespace||!0===this.options.trimValue)&&(e=a.trimString(e)),e},_getGroupedConstraints:function(){if(!1===this.options.priorityEnabled)return[this.constraints];for(var e=[],t={},i=0;i<this.constraints.length;i++){var n=this.constraints[i].priority;t[n]||e.push(t[n]=[]),t[n].push(this.constraints[i])}return e.sort(function(e,t){return t[0].priority-e[0].priority}),e}};var x=C,P=function(){this.__class__="ParsleyFieldMultiple"};P.prototype={addElement:function(e){return this.$elements.push(e),this},refreshConstraints:function(){var t;if(this.constraints=[],this.$element.is("select"))return this.actualizeOptions()._bindConstraints(),this;for(var i=0;i<this.$elements.length;i++)if(e("html").has(this.$elements[i]).length){t=this.$elements[i].data("ParsleyFieldMultiple").refreshConstraints().constraints;for(var n=0;n<t.length;n++)this.addConstraint(t[n].name,t[n].requirements,t[n].priority,t[n].isDomConstraint)}else this.$elements.splice(i,1);return this},getValue:function(){if("function"==typeof this.options.value)value=this.options.value(this);else if("undefined"!=typeof this.options.value)return this.options.value;if(this.$element.is("input[type=radio]"))return this._findRelated().filter(":checked").val()||"";if(this.$element.is("input[type=checkbox]")){var t=[];return this._findRelated().filter(":checked").each(function(){t.push(e(this).val())}),t}return this.$element.is("select")&&null===this.$element.val()?[]:this.$element.val()},_init:function(){return this.$elements=[this.$element],this}};var E=function(t,i,n){this.$element=e(t);var r=this.$element.data("Parsley");if(r)return"undefined"!=typeof n&&r.parent===window.Parsley&&(r.parent=n,r._resetOptions(r.options)),r;if(!this.$element.length)throw new Error("You must bind Parsley on an existing element.");if("undefined"!=typeof n&&"ParsleyForm"!==n.__class__)throw new Error("Parent instance must be a ParsleyForm instance");return this.parent=n||window.Parsley,this.init(i)};E.prototype={init:function(e){return this.__class__="Parsley",this.__version__="2.3.5",this.__id__=a.generateID(),this._resetOptions(e),this.$element.is("form")||a.checkAttr(this.$element,this.options.namespace,"validate")&&!this.$element.is(this.options.inputs)?this.bind("parsleyForm"):this.isMultiple()?this.handleMultiple():this.bind("parsleyField")},isMultiple:function(){return this.$element.is("input[type=radio], input[type=checkbox]")||this.$element.is("select")&&"undefined"!=typeof this.$element.attr("multiple")},handleMultiple:function(){var t,i,n=this;if(this.options.multiple||("undefined"!=typeof this.$element.attr("name")&&this.$element.attr("name").length?this.options.multiple=t=this.$element.attr("name"):"undefined"!=typeof this.$element.attr("id")&&this.$element.attr("id").length&&(this.options.multiple=this.$element.attr("id"))),this.$element.is("select")&&"undefined"!=typeof this.$element.attr("multiple"))return this.options.multiple=this.options.multiple||this.__id__,this.bind("parsleyFieldMultiple");if(!this.options.multiple)return a.warn("To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.",this.$element),this;this.options.multiple=this.options.multiple.replace(/(:|\.|\[|\]|\{|\}|\$)/g,""),
"undefined"!=typeof t&&e('input[name="'+t+'"]').each(function(t,i){e(i).is("input[type=radio], input[type=checkbox]")&&e(i).attr(n.options.namespace+"multiple",n.options.multiple)});for(var r=this._findRelated(),s=0;s<r.length;s++)if(i=e(r.get(s)).data("Parsley"),"undefined"!=typeof i){this.$element.data("ParsleyFieldMultiple")||i.addElement(this.$element);break}return this.bind("parsleyField",!0),i||this.bind("parsleyFieldMultiple")},bind:function(t,i){var n;switch(t){case"parsleyForm":n=e.extend(new _(this.$element,this.domOptions,this.options),window.ParsleyExtend)._bindFields();break;case"parsleyField":n=e.extend(new x(this.$element,this.domOptions,this.options,this.parent),window.ParsleyExtend);break;case"parsleyFieldMultiple":n=e.extend(new x(this.$element,this.domOptions,this.options,this.parent),new P,window.ParsleyExtend)._init();break;default:throw new Error(t+"is not a supported Parsley type")}return this.options.multiple&&a.setAttr(this.$element,this.options.namespace,"multiple",this.options.multiple),"undefined"!=typeof i?(this.$element.data("ParsleyFieldMultiple",n),n):(this.$element.data("Parsley",n),n._actualizeTriggers(),n._trigger("init"),n)}};var V=e.fn.jquery.split(".");if(parseInt(V[0])<=1&&parseInt(V[1])<8)throw"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.";V.forEach||a.warn("Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim");var M=e.extend(new l,{$element:e(document),actualizeOptions:null,_resetOptions:null,Factory:E,version:"2.3.5"});e.extend(x.prototype,y.Field,l.prototype),e.extend(_.prototype,y.Form,l.prototype),e.extend(E.prototype,l.prototype),e.fn.parsley=e.fn.psly=function(t){if(this.length>1){var i=[];return this.each(function(){i.push(e(this).parsley(t))}),i}return e(this).length?new E(this,t):void a.warn("You must bind Parsley on an existing element.")},"undefined"==typeof window.ParsleyExtend&&(window.ParsleyExtend={}),M.options=e.extend(a.objectCreate(o),window.ParsleyConfig),window.ParsleyConfig=M.options,window.Parsley=window.psly=M,window.ParsleyUtils=a;var O=window.Parsley._validatorRegistry=new c(window.ParsleyConfig.validators,window.ParsleyConfig.i18n);window.ParsleyValidator={},e.each("setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator".split(" "),function(t,i){window.Parsley[i]=e.proxy(O,i),window.ParsleyValidator[i]=function(){var e;return a.warnOnce("Accessing the method '"+i+"' through ParsleyValidator is deprecated. Simply call 'window.Parsley."+i+"(...)'"),(e=window.Parsley)[i].apply(e,arguments)}}),window.Parsley.UI=y,window.ParsleyUI={removeError:function(e,t,i){var n=!0!==i;return a.warnOnce("Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e.removeError(t,{updateClass:n})},getErrorsMessages:function(e){return a.warnOnce("Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly."),e.getErrorsMessages()}},e.each("addError updateError".split(" "),function(e,t){window.ParsleyUI[t]=function(e,i,n,r,s){var o=!0!==s;return a.warnOnce("Accessing ParsleyUI is deprecated. Call '"+t+"' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e[t](i,{message:n,assert:r,updateClass:o})}}),/firefox/i.test(navigator.userAgent)&&e(document).on("change","select",function(t){e(t.target).trigger("input")}),!1!==window.ParsleyConfig.autoBind&&e(function(){e("[data-parsley-validate]").length&&e("[data-parsley-validate]").parsley()});var A=e({}),R=function(){a.warnOnce("Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley")},D="parsley:";e.listen=function(e,n){var r;if(R(),"object"==typeof arguments[1]&&"function"==typeof arguments[2]&&(r=arguments[1],n=arguments[2]),"function"!=typeof n)throw new Error("Wrong parameters");window.Parsley.on(i(e),t(n,r))},e.listenTo=function(e,n,r){if(R(),!(e instanceof x||e instanceof _))throw new Error("Must give Parsley instance");if("string"!=typeof n||"function"!=typeof r)throw new Error("Wrong parameters");e.on(i(n),t(r))},e.unsubscribe=function(e,t){if(R(),"string"!=typeof e||"function"!=typeof t)throw new Error("Wrong arguments");window.Parsley.off(i(e),t.parsleyAdaptedCallback)},e.unsubscribeTo=function(e,t){if(R(),!(e instanceof x||e instanceof _))throw new Error("Must give Parsley instance");e.off(i(t))},e.unsubscribeAll=function(t){R(),window.Parsley.off(i(t)),e("form,input,textarea,select").each(function(){var n=e(this).data("Parsley");n&&n.off(i(t))})},e.emit=function(e,t){var n;R();var r=t instanceof x||t instanceof _,s=Array.prototype.slice.call(arguments,r?2:1);s.unshift(i(e)),r||(t=window.Parsley),(n=t).trigger.apply(n,_toConsumableArray(s))};e.extend(!0,M,{asyncValidators:{"default":{fn:function(e){return e.status>=200&&e.status<300},url:!1},reverse:{fn:function(e){return e.status<200||e.status>=300},url:!1}},addAsyncValidator:function(e,t,i,n){return M.asyncValidators[e]={fn:t,url:i||!1,options:n||{}},this}}),M.addValidator("remote",{requirementType:{"":"string",validator:"string",reverse:"boolean",options:"object"},validateString:function(t,i,n,r){var s,a,o={},l=n.validator||(!0===n.reverse?"reverse":"default");if("undefined"==typeof M.asyncValidators[l])throw new Error("Calling an undefined async validator: `"+l+"`");i=M.asyncValidators[l].url||i,i.indexOf("{value}")>-1?i=i.replace("{value}",encodeURIComponent(t)):o[r.$element.attr("name")||r.$element.attr("id")]=t;var u=e.extend(!0,n.options||{},M.asyncValidators[l].options);s=e.extend(!0,{},{url:i,data:o,type:"GET"},u),r.trigger("field:ajaxoptions",r,s),a=e.param(s),"undefined"==typeof M._remoteCache&&(M._remoteCache={});var d=M._remoteCache[a]=M._remoteCache[a]||e.ajax(s),h=function(){var t=M.asyncValidators[l].fn.call(r,d,i,n);return t||(t=e.Deferred().reject()),e.when(t)};return d.then(h,h)},priority:-1}),M.on("form:submit",function(){M._remoteCache={}}),window.ParsleyExtend.addAsyncValidator=function(){return ParsleyUtils.warnOnce("Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`"),M.addAsyncValidator.apply(M,arguments)},M.addMessages("en",{defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",number:"This value should be a valid number.",integer:"This value should be a valid integer.",digits:"This value should be digits.",alphanum:"This value should be alphanumeric."},notblank:"This value should not be blank.",required:"This value is required.",pattern:"This value seems to be invalid.",min:"This value should be greater than or equal to %s.",max:"This value should be lower than or equal to %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or fewer.",length:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or fewer.",check:"You must select between %s and %s choices.",equalto:"This value should be the same."}),M.setLocale("en");var q=M;return q});
//# sourceMappingURL=parsley.min.js.mapassets/js/parsley.min.js.map000064400000634531151336065400012054 0ustar00{"version":3,"sources":["parsley.min.js","/source/parsley.js","/source/src/parsley/pubsub.js","/source/src/parsley/utils.js","/source/src/parsley/defaults.js","/source/src/parsley/abstract.js","/source/src/parsley/validator.js","/source/src/parsley/validator_registry.js","/source/src/parsley/ui.js","/source/src/parsley/form.js","/source/src/parsley/factory/constraint.js","/source/src/parsley/field.js","/source/src/parsley/multiple.js","/source/src/parsley/factory.js","/source/src/parsley/main.js","/source/src/parsley/remote.js","/source/src/i18n/en.js","/source/src/parsley.js"],"names":["_toConsumableArray","arr","Array","isArray","i","arr2","length","from","_slice","prototype","slice","global","factory","exports","module","require","define","amd","parsley","jQuery","this","$","adapt","fn","context","parsleyAdaptedCallback","args","call","arguments","unshift","apply","o","eventName","name","lastIndexOf","eventPrefix","substr","globalID","pastWarnings","ParsleyUtils__ParsleyUtils","attr","$element","namespace","obj","attribute","attributes","regex","RegExp","hasOwnProperty","specified","test","camelize","deserializeValue","value","checkAttr","_checkAttr","is","setAttr","setAttribute","dasherize","String","generateID","num","isNaN","Number","parseJSON","e","str","replace","match","chr","toUpperCase","toLowerCase","warn","_window$console","window","console","warnOnce","msg","_resetWarnings","trimString","string","namespaceEvents","events","split","map","evt","join","objectCreate","Object","create","Error","TypeError","result","ParsleyUtils__default","ParsleyDefaults","inputs","excluded","priorityEnabled","multiple","group","uiEnabled","validationThreshold","focus","trigger","triggerAfterFailure","errorClass","successClass","classHandler","ParsleyField","errorsContainer","errorsWrapper","errorTemplate","ParsleyAbstract","asyncSupport","actualizeOptions","options","domOptions","parent","_resetOptions","initOptions","_listeners","on","queue","push","subscribe","listenTo","off","splice","unsubscribe","unsubscribeTo","target","extraArg","reset","__class__","_resetUI","_trigger","fields","destroy","_destroyUI","removeData","asyncIsValid","force","whenValid","_findRelated","find","requirementConverters","_string","integer","parseInt","number","parseFloat","reference","boolean","object","regexp","_regexp","flags","convertArrayRequirement","m","values","convertRequirement","requirementType","converter","convertExtraOptionRequirement","requirementSpec","extraOptionReader","main","extra","key","ParsleyValidator","spec","extend","validate","requirementFirstArg","validateMultiple","validateNumber","validateString","parseRequirements","requirements","type","isPlainObject","priority","ParsleyValidatorRegistry","validators","catalog","locale","init","typeRegexes","email","digits","alphanum","url","range","decimalPlaces","Math","max","addValidator","Parsley","setLocale","addCatalog","messages","set","addMessage","message","addMessages","nameMessageObject","arg1","arg2","_setValidator","updateValidator","removeValidator","validator","getErrorMessage","constraint","typeMessages","formatMessage","defaultMessage","en","parameters","notblank","required","_ref","undefined","_ref$step","step","_ref$base","base","nb","decimals","toInt","f","round","pow","pattern","minlength","requirement","maxlength","min","mincheck","maxcheck","check","equalto","refOrValue","$reference","val","ParsleyUI","diffResults","newResult","oldResult","deep","added","kept","found","j","assert","removed","Form","_actualizeTriggers","_this","onSubmitValidate","onSubmitButton","_focusedField","validationResult","field","noFocus","Field","_reflowUI","_buildUI","_ui","diff","lastValidationResult","_manageStatusClass","_manageErrorsMessages","_failedOnce","getErrorsMessages","errorMessage","_getErrorMessage","addError","_ref2","_ref2$updateClass","updateClass","_addError","_errorClass","updateError","_ref3","_ref3$updateClass","_updateError","removeError","_ref4","_ref4$updateClass","_removeError","hasConstraints","needsValidation","_successClass","_resetClass","errorsMessagesDisabled","_insertErrorWrapper","$errorsWrapper","append","addClass","html","removeClass","remove","_ref5","_ref6","customConstraintErrorMessage","__id__","$errorClassHandler","_manageClassHandler","errorsWrapperId","validationInformationVisible","$handler","$errorsContainer","$from","after","_this2","$toBind","event","_eventValidate","getValue","children","ParsleyForm","element","ParsleyForm__statusMapping","pending","resolved","rejected","_this3","$submitSource","_$submitSource","first","prop","promise","whenValidate","state","stopImmediatePropagation","preventDefault","done","_submit","$synthetic","appendTo","Event","_arguments","_this4","_ref7","submitEvent","_refreshFields","promises","_withoutReactualizingFormOptions","promiseBasedOnValidationResult","r","Deferred","reject","resolve","when","fail","always","pipe","isValid","_arguments2","_this5","_ref8","_bindFields","_this6","oldFields","fieldsMappedById","not","each","_","fieldInstance","Factory","oldActualizeOptions","ConstraintFactory","parsleyField","isDomConstraint","validatorSpec","_validatorRegistry","_parseRequirements","capitalize","cap","instance","requirementList","_this7","parsleyFormInstance","constraints","constraintsByName","_bindConstraints","parsley_field__statusMapping","_this8","_ref9","refreshConstraints","_isInGroup","_refreshed","_isRequired","validateIfEmpty","inArray","_arguments3","_this9","_ref10","_ref10$force","groupedConstraints","_getGroupedConstraints","_validateConstraint","_this10","_handleWhitespace","addConstraint","removeConstraint","updateConstraint","_bindHtml5Constraints","hasClass","trimValue","whitespace","index","p","sort","a","b","parsley_field","ParsleyMultiple","addElement","$elements","fieldConstraints","has","data","filter","_init","ParsleyFactory","savedparsleyFormInstance","__version__","bind","isMultiple","handleMultiple","parsleyMultipleInstance","_this11","input","$previouslyRelated","get","doNotStore","parsleyInstance","ParsleyExtend","vernums","jquery","forEach","document","version","psly","instances","ParsleyConfig","ParsleyUtils","registry","i18n","method","proxy","_window$Parsley","UI","doNotUpdateClass","navigator","userAgent","autoBind","deprecated","listen","callback","unsubscribeAll","emit","_instance","instanceGiven","asyncValidators","default","xhr","status","reverse","addAsyncValidator","ajaxOptions","csr","indexOf","encodeURIComponent","remoteOptions","param","_remoteCache","ajax","handleXhr","then"],"mappings":";;;;;;;;AAcA,QAASA,oBAAmBC,GAAO,GAAIC,MAAMC,QAAQF,GAAM,CAAE,IAAK,GAAIG,GAAI,EAAGC,EAAOH,MAAMD,EAAIK,QAASF,EAAIH,EAAIK,OAAQF,IAAKC,EAAKD,GAAKH,EAAIG,EAAI,OAAOC,GAAe,MAAOH,OAAMK,KAAKN,GCFtL,GAAAO,QAAAN,MAAAO,UAAAC,OAZA,SAAWC,EAAQC,GACE,gBAAZC,UAA0C,mBAAXC,QAAyBA,OAAOD,QAAUD,EAAQG,QAAQ,WAC9E,kBAAXC,SAAyBA,OAAOC,IAAMD,QAAQ,UAAWJ,GAChED,EAAOO,QAAUN,EAAQD,EAAOQ,SAChCC,KAAM,SAAUC,GAAK,YCOvB,SAASC,GAAMC,EAAIC,GASjB,MAPKD,GAAGE,yBACNF,EAAGE,uBAAyB,WAC1B,GAAIC,GAAOxB,MAAMO,UAAUC,MAAMiB,KAAKC,UAAW,EACjDF,GAAKG,QAAQT,MACbG,EAAGO,MAAMN,GAAWO,EAAGL,KAGpBH,EAAGE,uBAKZ,QAASO,GAAUC,GACjB,MAAyC,KAArCA,EAAKC,YAAYC,EAAa,GACzBF,EAAKG,OAAOD,EAAY7B,QAC1B2B,EC1BT,GAAII,GAAW,EACXC,KAHJC,GAQEC,KAAM,SAAUC,EAAUC,EAAWC,GACnC,GAAIvC,GACAwC,EACAC,EACAC,EAAQ,GAAIC,QAAO,IAAML,EAAW,IAExC,IAAI,mBAAuBC,GACzBA,SAGA,KAAKvC,IAAKuC,GACJA,EAAIK,eAAe5C,UACduC,GAAIvC,EAIjB,IAAI,mBAAuBqC,IAAY,mBAAuBA,GAAS,GACrE,MAAOE,EAGT,KADAE,EAAaJ,EAAS,GAAGI,WACpBzC,EAAIyC,EAAWvC,OAAQF,KAC1BwC,EAAYC,EAAWzC,GAEnBwC,GAAaA,EAAUK,WAAaH,EAAMI,KAAKN,EAAUX,QAC3DU,EAAIvB,KAAK+B,SAASP,EAAUX,KAAKvB,MAAMgC,EAAUpC,UAAYc,KAAKgC,iBAAiBR,EAAUS,OAIjG,OAAOV,IAGTW,UAAW,SAAUb,EAAUC,EAAWa,GACxC,MAAOd,GAASe,GAAG,IAAMd,EAAYa,EAAY,MAGnDE,QAAS,SAAUhB,EAAUC,EAAWF,EAAMa,GAC5CZ,EAAS,GAAGiB,aAAatC,KAAKuC,UAAUjB,EAAYF,GAAOoB,OAAOP,KAGpEQ,WAAY,WACV,MAAO,GAAKxB,KAKde,iBAAkB,SAAUC,GAC1B,GAAIS,EAEJ,KACE,MAAOT,GACI,QAATA,IACU,SAATA,GAAmB,EACX,QAATA,EAAkB,KACjBU,MAAMD,EAAME,OAAOX,IACpB,UAAUH,KAAKG,GAAShC,EAAE4C,UAAUZ,GACpCA,EAF8BS,GAG5BT,EACJ,MAAOa,GAAK,MAAOb,KAIvBF,SAAU,SAAUgB,GAClB,MAAOA,GAAIC,QAAQ,UAAW,SAAUC,EAAOC,GAC7C,MAAOA,GAAMA,EAAIC,cAAgB,MAKrCZ,UAAW,SAAUQ,GACnB,MAAOA,GAAIC,QAAQ,MAAO,KACvBA,QAAQ,wBAAyB,SACjCA,QAAQ,oBAAqB,SAC7BA,QAAQ,KAAM,KACdI,eAGLC,KAAM,WHOF,GAAIC,EGNFC,QAAOC,SAAW,kBAAsBD,QAAOC,QAAQH,OACzDC,EAAAC,OAAOC,SAAQH,KAAA3C,MAAA4C,EAAQ9C,YAG3BiD,SAAU,SAASC,GACZxC,EAAawC,KAChBxC,EAAawC,IAAO,EACpB1D,KAAKqD,KAAA3C,MAALV,KAAaQ,aAIjBmD,eAAgB,WACdzC,MAGF0C,WAAY,SAASC,GACnB,MAAOA,GAAOb,QAAQ,aAAc,KAGtCc,gBAAiB,SAASC,EAAQzC,GAEhC,MADAyC,GAAS/D,KAAK4D,WAAWG,GAAU,IAAIC,MAAM,OACxCD,EAAO,GAEL9D,EAAEgE,IAAIF,EAAQ,SAAAG,GAAS,MAAUA,GAAA,IAAO5C,IAAgB6C,KAAK,KAD3D,IAKXC,aAAcC,OAAOC,QAAU,WAC7B,GAAID,GAAS,YACb,OAAO,UAAUhF,GACf,GAAImB,UAAUtB,OAAS,EACrB,KAAMqF,OAAM,gCAEd,IAAwB,gBAAblF,GACT,KAAMmF,WAAU,6BAElBH,GAAOhF,UAAYA,CACnB,IAAIoF,GAAS,GAAIJ,EAEjB,OADAA,GAAOhF,UAAY,KACZoF,OA5HbC,EAAAvD,ECKIwD,GAIFrD,UAAW,gBAGXsD,OAAQ,0BAGRC,SAAU,gFAGVC,iBAAiB,EAKjBC,SAAU,KAGVC,MAAO,KAIPC,WAAW,EAGXC,oBAAqB,EAGrBC,MAAO,QAGPC,SAAS,EAGTC,oBAAqB,QAGrBC,WAAY,gBAGZC,aAAc,kBAIdC,aAAc,SAAUC,KAIxBC,gBAAiB,SAAUD,KAG3BE,cAAe,wCAGfC,cAAe,aC3DbC,EAAkB,YAEtBA,GAAgBxG,WACdyG,cAAc,EAEdC,iBAAkB,WAIhB,MAZJrB,GASiBtD,KAAKpB,KAAKqB,SAAUrB,KAAKgG,QAAQ1E,UAAWtB,KAAKiG,YAC1DjG,KAAKkG,QAAUlG,KAAKkG,OAAOH,kBAC7B/F,KAAKkG,OAAOH,mBACP/F,MAGTmG,cAAe,SAAUC,GACvBpG,KAAKiG,WAhBTvB,EAgBmCN,aAAapE,KAAKkG,OAAOF,SACxDhG,KAAKgG,QAjBTtB,EAiBgCN,aAAapE,KAAKiG,WAE9C,KAAK,GAAIjH,KAAKoH,GACRA,EAAYxE,eAAe5C,KAC7BgB,KAAKgG,QAAQhH,GAAKoH,EAAYpH,GAElCgB,MAAK+F,oBAGPM,WAAY,KAMZC,GAAI,SAAUzF,EAAMV,GAClBH,KAAKqG,WAAarG,KAAKqG,cACvB,IAAIE,GAAQvG,KAAKqG,WAAWxF,GAAQb,KAAKqG,WAAWxF,MAGpD,OAFA0F,GAAMC,KAAKrG,GAEJH,MAITyG,UAAW,SAAS5F,EAAMV,GACxBF,EAAEyG,SAAS1G,KAAMa,EAAKuC,cAAejD,IAIvCwG,IAAK,SAAU9F,EAAMV,GACnB,GAAIoG,GAAQvG,KAAKqG,YAAcrG,KAAKqG,WAAWxF,EAC/C,IAAI0F,EACF,GAAKpG,EAGH,IAAK,GAAInB,GAAIuH,EAAMrH,OAAQF,KACrBuH,EAAMvH,KAAOmB,GACfoG,EAAMK,OAAO5H,EAAG,cAJbgB,MAAKqG,WAAWxF,EAO3B,OAAOb,OAIT6G,YAAa,SAAShG,EAAMV,GAC1BF,EAAE6G,cAAc9G,KAAMa,EAAKuC,gBAM7BgC,QAAS,SAAUvE,EAAMkG,EAAQC,GAC/BD,EAASA,GAAU/G,IACnB,IACIyE,GADA8B,EAAQvG,KAAKqG,YAAcrG,KAAKqG,WAAWxF,EAG/C,IAAI0F,EACF,IAAK,GAAIvH,GAAIuH,EAAMrH,OAAQF,KAEzB,GADAyF,EAAS8B,EAAMvH,GAAGuB,KAAKwG,EAAQA,EAAQC,GACnCvC,KAAW,EAAO,MAAOA,EAGjC,OAAIzE,MAAKkG,OACAlG,KAAKkG,OAAOd,QAAQvE,EAAMkG,EAAQC,IAEpC,GAITC,MAAO,WAEL,GAAI,gBAAkBjH,KAAKkH,UAEzB,MADAlH,MAAKmH,WACEnH,KAAKoH,SAAS,QAIvB,KAAK,GAAIpI,GAAI,EAAGA,EAAIgB,KAAKqH,OAAOnI,OAAQF,IACtCgB,KAAKqH,OAAOrI,GAAGiI,OAEjBjH,MAAKoH,SAAS,UAIhBE,QAAS,WAGP,GADAtH,KAAKuH,aACD,gBAAkBvH,KAAKkH,UAKzB,MAJAlH,MAAKqB,SAASmG,WAAW,WACzBxH,KAAKqB,SAASmG,WAAW,4BACzBxH,MAAKoH,SAAS,UAMhB,KAAK,GAAIpI,GAAI,EAAGA,EAAIgB,KAAKqH,OAAOnI,OAAQF,IACtCgB,KAAKqH,OAAOrI,GAAGsI,SAEjBtH,MAAKqB,SAASmG,WAAW,WACzBxH,KAAKoH,SAAS,YAGhBK,aAAc,SAAUzC,EAAO0C,GAE7B,MA1HJhD,GAyHiBjB,SAAS,4DACfzD,KAAK2H,WAAW3C,MAAAA,EAAO0C,MAAAA,KAGhCE,aAAc,WACZ,MAAO5H,MAAKgG,QAAQjB,SAClB/E,KAAKkG,OAAO7E,SAASwG,KAAA,IAAS7H,KAAKgG,QAAQ1E,UAAA,aAAsBtB,KAAKgG,QAAQjB,SAAA,MAC9E/E,KAAKqB,UC7HX,IAAIyG,IACFjE,OAAQ,SAASkE,GACf,MAAOA,IAETC,QAAS,SAASnE,GAChB,GAAIlB,MAAMkB,GACR,KAAM,mCAAqCA,EAAS,GACtD,OAAOoE,UAASpE,EAAQ,KAE1BqE,OAAQ,SAASrE,GACf,GAAIlB,MAAMkB,GACR,KAAM,iCAAmCA,EAAS,GACpD,OAAOsE,YAAWtE,IAEpBuE,UAAW,SAASvE,GAClB,GAAIY,GAASxE,EAAE4D,EACf,IAAsB,IAAlBY,EAAOvF,OACT,KAAM,uBAAyB2E,EAAS,GAC1C,OAAOY,IAET4D,UAAS,SAASxE,GAChB,MAAkB,UAAXA,GAETyE,OAAQ,SAASzE,GACf,MA3BJa,GA2BwB1C,iBAAiB6B,IAEvC0E,OAAQ,SAASC,GACf,GAAIC,GAAQ,EAcZ,OAXI,sBAAsB3G,KAAK0G,IAG7BC,EAAQD,EAAOxF,QAAQ,iBAAkB,MAGzCwF,EAASA,EAAOxF,QAAQ,GAAIrB,QAAO,WAAa8G,EAAQ,KAAM,OAG9DD,EAAS,IAAMA,EAAS,IAEnB,GAAI7G,QAAO6G,EAAQC,KAI1BC,EAA0B,SAAS7E,EAAQ3E,GAC7C,GAAIyJ,GAAI9E,EAAOZ,MAAM,mBACrB,KAAK0F,EACH,KAAM,iCAAmC9E,EAAS,GACpD,IAAI+E,GAASD,EAAE,GAAG3E,MAAM,KAAKC,IApD/BS,EAoDgDd,WAC9C,IAAIgF,EAAO1J,SAAWA,EACpB,KAAM,mBAAqB0J,EAAO1J,OAAS,gBAAkBA,EAAS,aACxE,OAAO0J,IAGLC,EAAqB,SAASC,EAAiBjF,GACjD,GAAIkF,GAAYjB,EAAsBgB,GAAmB,SACzD,KAAKC,EACH,KAAM,uCAAyCD,EAAkB,GACnE,OAAOC,GAAUlF,IAGfmF,EAAgC,SAASC,EAAiBpF,EAAQqF,GACpE,GAAIC,GAAO,KACPC,IACJ,KAAK,GAAIC,KAAOJ,GACd,GAAII,EAAK,CACP,GAAIpH,GAAQiH,EAAkBG,EAC1B,iBAAoBpH,KACtBA,EAAQ4G,EAAmBI,EAAgBI,GAAMpH,IACnDmH,EAAMC,GAAOpH,MAEbkH,GAAON,EAAmBI,EAAgBI,GAAMxF,EAGpD,QAAQsF,EAAMC,IAKZE,EAAmB,SAASC,GAC9BtJ,EAAEuJ,QAAO,EAAMxJ,KAAMuJ,GAGvBD,GAAiBjK,WAEfoK,SAAU,SAASxH,EAAOyH,GACxB,GAAI1J,KAAKG,GAIP,MAFIK,WAAUtB,OAAS,IACrBwK,KAAyBpK,MAAMiB,KAAKC,UAAW,EAAG,KAC7CR,KAAKG,GAAGI,KAAKP,KAAMiC,EAAOyH,EAGnC,IAAIzJ,EAAElB,QAAQkD,GAAQ,CACpB,IAAKjC,KAAK2J,iBACR,KAAM,cAAgB3J,KAAKa,KAAO,mCACpC,OAAOb,MAAK2J,iBAAAjJ,MAALV,KAAyBQ,WAEhC,GAAIR,KAAK4J,eACP,MAAIjH,OAAMV,IACD,GACTzB,UAAU,GAAK2H,WAAW3H,UAAU,IAC7BR,KAAK4J,eAAAlJ,MAALV,KAAuBQ,WAEhC,IAAIR,KAAK6J,eACP,MAAO7J,MAAK6J,eAAAnJ,MAALV,KAAuBQ,UAEhC,MAAM,cAAgBR,KAAKa,KAAO,kCAMtCiJ,kBAAmB,SAASC,EAAcb,GACxC,GAAI,gBAAoBa,GAGtB,MAAO9J,GAAElB,QAAQgL,GAAgBA,GAAgBA,EAEnD,IAAIC,GAAOhK,KAAK8I,eAChB,IAAI7I,EAAElB,QAAQiL,GAAO,CAEnB,IAAK,GADDpB,GAASF,EAAwBqB,EAAcC,EAAK9K,QAC/CF,EAAI,EAAGA,EAAI4J,EAAO1J,OAAQF,IACjC4J,EAAO5J,GAAK6J,EAAmBmB,EAAKhL,GAAI4J,EAAO5J,GACjD,OAAO4J,GACF,MAAI3I,GAAEgK,cAAcD,GAClBhB,EAA8BgB,EAAMD,EAAcb,IAEjDL,EAAmBmB,EAAMD,KAIrCjB,gBAAiB,SAEjBoB,SAAU,ECrIZ,IAAIC,GAA2B,SAAUC,EAAYC,GACnDrK,KAAKkH,UAAY,2BAGjBlH,KAAKsK,OAAS,KAEdtK,KAAKuK,KAAKH,MAAkBC,QAG1BG,GACFC,MAAO,04BAGPvC,OAAQ,+BAERF,QAAS,UAET0C,OAAQ,QAERC,SAAU,SAEVC,IAAK,GAAIjJ,QACL,qWA+BK,KAGX6I,GAAYK,MAAQL,EAAYtC,MAGhC,IAAI4C,GAAgB,SAAApI,GAClB,GAAIO,IAAS,GAAKP,GAAKO,MAAM,mCAC7B,OAAKA,GACE8H,KAAKC,IACP,GAEC/H,EAAM,GAAKA,EAAM,GAAG/D,OAAS,IAE7B+D,EAAM,IAAMA,EAAM,GAAK,IANR,EASvBkH,GAAyB9K,WACvBkL,KAAM,SAAUH,EAAYC,GAC1BrK,KAAKqK,QAAUA,EAEfrK,KAAKoK,WAAanK,EAAEuJ,UAAWxJ,KAAKoK,WAEpC,KAAK,GAAIvJ,KAAQuJ,GACfpK,KAAKiL,aAAapK,EAAMuJ,EAAWvJ,GAAMV,GAAIiK,EAAWvJ,GAAMqJ,SAEhE3G,QAAO2H,QAAQ9F,QAAQ,2BAIzB+F,UAAW,SAAUb,GACnB,GAAI,mBAAuBtK,MAAKqK,QAAQC,GACtC,KAAM,IAAI/F,OAAM+F,EAAS,mCAI3B,OAFAtK,MAAKsK,OAASA,EAEPtK,MAIToL,WAAY,SAAUd,EAAQe,EAAUC,GAItC,MAHI,gBAAoBD,KACtBrL,KAAKqK,QAAQC,GAAUe,IAErB,IAASC,EACJtL,KAAKmL,UAAUb,GAEjBtK,MAITuL,WAAY,SAAUjB,EAAQzJ,EAAM2K,GAMlC,MALI,mBAAuBxL,MAAKqK,QAAQC,KACtCtK,KAAKqK,QAAQC,OAEftK,KAAKqK,QAAQC,GAAQzJ,GAAQ2K,EAEtBxL,MAITyL,YAAa,SAAUnB,EAAQoB,GAC7B,IAAK,GAAI7K,KAAQ6K,GACf1L,KAAKuL,WAAWjB,EAAQzJ,EAAM6K,EAAkB7K,GAElD,OAAOb,OAiBTiL,aAAc,SAAUpK,EAAM8K,EAAMC,GAClC,GAAI5L,KAAKoK,WAAWvJ,GA7IxB6D,EA8ImBrB,KAAK,cAAgBxC,EAAO,6BACtC,IAAI8D,EAAgB/C,eAAef,GAEtC,WAjJN6D,GAgJmBrB,KAAK,IAAMxC,EAAO,+DAGjC,OAAOb,MAAK6L,cAAAnL,MAALV,KAAsBQ,YAG/BsL,gBAAiB,SAAUjL,EAAM8K,EAAMC,GACrC,MAAK5L,MAAKoK,WAAWvJ,GAIdb,KAAK6L,cAAc7L,KAAMQ,YA3JpCkE,EAwJmBrB,KAAK,cAAgBxC,EAAO,6BAClCb,KAAKiL,aAAAvK,MAALV,KAAqBQ,aAKhCuL,gBAAiB,SAAUlL,GAMzB,MALKb,MAAKoK,WAAWvJ,IA/JzB6D,EAgKmBrB,KAAK,cAAgBxC,EAAO,2BAEpCb,MAAKoK,WAAWvJ,GAEhBb,MAGT6L,cAAe,SAAUhL,EAAMmL,EAAW9B,GACpC,gBAAoB8B,KAEtBA,GACE7L,GAAI6L,EACJ9B,SAAUA,IAGT8B,EAAUvC,WACbuC,EAAY,GAAI1C,GAAiB0C,IAEnChM,KAAKoK,WAAWvJ,GAAQmL,CAExB,KAAK,GAAI1B,KAAU0B,GAAUX,aAC3BrL,KAAKuL,WAAWjB,EAAQzJ,EAAMmL,EAAUX,SAASf,GAEnD,OAAOtK,OAGTiM,gBAAiB,SAAUC,GACzB,GAAIV,EAGJ,IAAI,SAAWU,EAAWrL,KAAM,CAC9B,GAAIsL,GAAenM,KAAKqK,QAAQrK,KAAKsK,QAAQ4B,EAAWrL,SACxD2K,GAAUW,EAAaD,EAAWnC,kBAElCyB,GAAUxL,KAAKoM,cAAcpM,KAAKqK,QAAQrK,KAAKsK,QAAQ4B,EAAWrL,MAAOqL,EAAWnC,aAEtF,OAAOyB,IAAWxL,KAAKqK,QAAQrK,KAAKsK,QAAQ+B,gBAAkBrM,KAAKqK,QAAQiC,GAAGD,gBAIhFD,cAAe,SAAUvI,EAAQ0I,GAC/B,GAAI,gBAAoBA,GAAY,CAClC,IAAK,GAAIvN,KAAKuN,GACZ1I,EAAS7D,KAAKoM,cAAcvI,EAAQ0I,EAAWvN,GAEjD,OAAO6E,GAGT,MAAO,gBAAoBA,GAASA,EAAOb,QAAQ,MAAOuJ,GAAc,IAU1EnC,YACEoC,UACE3C,eAAgB,SAAS5H,GACvB,MAAO,KAAKH,KAAKG,IAEnBiI,SAAU,GAEZuC,UACE9C,iBAAkB,SAASf,GACzB,MAAOA,GAAO1J,OAAS,GAEzB2K,eAAgB,SAAS5H,GACvB,MAAO,KAAKH,KAAKG,IAEnBiI,SAAU,KAEZF,MACEH,eAAgB,SAAS5H,EAAO+H,GPmb5B,GAAI0C,GAAOlM,UAAUtB,QAAU,GAAsByN,SAAjBnM,UAAU,MOnbaA,UAAA,GPqbvDoM,EAAYF,EOrbmBG,KAAAA,EAAAF,SAAAC,EAAO,IAAAA,EPubtCE,EAAYJ,EOvb+BK,KAAAA,EAAAJ,SAAAG,EAAO,EAAAA,EACpDpL,EAAQ8I,EAAYR,EACxB,KAAKtI,EACH,KAAM,IAAI6C,OAAM,mBAAqByF,EAAO,qBAE9C,KAAKtI,EAAMI,KAAKG,GACd,OAAO,CACT,IAAI,WAAa+H,IACV,SAASlI,KAAK+K,GAAQ,IAAK,CAC9B,GAAIG,GAAKpK,OAAOX,GACZgL,EAAWlC,KAAKC,IAAIF,EAAc+B,GAAO/B,EAAciC,GAC3D,IAAIjC,EAAckC,GAAMC,EACtB,OAAO,CAET,IAAIC,GAAQ,SAAAC,GAAO,MAAOpC,MAAKqC,MAAMD,EAAIpC,KAAKsC,IAAI,GAAIJ,IACtD,KAAKC,EAAMF,GAAME,EAAMH,IAASG,EAAML,IAAS,EAC7C,OAAO,EAGb,OAAO,GAET/D,iBACE,GAAI,SACJ+D,KAAM,SACNE,KAAM,UAER7C,SAAU,KAEZoD,SACEzD,eAAgB,SAAS5H,EAAOsG,GAC9B,MAAOA,GAAOzG,KAAKG,IAErB6G,gBAAiB,SACjBoB,SAAU,IAEZqD,WACE1D,eAAgB,SAAU5H,EAAOuL,GAC/B,MAAOvL,GAAM/C,QAAUsO,GAEzB1E,gBAAiB,UACjBoB,SAAU,IAEZuD,WACE5D,eAAgB,SAAU5H,EAAOuL,GAC/B,MAAOvL,GAAM/C,QAAUsO,GAEzB1E,gBAAiB,UACjBoB,SAAU,IAEZhL,QACE2K,eAAgB,SAAU5H,EAAOyL,EAAK1C,GACpC,MAAO/I,GAAM/C,QAAUwO,GAAOzL,EAAM/C,QAAU8L,GAEhDlC,iBAAkB,UAAW,WAC7BoB,SAAU,IAEZyD,UACEhE,iBAAkB,SAAUf,EAAQ4E,GAClC,MAAO5E,GAAO1J,QAAUsO,GAE1B1E,gBAAiB,UACjBoB,SAAU,IAEZ0D,UACEjE,iBAAkB,SAAUf,EAAQ4E,GAClC,MAAO5E,GAAO1J,QAAUsO,GAE1B1E,gBAAiB,UACjBoB,SAAU,IAEZ2D,OACElE,iBAAkB,SAAUf,EAAQ8E,EAAK1C,GACvC,MAAOpC,GAAO1J,QAAUwO,GAAO9E,EAAO1J,QAAU8L,GAElDlC,iBAAkB,UAAW,WAC7BoB,SAAU,IAEZwD,KACE9D,eAAgB,SAAU3H,EAAOuL,GAC/B,MAAOvL,IAASuL,GAElB1E,gBAAiB,SACjBoB,SAAU,IAEZc,KACEpB,eAAgB,SAAU3H,EAAOuL,GAC/B,MAAgBA,IAATvL,GAET6G,gBAAiB,SACjBoB,SAAU,IAEZW,OACEjB,eAAgB,SAAU3H,EAAOyL,EAAK1C,GACpC,MAAO/I,IAASyL,GAAgB1C,GAAT/I,GAEzB6G,iBAAkB,SAAU,UAC5BoB,SAAU,IAEZ4D,SACEjE,eAAgB,SAAU5H,EAAO8L,GAC/B,GAAIC,GAAa/N,EAAE8N,EACnB,OAAIC,GAAW9O,OACN+C,IAAU+L,EAAWC,MAErBhM,IAAU8L,GAErB7D,SAAU,MClVhB,IAAIgE,MAEAC,EAAc,QAAdA,GAAwBC,EAAWC,EAAWC,GAIhD,IAAK,GAHDC,MACAC,KAEKxP,EAAI,EAAGA,EAAIoP,EAAUlP,OAAQF,IAAK,CAGzC,IAAK,GAFDyP,IAAQ,EAEHC,EAAI,EAAGA,EAAIL,EAAUnP,OAAQwP,IACpC,GAAIN,EAAUpP,GAAG2P,OAAO9N,OAASwN,EAAUK,GAAGC,OAAO9N,KAAM,CACzD4N,GAAQ,CACR,OAGAA,EACFD,EAAKhI,KAAK4H,EAAUpP,IAEpBuP,EAAM/H,KAAK4H,EAAUpP,IAGzB,OACEwP,KAAMA,EACND,MAAOA,EACPK,QAAUN,KAAOH,EAAYE,EAAWD,GAAW,GAAMG,OAI7DL,GAAUW,MAERC,mBAAoB,WR0wBhB,GAAIC,GAAQ/O,IQzwBdA,MAAKqB,SAASiF,GAAG,iBAAkB,SAAApC,GAAS6K,EAAKC,iBAAiB9K,KAClElE,KAAKqB,SAASiF,GAAG,gBAAiB,8CAA+C,SAAApC,GAAS6K,EAAKE,eAAe/K,MAG1G,IAAUlE,KAAKgG,QAAQf,WAG3BjF,KAAKqB,SAASD,KAAK,aAAc,KAGnC+D,MAAO,WAGL,GAFAnF,KAAKkP,cAAgB,MAEjB,IAASlP,KAAKmP,kBAAoB,SAAWnP,KAAKgG,QAAQb,MAC5D,MAAO,KAET,KAAK,GAAInG,GAAI,EAAGA,EAAIgB,KAAKqH,OAAOnI,OAAQF,IAAK,CAC3C,GAAIoQ,GAAQpP,KAAKqH,OAAOrI,EACxB,KAAI,IAASoQ,EAAMD,kBAAoBC,EAAMD,iBAAiBjQ,OAAS,GAAK,mBAAuBkQ,GAAMpJ,QAAQqJ,UAC/GrP,KAAKkP,cAAgBE,EAAM/N,SACvB,UAAYrB,KAAKgG,QAAQb,OAC3B,MAIN,MAAI,QAASnF,KAAKkP,cACT,KAEFlP,KAAKkP,cAAc/J,SAG5BoC,WAAY,WAEVvH,KAAKqB,SAASsF,IAAI,cAKtBuH,EAAUoB,OAERC,UAAW,WAIT,GAHAvP,KAAKwP,WAGAxP,KAAKyP,IAAV,CAIA,GAAIC,GAAOvB,EAAYnO,KAAKmP,iBAAkBnP,KAAKyP,IAAIE,qBAGvD3P,MAAKyP,IAAIE,qBAAuB3P,KAAKmP,iBAGrCnP,KAAK4P,qBAGL5P,KAAK6P,sBAAsBH,GAG3B1P,KAAK8O,sBAGAY,EAAKlB,KAAKtP,SAAUwQ,EAAKnB,MAAMrP,QAAYc,KAAK8P,cACnD9P,KAAK8P,aAAc,EACnB9P,KAAK8O,wBAKTiB,kBAAmB,WAEjB,IAAI,IAAS/P,KAAKmP,iBAChB,QAIF,KAAK,GAFD9D,MAEKrM,EAAI,EAAGA,EAAIgB,KAAKmP,iBAAiBjQ,OAAQF,IAChDqM,EAAS7E,KAAKxG,KAAKmP,iBAAiBnQ,GAAGgR,cACtChQ,KAAKiQ,iBAAiBjQ,KAAKmP,iBAAiBnQ,GAAG2P,QAElD,OAAOtD,IAIT6E,SAAU,SAAUrP,GRwwBhB,GAAIsP,GAAQ3P,UAAUtB,QAAU,GAAsByN,SAAjBnM,UAAU,MQxwBeA,UAAA,GAAvCgL,EAAA2E,EAAA3E,QAASmD,EAAAwB,EAAAxB,OR4wB5ByB,EAAoBD,EQ5wBgBE,YAAAA,EAAA1D,SAAAyD,GAAc,EAAAA,CACxDpQ,MAAKwP,WACLxP,KAAKsQ,UAAUzP,GAAO2K,QAAAA,EAASmD,OAAAA,IAE3B0B,GACFrQ,KAAKuQ,eAITC,YAAa,SAAU3P,GR8wBnB,GAAI4P,GAAQjQ,UAAUtB,QAAU,GAAsByN,SAAjBnM,UAAU,MQ9wBkBA,UAAA,GAAvCgL,EAAAiF,EAAAjF,QAASmD,EAAA8B,EAAA9B,ORkxB/B+B,EAAoBD,EQlxBmBJ,YAAAA,EAAA1D,SAAA+D,GAAc,EAAAA,CAC3D1Q,MAAKwP,WACLxP,KAAK2Q,aAAa9P,GAAO2K,QAAAA,EAASmD,OAAAA,IAE9B0B,GACFrQ,KAAKuQ,eAITK,YAAa,SAAU/P,GRoxBnB,GAAIgQ,GAAQrQ,UAAUtB,QAAU,GAAsByN,SAAjBnM,UAAU,MQpxBCA,UAAA,GRsxB5CsQ,EAAoBD,EQtxBER,YAAAA,EAAA1D,SAAAmE,GAAc,EAAAA,CAC1C9Q,MAAKwP,WACLxP,KAAK+Q,aAAalQ,GAIdwP,GACFrQ,KAAK4P,sBAGTA,mBAAoB,WACd5P,KAAKgR,kBAAoBhR,KAAKiR,oBAAqB,IAASjR,KAAKmP,iBACnEnP,KAAKkR,gBACElR,KAAKmP,iBAAiBjQ,OAAS,EACtCc,KAAKuQ,cAELvQ,KAAKmR,eAGTtB,sBAAuB,SAAUH,GAC/B,GAAI,mBAAuB1P,MAAKgG,QAAQoL,uBAAxC,CAIA,GAAI,mBAAuBpR,MAAKgG,QAAQgK,aACtC,MAAKN,GAAKnB,MAAMrP,QAAUwQ,EAAKlB,KAAKtP,QAClCc,KAAKqR,sBAED,IAAMrR,KAAKyP,IAAI6B,eAAezJ,KAAK,iCAAiC3I,QACtEc,KAAKyP,IAAI6B,eACNC,OACCtR,EAAED,KAAKgG,QAAQJ,eACd4L,SAAS,iCAGTxR,KAAKyP,IAAI6B,eACbE,SAAS,UACT3J,KAAK,iCACL4J,KAAKzR,KAAKgG,QAAQgK,eAGhBhQ,KAAKyP,IAAI6B,eACbI,YAAY,UACZ7J,KAAK,iCACL8J,QAIL,KAAK,GAAI3S,GAAI,EAAGA,EAAI0Q,EAAKd,QAAQ1P,OAAQF,IACvCgB,KAAK+Q,aAAarB,EAAKd,QAAQ5P,GAAG2P,OAAO9N,KAE3C,KAAK7B,EAAI,EAAGA,EAAI0Q,EAAKnB,MAAMrP,OAAQF,IACjCgB,KAAKsQ,UAAUZ,EAAKnB,MAAMvP,GAAG2P,OAAO9N,MAAO2K,QAASkE,EAAKnB,MAAMvP,GAAGgR,aAAcrB,OAAQe,EAAKnB,MAAMvP,GAAG2P,QAExG,KAAK3P,EAAI,EAAGA,EAAI0Q,EAAKlB,KAAKtP,OAAQF,IAChCgB,KAAK2Q,aAAajB,EAAKlB,KAAKxP,GAAG2P,OAAO9N,MAAO2K,QAASkE,EAAKlB,KAAKxP,GAAGgR,aAAcrB,OAAQe,EAAKlB,KAAKxP,GAAG2P,WAI1G2B,UAAW,SAAUzP,EAAM+Q,GRmwBvB,GQnwBwBpG,GAADoG,EAACpG,QAASmD,EAAViD,EAAUjD,MACnC3O,MAAKqR,sBACLrR,KAAKyP,IAAI6B,eACNE,SAAS,UACTD,OACCtR,EAAED,KAAKgG,QAAQJ,eACd4L,SAAS,WAAa3Q,GACtB4Q,KAAKjG,GAAWxL,KAAKiQ,iBAAiBtB,MAI7CgC,aAAc,SAAU9P,EAAMgR,GRgwB1B,GQhwB2BrG,GAADqG,EAACrG,QAASmD,EAAVkD,EAAUlD,MACtC3O,MAAKyP,IAAI6B,eACNE,SAAS,UACT3J,KAAK,YAAchH,GACnB4Q,KAAKjG,GAAWxL,KAAKiQ,iBAAiBtB,KAG3CoC,aAAc,SAAUlQ,GACtBb,KAAKyP,IAAI6B,eACNI,YAAY,UACZ7J,KAAK,YAAchH,GACnB8Q,UAGL1B,iBAAkB,SAAU/D,GAC1B,GAAI4F,GAA+B5F,EAAWrL,KAAO,SAErD,OAAI,mBAAuBb,MAAKgG,QAAQ8L,GAC/BvO,OAAO2H,QAAQkB,cAAcpM,KAAKgG,QAAQ8L,GAA+B5F,EAAWnC,cAEtFxG,OAAO2H,QAAQe,gBAAgBC,IAGxCsD,SAAU,WAER,IAAIxP,KAAKyP,MAAO,IAAUzP,KAAKgG,QAAQf,UAAvC,CAGA,GAAIwK,KAGJzP,MAAKqB,SAASD,KAAKpB,KAAKgG,QAAQ1E,UAAY,KAAMtB,KAAK+R,QAIvDtC,EAAIuC,mBAAqBhS,KAAKiS,sBAG9BxC,EAAIyC,gBAAkB,eAAiBlS,KAAKgG,QAAQjB,SAAW,YAAc/E,KAAKgG,QAAQjB,SAAW/E,KAAK+R,QAC1GtC,EAAI6B,eAAiBrR,EAAED,KAAKgG,QAAQL,eAAevE,KAAK,KAAMqO,EAAIyC,iBAGlEzC,EAAIE,wBACJF,EAAI0C,8BAA+B,EAGnCnS,KAAKyP,IAAMA,IAIbwC,oBAAqB,WAEnB,GAAI,gBAAoBjS,MAAKgG,QAAQR,cAAgBvF,EAAED,KAAKgG,QAAQR,cAActG,OAChF,MAAOe,GAAED,KAAKgG,QAAQR,aAGxB,IAAI4M,GAAWpS,KAAKgG,QAAQR,aAAajF,KAAKP,KAAMA,KAGpD,OAAI,mBAAuBoS,IAAYA,EAASlT,OACvCkT,GAGJpS,KAAKgG,QAAQjB,UAAY/E,KAAKqB,SAASe,GAAG,UACtCpC,KAAKqB,SAGPrB,KAAKqB,SAAS6E,UAGvBmL,oBAAqB,WACnB,GAAIgB,EAGJ,IAAI,IAAMrS,KAAKyP,IAAI6B,eAAepL,SAAShH,OACzC,MAAOc,MAAKyP,IAAI6B,eAAepL,QAEjC,IAAI,gBAAoBlG,MAAKgG,QAAQN,gBAAiB,CACpD,GAAIzF,EAAED,KAAKgG,QAAQN,iBAAiBxG,OAClC,MAAOe,GAAED,KAAKgG,QAAQN,iBAAiB6L,OAAOvR,KAAKyP,IAAI6B,eA9R/D5M,GAgSqBrB,KAAK,yBAA2BrD,KAAKgG,QAAQN,gBAAkB,+BACrE,kBAAsB1F,MAAKgG,QAAQN,kBAC5C2M,EAAmBrS,KAAKgG,QAAQN,gBAAgBnF,KAAKP,KAAMA,MAE7D,IAAI,mBAAuBqS,IAAoBA,EAAiBnT,OAC9D,MAAOmT,GAAiBd,OAAOvR,KAAKyP,IAAI6B,eAE1C,IAAIgB,GAAQtS,KAAKqB,QAGjB,OAFIrB,MAAKgG,QAAQjB,WACfuN,EAAQA,EAAMpM,UACToM,EAAMC,MAAMvS,KAAKyP,IAAI6B,iBAG9BxC,mBAAoB,WRivBhB,GAAI0D,GAASxS,KQhvBXyS,EAAUzS,KAAK4H,cAGnB6K,GAAQ9L,IAAI,YACR3G,KAAK8P,YACP2C,EAAQnM,GAnTd5B,EAmT8BZ,gBAAgB9D,KAAKgG,QAAQX,oBAAqB,WAAY,WACpFmN,EAAK/I,aAGPgJ,EAAQnM,GAvTd5B,EAuT8BZ,gBAAgB9D,KAAKgG,QAAQZ,QAAS,WAAY,SAAAsN,GACxEF,EAAKG,eAAeD,MAK1BC,eAAgB,SAAUD,KAIpB,YAAY5Q,KAAK4Q,EAAM1I,OACnBhK,KAAKyP,KAAOzP,KAAKyP,IAAI0C,gCAAiCnS,KAAK4S,WAAW1T,QAAUc,KAAKgG,QAAQd,uBAGrGlF,KAAKyJ,YAGPtC,SAAU,WAERnH,KAAK8P,aAAc,EACnB9P,KAAK8O,qBAGD,mBAAuB9O,MAAKyP,MAIhCzP,KAAKyP,IAAI6B,eACNI,YAAY,UACZmB,WACAlB,SAGH3R,KAAKmR,cAGLnR,KAAKyP,IAAIE,wBACT3P,KAAKyP,IAAI0C,8BAA+B,IAG1C5K,WAAY,WACVvH,KAAKmH,WAED,mBAAuBnH,MAAKyP,KAC9BzP,KAAKyP,IAAI6B,eAAeK,eAEnB3R,MAAKyP,KAGdyB,cAAe,WACblR,KAAKyP,IAAI0C,8BAA+B,EACxCnS,KAAKyP,IAAIuC,mBAAmBN,YAAY1R,KAAKgG,QAAQV,YAAYkM,SAASxR,KAAKgG,QAAQT,eAEzFgL,YAAa,WACXvQ,KAAKyP,IAAI0C,8BAA+B,EACxCnS,KAAKyP,IAAIuC,mBAAmBN,YAAY1R,KAAKgG,QAAQT,cAAciM,SAASxR,KAAKgG,QAAQV,aAE3F6L,YAAa,WACXnR,KAAKyP,IAAIuC,mBAAmBN,YAAY1R,KAAKgG,QAAQT,cAAcmM,YAAY1R,KAAKgG,QAAQV,aC7WhG,IAAIwN,GAAc,SAAUC,EAAS9M,EAAYD,GAC/ChG,KAAKkH,UAAY,cACjBlH,KAAK+R,OANPrN,EAM6BjC,aAE3BzC,KAAKqB,SAAWpB,EAAE8S,GAClB/S,KAAKiG,WAAaA,EAClBjG,KAAKgG,QAAUA,EACfhG,KAAKkG,OAAS3C,OAAO2H,QAErBlL,KAAKqH,UACLrH,KAAKmP,iBAAmB,MAd1B6D,GAiBqBC,QAAS,KAAMC,UAAU,EAAMC,UAAU,EAE9DL,GAAYzT,WACV2P,iBAAkB,SAAU0D,GT2lCxB,GAAIU,GAASpT,ISzlCf,KAAI,IAAS0S,EAAM5S,QAAnB,CAIA,GAAIuT,GAAgBrT,KAAKsT,gBAAkBtT,KAAKqB,SAASwG,KAAK,+CAA+C0L,OAG7G,IAFAvT,KAAKsT,eAAiB,KACtBtT,KAAKqB,SAASwG,KAAK,oCAAoC2L,KAAK,YAAY,IACpEH,EAAcjR,GAAG,oBAArB,CAGA,GAAIqR,GAAUzT,KAAK0T,cAAchB,MAAAA,GAE7B,cAAee,EAAQE,UAAW,IAAU3T,KAAKoH,SAAS,YAK5DsL,EAAMkB,2BACNlB,EAAMmB,iBACF,YAAcJ,EAAQE,SACxBF,EAAQK,KAAK,WAAQV,EAAKW,QAAQV,SAIxCpE,eAAgB,SAASyD,GACvB1S,KAAKsT,eAAiBrT,EAAEyS,EAAM3L,SAKhCgN,QAAS,SAAUV,GACjB,IAAI,IAAUrT,KAAKoH,SAAS,UAA5B,CAGA,GAAIiM,EAAe,CACjB,GAAIW,GAAahU,KAAKqB,SAASwG,KAAK,oCAAoC2L,KAAK,YAAY,EACrF,KAAMQ,EAAW9U,SACnB8U,EAAa/T,EAAE,iEAAiEgU,SAASjU,KAAKqB,WAChG2S,EAAW5S,MACTP,KAAMwS,EAAcjS,KAAK,QACzBa,MAAOoR,EAAcjS,KAAK,WAI9BpB,KAAKqB,SAAS+D,QAAQnF,EAAEuJ,OAAOvJ,EAAEiU,MAAM,WAAYpU,SAAS,OAQ9D2J,SAAU,SAAUzD,GAClB,GAAIxF,UAAUtB,QAAU,IAAMe,EAAEgK,cAAcjE,GAAU,CA3E5DtB,EA4EmBjB,SAAS,2FT2lCpB,IAAI0Q,GAAa/U,OAAOmB,KS1lCEC,WAAvBwE,EAAAmP,EAAA,GAAOzM,EAAAyM,EAAA,GAAOzB,EAAAyB,EAAA,EACnBnO,IAAWhB,MAAAA,EAAO0C,MAAAA,EAAOgL,MAAAA,GAE3B,MAhFJM,GAgF0BhT,KAAK0T,aAAa1N,GAAS2N,UAGnDD,aAAc,WTgmCV,GAAIU,GAASpU,KAETqU,EAAQ7T,UAAUtB,QAAU,GAAsByN,SAAjBnM,UAAU,MSlmCHA,UAAA,GAAvBwE,EAAAqP,EAAArP,MAAO0C,EAAA2M,EAAA3M,MAAOgL,EAAA2B,EAAA3B,KACrC1S,MAAKsU,YAAc5B,EACfA,IACF1S,KAAKsU,YAAcrU,EAAEuJ,UAAWkJ,GAAQmB,eAAgB,WAtF9DnP,EAuFqBjB,SAAS,0GACtB2Q,EAAKjF,kBAAmB,MAG5BnP,KAAKmP,kBAAmB,EAGxBnP,KAAKoH,SAAS,YAGdpH,KAAKuU,gBAEL,IAAIC,GAAWxU,KAAKyU,iCAAiC,WACnD,MAAOxU,GAAEgE,IAAImQ,EAAK/M,OAAQ,SAAA+H,GACxB,MAAOA,GAAMsE,cAAchM,MAAAA,EAAO1C,MAAAA,QAIlC0P,EAAiC,WACnC,GAAIC,GAAI1U,EAAE2U,UAGV,QAFI,IAAUR,EAAKjF,kBACjBwF,EAAEE,SACGF,EAAEG,UAAUrB,UAGrB,OAAOxT,GAAE8U,KAAArU,MAAFT,EAAArB,mBAAU4V,IACdV,KAAO,WAAQM,EAAKhN,SAAS,aAC7B4N,KAAO,WACNZ,EAAKjF,kBAAmB,EACxBiF,EAAKjP,QACLiP,EAAKhN,SAAS,WAEf6N,OAAO,WAAQb,EAAKhN,SAAS,eAC7B8N,KAAOR,EAAgCA,IAO5CS,QAAS,SAAUnP,GACjB,GAAIxF,UAAUtB,QAAU,IAAMe,EAAEgK,cAAcjE,GAAU,CAhI5DtB,EAiImBjB,SAAS,0FTwmCpB,IAAI2R,GAAchW,OAAOmB,KSvmCNC,WAAhBwE,EAAAoQ,EAAA,GAAO1N,EAAA0N,EAAA,EACZpP,IAAWhB,MAAAA,EAAO0C,MAAAA,GAEpB,MArIJsL,GAqI0BhT,KAAK2H,UAAU3B,GAAS2N,UAMhDhM,UAAW,WT4mCP,GAAI0N,GAASrV,KAETsV,EAAQ9U,UAAUtB,QAAU,GAAsByN,SAAjBnM,UAAU,MS9mCbA,UAAA,GAAhBwE,EAAAsQ,EAAAtQ,MAAO0C,EAAA4N,EAAA5N,KAC3B1H,MAAKuU,gBAEL,IAAIC,GAAWxU,KAAKyU,iCAAiC,WACnD,MAAOxU,GAAEgE,IAAIoR,EAAKhO,OAAQ,SAAA+H,GACxB,MAAOA,GAAMzH,WAAW3C,MAAAA,EAAO0C,MAAAA,OAGnC,OAAOzH,GAAE8U,KAAArU,MAAFT,EAAArB,mBAAU4V,KAGnBD,eAAgB,WACd,MAAOvU,MAAK+F,mBAAmBwP,eAGjCA,YAAa,WTmnCT,GAAIC,GAASxV,KSlnCXyV,EAAYzV,KAAKqH,MAwBrB,OAtBArH,MAAKqH,UACLrH,KAAK0V,oBAEL1V,KAAKyU,iCAAiC,WACpCe,EAAKnU,SACJwG,KAAK2N,EAAKxP,QAAQpB,QAClB+Q,IAAIH,EAAKxP,QAAQnB,UACjB+Q,KAAK,SAACC,EAAG9C,GACR,GAAI+C,GAAgB,GAAIvS,QAAO2H,QAAQ6K,QAAQhD,KAASyC,EAGnD,kBAAmBM,EAAc5O,WAAa,yBAA2B4O,EAAc5O,YAAe,IAAS4O,EAAc9P,QAAQnB,UACpI,mBAAuB2Q,GAAKE,iBAAiBI,EAAc5O,UAAY,IAAM4O,EAAc/D,UAC7FyD,EAAKE,iBAAiBI,EAAc5O,UAAY,IAAM4O,EAAc/D,QAAU+D,EAC9EN,EAAKnO,OAAOb,KAAKsP,MAIvB7V,EAAEwV,GAAWE,IAAIH,EAAKnO,QAAQuO,KAAK,SAACC,EAAGzG,GACrCA,EAAMhI,SAAS,aAGZpH,MAUTyU,iCAAkC,SAAUtU,GAC1C,GAAI6V,GAAsBhW,KAAK+F,gBAC/B/F,MAAK+F,iBAAmB,WAAc,MAAO/F,MAC7C,IAAIyE,GAAStE,GAEb,OADAH,MAAK+F,iBAAmBiQ,EACjBvR,GAMT2C,SAAU,SAAUxG,GAClB,MAAOZ,MAAKoF,QAAQ,QAAUxE,ICpMlC,IAAIqV,GAAoB,SAAUC,EAAcrV,EAAMkJ,EAAcG,EAAUiM,GAC5E,IAAK,eAAerU,KAAKoU,EAAahP,WACpC,KAAM,IAAI3C,OAAM,yDAElB,IAAI6R,GAAgB7S,OAAO2H,QAAQmL,mBAAmBjM,WAAWvJ,GAC7DmL,EAAY,GAAI1C,GAAiB8M,EAErCnW,GAAEuJ,OAAOxJ,MACPgM,UAAWA,EACXnL,KAAMA,EACNkJ,aAAcA,EACdG,SAAUA,GAAYgM,EAAalQ,QAAQnF,EAAO,aAAemL,EAAU9B,SAC3EiM,iBAAiB,IAASA,IAE5BnW,KAAKsW,mBAAmBJ,EAAalQ,UAGnCuQ,EAAa,SAASxT,GACxB,GAAIyT,GAAMzT,EAAI,GAAGI,aACjB,OAAOqT,GAAMzT,EAAIzD,MAAM,GAGzB2W,GAAkB5W,WAChBoK,SAAU,SAASxH,EAAOwU,GACxB,GAAInW,GAAON,KAAK0W,gBAAgBpX,MAAM,EAGtC,OAFAgB,GAAKG,QAAQwB,GACb3B,EAAKkG,KAAKiQ,GACHzW,KAAKgM,UAAUvC,SAAS/I,MAAMV,KAAKgM,UAAW1L,IAGvDgW,mBAAoB,SAAStQ,GV2zCzB,GAAI2Q,GAAS3W,IU1zCfA,MAAK0W,gBAAkB1W,KAAKgM,UAAUlC,kBAAkB9J,KAAK+J,aAAc,SAAAV,GACzE,MAAOrD,GAAQ2Q,EAAK9V,KAAO0V,EAAWlN,OChC5C,IAAI5D,GAAe,SAAU2J,EAAOnJ,EAAYD,EAAS4Q,GACvD5W,KAAKkH,UAAY,eACjBlH,KAAK+R,OAPPrN,EAO6BjC,aAE3BzC,KAAKqB,SAAWpB,EAAEmP,GAGd,mBAAuBwH,KACzB5W,KAAKkG,OAAS0Q,GAGhB5W,KAAKgG,QAAUA,EACfhG,KAAKiG,WAAaA,EAGlBjG,KAAK6W,eACL7W,KAAK8W,qBACL9W,KAAKmP,oBAGLnP,KAAK+W,oBAzBPC,GA4BqB/D,QAAS,KAAMC,UAAU,EAAMC,UAAU,EAE9D1N,GAAapG,WAKXoK,SAAU,SAAUzD,GACdxF,UAAUtB,QAAU,IAAMe,EAAEgK,cAAcjE,KApClDtB,EAqCmBjB,SAAS,6FACtBuC,GAAWA,QAAAA,GAEb,IAAIyN,GAAUzT,KAAK0T,aAAa1N,EAChC,KAAKyN,EACH,OAAO,CACT,QAAQA,EAAQE,SACd,IAAK,UAAW,MAAO,KACvB,KAAK,WAAY,OAAO,CACxB,KAAK,WAAY,MAAO3T,MAAKmP,mBAOjCuE,aAAc,WXq2CV,GAAIuD,GAASjX,KAETkX,EAAQ1W,UAAUtB,QAAU,GAAsByN,SAAjBnM,UAAU,MWv2CTA,UAAA,GAAjBkH,EAAAwP,EAAAxP,MAAO1C,EAAAkS,EAAAlS,KAG9B,OADAhF,MAAKmX,sBACDnS,GAAUhF,KAAKoX,WAAWpS,IAG9BhF,KAAKiC,MAAQjC,KAAK4S,WAGlB5S,KAAKoH,SAAS,YAEPpH,KAAK2H,WAAWD,MAAAA,EAAOzF,MAAOjC,KAAKiC,MAAOoV,YAAY,IAC1DpC,OAAO,WAAQgC,EAAK1H,cACpBuE,KAAK,WAAUmD,EAAK7P,SAAS,aAC7B4N,KAAK,WAAUiC,EAAK7P,SAAS,WAC7B6N,OAAO,WAAQgC,EAAK7P,SAAS,gBAZhC,QAeF4J,eAAgB,WACd,MAAO,KAAMhR,KAAK6W,YAAY3X,QAIhC+R,gBAAiB,SAAUhP,GAMzB,MALI,mBAAuBA,KACzBA,EAAQjC,KAAK4S,YAIV3Q,EAAM/C,QAAWc,KAAKsX,eAAiB,mBAAuBtX,MAAKgG,QAAQuR,iBAGzE,GAFE,GAKXH,WAAY,SAAUpS,GACpB,MAAI/E,GAAElB,QAAQiB,KAAKgG,QAAQhB,OAClB,KAAO/E,EAAEuX,QAAQxS,EAAOhF,KAAKgG,QAAQhB,OACvChF,KAAKgG,QAAQhB,QAAUA,GAOhCmQ,QAAS,SAAUnP,GACjB,GAAIxF,UAAUtB,QAAU,IAAMe,EAAEgK,cAAcjE,GAAU,CAnG5DtB,EAoGmBjB,SAAS,2FX62CpB,IAAIgU,GAAcrY,OAAOmB,KW52CNC,WAAhBkH,EAAA+P,EAAA,GAAOxV,EAAAwV,EAAA,EACZzR,IAAW0B,MAAAA,EAAOzF,MAAAA,GAEpB,GAAIwR,GAAUzT,KAAK2H,UAAU3B,EAC7B,OAAKyN,GAzGTuD,EA2GyBvD,EAAQE,UADpB,GASXhM,UAAW,WXi3CP,GAAI+P,GAAS1X,KAET2X,EAASnX,UAAUtB,QAAU,GAAsByN,SAAjBnM,UAAU,MWn3CaA,UAAA,GXq3CzDoX,EAAeD,EWr3CDjQ,MAAAA,EAAAiF,SAAAiL,GAAQ,EAAAA,EAAO3V,EAAA0V,EAAA1V,MAAO+C,EAAA2S,EAAA3S,MAAOqS,EAAAM,EAAAN,UAKjD,IAHKA,GACHrX,KAAKmX,sBAEHnS,GAAUhF,KAAKoX,WAAWpS,GAA9B,CAMA,GAHAhF,KAAKmP,kBAAmB,GAGnBnP,KAAKgR,iBACR,MAAO/Q,GAAE8U,MAMX,KAHI,mBAAuB9S,IAAS,OAASA,KAC3CA,EAAQjC,KAAK4S,aAEV5S,KAAKiR,gBAAgBhP,KAAU,IAASyF,EAC3C,MAAOzH,GAAE8U,MAEX,IAAI8C,GAAqB7X,KAAK8X,yBAC1BtD,IAWJ,OAVAvU,GAAE2V,KAAKiC,EAAoB,SAAChC,EAAGgB,GAG7B,GAAIpD,GAAUxT,EAAE8U,KAAArU,MAAFT,EAAArB,mBACTqB,EAAEgE,IAAI4S,EAAa,SAAA3K,GXq3CpB,MWr3CkCwL,GAAKK,oBAAoB9V,EAAOiK,MAGtE,OADAsI,GAAShO,KAAKiN,GACU,aAApBA,EAAQE,SACH,EADT,SAGK1T,EAAE8U,KAAKrU,MAAMT,EAAGuU,KAIzBuD,oBAAqB,SAAS9V,EAAOiK,GXq3CjC,GAAI8L,GAAUhY,KWp3CZyE,EAASyH,EAAWzC,SAASxH,EAAOjC,KAKxC,QAHI,IAAUyE,IACZA,EAASxE,EAAE2U,WAAWC,UAEjB5U,EAAE8U,KAAKtQ,GAAQuQ,KAAK,SAAAhF,IACrB,IAASgI,EAAK7I,mBAChB6I,EAAK7I,qBACP6I,EAAK7I,iBAAiB3I,MACpBmI,OAAQzC,EACR8D,aAAc,gBAAoBA,IAAgBA,OAMxD4C,SAAU,WACR,GAAI3Q,EAWJ,OAPEA,GADE,kBAAsBjC,MAAKgG,QAAQ/D,MAC7BjC,KAAKgG,QAAQ/D,MAAMjC,MACpB,mBAAuBA,MAAKgG,QAAQ/D,MACnCjC,KAAKgG,QAAQ/D,MAEbjC,KAAKqB,SAAS4M,MAGpB,mBAAuBhM,IAAS,OAASA,EACpC,GAEFjC,KAAKiY,kBAAkBhW,IAKhCkV,mBAAoB,WAClB,MAAOnX,MAAK+F,mBAAmBgR,oBAWjCmB,cAAe,SAAUrX,EAAMkJ,EAAcG,EAAUiM,GAErD,GAAI5S,OAAO2H,QAAQmL,mBAAmBjM,WAAWvJ,GAAO,CACtD,GAAIqL,GAAa,GAAI+J,GAAkBjW,KAAMa,EAAMkJ,EAAcG,EAAUiM,EAGvE,eAAgBnW,KAAK8W,kBAAkB5K,EAAWrL,OACpDb,KAAKmY,iBAAiBjM,EAAWrL,MAEnCb,KAAK6W,YAAYrQ,KAAK0F,GACtBlM,KAAK8W,kBAAkB5K,EAAWrL,MAAQqL,EAG5C,MAAOlM,OAITmY,iBAAkB,SAAUtX,GAC1B,IAAK,GAAI7B,GAAI,EAAGA,EAAIgB,KAAK6W,YAAY3X,OAAQF,IAC3C,GAAI6B,IAASb,KAAK6W,YAAY7X,GAAG6B,KAAM,CACrCb,KAAK6W,YAAYjQ,OAAO5H,EAAG,EAC3B,OAGJ,aADOgB,MAAK8W,kBAAkBjW,GACvBb,MAIToY,iBAAkB,SAAUvX,EAAM0L,EAAYrC,GAC5C,MAAOlK,MAAKmY,iBAAiBtX,GAC1BqX,cAAcrX,EAAM0L,EAAYrC,IAOrC6M,iBAAkB,WAKhB,IAAK,GAJDF,MACAC,KAGK9X,EAAI,EAAGA,EAAIgB,KAAK6W,YAAY3X,OAAQF,KACvC,IAAUgB,KAAK6W,YAAY7X,GAAGmX,kBAChCU,EAAYrQ,KAAKxG,KAAK6W,YAAY7X,IAClC8X,EAAkB9W,KAAK6W,YAAY7X,GAAG6B,MAAQb,KAAK6W,YAAY7X,GAGnEgB,MAAK6W,YAAcA,EACnB7W,KAAK8W,kBAAoBA,CAGzB,KAAK,GAAIjW,KAAQb,MAAKgG,QACpBhG,KAAKkY,cAAcrX,EAAMb,KAAKgG,QAAQnF,GAAO8L,QAAW,EAG1D,OAAO3M,MAAKqY,yBAKdA,sBAAuB,YAEjBrY,KAAKqB,SAASiX,SAAS,aAAetY,KAAKqB,SAASD,KAAK,cAC3DpB,KAAKkY,cAAc,YAAY,EAAMvL,QAAW,GAG9C,gBAAoB3M,MAAKqB,SAASD,KAAK,YACzCpB,KAAKkY,cAAc,UAAWlY,KAAKqB,SAASD,KAAK,WAAYuL,QAAW,GAGtE,mBAAuB3M,MAAKqB,SAASD,KAAK,QAAU,mBAAuBpB,MAAKqB,SAASD,KAAK,OAChGpB,KAAKkY,cAAc,SAAUlY,KAAKqB,SAASD,KAAK,OAAQpB,KAAKqB,SAASD,KAAK,QAASuL,QAAW,GAGxF,mBAAuB3M,MAAKqB,SAASD,KAAK,OACjDpB,KAAKkY,cAAc,MAAOlY,KAAKqB,SAASD,KAAK,OAAQuL,QAAW,GAGzD,mBAAuB3M,MAAKqB,SAASD,KAAK,QACjDpB,KAAKkY,cAAc,MAAOlY,KAAKqB,SAASD,KAAK,OAAQuL,QAAW,GAI9D,mBAAuB3M,MAAKqB,SAASD,KAAK,cAAgB,mBAAuBpB,MAAKqB,SAASD,KAAK,aACtGpB,KAAKkY,cAAc,UAAWlY,KAAKqB,SAASD,KAAK,aAAcpB,KAAKqB,SAASD,KAAK,cAAeuL,QAAW,GAGrG,mBAAuB3M,MAAKqB,SAASD,KAAK,aACjDpB,KAAKkY,cAAc,YAAalY,KAAKqB,SAASD,KAAK,aAAcuL,QAAW,GAGrE,mBAAuB3M,MAAKqB,SAASD,KAAK,cACjDpB,KAAKkY,cAAc,YAAalY,KAAKqB,SAASD,KAAK,aAAcuL,QAAW,EAI9E,IAAI3C,GAAOhK,KAAKqB,SAASD,KAAK,OAE9B,OAAI,mBAAuB4I,GAClBhK,KAGL,WAAagK,EACRhK,KAAKkY,cAAc,QAAS,UACjCrL,KAAM7M,KAAKqB,SAASD,KAAK,QACzB2L,KAAM/M,KAAKqB,SAASD,KAAK,QAAUpB,KAAKqB,SAASD,KAAK,WACpDuL,QAAW,GAEN,uBAAuB7K,KAAKkI,GAC9BhK,KAAKkY,cAAc,OAAQlO,EAAM2C,QAAW,GAE9C3M,MAKTsX,YAAa,WACX,MAAI,mBAAuBtX,MAAK8W,kBAAkBrK,UACzC,GAEF,IAAUzM,KAAK8W,kBAAkBrK,SAAS1C,cAKnD3C,SAAU,SAAUxG,GAClB,MAAOZ,MAAKoF,QAAQ,SAAWxE,IAOjCqX,kBAAmB,SAAUhW,GAU3B,OATI,IAASjC,KAAKgG,QAAQuS,WAhV9B7T,EAiVmBjB,SAAS,2FAEpB,WAAazD,KAAKgG,QAAQwS,aAC5BvW,EAAQA,EAAMe,QAAQ,UAAW,OAE/B,SAAYhD,KAAKgG,QAAQwS,YAAgB,WAAaxY,KAAKgG,QAAQwS,aAAgB,IAASxY,KAAKgG,QAAQuS,aAC3GtW,EAvVNyC,EAuV2Bd,WAAW3B,IAE3BA,GAMT6V,uBAAwB,WACtB,IAAI,IAAU9X,KAAKgG,QAAQlB,gBACzB,OAAQ9E,KAAK6W,YAMf,KAAK,GAJDgB,MACAY,KAGKzZ,EAAI,EAAGA,EAAIgB,KAAK6W,YAAY3X,OAAQF,IAAK,CAChD,GAAI0Z,GAAI1Y,KAAK6W,YAAY7X,GAAGkL,QACvBuO,GAAMC,IACTb,EAAmBrR,KAAKiS,EAAMC,OAChCD,EAAMC,GAAGlS,KAAKxG,KAAK6W,YAAY7X,IAKjC,MAFA6Y,GAAmBc,KAAK,SAAUC,EAAGC,GAAK,MAAOA,GAAE,GAAG3O,SAAW0O,EAAE,GAAG1O,WAE/D2N,GAhXX,IAAAiB,GAAArT,ECEIsT,EAAkB,WACpB/Y,KAAKkH,UAAY,uBAGnB6R,GAAgB1Z,WAEd2Z,WAAY,SAAU3X,GAGpB,MAFArB,MAAKiZ,UAAUzS,KAAKnF,GAEbrB,MAITmX,mBAAoB,WAClB,GAAI+B,EAKJ,IAHAlZ,KAAK6W,eAGD7W,KAAKqB,SAASe,GAAG,UAGnB,MAFApC,MAAK+F,mBAAmBgR,mBAEjB/W,IAIT,KAAK,GAAIhB,GAAI,EAAGA,EAAIgB,KAAKiZ,UAAU/Z,OAAQF,IAGzC,GAAKiB,EAAE,QAAQkZ,IAAInZ,KAAKiZ,UAAUja,IAAIE,OAAtC,CAKAga,EAAmBlZ,KAAKiZ,UAAUja,GAAGoa,KAAK,wBAAwBjC,qBAAqBN,WAEvF,KAAK,GAAInI,GAAI,EAAGA,EAAIwK,EAAiBha,OAAQwP,IAC3C1O,KAAKkY,cAAcgB,EAAiBxK,GAAG7N,KAAMqY,EAAiBxK,GAAG3E,aAAcmP,EAAiBxK,GAAGxE,SAAUgP,EAAiBxK,GAAGyH,qBAPjInW,MAAKiZ,UAAUrS,OAAO5H,EAAG,EAU7B,OAAOgB,OAIT4S,SAAU,WAER,GAAI,kBAAsB5S,MAAKgG,QAAQ/D,MACrCA,MAAQjC,KAAKgG,QAAQ/D,MAAMjC,UACxB,IAAI,mBAAuBA,MAAKgG,QAAQ/D,MAC3C,MAAOjC,MAAKgG,QAAQ/D,KAGtB,IAAIjC,KAAKqB,SAASe,GAAG,qBACnB,MAAOpC,MAAK4H,eAAeyR,OAAO,YAAYpL,OAAS,EAGzD,IAAIjO,KAAKqB,SAASe,GAAG,wBAAyB,CAC5C,GAAIwG,KAMJ,OAJA5I,MAAK4H,eAAeyR,OAAO,YAAYzD,KAAK,WAC1ChN,EAAOpC,KAAKvG,EAAED,MAAMiO,SAGfrF,EAIT,MAAI5I,MAAKqB,SAASe,GAAG,WAAa,OAASpC,KAAKqB,SAAS4M,SAIlDjO,KAAKqB,SAAS4M,OAGvBqL,MAAO,WAGL,MAFAtZ,MAAKiZ,WAAajZ,KAAKqB,UAEhBrB,MCxEX,IAAIuZ,GAAiB,SAAUxG,EAAS/M,EAAS4Q,GAC/C5W,KAAKqB,SAAWpB,EAAE8S,EAGlB,IAAIyG,GAA2BxZ,KAAKqB,SAAS+X,KAAK,UAClD,IAAII,EAQF,MALI,mBAAuB5C,IAAuB4C,EAAyBtT,SAAW3C,OAAO2H,UAC3FsO,EAAyBtT,OAAS0Q,EAClC4C,EAAyBrT,cAAcqT,EAAyBxT,UAG3DwT,CAIT,KAAKxZ,KAAKqB,SAASnC,OACjB,KAAM,IAAIqF,OAAM,gDAElB,IAAI,mBAAuBqS,IAAuB,gBAAkBA,EAAoB1P,UACtF,KAAM,IAAI3C,OAAM,iDAGlB,OADAvE,MAAKkG,OAAS0Q,GAAuBrT,OAAO2H,QACrClL,KAAKuK,KAAKvE,GAGnBuT,GAAela,WACbkL,KAAM,SAAUvE,GASd,MARAhG,MAAKkH,UAAY,UACjBlH,KAAKyZ,YAAc,QACnBzZ,KAAK+R,OAtCTrN,EAsC+BjC,aAG3BzC,KAAKmG,cAAcH,GAGfhG,KAAKqB,SAASe,GAAG,SA5CzBsC,EA4CkDxC,UAAUlC,KAAKqB,SAAUrB,KAAKgG,QAAQ1E,UAAW,cAAgBtB,KAAKqB,SAASe,GAAGpC,KAAKgG,QAAQpB,QACpI5E,KAAK0Z,KAAK,eAGZ1Z,KAAK2Z,aAAe3Z,KAAK4Z,iBAAmB5Z,KAAK0Z,KAAK,iBAG/DC,WAAY,WACV,MAAO3Z,MAAMqB,SAASe,GAAG,4CAAgDpC,KAAKqB,SAASe,GAAG,WAAa,mBAAuBpC,MAAKqB,SAASD,KAAK,aAKnJwY,eAAgB,WbmxDZ,GalxDE/Y,GAEAgZ,EbgxDEC,EAAU9Z,IarwDhB,IARIA,KAAKgG,QAAQjB,WAER,mBAAuB/E,MAAKqB,SAASD,KAAK,SAAWpB,KAAKqB,SAASD,KAAK,QAAQlC,OACvFc,KAAKgG,QAAQjB,SAAWlE,EAAOb,KAAKqB,SAASD,KAAK,QAC3C,mBAAuBpB,MAAKqB,SAASD,KAAK,OAASpB,KAAKqB,SAASD,KAAK,MAAMlC,SACnFc,KAAKgG,QAAQjB,SAAW/E,KAAKqB,SAASD,KAAK,QAGzCpB,KAAKqB,SAASe,GAAG,WAAa,mBAAuBpC,MAAKqB,SAASD,KAAK,YAE1E,MADApB,MAAKgG,QAAQjB,SAAW/E,KAAKgG,QAAQjB,UAAY/E,KAAK+R,OAC/C/R,KAAK0Z,KAAK,uBAGZ,KAAK1Z,KAAKgG,QAAQjB,SAEvB,MA9ENL,GA6EmBrB,KAAK,wHAAyHrD,KAAKqB,UACzIrB,IAITA,MAAKgG,QAAQjB,SAAW/E,KAAKgG,QAAQjB,SAAS/B,QAAQ,yBAA0B;AAG5E,mBAAuBnC,IACzBZ,EAAE,eAAiBY,EAAO,MAAM+U,KAAK,SAAC5W,EAAG+a,GACnC9Z,EAAE8Z,GAAO3X,GAAG,4CACdnC,EAAE8Z,GAAO3Y,KAAK0Y,EAAK9T,QAAQ1E,UAAY,WAAYwY,EAAK9T,QAAQjB,WAMtE,KAAK,GADDiV,GAAqBha,KAAK4H,eACrB5I,EAAI,EAAGA,EAAIgb,EAAmB9a,OAAQF,IAE7C,GADA6a,EAA0B5Z,EAAE+Z,EAAmBC,IAAIjb,IAAIoa,KAAK,WACxD,mBAAuBS,GAAyB,CAE7C7Z,KAAKqB,SAAS+X,KAAK,yBACtBS,EAAwBb,WAAWhZ,KAAKqB,SAG1C,OAQJ,MAFArB,MAAK0Z,KAAK,gBAAgB,GAEnBG,GAA2B7Z,KAAK0Z,KAAK,yBAI9CA,KAAM,SAAU1P,EAAMkQ,GACpB,GAAIC,EAEJ,QAAQnQ,GACN,IAAK,cACHmQ,EAAkBla,EAAEuJ,OAClB,GAAIsJ,GAAY9S,KAAKqB,SAAUrB,KAAKiG,WAAYjG,KAAKgG,SACrDzC,OAAO6W,eACP7E,aACF,MACF,KAAK,eACH4E,EAAkBla,EAAEuJ,OAClB,GA9HVsP,GA8H2B9Y,KAAKqB,SAAUrB,KAAKiG,WAAYjG,KAAKgG,QAAShG,KAAKkG,QACpE3C,OAAO6W,cAET,MACF,KAAK,uBACHD,EAAkBla,EAAEuJ,OAClB,GApIVsP,GAoI2B9Y,KAAKqB,SAAUrB,KAAKiG,WAAYjG,KAAKgG,QAAShG,KAAKkG,QACpE,GAAI6S,GACJxV,OAAO6W,eACPd,OACF,MACF,SACE,KAAM,IAAI/U,OAAMyF,EAAO,mCAM3B,MAHIhK,MAAKgG,QAAQjB,UA7IrBL,EA8ImBrC,QAAQrC,KAAKqB,SAAUrB,KAAKgG,QAAQ1E,UAAW,WAAYtB,KAAKgG,QAAQjB,UAEnF,mBAAuBmV,IACzBla,KAAKqB,SAAS+X,KAAK,uBAAwBe,GAEpCA,IAITna,KAAKqB,SAAS+X,KAAK,UAAWe,GAG9BA,EAAgBrL,qBAChBqL,EAAgB/S,SAAS,QAElB+S,IClJX,IAAIE,GAAUpa,EAAEE,GAAGma,OAAOtW,MAAM,IAChC,IAAIiE,SAASoS,EAAQ,KAAO,GAAKpS,SAASoS,EAAQ,IAAM,EACtD,KAAM,6EAEHA,GAAQE,SAfb7V,EAgBerB,KAAK,4FAGpB,IAAI6H,GAAUjL,EAAEuJ,OAAO,GAAI3D,IACvBxE,SAAUpB,EAAEua,UACZzU,iBAAkB,KAClBI,cAAe,KACf4P,QAASwD,EACTkB,QAAS,SAKbxa,GAAEuJ,OA7BFsP,EA6BsBzZ,UAAW6O,EAAUoB,MAAOzJ,EAAgBxG,WAClEY,EAAEuJ,OAAOsJ,EAAYzT,UAAW6O,EAAUW,KAAMhJ,EAAgBxG,WAEhEY,EAAEuJ,OAAO+P,EAAela,UAAWwG,EAAgBxG,WAInDY,EAAEE,GAAGL,QAAUG,EAAEE,GAAGua,KAAO,SAAU1U,GACnC,GAAIhG,KAAKd,OAAS,EAAG,CACnB,GAAIyb,KAMJ,OAJA3a,MAAK4V,KAAK,WACR+E,EAAUnU,KAAKvG,EAAED,MAAMF,QAAQkG,MAG1B2U,EAIT,MAAK1a,GAAED,MAAMd,OAMN,GAAIqa,GAAevZ,KAAMgG,OAtDlCtB,GAiDiBrB,KAAK,kDAUlB,mBAAuBE,QAAO6W,gBAChC7W,OAAO6W,kBAITlP,EAAQlF,QAAU/F,EAAEuJ,OAhEpB9E,EAgEwCN,aAAaO,GAAkBpB,OAAOqX,eAC9ErX,OAAOqX,cAAgB1P,EAAQlF,QAG/BzC,OAAO2H,QAAU3H,OAAOmX,KAAOxP,EAC/B3H,OAAOsX,aArEPnW,CAwEA,IAAIoW,GAAWvX,OAAO2H,QAAQmL,mBAAqB,GAAIlM,GAAyB5G,OAAOqX,cAAcxQ,WAAY7G,OAAOqX,cAAcG,KACtIxX,QAAO+F,oBACPrJ,EAAE2V,KAAK,yHAAyH5R,MAAM,KAAM,SAAUhF,EAAGgc,GACvJzX,OAAO2H,QAAQ8P,GAAU/a,EAAEgb,MAAMH,EAAUE,GAC3CzX,OAAO+F,iBAAiB0R,GAAU,Wd05D9B,GAAIE,Ecx5DN,OA9EJxW,GA6EiBjB,SAAA,yBAAkCuX,EAAA,yEAA+EA,EAAA,WACvHE,EAAA3X,OAAO2H,SAAQ8P,GAAAta,MAAAwa,EAAW1a,cAMrC+C,OAAO2H,QAAQiQ,GAAKjN,EACpB3K,OAAO2K,WACL0C,YAAa,SAAU6F,EAAU5V,EAAMua,GACrC,GAAI/K,IAAc,IAAS+K,CAE3B,OAzFJ1W,GAwFiBjB,SAAA,qJACNgT,EAAS7F,YAAY/P,GAAOwP,YAAAA,KAErCN,kBAAmB,SAAU0G,GAE3B,MA7FJ/R,GA4FiBjB,SAAA,yFACNgT,EAAS1G,sBAGpB9P,EAAE2V,KAAK,uBAAuB5R,MAAM,KAAM,SAAUhF,EAAGgc,GACrDzX,OAAO2K,UAAU8M,GAAU,SAAUvE,EAAU5V,EAAM2K,EAASmD,EAAQyM,GACpE,GAAI/K,IAAc,IAAS+K,CAE3B,OApGJ1W,GAmGiBjB,SAAA,4CAAqDuX,EAAA,iGAC3DvE,EAASuE,GAAQna,GAAO2K,QAAAA,EAASmD,OAAAA,EAAQ0B,YAAAA,OAMhD,WAAWvO,KAAKuZ,UAAUC,YAC5Brb,EAAEua,UAAUlU,GAAG,SAAU,SAAU,SAAApC,GACjCjE,EAAEiE,EAAI6C,QAAQ3B,QAAQ,YAMtB,IAAU7B,OAAOqX,cAAcW,UACjCtb,EAAE,WAEIA,EAAE,2BAA2Bf,QAC/Be,EAAE,2BAA2BH,WZjHnC,IAAIa,GAAIV,MACJub,EAAa,WANjB9W,EAOejB,SAAS,iHAgBpB1C,EAAc,UASlBd,GAAEwb,OAAS,SAAU5a,EAAM6a,GACzB,GAAItb,EAOJ,IANAob,IACI,gBAAoBhb,WAAU,IAAM,kBAAsBA,WAAU,KACtEJ,EAAUI,UAAU,GACpBkb,EAAWlb,UAAU,IAGnB,kBAAsBkb,GACxB,KAAM,IAAInX,OAAM,mBAElBhB,QAAO2H,QAAQ5E,GAAG1F,EAAUC,GAAOX,EAAMwb,EAAUtb,KAGrDH,EAAEyG,SAAW,SAAU+P,EAAU5V,EAAMV,GAErC,GADAqb,MACM/E,YAhDRqC,IAgD+CrC,YAAoB3D,IAC/D,KAAM,IAAIvO,OAAM,6BAElB,IAAI,gBAAoB1D,IAAQ,kBAAsBV,GACpD,KAAM,IAAIoE,OAAM,mBAElBkS,GAASnQ,GAAG1F,EAAUC,GAAOX,EAAMC,KAGrCF,EAAE4G,YAAc,SAAUhG,EAAMV,GAE9B,GADAqb,IACI,gBAAoB3a,IAAQ,kBAAsBV,GACpD,KAAM,IAAIoE,OAAM,kBAClBhB,QAAO2H,QAAQvE,IAAI/F,EAAUC,GAAOV,EAAGE,yBAGzCJ,EAAE6G,cAAgB,SAAU2P,EAAU5V,GAEpC,GADA2a,MACM/E,YAlERqC,IAkE+CrC,YAAoB3D,IAC/D,KAAM,IAAIvO,OAAM,6BAClBkS,GAAS9P,IAAI/F,EAAUC,KAGzBZ,EAAE0b,eAAiB,SAAU9a,GAC3B2a,IACAjY,OAAO2H,QAAQvE,IAAI/F,EAAUC,IAC7BZ,EAAE,8BAA8B2V,KAAK,WACnC,GAAIa,GAAWxW,EAAED,MAAMoZ,KAAK,UACxB3C,IACFA,EAAS9P,IAAI/F,EAAUC,OAM7BZ,EAAE2b,KAAO,SAAU/a,EAAM4V,GF0gErB,GAAIoF,EEzgENL,IACA,IAAIM,GAAiBrF,YArFvBqC,IAqF6DrC,YAAoB3D,GAC3ExS,EAAOxB,MAAMO,UAAUC,MAAMiB,KAAKC,UAAWsb,EAAgB,EAAI,EACrExb,GAAKG,QAAQG,EAAUC,IAClBib,IACHrF,EAAWlT,OAAO2H,UAEpB2Q,EAAApF,GAASrR,QAAA1E,MAAAmb,EAAAjd,mBAAW0B,IavFtBL,GAAEuJ,QAAO,EAAM0B,GACb6Q,iBACEC,WACE7b,GAAI,SAAU8b,GAKZ,MAAOA,GAAIC,QAAU,KAAOD,EAAIC,OAAS,KAE3CtR,KAAK,GAEPuR,SACEhc,GAAI,SAAU8b,GAEZ,MAAOA,GAAIC,OAAS,KAAOD,EAAIC,QAAU,KAE3CtR,KAAK,IAITwR,kBAAmB,SAAUvb,EAAMV,EAAIyK,EAAK5E,GAO1C,MANAkF,GAAQ6Q,gBAAgBlb,IACtBV,GAAIA,EACJyK,IAAKA,IAAO,EACZ5E,QAASA,OAGJhG,QAKXkL,EAAQD,aAAa,UACnBnC,iBACE,GAAI,SACJkD,UAAa,SACbmQ,QAAW,UACXnW,QAAW,UAGb6D,eAAgB,SAAU5H,EAAO2I,EAAK5E,EAASyQ,GAC7C,GACI4F,GACAC,EAFAlD,KAGApN,EAAYhG,EAAQgG,aAAc,IAAShG,EAAQmW,QAAU,UAAY,UAE7E,IAAI,mBAAuBjR,GAAQ6Q,gBAAgB/P,GACjD,KAAM,IAAIzH,OAAM,0CAA4CyH,EAAY,IAE1EpB,GAAMM,EAAQ6Q,gBAAgB/P,GAAWpB,KAAOA,EAG5CA,EAAI2R,QAAQ,WAAa,GAC3B3R,EAAMA,EAAI5H,QAAQ,UAAWwZ,mBAAmBva,IAEhDmX,EAAK3C,EAASpV,SAASD,KAAK,SAAWqV,EAASpV,SAASD,KAAK,OAASa,CAIzE,IAAIwa,GAAgBxc,EAAEuJ,QAAO,EAAMxD,EAAQA,YAAgBkF,EAAQ6Q,gBAAgB/P,GAAWhG,QAG9FqW,GAAcpc,EAAEuJ,QAAO,MACrBoB,IAAKA,EACLwO,KAAMA,EACNpP,KAAM,OACLyS,GAGHhG,EAASrR,QAAQ,oBAAqBqR,EAAU4F,GAEhDC,EAAMrc,EAAEyc,MAAML,GAGV,mBAAuBnR,GAAQyR,eACjCzR,EAAQyR,gBAGV,IAAIV,GAAM/Q,EAAQyR,aAAaL,GAAOpR,EAAQyR,aAAaL,IAAQrc,EAAE2c,KAAKP,GAEtEQ,EAAY,WACd,GAAIpY,GAASyG,EAAQ6Q,gBAAgB/P,GAAW7L,GAAGI,KAAKkW,EAAUwF,EAAKrR,EAAK5E,EAG5E,OAFKvB,KACHA,EAASxE,EAAE2U,WAAWC,UACjB5U,EAAE8U,KAAKtQ,GAGhB,OAAOwX,GAAIa,KAAKD,EAAWA,IAG7B3S,SAAU,KAGZgB,EAAQ5E,GAAG,cAAe,WACxB4E,EAAQyR,kBAGVpZ,OAAO6W,cAAcgC,kBAAoB,WAEvC,MADAvB,cAAapX,SAAS,4HACfyH,EAAQkR,kBAAA1b,MAARwK,EAA6B1K,YCpGtC0K,EAAQO,YAAY,MAClBY,eAAgB,kCAChBrC,MACES,MAAc,sCACdG,IAAc,oCACd1C,OAAc,uCACdF,QAAc,wCACd0C,OAAc,+BACdC,SAAc,sCAEhB6B,SAAgB,kCAChBC,SAAgB,0BAChBa,QAAgB,kCAChBI,IAAgB,oDAChB1C,IAAgB,kDAChBH,MAAgB,0CAChB0C,UAAgB,iEAChBE,UAAgB,iEAChBvO,OAAgB,gFAChByO,SAAgB,uCAChBC,SAAgB,uCAChBC,MAAgB,6CAChBC,QAAgB,mCAGlB5C,EAAQC,UAAU,KC7BlB,IAAArL,GAAAoL,ChBuzEE,OAAOpL","file":"parsley.min.js","sourcesContent":[null,"(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n  global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n  var globalID = 1;\n  var pastWarnings = {};\n\n  var ParsleyUtils__ParsleyUtils = {\n    // Parsley DOM-API\n    // returns object from dom attributes and values\n    attr: function ($element, namespace, obj) {\n      var i;\n      var attribute;\n      var attributes;\n      var regex = new RegExp('^' + namespace, 'i');\n\n      if ('undefined' === typeof obj)\n        obj = {};\n      else {\n        // Clear all own properties. This won't affect prototype's values\n        for (i in obj) {\n          if (obj.hasOwnProperty(i))\n            delete obj[i];\n        }\n      }\n\n      if ('undefined' === typeof $element || 'undefined' === typeof $element[0])\n        return obj;\n\n      attributes = $element[0].attributes;\n      for (i = attributes.length; i--; ) {\n        attribute = attributes[i];\n\n        if (attribute && attribute.specified && regex.test(attribute.name)) {\n          obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n        }\n      }\n\n      return obj;\n    },\n\n    checkAttr: function ($element, namespace, checkAttr) {\n      return $element.is('[' + namespace + checkAttr + ']');\n    },\n\n    setAttr: function ($element, namespace, attr, value) {\n      $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n    },\n\n    generateID: function () {\n      return '' + globalID++;\n    },\n\n    /** Third party functions **/\n    // Zepto deserialize function\n    deserializeValue: function (value) {\n      var num;\n\n      try {\n        return value ?\n          value == \"true\" ||\n          (value == \"false\" ? false :\n          value == \"null\" ? null :\n          !isNaN(num = Number(value)) ? num :\n          /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n          value)\n          : value;\n      } catch (e) { return value; }\n    },\n\n    // Zepto camelize function\n    camelize: function (str) {\n      return str.replace(/-+(.)?/g, function (match, chr) {\n        return chr ? chr.toUpperCase() : '';\n      });\n    },\n\n    // Zepto dasherize function\n    dasherize: function (str) {\n      return str.replace(/::/g, '/')\n        .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n        .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n        .replace(/_/g, '-')\n        .toLowerCase();\n    },\n\n    warn: function () {\n      if (window.console && 'function' === typeof window.console.warn)\n        window.console.warn(...arguments);\n    },\n\n    warnOnce: function(msg) {\n      if (!pastWarnings[msg]) {\n        pastWarnings[msg] = true;\n        this.warn(...arguments);\n      }\n    },\n\n    _resetWarnings: function () {\n      pastWarnings = {};\n    },\n\n    trimString: function(string) {\n      return string.replace(/^\\s+|\\s+$/g, '');\n    },\n\n    namespaceEvents: function(events, namespace) {\n      events = this.trimString(events || '').split(/\\s+/);\n      if (!events[0])\n        return '';\n      return $.map(events, evt => { return `${evt}.${namespace}`; }).join(' ');\n    },\n\n    // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n    objectCreate: Object.create || (function () {\n      var Object = function () {};\n      return function (prototype) {\n        if (arguments.length > 1) {\n          throw Error('Second argument not supported');\n        }\n        if (typeof prototype != 'object') {\n          throw TypeError('Argument must be an object');\n        }\n        Object.prototype = prototype;\n        var result = new Object();\n        Object.prototype = null;\n        return result;\n      };\n    })()\n  };\n\n  var ParsleyUtils__default = ParsleyUtils__ParsleyUtils;\n\n  // All these options could be overriden and specified directly in DOM using\n  // `data-parsley-` default DOM-API\n  // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n  // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\n  var ParsleyDefaults = {\n    // ### General\n\n    // Default data-namespace for DOM API\n    namespace: 'data-parsley-',\n\n    // Supported inputs by default\n    inputs: 'input, textarea, select',\n\n    // Excluded inputs by default\n    excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n    // Stop validating field on highest priority failing constraint\n    priorityEnabled: true,\n\n    // ### Field only\n\n    // identifier used to group together inputs (e.g. radio buttons...)\n    multiple: null,\n\n    // identifier (or array of identifiers) used to validate only a select group of inputs\n    group: null,\n\n    // ### UI\n    // Enable\\Disable error messages\n    uiEnabled: true,\n\n    // Key events threshold before validation\n    validationThreshold: 3,\n\n    // Focused field on form validation error. 'first'|'last'|'none'\n    focus: 'first',\n\n    // event(s) that will trigger validation before first failure. eg: `input`...\n    trigger: false,\n\n    // event(s) that will trigger validation after first failure.\n    triggerAfterFailure: 'input',\n\n    // Class that would be added on every failing validation Parsley field\n    errorClass: 'parsley-error',\n\n    // Same for success validation\n    successClass: 'parsley-success',\n\n    // Return the `$element` that will receive these above success or error classes\n    // Could also be (and given directly from DOM) a valid selector like `'#div'`\n    classHandler: function (ParsleyField) {},\n\n    // Return the `$element` where errors will be appended\n    // Could also be (and given directly from DOM) a valid selector like `'#div'`\n    errorsContainer: function (ParsleyField) {},\n\n    // ul elem that would receive errors' list\n    errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n    // li elem that would receive error message\n    errorTemplate: '<li></li>'\n  };\n\n  var ParsleyAbstract = function () {};\n\n  ParsleyAbstract.prototype = {\n    asyncSupport: true, // Deprecated\n\n    actualizeOptions: function () {\n      ParsleyUtils__default.attr(this.$element, this.options.namespace, this.domOptions);\n      if (this.parent && this.parent.actualizeOptions)\n        this.parent.actualizeOptions();\n      return this;\n    },\n\n    _resetOptions: function (initOptions) {\n      this.domOptions = ParsleyUtils__default.objectCreate(this.parent.options);\n      this.options = ParsleyUtils__default.objectCreate(this.domOptions);\n      // Shallow copy of ownProperties of initOptions:\n      for (var i in initOptions) {\n        if (initOptions.hasOwnProperty(i))\n          this.options[i] = initOptions[i];\n      }\n      this.actualizeOptions();\n    },\n\n    _listeners: null,\n\n    // Register a callback for the given event name\n    // Callback is called with context as the first argument and the `this`\n    // The context is the current parsley instance, or window.Parsley if global\n    // A return value of `false` will interrupt the calls\n    on: function (name, fn) {\n      this._listeners = this._listeners || {};\n      var queue = this._listeners[name] = this._listeners[name] || [];\n      queue.push(fn);\n\n      return this;\n    },\n\n    // Deprecated. Use `on` instead\n    subscribe: function(name, fn) {\n      $.listenTo(this, name.toLowerCase(), fn);\n    },\n\n    // Unregister a callback (or all if none is given) for the given event name\n    off: function (name, fn) {\n      var queue = this._listeners && this._listeners[name];\n      if (queue) {\n        if (!fn) {\n          delete this._listeners[name];\n        } else {\n          for (var i = queue.length; i--; )\n            if (queue[i] === fn)\n              queue.splice(i, 1);\n        }\n      }\n      return this;\n    },\n\n    // Deprecated. Use `off`\n    unsubscribe: function(name, fn) {\n      $.unsubscribeTo(this, name.toLowerCase());\n    },\n\n    // Trigger an event of the given name\n    // A return value of `false` interrupts the callback chain\n    // Returns false if execution was interrupted\n    trigger: function (name, target, extraArg) {\n      target = target || this;\n      var queue = this._listeners && this._listeners[name];\n      var result;\n      var parentResult;\n      if (queue) {\n        for (var i = queue.length; i--; ) {\n          result = queue[i].call(target, target, extraArg);\n          if (result === false) return result;\n        }\n      }\n      if (this.parent) {\n        return this.parent.trigger(name, target, extraArg);\n      }\n      return true;\n    },\n\n    // Reset UI\n    reset: function () {\n      // Field case: just emit a reset event for UI\n      if ('ParsleyForm' !== this.__class__) {\n        this._resetUI();\n        return this._trigger('reset');\n      }\n\n      // Form case: emit a reset event for each field\n      for (var i = 0; i < this.fields.length; i++)\n        this.fields[i].reset();\n\n      this._trigger('reset');\n    },\n\n    // Destroy Parsley instance (+ UI)\n    destroy: function () {\n      // Field case: emit destroy event to clean UI and then destroy stored instance\n      this._destroyUI();\n      if ('ParsleyForm' !== this.__class__) {\n        this.$element.removeData('Parsley');\n        this.$element.removeData('ParsleyFieldMultiple');\n        this._trigger('destroy');\n\n        return;\n      }\n\n      // Form case: destroy all its fields and then destroy stored instance\n      for (var i = 0; i < this.fields.length; i++)\n        this.fields[i].destroy();\n\n      this.$element.removeData('Parsley');\n      this._trigger('destroy');\n    },\n\n    asyncIsValid: function (group, force) {\n      ParsleyUtils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n      return this.whenValid({group, force});\n    },\n\n    _findRelated: function () {\n      return this.options.multiple ?\n        this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n      : this.$element;\n    }\n  };\n\n  var requirementConverters = {\n    string: function(string) {\n      return string;\n    },\n    integer: function(string) {\n      if (isNaN(string))\n        throw 'Requirement is not an integer: \"' + string + '\"';\n      return parseInt(string, 10);\n    },\n    number: function(string) {\n      if (isNaN(string))\n        throw 'Requirement is not a number: \"' + string + '\"';\n      return parseFloat(string);\n    },\n    reference: function(string) { // Unused for now\n      var result = $(string);\n      if (result.length === 0)\n        throw 'No such reference: \"' + string + '\"';\n      return result;\n    },\n    boolean: function(string) {\n      return string !== 'false';\n    },\n    object: function(string) {\n      return ParsleyUtils__default.deserializeValue(string);\n    },\n    regexp: function(regexp) {\n      var flags = '';\n\n      // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n      if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n        // Replace the regexp literal string with the first match group: ([gimy]*)\n        // If no flag is present, this will be a blank string\n        flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n        // Again, replace the regexp literal string with the first match group:\n        // everything excluding the opening and closing slashes and the flags\n        regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n      } else {\n        // Anchor regexp:\n        regexp = '^' + regexp + '$';\n      }\n      return new RegExp(regexp, flags);\n    }\n  };\n\n  var convertArrayRequirement = function(string, length) {\n    var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n    if (!m)\n      throw 'Requirement is not an array: \"' + string + '\"';\n    var values = m[1].split(',').map(ParsleyUtils__default.trimString);\n    if (values.length !== length)\n      throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n    return values;\n  };\n\n  var convertRequirement = function(requirementType, string) {\n    var converter = requirementConverters[requirementType || 'string'];\n    if (!converter)\n      throw 'Unknown requirement specification: \"' + requirementType + '\"';\n    return converter(string);\n  };\n\n  var convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n    var main = null;\n    var extra = {};\n    for (var key in requirementSpec) {\n      if (key) {\n        var value = extraOptionReader(key);\n        if ('string' === typeof value)\n          value = convertRequirement(requirementSpec[key], value);\n        extra[key] = value;\n      } else {\n        main = convertRequirement(requirementSpec[key], string);\n      }\n    }\n    return [main, extra];\n  };\n\n  // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n  var ParsleyValidator = function(spec) {\n    $.extend(true, this, spec);\n  };\n\n  ParsleyValidator.prototype = {\n    // Returns `true` iff the given `value` is valid according the given requirements.\n    validate: function(value, requirementFirstArg) {\n      if (this.fn) { // Legacy style validator\n\n        if (arguments.length > 3)  // If more args then value, requirement, instance...\n          requirementFirstArg = [].slice.call(arguments, 1, -1);  // Skip first arg (value) and last (instance), combining the rest\n        return this.fn.call(this, value, requirementFirstArg);\n      }\n\n      if ($.isArray(value)) {\n        if (!this.validateMultiple)\n          throw 'Validator `' + this.name + '` does not handle multiple values';\n        return this.validateMultiple(...arguments);\n      } else {\n        if (this.validateNumber) {\n          if (isNaN(value))\n            return false;\n          arguments[0] = parseFloat(arguments[0]);\n          return this.validateNumber(...arguments);\n        }\n        if (this.validateString) {\n          return this.validateString(...arguments);\n        }\n        throw 'Validator `' + this.name + '` only handles multiple values';\n      }\n    },\n\n    // Parses `requirements` into an array of arguments,\n    // according to `this.requirementType`\n    parseRequirements: function(requirements, extraOptionReader) {\n      if ('string' !== typeof requirements) {\n        // Assume requirement already parsed\n        // but make sure we return an array\n        return $.isArray(requirements) ? requirements : [requirements];\n      }\n      var type = this.requirementType;\n      if ($.isArray(type)) {\n        var values = convertArrayRequirement(requirements, type.length);\n        for (var i = 0; i < values.length; i++)\n          values[i] = convertRequirement(type[i], values[i]);\n        return values;\n      } else if ($.isPlainObject(type)) {\n        return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n      } else {\n        return [convertRequirement(type, requirements)];\n      }\n    },\n    // Defaults:\n    requirementType: 'string',\n\n    priority: 2\n\n  };\n\n  var ParsleyValidatorRegistry = function (validators, catalog) {\n    this.__class__ = 'ParsleyValidatorRegistry';\n\n    // Default Parsley locale is en\n    this.locale = 'en';\n\n    this.init(validators || {}, catalog || {});\n  };\n\n  var typeRegexes =  {\n    email: /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,\n\n    // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n    number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n    integer: /^-?\\d+$/,\n\n    digits: /^\\d+$/,\n\n    alphanum: /^\\w+$/i,\n\n    url: new RegExp(\n        \"^\" +\n          // protocol identifier\n          \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n          // user:pass authentication\n          \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n          \"(?:\" +\n            // IP address exclusion\n            // private & local networks\n            // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +   // ** mod: allow local networks\n            // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n            // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n            // IP address dotted notation octets\n            // excludes loopback network 0.0.0.0\n            // excludes reserved space >= 224.0.0.0\n            // excludes network & broacast addresses\n            // (first & last IP address of each class)\n            \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n            \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n            \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n          \"|\" +\n            // host name\n            \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n            // domain name\n            \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n            // TLD identifier\n            \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\" +\n          \")\" +\n          // port number\n          \"(?::\\\\d{2,5})?\" +\n          // resource path\n          \"(?:/\\\\S*)?\" +\n        \"$\", 'i'\n      )\n  };\n  typeRegexes.range = typeRegexes.number;\n\n  // See http://stackoverflow.com/a/10454560/8279\n  var decimalPlaces = num => {\n    var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n    if (!match) { return 0; }\n    return Math.max(\n         0,\n         // Number of digits right of decimal point.\n         (match[1] ? match[1].length : 0) -\n         // Adjust for scientific notation.\n         (match[2] ? +match[2] : 0));\n  };\n\n  ParsleyValidatorRegistry.prototype = {\n    init: function (validators, catalog) {\n      this.catalog = catalog;\n      // Copy prototype's validators:\n      this.validators = $.extend({}, this.validators);\n\n      for (var name in validators)\n        this.addValidator(name, validators[name].fn, validators[name].priority);\n\n      window.Parsley.trigger('parsley:validator:init');\n    },\n\n    // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n    setLocale: function (locale) {\n      if ('undefined' === typeof this.catalog[locale])\n        throw new Error(locale + ' is not available in the catalog');\n\n      this.locale = locale;\n\n      return this;\n    },\n\n    // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n    addCatalog: function (locale, messages, set) {\n      if ('object' === typeof messages)\n        this.catalog[locale] = messages;\n\n      if (true === set)\n        return this.setLocale(locale);\n\n      return this;\n    },\n\n    // Add a specific message for a given constraint in a given locale\n    addMessage: function (locale, name, message) {\n      if ('undefined' === typeof this.catalog[locale])\n        this.catalog[locale] = {};\n\n      this.catalog[locale][name] = message;\n\n      return this;\n    },\n\n    // Add messages for a given locale\n    addMessages: function (locale, nameMessageObject) {\n      for (var name in nameMessageObject)\n        this.addMessage(locale, name, nameMessageObject[name]);\n\n      return this;\n    },\n\n    // Add a new validator\n    //\n    //    addValidator('custom', {\n    //        requirementType: ['integer', 'integer'],\n    //        validateString: function(value, from, to) {},\n    //        priority: 22,\n    //        messages: {\n    //          en: \"Hey, that's no good\",\n    //          fr: \"Aye aye, pas bon du tout\",\n    //        }\n    //    })\n    //\n    // Old API was addValidator(name, function, priority)\n    //\n    addValidator: function (name, arg1, arg2) {\n      if (this.validators[name])\n        ParsleyUtils__default.warn('Validator \"' + name + '\" is already defined.');\n      else if (ParsleyDefaults.hasOwnProperty(name)) {\n        ParsleyUtils__default.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n        return;\n      }\n      return this._setValidator(...arguments);\n    },\n\n    updateValidator: function (name, arg1, arg2) {\n      if (!this.validators[name]) {\n        ParsleyUtils__default.warn('Validator \"' + name + '\" is not already defined.');\n        return this.addValidator(...arguments);\n      }\n      return this._setValidator(this, arguments);\n    },\n\n    removeValidator: function (name) {\n      if (!this.validators[name])\n        ParsleyUtils__default.warn('Validator \"' + name + '\" is not defined.');\n\n      delete this.validators[name];\n\n      return this;\n    },\n\n    _setValidator: function (name, validator, priority) {\n      if ('object' !== typeof validator) {\n        // Old style validator, with `fn` and `priority`\n        validator = {\n          fn: validator,\n          priority: priority\n        };\n      }\n      if (!validator.validate) {\n        validator = new ParsleyValidator(validator);\n      }\n      this.validators[name] = validator;\n\n      for (var locale in validator.messages || {})\n        this.addMessage(locale, name, validator.messages[locale]);\n\n      return this;\n    },\n\n    getErrorMessage: function (constraint) {\n      var message;\n\n      // Type constraints are a bit different, we have to match their requirements too to find right error message\n      if ('type' === constraint.name) {\n        var typeMessages = this.catalog[this.locale][constraint.name] || {};\n        message = typeMessages[constraint.requirements];\n      } else\n        message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n      return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n    },\n\n    // Kind of light `sprintf()` implementation\n    formatMessage: function (string, parameters) {\n      if ('object' === typeof parameters) {\n        for (var i in parameters)\n          string = this.formatMessage(string, parameters[i]);\n\n        return string;\n      }\n\n      return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n    },\n\n    // Here is the Parsley default validators list.\n    // A validator is an object with the following key values:\n    //  - priority: an integer\n    //  - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n    //  - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n    // Alternatively, a validator can be a function that returns such an object\n    //\n    validators: {\n      notblank: {\n        validateString: function(value) {\n          return /\\S/.test(value);\n        },\n        priority: 2\n      },\n      required: {\n        validateMultiple: function(values) {\n          return values.length > 0;\n        },\n        validateString: function(value) {\n          return /\\S/.test(value);\n        },\n        priority: 512\n      },\n      type: {\n        validateString: function(value, type, {step = '1', base = 0} = {}) {\n          var regex = typeRegexes[type];\n          if (!regex) {\n            throw new Error('validator type `' + type + '` is not supported');\n          }\n          if (!regex.test(value))\n            return false;\n          if ('number' === type) {\n            if (!/^any$/i.test(step || '')) {\n              var nb = Number(value);\n              var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n              if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n                return false;\n              // Be careful of rounding errors by using integers.\n              var toInt = f => { return Math.round(f * Math.pow(10, decimals)); };\n              if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n                return false;\n            }\n          }\n          return true;\n        },\n        requirementType: {\n          '': 'string',\n          step: 'string',\n          base: 'number'\n        },\n        priority: 256\n      },\n      pattern: {\n        validateString: function(value, regexp) {\n          return regexp.test(value);\n        },\n        requirementType: 'regexp',\n        priority: 64\n      },\n      minlength: {\n        validateString: function (value, requirement) {\n          return value.length >= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      maxlength: {\n        validateString: function (value, requirement) {\n          return value.length <= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      length: {\n        validateString: function (value, min, max) {\n          return value.length >= min && value.length <= max;\n        },\n        requirementType: ['integer', 'integer'],\n        priority: 30\n      },\n      mincheck: {\n        validateMultiple: function (values, requirement) {\n          return values.length >= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      maxcheck: {\n        validateMultiple: function (values, requirement) {\n          return values.length <= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      check: {\n        validateMultiple: function (values, min, max) {\n          return values.length >= min && values.length <= max;\n        },\n        requirementType: ['integer', 'integer'],\n        priority: 30\n      },\n      min: {\n        validateNumber: function (value, requirement) {\n          return value >= requirement;\n        },\n        requirementType: 'number',\n        priority: 30\n      },\n      max: {\n        validateNumber: function (value, requirement) {\n          return value <= requirement;\n        },\n        requirementType: 'number',\n        priority: 30\n      },\n      range: {\n        validateNumber: function (value, min, max) {\n          return value >= min && value <= max;\n        },\n        requirementType: ['number', 'number'],\n        priority: 30\n      },\n      equalto: {\n        validateString: function (value, refOrValue) {\n          var $reference = $(refOrValue);\n          if ($reference.length)\n            return value === $reference.val();\n          else\n            return value === refOrValue;\n        },\n        priority: 256\n      }\n    }\n  };\n\n  var ParsleyUI = {};\n\n  var diffResults = function (newResult, oldResult, deep) {\n    var added = [];\n    var kept = [];\n\n    for (var i = 0; i < newResult.length; i++) {\n      var found = false;\n\n      for (var j = 0; j < oldResult.length; j++)\n        if (newResult[i].assert.name === oldResult[j].assert.name) {\n          found = true;\n          break;\n        }\n\n      if (found)\n        kept.push(newResult[i]);\n      else\n        added.push(newResult[i]);\n    }\n\n    return {\n      kept: kept,\n      added: added,\n      removed: !deep ? diffResults(oldResult, newResult, true).added : []\n    };\n  };\n\n  ParsleyUI.Form = {\n\n    _actualizeTriggers: function () {\n      this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n      this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n      // UI could be disabled\n      if (false === this.options.uiEnabled)\n        return;\n\n      this.$element.attr('novalidate', '');\n    },\n\n    focus: function () {\n      this._focusedField = null;\n\n      if (true === this.validationResult || 'none' === this.options.focus)\n        return null;\n\n      for (var i = 0; i < this.fields.length; i++) {\n        var field = this.fields[i];\n        if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n          this._focusedField = field.$element;\n          if ('first' === this.options.focus)\n            break;\n        }\n      }\n\n      if (null === this._focusedField)\n        return null;\n\n      return this._focusedField.focus();\n    },\n\n    _destroyUI: function () {\n      // Reset all event listeners\n      this.$element.off('.Parsley');\n    }\n\n  };\n\n  ParsleyUI.Field = {\n\n    _reflowUI: function () {\n      this._buildUI();\n\n      // If this field doesn't have an active UI don't bother doing something\n      if (!this._ui)\n        return;\n\n      // Diff between two validation results\n      var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n      // Then store current validation result for next reflow\n      this._ui.lastValidationResult = this.validationResult;\n\n      // Handle valid / invalid / none field class\n      this._manageStatusClass();\n\n      // Add, remove, updated errors messages\n      this._manageErrorsMessages(diff);\n\n      // Triggers impl\n      this._actualizeTriggers();\n\n      // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n      if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n        this._failedOnce = true;\n        this._actualizeTriggers();\n      }\n    },\n\n    // Returns an array of field's error message(s)\n    getErrorsMessages: function () {\n      // No error message, field is valid\n      if (true === this.validationResult)\n        return [];\n\n      var messages = [];\n\n      for (var i = 0; i < this.validationResult.length; i++)\n        messages.push(this.validationResult[i].errorMessage ||\n         this._getErrorMessage(this.validationResult[i].assert));\n\n      return messages;\n    },\n\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    addError: function (name, {message, assert, updateClass = true} = {}) {\n      this._buildUI();\n      this._addError(name, {message, assert});\n\n      if (updateClass)\n        this._errorClass();\n    },\n\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    updateError: function (name, {message, assert, updateClass = true} = {}) {\n      this._buildUI();\n      this._updateError(name, {message, assert});\n\n      if (updateClass)\n        this._errorClass();\n    },\n\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    removeError: function (name, {updateClass = true} = {}) {\n      this._buildUI();\n      this._removeError(name);\n\n      // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n      // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n      if (updateClass)\n        this._manageStatusClass();\n    },\n\n    _manageStatusClass: function () {\n      if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n        this._successClass();\n      else if (this.validationResult.length > 0)\n        this._errorClass();\n      else\n        this._resetClass();\n    },\n\n    _manageErrorsMessages: function (diff) {\n      if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n        return;\n\n      // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n      if ('undefined' !== typeof this.options.errorMessage) {\n        if ((diff.added.length || diff.kept.length)) {\n          this._insertErrorWrapper();\n\n          if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n            this._ui.$errorsWrapper\n              .append(\n                $(this.options.errorTemplate)\n                .addClass('parsley-custom-error-message')\n              );\n\n          return this._ui.$errorsWrapper\n            .addClass('filled')\n            .find('.parsley-custom-error-message')\n            .html(this.options.errorMessage);\n        }\n\n        return this._ui.$errorsWrapper\n          .removeClass('filled')\n          .find('.parsley-custom-error-message')\n          .remove();\n      }\n\n      // Show, hide, update failing constraints messages\n      for (var i = 0; i < diff.removed.length; i++)\n        this._removeError(diff.removed[i].assert.name);\n\n      for (i = 0; i < diff.added.length; i++)\n        this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n      for (i = 0; i < diff.kept.length; i++)\n        this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n    },\n\n\n    _addError: function (name, {message, assert}) {\n      this._insertErrorWrapper();\n      this._ui.$errorsWrapper\n        .addClass('filled')\n        .append(\n          $(this.options.errorTemplate)\n          .addClass('parsley-' + name)\n          .html(message || this._getErrorMessage(assert))\n        );\n    },\n\n    _updateError: function (name, {message, assert}) {\n      this._ui.$errorsWrapper\n        .addClass('filled')\n        .find('.parsley-' + name)\n        .html(message || this._getErrorMessage(assert));\n    },\n\n    _removeError: function (name) {\n      this._ui.$errorsWrapper\n        .removeClass('filled')\n        .find('.parsley-' + name)\n        .remove();\n    },\n\n    _getErrorMessage: function (constraint) {\n      var customConstraintErrorMessage = constraint.name + 'Message';\n\n      if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n        return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n      return window.Parsley.getErrorMessage(constraint);\n    },\n\n    _buildUI: function () {\n      // UI could be already built or disabled\n      if (this._ui || false === this.options.uiEnabled)\n        return;\n\n      var _ui = {};\n\n      // Give field its Parsley id in DOM\n      this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n      /** Generate important UI elements and store them in this **/\n      // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n      _ui.$errorClassHandler = this._manageClassHandler();\n\n      // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n      _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n      _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n      // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n      _ui.lastValidationResult = [];\n      _ui.validationInformationVisible = false;\n\n      // Store it in this for later\n      this._ui = _ui;\n    },\n\n    // Determine which element will have `parsley-error` and `parsley-success` classes\n    _manageClassHandler: function () {\n      // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n      if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n        return $(this.options.classHandler);\n\n      // Class handled could also be determined by function given in Parsley options\n      var $handler = this.options.classHandler.call(this, this);\n\n      // If this function returned a valid existing DOM element, go for it\n      if ('undefined' !== typeof $handler && $handler.length)\n        return $handler;\n\n      // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n      if (!this.options.multiple || this.$element.is('select'))\n        return this.$element;\n\n      // But if multiple element (radio, checkbox), that would be their parent\n      return this.$element.parent();\n    },\n\n    _insertErrorWrapper: function () {\n      var $errorsContainer;\n\n      // Nothing to do if already inserted\n      if (0 !== this._ui.$errorsWrapper.parent().length)\n        return this._ui.$errorsWrapper.parent();\n\n      if ('string' === typeof this.options.errorsContainer) {\n        if ($(this.options.errorsContainer).length)\n          return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n        else\n          ParsleyUtils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n      } else if ('function' === typeof this.options.errorsContainer)\n        $errorsContainer = this.options.errorsContainer.call(this, this);\n\n      if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n        return $errorsContainer.append(this._ui.$errorsWrapper);\n\n      var $from = this.$element;\n      if (this.options.multiple)\n        $from = $from.parent();\n      return $from.after(this._ui.$errorsWrapper);\n    },\n\n    _actualizeTriggers: function () {\n      var $toBind = this._findRelated();\n\n      // Remove Parsley events already bound on this field\n      $toBind.off('.Parsley');\n      if (this._failedOnce)\n        $toBind.on(ParsleyUtils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n          this.validate();\n        });\n      else {\n        $toBind.on(ParsleyUtils__default.namespaceEvents(this.options.trigger, 'Parsley'), event => {\n          this._eventValidate(event);\n        });\n      }\n    },\n\n    _eventValidate: function (event) {\n      // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n      // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n      // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n      if (/key|input/.test(event.type))\n        if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n          return;\n\n      this.validate();\n    },\n\n    _resetUI: function () {\n      // Reset all event listeners\n      this._failedOnce = false;\n      this._actualizeTriggers();\n\n      // Nothing to do if UI never initialized for this field\n      if ('undefined' === typeof this._ui)\n        return;\n\n      // Reset all errors' li\n      this._ui.$errorsWrapper\n        .removeClass('filled')\n        .children()\n        .remove();\n\n      // Reset validation class\n      this._resetClass();\n\n      // Reset validation flags and last validation result\n      this._ui.lastValidationResult = [];\n      this._ui.validationInformationVisible = false;\n    },\n\n    _destroyUI: function () {\n      this._resetUI();\n\n      if ('undefined' !== typeof this._ui)\n        this._ui.$errorsWrapper.remove();\n\n      delete this._ui;\n    },\n\n    _successClass: function () {\n      this._ui.validationInformationVisible = true;\n      this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n    },\n    _errorClass: function () {\n      this._ui.validationInformationVisible = true;\n      this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n    },\n    _resetClass: function () {\n      this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n    }\n  };\n\n  var ParsleyForm = function (element, domOptions, options) {\n    this.__class__ = 'ParsleyForm';\n    this.__id__ = ParsleyUtils__default.generateID();\n\n    this.$element = $(element);\n    this.domOptions = domOptions;\n    this.options = options;\n    this.parent = window.Parsley;\n\n    this.fields = [];\n    this.validationResult = null;\n  };\n\n  var ParsleyForm__statusMapping = {pending: null, resolved: true, rejected: false};\n\n  ParsleyForm.prototype = {\n    onSubmitValidate: function (event) {\n      // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n      if (true === event.parsley)\n        return;\n\n      // If we didn't come here through a submit button, use the first one in the form\n      var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n      this._$submitSource = null;\n      this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n      if ($submitSource.is('[formnovalidate]'))\n        return;\n\n      var promise = this.whenValidate({event});\n\n      if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n        // All good, let event go through. We make this distinction because browsers\n        // differ in their handling of `submit` being called from inside a submit event [#1047]\n      } else {\n        // Rejected or pending: cancel this submit\n        event.stopImmediatePropagation();\n        event.preventDefault();\n        if ('pending' === promise.state())\n          promise.done(() => { this._submit($submitSource); });\n      }\n    },\n\n    onSubmitButton: function(event) {\n      this._$submitSource = $(event.target);\n    },\n    // internal\n    // _submit submits the form, this time without going through the validations.\n    // Care must be taken to \"fake\" the actual submit button being clicked.\n    _submit: function ($submitSource) {\n      if (false === this._trigger('submit'))\n        return;\n      // Add submit button's data\n      if ($submitSource) {\n        var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n        if (0 === $synthetic.length)\n          $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n        $synthetic.attr({\n          name: $submitSource.attr('name'),\n          value: $submitSource.attr('value')\n        });\n      }\n\n      this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n    },\n\n    // Performs validation on fields while triggering events.\n    // @returns `true` if all validations succeeds, `false`\n    // if a failure is immediately detected, or `null`\n    // if dependant on a promise.\n    // Consider using `whenValidate` instead.\n    validate: function (options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        ParsleyUtils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n        var [group, force, event] = arguments;\n        options = {group, force, event};\n      }\n      return ParsleyForm__statusMapping[ this.whenValidate(options).state() ];\n    },\n\n    whenValidate: function ({group, force, event} = {}) {\n      this.submitEvent = event;\n      if (event) {\n        this.submitEvent = $.extend({}, event, {preventDefault: () => {\n          ParsleyUtils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n          this.validationResult = false;\n        }});\n      }\n      this.validationResult = true;\n\n      // fire validate event to eventually modify things before very validation\n      this._trigger('validate');\n\n      // Refresh form DOM options and form's fields that could have changed\n      this._refreshFields();\n\n      var promises = this._withoutReactualizingFormOptions(() => {\n        return $.map(this.fields, field => {\n          return field.whenValidate({force, group});\n        });\n      });\n\n      var promiseBasedOnValidationResult = () => {\n        var r = $.Deferred();\n        if (false === this.validationResult)\n          r.reject();\n        return r.resolve().promise();\n      };\n\n      return $.when(...promises)\n        .done(  () => { this._trigger('success'); })\n        .fail(  () => {\n          this.validationResult = false;\n          this.focus();\n          this._trigger('error');\n        })\n        .always(() => { this._trigger('validated'); })\n        .pipe(  promiseBasedOnValidationResult, promiseBasedOnValidationResult);\n    },\n\n    // Iterate over refreshed fields, and stop on first failure.\n    // Returns `true` if all fields are valid, `false` if a failure is detected\n    // or `null` if the result depends on an unresolved promise.\n    // Prefer using `whenValid` instead.\n    isValid: function (options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        ParsleyUtils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n        var [group, force] = arguments;\n        options = {group, force};\n      }\n      return ParsleyForm__statusMapping[ this.whenValid(options).state() ];\n    },\n\n    // Iterate over refreshed fields and validate them.\n    // Returns a promise.\n    // A validation that immediately fails will interrupt the validations.\n    whenValid: function ({group, force} = {}) {\n      this._refreshFields();\n\n      var promises = this._withoutReactualizingFormOptions(() => {\n        return $.map(this.fields, field => {\n          return field.whenValid({group, force});\n        });\n      });\n      return $.when(...promises);\n    },\n\n    _refreshFields: function () {\n      return this.actualizeOptions()._bindFields();\n    },\n\n    _bindFields: function () {\n      var oldFields = this.fields;\n\n      this.fields = [];\n      this.fieldsMappedById = {};\n\n      this._withoutReactualizingFormOptions(() => {\n        this.$element\n        .find(this.options.inputs)\n        .not(this.options.excluded)\n        .each((_, element) => {\n          var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n          // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n          if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n            if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n              this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n              this.fields.push(fieldInstance);\n            }\n        });\n\n        $(oldFields).not(this.fields).each((_, field) => {\n          field._trigger('reset');\n        });\n      });\n      return this;\n    },\n\n    // Internal only.\n    // Looping on a form's fields to do validation or similar\n    // will trigger reactualizing options on all of them, which\n    // in turn will reactualize the form's options.\n    // To avoid calling actualizeOptions so many times on the form\n    // for nothing, _withoutReactualizingFormOptions temporarily disables\n    // the method actualizeOptions on this form while `fn` is called.\n    _withoutReactualizingFormOptions: function (fn) {\n      var oldActualizeOptions = this.actualizeOptions;\n      this.actualizeOptions = function () { return this; };\n      var result = fn();\n      this.actualizeOptions = oldActualizeOptions;\n      return result;\n    },\n\n    // Internal only.\n    // Shortcut to trigger an event\n    // Returns true iff event is not interrupted and default not prevented.\n    _trigger: function (eventName) {\n      return this.trigger('form:' + eventName);\n    }\n\n  };\n\n  var ConstraintFactory = function (parsleyField, name, requirements, priority, isDomConstraint) {\n    if (!/ParsleyField/.test(parsleyField.__class__))\n      throw new Error('ParsleyField or ParsleyFieldMultiple instance expected');\n\n    var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n    var validator = new ParsleyValidator(validatorSpec);\n\n    $.extend(this, {\n      validator: validator,\n      name: name,\n      requirements: requirements,\n      priority: priority || parsleyField.options[name + 'Priority'] || validator.priority,\n      isDomConstraint: true === isDomConstraint\n    });\n    this._parseRequirements(parsleyField.options);\n  };\n\n  var capitalize = function(str) {\n    var cap = str[0].toUpperCase();\n    return cap + str.slice(1);\n  };\n\n  ConstraintFactory.prototype = {\n    validate: function(value, instance) {\n      var args = this.requirementList.slice(0); // Make copy\n      args.unshift(value);\n      args.push(instance);\n      return this.validator.validate.apply(this.validator, args);\n    },\n\n    _parseRequirements: function(options) {\n      this.requirementList = this.validator.parseRequirements(this.requirements, key => {\n        return options[this.name + capitalize(key)];\n      });\n    }\n  };\n\n  var ParsleyField = function (field, domOptions, options, parsleyFormInstance) {\n    this.__class__ = 'ParsleyField';\n    this.__id__ = ParsleyUtils__default.generateID();\n\n    this.$element = $(field);\n\n    // Set parent if we have one\n    if ('undefined' !== typeof parsleyFormInstance) {\n      this.parent = parsleyFormInstance;\n    }\n\n    this.options = options;\n    this.domOptions = domOptions;\n\n    // Initialize some properties\n    this.constraints = [];\n    this.constraintsByName = {};\n    this.validationResult = [];\n\n    // Bind constraints\n    this._bindConstraints();\n  };\n\n  var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n  ParsleyField.prototype = {\n    // # Public API\n    // Validate field and trigger some events for mainly `ParsleyUI`\n    // @returns `true`, an array of the validators that failed, or\n    // `null` if validation is not finished. Prefer using whenValidate\n    validate: function (options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        ParsleyUtils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n        options = {options};\n      }\n      var promise = this.whenValidate(options);\n      if (!promise)  // If excluded with `group` option\n        return true;\n      switch (promise.state()) {\n        case 'pending': return null;\n        case 'resolved': return true;\n        case 'rejected': return this.validationResult;\n      }\n    },\n\n    // Validate field and trigger some events for mainly `ParsleyUI`\n    // @returns a promise that succeeds only when all validations do\n    // or `undefined` if field is not in the given `group`.\n    whenValidate: function ({force, group} =  {}) {\n      // do not validate a field if not the same as given validation group\n      this.refreshConstraints();\n      if (group && !this._isInGroup(group))\n        return;\n\n      this.value = this.getValue();\n\n      // Field Validate event. `this.value` could be altered for custom needs\n      this._trigger('validate');\n\n      return this.whenValid({force, value: this.value, _refreshed: true})\n        .always(() => { this._reflowUI(); })\n        .done(() =>   { this._trigger('success'); })\n        .fail(() =>   { this._trigger('error'); })\n        .always(() => { this._trigger('validated'); });\n    },\n\n    hasConstraints: function () {\n      return 0 !== this.constraints.length;\n    },\n\n    // An empty optional field does not need validation\n    needsValidation: function (value) {\n      if ('undefined' === typeof value)\n        value = this.getValue();\n\n      // If a field is empty and not required, it is valid\n      // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n      if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n        return false;\n\n      return true;\n    },\n\n    _isInGroup: function (group) {\n      if ($.isArray(this.options.group))\n        return -1 !== $.inArray(group, this.options.group);\n      return this.options.group === group;\n    },\n\n    // Just validate field. Do not trigger any event.\n    // Returns `true` iff all constraints pass, `false` if there are failures,\n    // or `null` if the result can not be determined yet (depends on a promise)\n    // See also `whenValid`.\n    isValid: function (options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        ParsleyUtils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n        var [force, value] = arguments;\n        options = {force, value};\n      }\n      var promise = this.whenValid(options);\n      if (!promise) // Excluded via `group`\n        return true;\n      return parsley_field__statusMapping[promise.state()];\n    },\n\n    // Just validate field. Do not trigger any event.\n    // @returns a promise that succeeds only when all validations do\n    // or `undefined` if the field is not in the given `group`.\n    // The argument `force` will force validation of empty fields.\n    // If a `value` is given, it will be validated instead of the value of the input.\n    whenValid: function ({force = false, value, group, _refreshed} = {}) {\n      // Recompute options and rebind constraints to have latest changes\n      if (!_refreshed)\n        this.refreshConstraints();\n      // do not validate a field if not the same as given validation group\n      if (group && !this._isInGroup(group))\n        return;\n\n      this.validationResult = true;\n\n      // A field without constraint is valid\n      if (!this.hasConstraints())\n        return $.when();\n\n      // Value could be passed as argument, needed to add more power to 'parsley:field:validate'\n      if ('undefined' === typeof value || null === value)\n        value = this.getValue();\n\n      if (!this.needsValidation(value) && true !== force)\n        return $.when();\n\n      var groupedConstraints = this._getGroupedConstraints();\n      var promises = [];\n      $.each(groupedConstraints, (_, constraints) => {\n        // Process one group of constraints at a time, we validate the constraints\n        // and combine the promises together.\n        var promise = $.when(\n          ...$.map(constraints, constraint => this._validateConstraint(value, constraint))\n        );\n        promises.push(promise);\n        if (promise.state() === 'rejected')\n          return false; // Interrupt processing if a group has already failed\n      });\n      return $.when.apply($, promises);\n    },\n\n    // @returns a promise\n    _validateConstraint: function(value, constraint) {\n      var result = constraint.validate(value, this);\n      // Map false to a failed promise\n      if (false === result)\n        result = $.Deferred().reject();\n      // Make sure we return a promise and that we record failures\n      return $.when(result).fail(errorMessage => {\n        if (true === this.validationResult)\n          this.validationResult = [];\n        this.validationResult.push({\n          assert: constraint,\n          errorMessage: 'string' === typeof errorMessage && errorMessage\n        });\n      });\n    },\n\n    // @returns Parsley field computed value that could be overrided or configured in DOM\n    getValue: function () {\n      var value;\n\n      // Value could be overriden in DOM or with explicit options\n      if ('function' === typeof this.options.value)\n        value = this.options.value(this);\n      else if ('undefined' !== typeof this.options.value)\n        value = this.options.value;\n      else\n        value = this.$element.val();\n\n      // Handle wrong DOM or configurations\n      if ('undefined' === typeof value || null === value)\n        return '';\n\n      return this._handleWhitespace(value);\n    },\n\n    // Actualize options that could have change since previous validation\n    // Re-bind accordingly constraints (could be some new, removed or updated)\n    refreshConstraints: function () {\n      return this.actualizeOptions()._bindConstraints();\n    },\n\n    /**\n    * Add a new constraint to a field\n    *\n    * @param {String}   name\n    * @param {Mixed}    requirements      optional\n    * @param {Number}   priority          optional\n    * @param {Boolean}  isDomConstraint   optional\n    */\n    addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n      if (window.Parsley._validatorRegistry.validators[name]) {\n        var constraint = new ConstraintFactory(this, name, requirements, priority, isDomConstraint);\n\n        // if constraint already exist, delete it and push new version\n        if ('undefined' !== this.constraintsByName[constraint.name])\n          this.removeConstraint(constraint.name);\n\n        this.constraints.push(constraint);\n        this.constraintsByName[constraint.name] = constraint;\n      }\n\n      return this;\n    },\n\n    // Remove a constraint\n    removeConstraint: function (name) {\n      for (var i = 0; i < this.constraints.length; i++)\n        if (name === this.constraints[i].name) {\n          this.constraints.splice(i, 1);\n          break;\n        }\n      delete this.constraintsByName[name];\n      return this;\n    },\n\n    // Update a constraint (Remove + re-add)\n    updateConstraint: function (name, parameters, priority) {\n      return this.removeConstraint(name)\n        .addConstraint(name, parameters, priority);\n    },\n\n    // # Internals\n\n    // Internal only.\n    // Bind constraints from config + options + DOM\n    _bindConstraints: function () {\n      var constraints = [];\n      var constraintsByName = {};\n\n      // clean all existing DOM constraints to only keep javascript user constraints\n      for (var i = 0; i < this.constraints.length; i++)\n        if (false === this.constraints[i].isDomConstraint) {\n          constraints.push(this.constraints[i]);\n          constraintsByName[this.constraints[i].name] = this.constraints[i];\n        }\n\n      this.constraints = constraints;\n      this.constraintsByName = constraintsByName;\n\n      // then re-add Parsley DOM-API constraints\n      for (var name in this.options)\n        this.addConstraint(name, this.options[name], undefined, true);\n\n      // finally, bind special HTML5 constraints\n      return this._bindHtml5Constraints();\n    },\n\n    // Internal only.\n    // Bind specific HTML5 constraints to be HTML5 compliant\n    _bindHtml5Constraints: function () {\n      // html5 required\n      if (this.$element.hasClass('required') || this.$element.attr('required'))\n        this.addConstraint('required', true, undefined, true);\n\n      // html5 pattern\n      if ('string' === typeof this.$element.attr('pattern'))\n        this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n      // range\n      if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max'))\n        this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n      // HTML5 min\n      else if ('undefined' !== typeof this.$element.attr('min'))\n        this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n      // HTML5 max\n      else if ('undefined' !== typeof this.$element.attr('max'))\n        this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n\n      // length\n      if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength'))\n        this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n      // HTML5 minlength\n      else if ('undefined' !== typeof this.$element.attr('minlength'))\n        this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n      // HTML5 maxlength\n      else if ('undefined' !== typeof this.$element.attr('maxlength'))\n        this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n\n      // html5 types\n      var type = this.$element.attr('type');\n\n      if ('undefined' === typeof type)\n        return this;\n\n      // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n      if ('number' === type) {\n        return this.addConstraint('type', ['number', {\n          step: this.$element.attr('step'),\n          base: this.$element.attr('min') || this.$element.attr('value')\n        }], undefined, true);\n      // Regular other HTML5 supported types\n      } else if (/^(email|url|range)$/i.test(type)) {\n        return this.addConstraint('type', type, undefined, true);\n      }\n      return this;\n    },\n\n    // Internal only.\n    // Field is required if have required constraint without `false` value\n    _isRequired: function () {\n      if ('undefined' === typeof this.constraintsByName.required)\n        return false;\n\n      return false !== this.constraintsByName.required.requirements;\n    },\n\n    // Internal only.\n    // Shortcut to trigger an event\n    _trigger: function (eventName) {\n      return this.trigger('field:' + eventName);\n    },\n\n    // Internal only\n    // Handles whitespace in a value\n    // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n    // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n    _handleWhitespace: function (value) {\n      if (true === this.options.trimValue)\n        ParsleyUtils__default.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n      if ('squish' === this.options.whitespace)\n        value = value.replace(/\\s{2,}/g, ' ');\n\n      if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n        value = ParsleyUtils__default.trimString(value);\n\n      return value;\n    },\n\n    // Internal only.\n    // Returns the constraints, grouped by descending priority.\n    // The result is thus an array of arrays of constraints.\n    _getGroupedConstraints: function () {\n      if (false === this.options.priorityEnabled)\n        return [this.constraints];\n\n      var groupedConstraints = [];\n      var index = {};\n\n      // Create array unique of priorities\n      for (var i = 0; i < this.constraints.length; i++) {\n        var p = this.constraints[i].priority;\n        if (!index[p])\n          groupedConstraints.push(index[p] = []);\n        index[p].push(this.constraints[i]);\n      }\n      // Sort them by priority DESC\n      groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n      return groupedConstraints;\n    }\n\n  };\n\n  var parsley_field = ParsleyField;\n\n  var ParsleyMultiple = function () {\n    this.__class__ = 'ParsleyFieldMultiple';\n  };\n\n  ParsleyMultiple.prototype = {\n    // Add new `$element` sibling for multiple field\n    addElement: function ($element) {\n      this.$elements.push($element);\n\n      return this;\n    },\n\n    // See `ParsleyField.refreshConstraints()`\n    refreshConstraints: function () {\n      var fieldConstraints;\n\n      this.constraints = [];\n\n      // Select multiple special treatment\n      if (this.$element.is('select')) {\n        this.actualizeOptions()._bindConstraints();\n\n        return this;\n      }\n\n      // Gather all constraints for each input in the multiple group\n      for (var i = 0; i < this.$elements.length; i++) {\n\n        // Check if element have not been dynamically removed since last binding\n        if (!$('html').has(this.$elements[i]).length) {\n          this.$elements.splice(i, 1);\n          continue;\n        }\n\n        fieldConstraints = this.$elements[i].data('ParsleyFieldMultiple').refreshConstraints().constraints;\n\n        for (var j = 0; j < fieldConstraints.length; j++)\n          this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n      }\n\n      return this;\n    },\n\n    // See `ParsleyField.getValue()`\n    getValue: function () {\n      // Value could be overriden in DOM\n      if ('function' === typeof this.options.value)\n        value = this.options.value(this);\n      else if ('undefined' !== typeof this.options.value)\n        return this.options.value;\n\n      // Radio input case\n      if (this.$element.is('input[type=radio]'))\n        return this._findRelated().filter(':checked').val() || '';\n\n      // checkbox input case\n      if (this.$element.is('input[type=checkbox]')) {\n        var values = [];\n\n        this._findRelated().filter(':checked').each(function () {\n          values.push($(this).val());\n        });\n\n        return values;\n      }\n\n      // Select multiple case\n      if (this.$element.is('select') && null === this.$element.val())\n        return [];\n\n      // Default case that should never happen\n      return this.$element.val();\n    },\n\n    _init: function () {\n      this.$elements = [this.$element];\n\n      return this;\n    }\n  };\n\n  var ParsleyFactory = function (element, options, parsleyFormInstance) {\n    this.$element = $(element);\n\n    // If the element has already been bound, returns its saved Parsley instance\n    var savedparsleyFormInstance = this.$element.data('Parsley');\n    if (savedparsleyFormInstance) {\n\n      // If the saved instance has been bound without a ParsleyForm parent and there is one given in this call, add it\n      if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n        savedparsleyFormInstance.parent = parsleyFormInstance;\n        savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n      }\n\n      return savedparsleyFormInstance;\n    }\n\n    // Parsley must be instantiated with a DOM element or jQuery $element\n    if (!this.$element.length)\n      throw new Error('You must bind Parsley on an existing element.');\n\n    if ('undefined' !== typeof parsleyFormInstance && 'ParsleyForm' !== parsleyFormInstance.__class__)\n      throw new Error('Parent instance must be a ParsleyForm instance');\n\n    this.parent = parsleyFormInstance || window.Parsley;\n    return this.init(options);\n  };\n\n  ParsleyFactory.prototype = {\n    init: function (options) {\n      this.__class__ = 'Parsley';\n      this.__version__ = '2.3.5';\n      this.__id__ = ParsleyUtils__default.generateID();\n\n      // Pre-compute options\n      this._resetOptions(options);\n\n      // A ParsleyForm instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n      if (this.$element.is('form') || (ParsleyUtils__default.checkAttr(this.$element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n        return this.bind('parsleyForm');\n\n      // Every other element is bound as a `ParsleyField` or `ParsleyFieldMultiple`\n      return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n    },\n\n    isMultiple: function () {\n      return (this.$element.is('input[type=radio], input[type=checkbox]')) || (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple'));\n    },\n\n    // Multiples fields are a real nightmare :(\n    // Maybe some refactoring would be appreciated here...\n    handleMultiple: function () {\n      var name;\n      var multiple;\n      var parsleyMultipleInstance;\n\n      // Handle multiple name\n      if (this.options.multiple)\n        ; // We already have our 'multiple' identifier\n      else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length)\n        this.options.multiple = name = this.$element.attr('name');\n      else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length)\n        this.options.multiple = this.$element.attr('id');\n\n      // Special select multiple input\n      if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n        this.options.multiple = this.options.multiple || this.__id__;\n        return this.bind('parsleyFieldMultiple');\n\n      // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n      } else if (!this.options.multiple) {\n        ParsleyUtils__default.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n        return this;\n      }\n\n      // Remove special chars\n      this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n      // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n      if ('undefined' !== typeof name) {\n        $('input[name=\"' + name + '\"]').each((i, input) => {\n          if ($(input).is('input[type=radio], input[type=checkbox]'))\n            $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n        });\n      }\n\n      // Check here if we don't already have a related multiple instance saved\n      var $previouslyRelated = this._findRelated();\n      for (var i = 0; i < $previouslyRelated.length; i++) {\n        parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n        if ('undefined' !== typeof parsleyMultipleInstance) {\n\n          if (!this.$element.data('ParsleyFieldMultiple')) {\n            parsleyMultipleInstance.addElement(this.$element);\n          }\n\n          break;\n        }\n      }\n\n      // Create a secret ParsleyField instance for every multiple field. It will be stored in `data('ParsleyFieldMultiple')`\n      // And will be useful later to access classic `ParsleyField` stuff while being in a `ParsleyFieldMultiple` instance\n      this.bind('parsleyField', true);\n\n      return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n    },\n\n    // Return proper `ParsleyForm`, `ParsleyField` or `ParsleyFieldMultiple`\n    bind: function (type, doNotStore) {\n      var parsleyInstance;\n\n      switch (type) {\n        case 'parsleyForm':\n          parsleyInstance = $.extend(\n            new ParsleyForm(this.$element, this.domOptions, this.options),\n            window.ParsleyExtend\n          )._bindFields();\n          break;\n        case 'parsleyField':\n          parsleyInstance = $.extend(\n            new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n            window.ParsleyExtend\n          );\n          break;\n        case 'parsleyFieldMultiple':\n          parsleyInstance = $.extend(\n            new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n            new ParsleyMultiple(),\n            window.ParsleyExtend\n          )._init();\n          break;\n        default:\n          throw new Error(type + 'is not a supported Parsley type');\n      }\n\n      if (this.options.multiple)\n        ParsleyUtils__default.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n      if ('undefined' !== typeof doNotStore) {\n        this.$element.data('ParsleyFieldMultiple', parsleyInstance);\n\n        return parsleyInstance;\n      }\n\n      // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n      this.$element.data('Parsley', parsleyInstance);\n\n      // Tell the world we have a new ParsleyForm or ParsleyField instance!\n      parsleyInstance._actualizeTriggers();\n      parsleyInstance._trigger('init');\n\n      return parsleyInstance;\n    }\n  };\n\n  var vernums = $.fn.jquery.split('.');\n  if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n    throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n  }\n  if (!vernums.forEach) {\n    ParsleyUtils__default.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n  }\n  // Inherit `on`, `off` & `trigger` to Parsley:\n  var Parsley = $.extend(new ParsleyAbstract(), {\n      $element: $(document),\n      actualizeOptions: null,\n      _resetOptions: null,\n      Factory: ParsleyFactory,\n      version: '2.3.5'\n    });\n\n  // Supplement ParsleyField and Form with ParsleyAbstract\n  // This way, the constructors will have access to those methods\n  $.extend(parsley_field.prototype, ParsleyUI.Field, ParsleyAbstract.prototype);\n  $.extend(ParsleyForm.prototype, ParsleyUI.Form, ParsleyAbstract.prototype);\n  // Inherit actualizeOptions and _resetOptions:\n  $.extend(ParsleyFactory.prototype, ParsleyAbstract.prototype);\n\n  // ### jQuery API\n  // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n  $.fn.parsley = $.fn.psly = function (options) {\n    if (this.length > 1) {\n      var instances = [];\n\n      this.each(function () {\n        instances.push($(this).parsley(options));\n      });\n\n      return instances;\n    }\n\n    // Return undefined if applied to non existing DOM element\n    if (!$(this).length) {\n      ParsleyUtils__default.warn('You must bind Parsley on an existing element.');\n\n      return;\n    }\n\n    return new ParsleyFactory(this, options);\n  };\n\n  // ### ParsleyField and ParsleyForm extension\n  // Ensure the extension is now defined if it wasn't previously\n  if ('undefined' === typeof window.ParsleyExtend)\n    window.ParsleyExtend = {};\n\n  // ### Parsley config\n  // Inherit from ParsleyDefault, and copy over any existing values\n  Parsley.options = $.extend(ParsleyUtils__default.objectCreate(ParsleyDefaults), window.ParsleyConfig);\n  window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n  // ### Globals\n  window.Parsley = window.psly = Parsley;\n  window.ParsleyUtils = ParsleyUtils__default;\n\n  // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n  var registry = window.Parsley._validatorRegistry = new ParsleyValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n  window.ParsleyValidator = {};\n  $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator'.split(' '), function (i, method) {\n    window.Parsley[method] = $.proxy(registry, method);\n    window.ParsleyValidator[method] = function () {\n      ParsleyUtils__default.warnOnce(`Accessing the method '${method}' through ParsleyValidator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n      return window.Parsley[method](...arguments);\n    };\n  });\n\n  // ### ParsleyUI\n  // Deprecated global object\n  window.Parsley.UI = ParsleyUI;\n  window.ParsleyUI = {\n    removeError: function (instance, name, doNotUpdateClass) {\n      var updateClass = true !== doNotUpdateClass;\n      ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n      return instance.removeError(name, {updateClass});\n    },\n    getErrorsMessages: function (instance) {\n      ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n      return instance.getErrorsMessages();\n    }\n  };\n  $.each('addError updateError'.split(' '), function (i, method) {\n    window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n      var updateClass = true !== doNotUpdateClass;\n      ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n      return instance[method](name, {message, assert, updateClass});\n    };\n  });\n\n  // Alleviate glaring Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=1250521\n  // See also https://github.com/guillaumepotier/Parsley.js/issues/1068\n  if (/firefox/i.test(navigator.userAgent)) {\n    $(document).on('change', 'select', evt => {\n      $(evt.target).trigger('input');\n    });\n  }\n\n  // ### PARSLEY auto-binding\n  // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n  if (false !== window.ParsleyConfig.autoBind) {\n    $(function () {\n      // Works only on `data-parsley-validate`.\n      if ($('[data-parsley-validate]').length)\n        $('[data-parsley-validate]').parsley();\n    });\n  }\n\n  var o = $({});\n  var deprecated = function () {\n    ParsleyUtils__default.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n  };\n\n  // Returns an event handler that calls `fn` with the arguments it expects\n  function adapt(fn, context) {\n    // Store to allow unbinding\n    if (!fn.parsleyAdaptedCallback) {\n      fn.parsleyAdaptedCallback = function () {\n        var args = Array.prototype.slice.call(arguments, 0);\n        args.unshift(this);\n        fn.apply(context || o, args);\n      };\n    }\n    return fn.parsleyAdaptedCallback;\n  }\n\n  var eventPrefix = 'parsley:';\n  // Converts 'parsley:form:validate' into 'form:validate'\n  function eventName(name) {\n    if (name.lastIndexOf(eventPrefix, 0) === 0)\n      return name.substr(eventPrefix.length);\n    return name;\n  }\n\n  // $.listen is deprecated. Use Parsley.on instead.\n  $.listen = function (name, callback) {\n    var context;\n    deprecated();\n    if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n      context = arguments[1];\n      callback = arguments[2];\n    }\n\n    if ('function' !== typeof callback)\n      throw new Error('Wrong parameters');\n\n    window.Parsley.on(eventName(name), adapt(callback, context));\n  };\n\n  $.listenTo = function (instance, name, fn) {\n    deprecated();\n    if (!(instance instanceof parsley_field) && !(instance instanceof ParsleyForm))\n      throw new Error('Must give Parsley instance');\n\n    if ('string' !== typeof name || 'function' !== typeof fn)\n      throw new Error('Wrong parameters');\n\n    instance.on(eventName(name), adapt(fn));\n  };\n\n  $.unsubscribe = function (name, fn) {\n    deprecated();\n    if ('string' !== typeof name || 'function' !== typeof fn)\n      throw new Error('Wrong arguments');\n    window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n  };\n\n  $.unsubscribeTo = function (instance, name) {\n    deprecated();\n    if (!(instance instanceof parsley_field) && !(instance instanceof ParsleyForm))\n      throw new Error('Must give Parsley instance');\n    instance.off(eventName(name));\n  };\n\n  $.unsubscribeAll = function (name) {\n    deprecated();\n    window.Parsley.off(eventName(name));\n    $('form,input,textarea,select').each(function () {\n      var instance = $(this).data('Parsley');\n      if (instance) {\n        instance.off(eventName(name));\n      }\n    });\n  };\n\n  // $.emit is deprecated. Use jQuery events instead.\n  $.emit = function (name, instance) {\n    deprecated();\n    var instanceGiven = (instance instanceof parsley_field) || (instance instanceof ParsleyForm);\n    var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n    args.unshift(eventName(name));\n    if (!instanceGiven) {\n      instance = window.Parsley;\n    }\n    instance.trigger(...args);\n  };\n\n  var pubsub = {};\n\n  $.extend(true, Parsley, {\n    asyncValidators: {\n      'default': {\n        fn: function (xhr) {\n          // By default, only status 2xx are deemed successful.\n          // Note: we use status instead of state() because responses with status 200\n          // but invalid messages (e.g. an empty body for content type set to JSON) will\n          // result in state() === 'rejected'.\n          return xhr.status >= 200 && xhr.status < 300;\n        },\n        url: false\n      },\n      reverse: {\n        fn: function (xhr) {\n          // If reverse option is set, a failing ajax request is considered successful\n          return xhr.status < 200 || xhr.status >= 300;\n        },\n        url: false\n      }\n    },\n\n    addAsyncValidator: function (name, fn, url, options) {\n      Parsley.asyncValidators[name] = {\n        fn: fn,\n        url: url || false,\n        options: options || {}\n      };\n\n      return this;\n    }\n\n  });\n\n  Parsley.addValidator('remote', {\n    requirementType: {\n      '': 'string',\n      'validator': 'string',\n      'reverse': 'boolean',\n      'options': 'object'\n    },\n\n    validateString: function (value, url, options, instance) {\n      var data = {};\n      var ajaxOptions;\n      var csr;\n      var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n      if ('undefined' === typeof Parsley.asyncValidators[validator])\n        throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n      url = Parsley.asyncValidators[validator].url || url;\n\n      // Fill current value\n      if (url.indexOf('{value}') > -1) {\n        url = url.replace('{value}', encodeURIComponent(value));\n      } else {\n        data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n      }\n\n      // Merge options passed in from the function with the ones in the attribute\n      var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n      // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n      ajaxOptions = $.extend(true, {}, {\n        url: url,\n        data: data,\n        type: 'GET'\n      }, remoteOptions);\n\n      // Generate store key based on ajax options\n      instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n      csr = $.param(ajaxOptions);\n\n      // Initialise querry cache\n      if ('undefined' === typeof Parsley._remoteCache)\n        Parsley._remoteCache = {};\n\n      // Try to retrieve stored xhr\n      var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n      var handleXhr = function () {\n        var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n        if (!result) // Map falsy results to rejected promise\n          result = $.Deferred().reject();\n        return $.when(result);\n      };\n\n      return xhr.then(handleXhr, handleXhr);\n    },\n\n    priority: -1\n  });\n\n  Parsley.on('form:submit', function () {\n    Parsley._remoteCache = {};\n  });\n\n  window.ParsleyExtend.addAsyncValidator = function () {\n    ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n    return Parsley.addAsyncValidator(...arguments);\n  };\n\n  // This is included with the Parsley library itself,\n  // thus there is no use in adding it to your project.\n  Parsley.addMessages('en', {\n    defaultMessage: \"This value seems to be invalid.\",\n    type: {\n      email:        \"This value should be a valid email.\",\n      url:          \"This value should be a valid url.\",\n      number:       \"This value should be a valid number.\",\n      integer:      \"This value should be a valid integer.\",\n      digits:       \"This value should be digits.\",\n      alphanum:     \"This value should be alphanumeric.\"\n    },\n    notblank:       \"This value should not be blank.\",\n    required:       \"This value is required.\",\n    pattern:        \"This value seems to be invalid.\",\n    min:            \"This value should be greater than or equal to %s.\",\n    max:            \"This value should be lower than or equal to %s.\",\n    range:          \"This value should be between %s and %s.\",\n    minlength:      \"This value is too short. It should have %s characters or more.\",\n    maxlength:      \"This value is too long. It should have %s characters or fewer.\",\n    length:         \"This value length is invalid. It should be between %s and %s characters long.\",\n    mincheck:       \"You must select at least %s choices.\",\n    maxcheck:       \"You must select %s choices or fewer.\",\n    check:          \"You must select between %s and %s choices.\",\n    equalto:        \"This value should be the same.\"\n  });\n\n  Parsley.setLocale('en');\n\n  var parsley = Parsley;\n\n  return parsley;\n\n}));\n","import $ from 'jquery';\nimport ParsleyField from './field';\nimport ParsleyForm from './form';\nimport ParsleyUtils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n  ParsleyUtils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n};\n\n// Returns an event handler that calls `fn` with the arguments it expects\nfunction adapt(fn, context) {\n  // Store to allow unbinding\n  if (!fn.parsleyAdaptedCallback) {\n    fn.parsleyAdaptedCallback = function () {\n      var args = Array.prototype.slice.call(arguments, 0);\n      args.unshift(this);\n      fn.apply(context || o, args);\n    };\n  }\n  return fn.parsleyAdaptedCallback;\n}\n\nvar eventPrefix = 'parsley:';\n// Converts 'parsley:form:validate' into 'form:validate'\nfunction eventName(name) {\n  if (name.lastIndexOf(eventPrefix, 0) === 0)\n    return name.substr(eventPrefix.length);\n  return name;\n}\n\n// $.listen is deprecated. Use Parsley.on instead.\n$.listen = function (name, callback) {\n  var context;\n  deprecated();\n  if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n    context = arguments[1];\n    callback = arguments[2];\n  }\n\n  if ('function' !== typeof callback)\n    throw new Error('Wrong parameters');\n\n  window.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = function (instance, name, fn) {\n  deprecated();\n  if (!(instance instanceof ParsleyField) && !(instance instanceof ParsleyForm))\n    throw new Error('Must give Parsley instance');\n\n  if ('string' !== typeof name || 'function' !== typeof fn)\n    throw new Error('Wrong parameters');\n\n  instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = function (name, fn) {\n  deprecated();\n  if ('string' !== typeof name || 'function' !== typeof fn)\n    throw new Error('Wrong arguments');\n  window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = function (instance, name) {\n  deprecated();\n  if (!(instance instanceof ParsleyField) && !(instance instanceof ParsleyForm))\n    throw new Error('Must give Parsley instance');\n  instance.off(eventName(name));\n};\n\n$.unsubscribeAll = function (name) {\n  deprecated();\n  window.Parsley.off(eventName(name));\n  $('form,input,textarea,select').each(function () {\n    var instance = $(this).data('Parsley');\n    if (instance) {\n      instance.off(eventName(name));\n    }\n  });\n};\n\n// $.emit is deprecated. Use jQuery events instead.\n$.emit = function (name, instance) {\n  deprecated();\n  var instanceGiven = (instance instanceof ParsleyField) || (instance instanceof ParsleyForm);\n  var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n  args.unshift(eventName(name));\n  if (!instanceGiven) {\n    instance = window.Parsley;\n  }\n  instance.trigger(...args);\n};\n\nexport default {};\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar ParsleyUtils = {\n  // Parsley DOM-API\n  // returns object from dom attributes and values\n  attr: function ($element, namespace, obj) {\n    var i;\n    var attribute;\n    var attributes;\n    var regex = new RegExp('^' + namespace, 'i');\n\n    if ('undefined' === typeof obj)\n      obj = {};\n    else {\n      // Clear all own properties. This won't affect prototype's values\n      for (i in obj) {\n        if (obj.hasOwnProperty(i))\n          delete obj[i];\n      }\n    }\n\n    if ('undefined' === typeof $element || 'undefined' === typeof $element[0])\n      return obj;\n\n    attributes = $element[0].attributes;\n    for (i = attributes.length; i--; ) {\n      attribute = attributes[i];\n\n      if (attribute && attribute.specified && regex.test(attribute.name)) {\n        obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n      }\n    }\n\n    return obj;\n  },\n\n  checkAttr: function ($element, namespace, checkAttr) {\n    return $element.is('[' + namespace + checkAttr + ']');\n  },\n\n  setAttr: function ($element, namespace, attr, value) {\n    $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n  },\n\n  generateID: function () {\n    return '' + globalID++;\n  },\n\n  /** Third party functions **/\n  // Zepto deserialize function\n  deserializeValue: function (value) {\n    var num;\n\n    try {\n      return value ?\n        value == \"true\" ||\n        (value == \"false\" ? false :\n        value == \"null\" ? null :\n        !isNaN(num = Number(value)) ? num :\n        /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n        value)\n        : value;\n    } catch (e) { return value; }\n  },\n\n  // Zepto camelize function\n  camelize: function (str) {\n    return str.replace(/-+(.)?/g, function (match, chr) {\n      return chr ? chr.toUpperCase() : '';\n    });\n  },\n\n  // Zepto dasherize function\n  dasherize: function (str) {\n    return str.replace(/::/g, '/')\n      .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n      .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n      .replace(/_/g, '-')\n      .toLowerCase();\n  },\n\n  warn: function () {\n    if (window.console && 'function' === typeof window.console.warn)\n      window.console.warn(...arguments);\n  },\n\n  warnOnce: function(msg) {\n    if (!pastWarnings[msg]) {\n      pastWarnings[msg] = true;\n      this.warn(...arguments);\n    }\n  },\n\n  _resetWarnings: function () {\n    pastWarnings = {};\n  },\n\n  trimString: function(string) {\n    return string.replace(/^\\s+|\\s+$/g, '');\n  },\n\n  namespaceEvents: function(events, namespace) {\n    events = this.trimString(events || '').split(/\\s+/);\n    if (!events[0])\n      return '';\n    return $.map(events, evt => { return `${evt}.${namespace}`; }).join(' ');\n  },\n\n  // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n  objectCreate: Object.create || (function () {\n    var Object = function () {};\n    return function (prototype) {\n      if (arguments.length > 1) {\n        throw Error('Second argument not supported');\n      }\n      if (typeof prototype != 'object') {\n        throw TypeError('Argument must be an object');\n      }\n      Object.prototype = prototype;\n      var result = new Object();\n      Object.prototype = null;\n      return result;\n    };\n  })()\n};\n\nexport default ParsleyUtils;\n","// All these options could be overriden and specified directly in DOM using\n// `data-parsley-` default DOM-API\n// eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n// eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\nvar ParsleyDefaults = {\n  // ### General\n\n  // Default data-namespace for DOM API\n  namespace: 'data-parsley-',\n\n  // Supported inputs by default\n  inputs: 'input, textarea, select',\n\n  // Excluded inputs by default\n  excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n  // Stop validating field on highest priority failing constraint\n  priorityEnabled: true,\n\n  // ### Field only\n\n  // identifier used to group together inputs (e.g. radio buttons...)\n  multiple: null,\n\n  // identifier (or array of identifiers) used to validate only a select group of inputs\n  group: null,\n\n  // ### UI\n  // Enable\\Disable error messages\n  uiEnabled: true,\n\n  // Key events threshold before validation\n  validationThreshold: 3,\n\n  // Focused field on form validation error. 'first'|'last'|'none'\n  focus: 'first',\n\n  // event(s) that will trigger validation before first failure. eg: `input`...\n  trigger: false,\n\n  // event(s) that will trigger validation after first failure.\n  triggerAfterFailure: 'input',\n\n  // Class that would be added on every failing validation Parsley field\n  errorClass: 'parsley-error',\n\n  // Same for success validation\n  successClass: 'parsley-success',\n\n  // Return the `$element` that will receive these above success or error classes\n  // Could also be (and given directly from DOM) a valid selector like `'#div'`\n  classHandler: function (ParsleyField) {},\n\n  // Return the `$element` where errors will be appended\n  // Could also be (and given directly from DOM) a valid selector like `'#div'`\n  errorsContainer: function (ParsleyField) {},\n\n  // ul elem that would receive errors' list\n  errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n  // li elem that would receive error message\n  errorTemplate: '<li></li>'\n};\n\nexport default ParsleyDefaults;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\n\nvar ParsleyAbstract = function () {};\n\nParsleyAbstract.prototype = {\n  asyncSupport: true, // Deprecated\n\n  actualizeOptions: function () {\n    ParsleyUtils.attr(this.$element, this.options.namespace, this.domOptions);\n    if (this.parent && this.parent.actualizeOptions)\n      this.parent.actualizeOptions();\n    return this;\n  },\n\n  _resetOptions: function (initOptions) {\n    this.domOptions = ParsleyUtils.objectCreate(this.parent.options);\n    this.options = ParsleyUtils.objectCreate(this.domOptions);\n    // Shallow copy of ownProperties of initOptions:\n    for (var i in initOptions) {\n      if (initOptions.hasOwnProperty(i))\n        this.options[i] = initOptions[i];\n    }\n    this.actualizeOptions();\n  },\n\n  _listeners: null,\n\n  // Register a callback for the given event name\n  // Callback is called with context as the first argument and the `this`\n  // The context is the current parsley instance, or window.Parsley if global\n  // A return value of `false` will interrupt the calls\n  on: function (name, fn) {\n    this._listeners = this._listeners || {};\n    var queue = this._listeners[name] = this._listeners[name] || [];\n    queue.push(fn);\n\n    return this;\n  },\n\n  // Deprecated. Use `on` instead\n  subscribe: function(name, fn) {\n    $.listenTo(this, name.toLowerCase(), fn);\n  },\n\n  // Unregister a callback (or all if none is given) for the given event name\n  off: function (name, fn) {\n    var queue = this._listeners && this._listeners[name];\n    if (queue) {\n      if (!fn) {\n        delete this._listeners[name];\n      } else {\n        for (var i = queue.length; i--; )\n          if (queue[i] === fn)\n            queue.splice(i, 1);\n      }\n    }\n    return this;\n  },\n\n  // Deprecated. Use `off`\n  unsubscribe: function(name, fn) {\n    $.unsubscribeTo(this, name.toLowerCase());\n  },\n\n  // Trigger an event of the given name\n  // A return value of `false` interrupts the callback chain\n  // Returns false if execution was interrupted\n  trigger: function (name, target, extraArg) {\n    target = target || this;\n    var queue = this._listeners && this._listeners[name];\n    var result;\n    var parentResult;\n    if (queue) {\n      for (var i = queue.length; i--; ) {\n        result = queue[i].call(target, target, extraArg);\n        if (result === false) return result;\n      }\n    }\n    if (this.parent) {\n      return this.parent.trigger(name, target, extraArg);\n    }\n    return true;\n  },\n\n  // Reset UI\n  reset: function () {\n    // Field case: just emit a reset event for UI\n    if ('ParsleyForm' !== this.__class__) {\n      this._resetUI();\n      return this._trigger('reset');\n    }\n\n    // Form case: emit a reset event for each field\n    for (var i = 0; i < this.fields.length; i++)\n      this.fields[i].reset();\n\n    this._trigger('reset');\n  },\n\n  // Destroy Parsley instance (+ UI)\n  destroy: function () {\n    // Field case: emit destroy event to clean UI and then destroy stored instance\n    this._destroyUI();\n    if ('ParsleyForm' !== this.__class__) {\n      this.$element.removeData('Parsley');\n      this.$element.removeData('ParsleyFieldMultiple');\n      this._trigger('destroy');\n\n      return;\n    }\n\n    // Form case: destroy all its fields and then destroy stored instance\n    for (var i = 0; i < this.fields.length; i++)\n      this.fields[i].destroy();\n\n    this.$element.removeData('Parsley');\n    this._trigger('destroy');\n  },\n\n  asyncIsValid: function (group, force) {\n    ParsleyUtils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n    return this.whenValid({group, force});\n  },\n\n  _findRelated: function () {\n    return this.options.multiple ?\n      this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n    : this.$element;\n  }\n};\n\nexport default ParsleyAbstract;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\n\nvar requirementConverters = {\n  string: function(string) {\n    return string;\n  },\n  integer: function(string) {\n    if (isNaN(string))\n      throw 'Requirement is not an integer: \"' + string + '\"';\n    return parseInt(string, 10);\n  },\n  number: function(string) {\n    if (isNaN(string))\n      throw 'Requirement is not a number: \"' + string + '\"';\n    return parseFloat(string);\n  },\n  reference: function(string) { // Unused for now\n    var result = $(string);\n    if (result.length === 0)\n      throw 'No such reference: \"' + string + '\"';\n    return result;\n  },\n  boolean: function(string) {\n    return string !== 'false';\n  },\n  object: function(string) {\n    return ParsleyUtils.deserializeValue(string);\n  },\n  regexp: function(regexp) {\n    var flags = '';\n\n    // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n    if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n      // Replace the regexp literal string with the first match group: ([gimy]*)\n      // If no flag is present, this will be a blank string\n      flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n      // Again, replace the regexp literal string with the first match group:\n      // everything excluding the opening and closing slashes and the flags\n      regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n    } else {\n      // Anchor regexp:\n      regexp = '^' + regexp + '$';\n    }\n    return new RegExp(regexp, flags);\n  }\n};\n\nvar convertArrayRequirement = function(string, length) {\n  var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n  if (!m)\n    throw 'Requirement is not an array: \"' + string + '\"';\n  var values = m[1].split(',').map(ParsleyUtils.trimString);\n  if (values.length !== length)\n    throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n  return values;\n};\n\nvar convertRequirement = function(requirementType, string) {\n  var converter = requirementConverters[requirementType || 'string'];\n  if (!converter)\n    throw 'Unknown requirement specification: \"' + requirementType + '\"';\n  return converter(string);\n};\n\nvar convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n  var main = null;\n  var extra = {};\n  for (var key in requirementSpec) {\n    if (key) {\n      var value = extraOptionReader(key);\n      if ('string' === typeof value)\n        value = convertRequirement(requirementSpec[key], value);\n      extra[key] = value;\n    } else {\n      main = convertRequirement(requirementSpec[key], string);\n    }\n  }\n  return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar ParsleyValidator = function(spec) {\n  $.extend(true, this, spec);\n};\n\nParsleyValidator.prototype = {\n  // Returns `true` iff the given `value` is valid according the given requirements.\n  validate: function(value, requirementFirstArg) {\n    if (this.fn) { // Legacy style validator\n\n      if (arguments.length > 3)  // If more args then value, requirement, instance...\n        requirementFirstArg = [].slice.call(arguments, 1, -1);  // Skip first arg (value) and last (instance), combining the rest\n      return this.fn.call(this, value, requirementFirstArg);\n    }\n\n    if ($.isArray(value)) {\n      if (!this.validateMultiple)\n        throw 'Validator `' + this.name + '` does not handle multiple values';\n      return this.validateMultiple(...arguments);\n    } else {\n      if (this.validateNumber) {\n        if (isNaN(value))\n          return false;\n        arguments[0] = parseFloat(arguments[0]);\n        return this.validateNumber(...arguments);\n      }\n      if (this.validateString) {\n        return this.validateString(...arguments);\n      }\n      throw 'Validator `' + this.name + '` only handles multiple values';\n    }\n  },\n\n  // Parses `requirements` into an array of arguments,\n  // according to `this.requirementType`\n  parseRequirements: function(requirements, extraOptionReader) {\n    if ('string' !== typeof requirements) {\n      // Assume requirement already parsed\n      // but make sure we return an array\n      return $.isArray(requirements) ? requirements : [requirements];\n    }\n    var type = this.requirementType;\n    if ($.isArray(type)) {\n      var values = convertArrayRequirement(requirements, type.length);\n      for (var i = 0; i < values.length; i++)\n        values[i] = convertRequirement(type[i], values[i]);\n      return values;\n    } else if ($.isPlainObject(type)) {\n      return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n    } else {\n      return [convertRequirement(type, requirements)];\n    }\n  },\n  // Defaults:\n  requirementType: 'string',\n\n  priority: 2\n\n};\n\nexport default ParsleyValidator;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\nimport ParsleyDefaults from './defaults';\nimport ParsleyValidator from './validator';\n\nvar ParsleyValidatorRegistry = function (validators, catalog) {\n  this.__class__ = 'ParsleyValidatorRegistry';\n\n  // Default Parsley locale is en\n  this.locale = 'en';\n\n  this.init(validators || {}, catalog || {});\n};\n\nvar typeRegexes =  {\n  email: /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,\n\n  // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n  number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n  integer: /^-?\\d+$/,\n\n  digits: /^\\d+$/,\n\n  alphanum: /^\\w+$/i,\n\n  url: new RegExp(\n      \"^\" +\n        // protocol identifier\n        \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n        // user:pass authentication\n        \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n        \"(?:\" +\n          // IP address exclusion\n          // private & local networks\n          // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +   // ** mod: allow local networks\n          // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n          // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n          // IP address dotted notation octets\n          // excludes loopback network 0.0.0.0\n          // excludes reserved space >= 224.0.0.0\n          // excludes network & broacast addresses\n          // (first & last IP address of each class)\n          \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n          \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n          \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n        \"|\" +\n          // host name\n          \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n          // domain name\n          \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n          // TLD identifier\n          \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\" +\n        \")\" +\n        // port number\n        \"(?::\\\\d{2,5})?\" +\n        // resource path\n        \"(?:/\\\\S*)?\" +\n      \"$\", 'i'\n    )\n};\ntypeRegexes.range = typeRegexes.number;\n\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n  var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n  if (!match) { return 0; }\n  return Math.max(\n       0,\n       // Number of digits right of decimal point.\n       (match[1] ? match[1].length : 0) -\n       // Adjust for scientific notation.\n       (match[2] ? +match[2] : 0));\n};\n\nParsleyValidatorRegistry.prototype = {\n  init: function (validators, catalog) {\n    this.catalog = catalog;\n    // Copy prototype's validators:\n    this.validators = $.extend({}, this.validators);\n\n    for (var name in validators)\n      this.addValidator(name, validators[name].fn, validators[name].priority);\n\n    window.Parsley.trigger('parsley:validator:init');\n  },\n\n  // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n  setLocale: function (locale) {\n    if ('undefined' === typeof this.catalog[locale])\n      throw new Error(locale + ' is not available in the catalog');\n\n    this.locale = locale;\n\n    return this;\n  },\n\n  // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n  addCatalog: function (locale, messages, set) {\n    if ('object' === typeof messages)\n      this.catalog[locale] = messages;\n\n    if (true === set)\n      return this.setLocale(locale);\n\n    return this;\n  },\n\n  // Add a specific message for a given constraint in a given locale\n  addMessage: function (locale, name, message) {\n    if ('undefined' === typeof this.catalog[locale])\n      this.catalog[locale] = {};\n\n    this.catalog[locale][name] = message;\n\n    return this;\n  },\n\n  // Add messages for a given locale\n  addMessages: function (locale, nameMessageObject) {\n    for (var name in nameMessageObject)\n      this.addMessage(locale, name, nameMessageObject[name]);\n\n    return this;\n  },\n\n  // Add a new validator\n  //\n  //    addValidator('custom', {\n  //        requirementType: ['integer', 'integer'],\n  //        validateString: function(value, from, to) {},\n  //        priority: 22,\n  //        messages: {\n  //          en: \"Hey, that's no good\",\n  //          fr: \"Aye aye, pas bon du tout\",\n  //        }\n  //    })\n  //\n  // Old API was addValidator(name, function, priority)\n  //\n  addValidator: function (name, arg1, arg2) {\n    if (this.validators[name])\n      ParsleyUtils.warn('Validator \"' + name + '\" is already defined.');\n    else if (ParsleyDefaults.hasOwnProperty(name)) {\n      ParsleyUtils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n      return;\n    }\n    return this._setValidator(...arguments);\n  },\n\n  updateValidator: function (name, arg1, arg2) {\n    if (!this.validators[name]) {\n      ParsleyUtils.warn('Validator \"' + name + '\" is not already defined.');\n      return this.addValidator(...arguments);\n    }\n    return this._setValidator(this, arguments);\n  },\n\n  removeValidator: function (name) {\n    if (!this.validators[name])\n      ParsleyUtils.warn('Validator \"' + name + '\" is not defined.');\n\n    delete this.validators[name];\n\n    return this;\n  },\n\n  _setValidator: function (name, validator, priority) {\n    if ('object' !== typeof validator) {\n      // Old style validator, with `fn` and `priority`\n      validator = {\n        fn: validator,\n        priority: priority\n      };\n    }\n    if (!validator.validate) {\n      validator = new ParsleyValidator(validator);\n    }\n    this.validators[name] = validator;\n\n    for (var locale in validator.messages || {})\n      this.addMessage(locale, name, validator.messages[locale]);\n\n    return this;\n  },\n\n  getErrorMessage: function (constraint) {\n    var message;\n\n    // Type constraints are a bit different, we have to match their requirements too to find right error message\n    if ('type' === constraint.name) {\n      var typeMessages = this.catalog[this.locale][constraint.name] || {};\n      message = typeMessages[constraint.requirements];\n    } else\n      message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n    return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n  },\n\n  // Kind of light `sprintf()` implementation\n  formatMessage: function (string, parameters) {\n    if ('object' === typeof parameters) {\n      for (var i in parameters)\n        string = this.formatMessage(string, parameters[i]);\n\n      return string;\n    }\n\n    return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n  },\n\n  // Here is the Parsley default validators list.\n  // A validator is an object with the following key values:\n  //  - priority: an integer\n  //  - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n  //  - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n  // Alternatively, a validator can be a function that returns such an object\n  //\n  validators: {\n    notblank: {\n      validateString: function(value) {\n        return /\\S/.test(value);\n      },\n      priority: 2\n    },\n    required: {\n      validateMultiple: function(values) {\n        return values.length > 0;\n      },\n      validateString: function(value) {\n        return /\\S/.test(value);\n      },\n      priority: 512\n    },\n    type: {\n      validateString: function(value, type, {step = '1', base = 0} = {}) {\n        var regex = typeRegexes[type];\n        if (!regex) {\n          throw new Error('validator type `' + type + '` is not supported');\n        }\n        if (!regex.test(value))\n          return false;\n        if ('number' === type) {\n          if (!/^any$/i.test(step || '')) {\n            var nb = Number(value);\n            var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n            if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n              return false;\n            // Be careful of rounding errors by using integers.\n            var toInt = f => { return Math.round(f * Math.pow(10, decimals)); };\n            if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n              return false;\n          }\n        }\n        return true;\n      },\n      requirementType: {\n        '': 'string',\n        step: 'string',\n        base: 'number'\n      },\n      priority: 256\n    },\n    pattern: {\n      validateString: function(value, regexp) {\n        return regexp.test(value);\n      },\n      requirementType: 'regexp',\n      priority: 64\n    },\n    minlength: {\n      validateString: function (value, requirement) {\n        return value.length >= requirement;\n      },\n      requirementType: 'integer',\n      priority: 30\n    },\n    maxlength: {\n      validateString: function (value, requirement) {\n        return value.length <= requirement;\n      },\n      requirementType: 'integer',\n      priority: 30\n    },\n    length: {\n      validateString: function (value, min, max) {\n        return value.length >= min && value.length <= max;\n      },\n      requirementType: ['integer', 'integer'],\n      priority: 30\n    },\n    mincheck: {\n      validateMultiple: function (values, requirement) {\n        return values.length >= requirement;\n      },\n      requirementType: 'integer',\n      priority: 30\n    },\n    maxcheck: {\n      validateMultiple: function (values, requirement) {\n        return values.length <= requirement;\n      },\n      requirementType: 'integer',\n      priority: 30\n    },\n    check: {\n      validateMultiple: function (values, min, max) {\n        return values.length >= min && values.length <= max;\n      },\n      requirementType: ['integer', 'integer'],\n      priority: 30\n    },\n    min: {\n      validateNumber: function (value, requirement) {\n        return value >= requirement;\n      },\n      requirementType: 'number',\n      priority: 30\n    },\n    max: {\n      validateNumber: function (value, requirement) {\n        return value <= requirement;\n      },\n      requirementType: 'number',\n      priority: 30\n    },\n    range: {\n      validateNumber: function (value, min, max) {\n        return value >= min && value <= max;\n      },\n      requirementType: ['number', 'number'],\n      priority: 30\n    },\n    equalto: {\n      validateString: function (value, refOrValue) {\n        var $reference = $(refOrValue);\n        if ($reference.length)\n          return value === $reference.val();\n        else\n          return value === refOrValue;\n      },\n      priority: 256\n    }\n  }\n};\n\nexport default ParsleyValidatorRegistry;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\n\nvar ParsleyUI = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n  var added = [];\n  var kept = [];\n\n  for (var i = 0; i < newResult.length; i++) {\n    var found = false;\n\n    for (var j = 0; j < oldResult.length; j++)\n      if (newResult[i].assert.name === oldResult[j].assert.name) {\n        found = true;\n        break;\n      }\n\n    if (found)\n      kept.push(newResult[i]);\n    else\n      added.push(newResult[i]);\n  }\n\n  return {\n    kept: kept,\n    added: added,\n    removed: !deep ? diffResults(oldResult, newResult, true).added : []\n  };\n};\n\nParsleyUI.Form = {\n\n  _actualizeTriggers: function () {\n    this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n    this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n    // UI could be disabled\n    if (false === this.options.uiEnabled)\n      return;\n\n    this.$element.attr('novalidate', '');\n  },\n\n  focus: function () {\n    this._focusedField = null;\n\n    if (true === this.validationResult || 'none' === this.options.focus)\n      return null;\n\n    for (var i = 0; i < this.fields.length; i++) {\n      var field = this.fields[i];\n      if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n        this._focusedField = field.$element;\n        if ('first' === this.options.focus)\n          break;\n      }\n    }\n\n    if (null === this._focusedField)\n      return null;\n\n    return this._focusedField.focus();\n  },\n\n  _destroyUI: function () {\n    // Reset all event listeners\n    this.$element.off('.Parsley');\n  }\n\n};\n\nParsleyUI.Field = {\n\n  _reflowUI: function () {\n    this._buildUI();\n\n    // If this field doesn't have an active UI don't bother doing something\n    if (!this._ui)\n      return;\n\n    // Diff between two validation results\n    var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n    // Then store current validation result for next reflow\n    this._ui.lastValidationResult = this.validationResult;\n\n    // Handle valid / invalid / none field class\n    this._manageStatusClass();\n\n    // Add, remove, updated errors messages\n    this._manageErrorsMessages(diff);\n\n    // Triggers impl\n    this._actualizeTriggers();\n\n    // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n    if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n      this._failedOnce = true;\n      this._actualizeTriggers();\n    }\n  },\n\n  // Returns an array of field's error message(s)\n  getErrorsMessages: function () {\n    // No error message, field is valid\n    if (true === this.validationResult)\n      return [];\n\n    var messages = [];\n\n    for (var i = 0; i < this.validationResult.length; i++)\n      messages.push(this.validationResult[i].errorMessage ||\n       this._getErrorMessage(this.validationResult[i].assert));\n\n    return messages;\n  },\n\n  // It's a goal of Parsley that this method is no longer required [#1073]\n  addError: function (name, {message, assert, updateClass = true} = {}) {\n    this._buildUI();\n    this._addError(name, {message, assert});\n\n    if (updateClass)\n      this._errorClass();\n  },\n\n  // It's a goal of Parsley that this method is no longer required [#1073]\n  updateError: function (name, {message, assert, updateClass = true} = {}) {\n    this._buildUI();\n    this._updateError(name, {message, assert});\n\n    if (updateClass)\n      this._errorClass();\n  },\n\n  // It's a goal of Parsley that this method is no longer required [#1073]\n  removeError: function (name, {updateClass = true} = {}) {\n    this._buildUI();\n    this._removeError(name);\n\n    // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n    // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n    if (updateClass)\n      this._manageStatusClass();\n  },\n\n  _manageStatusClass: function () {\n    if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n      this._successClass();\n    else if (this.validationResult.length > 0)\n      this._errorClass();\n    else\n      this._resetClass();\n  },\n\n  _manageErrorsMessages: function (diff) {\n    if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n      return;\n\n    // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n    if ('undefined' !== typeof this.options.errorMessage) {\n      if ((diff.added.length || diff.kept.length)) {\n        this._insertErrorWrapper();\n\n        if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n          this._ui.$errorsWrapper\n            .append(\n              $(this.options.errorTemplate)\n              .addClass('parsley-custom-error-message')\n            );\n\n        return this._ui.$errorsWrapper\n          .addClass('filled')\n          .find('.parsley-custom-error-message')\n          .html(this.options.errorMessage);\n      }\n\n      return this._ui.$errorsWrapper\n        .removeClass('filled')\n        .find('.parsley-custom-error-message')\n        .remove();\n    }\n\n    // Show, hide, update failing constraints messages\n    for (var i = 0; i < diff.removed.length; i++)\n      this._removeError(diff.removed[i].assert.name);\n\n    for (i = 0; i < diff.added.length; i++)\n      this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n    for (i = 0; i < diff.kept.length; i++)\n      this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n  },\n\n\n  _addError: function (name, {message, assert}) {\n    this._insertErrorWrapper();\n    this._ui.$errorsWrapper\n      .addClass('filled')\n      .append(\n        $(this.options.errorTemplate)\n        .addClass('parsley-' + name)\n        .html(message || this._getErrorMessage(assert))\n      );\n  },\n\n  _updateError: function (name, {message, assert}) {\n    this._ui.$errorsWrapper\n      .addClass('filled')\n      .find('.parsley-' + name)\n      .html(message || this._getErrorMessage(assert));\n  },\n\n  _removeError: function (name) {\n    this._ui.$errorsWrapper\n      .removeClass('filled')\n      .find('.parsley-' + name)\n      .remove();\n  },\n\n  _getErrorMessage: function (constraint) {\n    var customConstraintErrorMessage = constraint.name + 'Message';\n\n    if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n      return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n    return window.Parsley.getErrorMessage(constraint);\n  },\n\n  _buildUI: function () {\n    // UI could be already built or disabled\n    if (this._ui || false === this.options.uiEnabled)\n      return;\n\n    var _ui = {};\n\n    // Give field its Parsley id in DOM\n    this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n    /** Generate important UI elements and store them in this **/\n    // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n    _ui.$errorClassHandler = this._manageClassHandler();\n\n    // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n    _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n    _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n    // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n    _ui.lastValidationResult = [];\n    _ui.validationInformationVisible = false;\n\n    // Store it in this for later\n    this._ui = _ui;\n  },\n\n  // Determine which element will have `parsley-error` and `parsley-success` classes\n  _manageClassHandler: function () {\n    // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n    if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n      return $(this.options.classHandler);\n\n    // Class handled could also be determined by function given in Parsley options\n    var $handler = this.options.classHandler.call(this, this);\n\n    // If this function returned a valid existing DOM element, go for it\n    if ('undefined' !== typeof $handler && $handler.length)\n      return $handler;\n\n    // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n    if (!this.options.multiple || this.$element.is('select'))\n      return this.$element;\n\n    // But if multiple element (radio, checkbox), that would be their parent\n    return this.$element.parent();\n  },\n\n  _insertErrorWrapper: function () {\n    var $errorsContainer;\n\n    // Nothing to do if already inserted\n    if (0 !== this._ui.$errorsWrapper.parent().length)\n      return this._ui.$errorsWrapper.parent();\n\n    if ('string' === typeof this.options.errorsContainer) {\n      if ($(this.options.errorsContainer).length)\n        return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n      else\n        ParsleyUtils.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n    } else if ('function' === typeof this.options.errorsContainer)\n      $errorsContainer = this.options.errorsContainer.call(this, this);\n\n    if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n      return $errorsContainer.append(this._ui.$errorsWrapper);\n\n    var $from = this.$element;\n    if (this.options.multiple)\n      $from = $from.parent();\n    return $from.after(this._ui.$errorsWrapper);\n  },\n\n  _actualizeTriggers: function () {\n    var $toBind = this._findRelated();\n\n    // Remove Parsley events already bound on this field\n    $toBind.off('.Parsley');\n    if (this._failedOnce)\n      $toBind.on(ParsleyUtils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n        this.validate();\n      });\n    else {\n      $toBind.on(ParsleyUtils.namespaceEvents(this.options.trigger, 'Parsley'), event => {\n        this._eventValidate(event);\n      });\n    }\n  },\n\n  _eventValidate: function (event) {\n    // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n    // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n    // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n    if (/key|input/.test(event.type))\n      if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n        return;\n\n    this.validate();\n  },\n\n  _resetUI: function () {\n    // Reset all event listeners\n    this._failedOnce = false;\n    this._actualizeTriggers();\n\n    // Nothing to do if UI never initialized for this field\n    if ('undefined' === typeof this._ui)\n      return;\n\n    // Reset all errors' li\n    this._ui.$errorsWrapper\n      .removeClass('filled')\n      .children()\n      .remove();\n\n    // Reset validation class\n    this._resetClass();\n\n    // Reset validation flags and last validation result\n    this._ui.lastValidationResult = [];\n    this._ui.validationInformationVisible = false;\n  },\n\n  _destroyUI: function () {\n    this._resetUI();\n\n    if ('undefined' !== typeof this._ui)\n      this._ui.$errorsWrapper.remove();\n\n    delete this._ui;\n  },\n\n  _successClass: function () {\n    this._ui.validationInformationVisible = true;\n    this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n  },\n  _errorClass: function () {\n    this._ui.validationInformationVisible = true;\n    this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n  },\n  _resetClass: function () {\n    this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n  }\n};\n\nexport default ParsleyUI;\n","import $ from 'jquery';\nimport ParsleyAbstract from './abstract';\nimport ParsleyUtils from './utils';\n\nvar ParsleyForm = function (element, domOptions, options) {\n  this.__class__ = 'ParsleyForm';\n  this.__id__ = ParsleyUtils.generateID();\n\n  this.$element = $(element);\n  this.domOptions = domOptions;\n  this.options = options;\n  this.parent = window.Parsley;\n\n  this.fields = [];\n  this.validationResult = null;\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nParsleyForm.prototype = {\n  onSubmitValidate: function (event) {\n    // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n    if (true === event.parsley)\n      return;\n\n    // If we didn't come here through a submit button, use the first one in the form\n    var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n    this._$submitSource = null;\n    this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n    if ($submitSource.is('[formnovalidate]'))\n      return;\n\n    var promise = this.whenValidate({event});\n\n    if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n      // All good, let event go through. We make this distinction because browsers\n      // differ in their handling of `submit` being called from inside a submit event [#1047]\n    } else {\n      // Rejected or pending: cancel this submit\n      event.stopImmediatePropagation();\n      event.preventDefault();\n      if ('pending' === promise.state())\n        promise.done(() => { this._submit($submitSource); });\n    }\n  },\n\n  onSubmitButton: function(event) {\n    this._$submitSource = $(event.target);\n  },\n  // internal\n  // _submit submits the form, this time without going through the validations.\n  // Care must be taken to \"fake\" the actual submit button being clicked.\n  _submit: function ($submitSource) {\n    if (false === this._trigger('submit'))\n      return;\n    // Add submit button's data\n    if ($submitSource) {\n      var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n      if (0 === $synthetic.length)\n        $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n      $synthetic.attr({\n        name: $submitSource.attr('name'),\n        value: $submitSource.attr('value')\n      });\n    }\n\n    this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n  },\n\n  // Performs validation on fields while triggering events.\n  // @returns `true` if all validations succeeds, `false`\n  // if a failure is immediately detected, or `null`\n  // if dependant on a promise.\n  // Consider using `whenValidate` instead.\n  validate: function (options) {\n    if (arguments.length >= 1 && !$.isPlainObject(options)) {\n      ParsleyUtils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n      var [group, force, event] = arguments;\n      options = {group, force, event};\n    }\n    return statusMapping[ this.whenValidate(options).state() ];\n  },\n\n  whenValidate: function ({group, force, event} = {}) {\n    this.submitEvent = event;\n    if (event) {\n      this.submitEvent = $.extend({}, event, {preventDefault: () => {\n        ParsleyUtils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n        this.validationResult = false;\n      }});\n    }\n    this.validationResult = true;\n\n    // fire validate event to eventually modify things before very validation\n    this._trigger('validate');\n\n    // Refresh form DOM options and form's fields that could have changed\n    this._refreshFields();\n\n    var promises = this._withoutReactualizingFormOptions(() => {\n      return $.map(this.fields, field => {\n        return field.whenValidate({force, group});\n      });\n    });\n\n    var promiseBasedOnValidationResult = () => {\n      var r = $.Deferred();\n      if (false === this.validationResult)\n        r.reject();\n      return r.resolve().promise();\n    };\n\n    return $.when(...promises)\n      .done(  () => { this._trigger('success'); })\n      .fail(  () => {\n        this.validationResult = false;\n        this.focus();\n        this._trigger('error');\n      })\n      .always(() => { this._trigger('validated'); })\n      .pipe(  promiseBasedOnValidationResult, promiseBasedOnValidationResult);\n  },\n\n  // Iterate over refreshed fields, and stop on first failure.\n  // Returns `true` if all fields are valid, `false` if a failure is detected\n  // or `null` if the result depends on an unresolved promise.\n  // Prefer using `whenValid` instead.\n  isValid: function (options) {\n    if (arguments.length >= 1 && !$.isPlainObject(options)) {\n      ParsleyUtils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n      var [group, force] = arguments;\n      options = {group, force};\n    }\n    return statusMapping[ this.whenValid(options).state() ];\n  },\n\n  // Iterate over refreshed fields and validate them.\n  // Returns a promise.\n  // A validation that immediately fails will interrupt the validations.\n  whenValid: function ({group, force} = {}) {\n    this._refreshFields();\n\n    var promises = this._withoutReactualizingFormOptions(() => {\n      return $.map(this.fields, field => {\n        return field.whenValid({group, force});\n      });\n    });\n    return $.when(...promises);\n  },\n\n  _refreshFields: function () {\n    return this.actualizeOptions()._bindFields();\n  },\n\n  _bindFields: function () {\n    var oldFields = this.fields;\n\n    this.fields = [];\n    this.fieldsMappedById = {};\n\n    this._withoutReactualizingFormOptions(() => {\n      this.$element\n      .find(this.options.inputs)\n      .not(this.options.excluded)\n      .each((_, element) => {\n        var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n        // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n        if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n          if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n            this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n            this.fields.push(fieldInstance);\n          }\n      });\n\n      $(oldFields).not(this.fields).each((_, field) => {\n        field._trigger('reset');\n      });\n    });\n    return this;\n  },\n\n  // Internal only.\n  // Looping on a form's fields to do validation or similar\n  // will trigger reactualizing options on all of them, which\n  // in turn will reactualize the form's options.\n  // To avoid calling actualizeOptions so many times on the form\n  // for nothing, _withoutReactualizingFormOptions temporarily disables\n  // the method actualizeOptions on this form while `fn` is called.\n  _withoutReactualizingFormOptions: function (fn) {\n    var oldActualizeOptions = this.actualizeOptions;\n    this.actualizeOptions = function () { return this; };\n    var result = fn();\n    this.actualizeOptions = oldActualizeOptions;\n    return result;\n  },\n\n  // Internal only.\n  // Shortcut to trigger an event\n  // Returns true iff event is not interrupted and default not prevented.\n  _trigger: function (eventName) {\n    return this.trigger('form:' + eventName);\n  }\n\n};\n\nexport default ParsleyForm;\n","import $ from 'jquery';\nimport ParsleyUtils from '../utils';\nimport ParsleyValidator from '../validator';\n\n\nvar ConstraintFactory = function (parsleyField, name, requirements, priority, isDomConstraint) {\n  if (!/ParsleyField/.test(parsleyField.__class__))\n    throw new Error('ParsleyField or ParsleyFieldMultiple instance expected');\n\n  var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n  var validator = new ParsleyValidator(validatorSpec);\n\n  $.extend(this, {\n    validator: validator,\n    name: name,\n    requirements: requirements,\n    priority: priority || parsleyField.options[name + 'Priority'] || validator.priority,\n    isDomConstraint: true === isDomConstraint\n  });\n  this._parseRequirements(parsleyField.options);\n};\n\nvar capitalize = function(str) {\n  var cap = str[0].toUpperCase();\n  return cap + str.slice(1);\n};\n\nConstraintFactory.prototype = {\n  validate: function(value, instance) {\n    var args = this.requirementList.slice(0); // Make copy\n    args.unshift(value);\n    args.push(instance);\n    return this.validator.validate.apply(this.validator, args);\n  },\n\n  _parseRequirements: function(options) {\n    this.requirementList = this.validator.parseRequirements(this.requirements, key => {\n      return options[this.name + capitalize(key)];\n    });\n  }\n};\n\nexport default ConstraintFactory;\n\n","import $ from 'jquery';\nimport ConstraintFactory from './factory/constraint';\nimport ParsleyUI from './ui';\nimport ParsleyUtils from './utils';\n\nvar ParsleyField = function (field, domOptions, options, parsleyFormInstance) {\n  this.__class__ = 'ParsleyField';\n  this.__id__ = ParsleyUtils.generateID();\n\n  this.$element = $(field);\n\n  // Set parent if we have one\n  if ('undefined' !== typeof parsleyFormInstance) {\n    this.parent = parsleyFormInstance;\n  }\n\n  this.options = options;\n  this.domOptions = domOptions;\n\n  // Initialize some properties\n  this.constraints = [];\n  this.constraintsByName = {};\n  this.validationResult = [];\n\n  // Bind constraints\n  this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nParsleyField.prototype = {\n  // # Public API\n  // Validate field and trigger some events for mainly `ParsleyUI`\n  // @returns `true`, an array of the validators that failed, or\n  // `null` if validation is not finished. Prefer using whenValidate\n  validate: function (options) {\n    if (arguments.length >= 1 && !$.isPlainObject(options)) {\n      ParsleyUtils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n      options = {options};\n    }\n    var promise = this.whenValidate(options);\n    if (!promise)  // If excluded with `group` option\n      return true;\n    switch (promise.state()) {\n      case 'pending': return null;\n      case 'resolved': return true;\n      case 'rejected': return this.validationResult;\n    }\n  },\n\n  // Validate field and trigger some events for mainly `ParsleyUI`\n  // @returns a promise that succeeds only when all validations do\n  // or `undefined` if field is not in the given `group`.\n  whenValidate: function ({force, group} =  {}) {\n    // do not validate a field if not the same as given validation group\n    this.refreshConstraints();\n    if (group && !this._isInGroup(group))\n      return;\n\n    this.value = this.getValue();\n\n    // Field Validate event. `this.value` could be altered for custom needs\n    this._trigger('validate');\n\n    return this.whenValid({force, value: this.value, _refreshed: true})\n      .always(() => { this._reflowUI(); })\n      .done(() =>   { this._trigger('success'); })\n      .fail(() =>   { this._trigger('error'); })\n      .always(() => { this._trigger('validated'); });\n  },\n\n  hasConstraints: function () {\n    return 0 !== this.constraints.length;\n  },\n\n  // An empty optional field does not need validation\n  needsValidation: function (value) {\n    if ('undefined' === typeof value)\n      value = this.getValue();\n\n    // If a field is empty and not required, it is valid\n    // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n    if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n      return false;\n\n    return true;\n  },\n\n  _isInGroup: function (group) {\n    if ($.isArray(this.options.group))\n      return -1 !== $.inArray(group, this.options.group);\n    return this.options.group === group;\n  },\n\n  // Just validate field. Do not trigger any event.\n  // Returns `true` iff all constraints pass, `false` if there are failures,\n  // or `null` if the result can not be determined yet (depends on a promise)\n  // See also `whenValid`.\n  isValid: function (options) {\n    if (arguments.length >= 1 && !$.isPlainObject(options)) {\n      ParsleyUtils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n      var [force, value] = arguments;\n      options = {force, value};\n    }\n    var promise = this.whenValid(options);\n    if (!promise) // Excluded via `group`\n      return true;\n    return statusMapping[promise.state()];\n  },\n\n  // Just validate field. Do not trigger any event.\n  // @returns a promise that succeeds only when all validations do\n  // or `undefined` if the field is not in the given `group`.\n  // The argument `force` will force validation of empty fields.\n  // If a `value` is given, it will be validated instead of the value of the input.\n  whenValid: function ({force = false, value, group, _refreshed} = {}) {\n    // Recompute options and rebind constraints to have latest changes\n    if (!_refreshed)\n      this.refreshConstraints();\n    // do not validate a field if not the same as given validation group\n    if (group && !this._isInGroup(group))\n      return;\n\n    this.validationResult = true;\n\n    // A field without constraint is valid\n    if (!this.hasConstraints())\n      return $.when();\n\n    // Value could be passed as argument, needed to add more power to 'parsley:field:validate'\n    if ('undefined' === typeof value || null === value)\n      value = this.getValue();\n\n    if (!this.needsValidation(value) && true !== force)\n      return $.when();\n\n    var groupedConstraints = this._getGroupedConstraints();\n    var promises = [];\n    $.each(groupedConstraints, (_, constraints) => {\n      // Process one group of constraints at a time, we validate the constraints\n      // and combine the promises together.\n      var promise = $.when(\n        ...$.map(constraints, constraint => this._validateConstraint(value, constraint))\n      );\n      promises.push(promise);\n      if (promise.state() === 'rejected')\n        return false; // Interrupt processing if a group has already failed\n    });\n    return $.when.apply($, promises);\n  },\n\n  // @returns a promise\n  _validateConstraint: function(value, constraint) {\n    var result = constraint.validate(value, this);\n    // Map false to a failed promise\n    if (false === result)\n      result = $.Deferred().reject();\n    // Make sure we return a promise and that we record failures\n    return $.when(result).fail(errorMessage => {\n      if (true === this.validationResult)\n        this.validationResult = [];\n      this.validationResult.push({\n        assert: constraint,\n        errorMessage: 'string' === typeof errorMessage && errorMessage\n      });\n    });\n  },\n\n  // @returns Parsley field computed value that could be overrided or configured in DOM\n  getValue: function () {\n    var value;\n\n    // Value could be overriden in DOM or with explicit options\n    if ('function' === typeof this.options.value)\n      value = this.options.value(this);\n    else if ('undefined' !== typeof this.options.value)\n      value = this.options.value;\n    else\n      value = this.$element.val();\n\n    // Handle wrong DOM or configurations\n    if ('undefined' === typeof value || null === value)\n      return '';\n\n    return this._handleWhitespace(value);\n  },\n\n  // Actualize options that could have change since previous validation\n  // Re-bind accordingly constraints (could be some new, removed or updated)\n  refreshConstraints: function () {\n    return this.actualizeOptions()._bindConstraints();\n  },\n\n  /**\n  * Add a new constraint to a field\n  *\n  * @param {String}   name\n  * @param {Mixed}    requirements      optional\n  * @param {Number}   priority          optional\n  * @param {Boolean}  isDomConstraint   optional\n  */\n  addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n    if (window.Parsley._validatorRegistry.validators[name]) {\n      var constraint = new ConstraintFactory(this, name, requirements, priority, isDomConstraint);\n\n      // if constraint already exist, delete it and push new version\n      if ('undefined' !== this.constraintsByName[constraint.name])\n        this.removeConstraint(constraint.name);\n\n      this.constraints.push(constraint);\n      this.constraintsByName[constraint.name] = constraint;\n    }\n\n    return this;\n  },\n\n  // Remove a constraint\n  removeConstraint: function (name) {\n    for (var i = 0; i < this.constraints.length; i++)\n      if (name === this.constraints[i].name) {\n        this.constraints.splice(i, 1);\n        break;\n      }\n    delete this.constraintsByName[name];\n    return this;\n  },\n\n  // Update a constraint (Remove + re-add)\n  updateConstraint: function (name, parameters, priority) {\n    return this.removeConstraint(name)\n      .addConstraint(name, parameters, priority);\n  },\n\n  // # Internals\n\n  // Internal only.\n  // Bind constraints from config + options + DOM\n  _bindConstraints: function () {\n    var constraints = [];\n    var constraintsByName = {};\n\n    // clean all existing DOM constraints to only keep javascript user constraints\n    for (var i = 0; i < this.constraints.length; i++)\n      if (false === this.constraints[i].isDomConstraint) {\n        constraints.push(this.constraints[i]);\n        constraintsByName[this.constraints[i].name] = this.constraints[i];\n      }\n\n    this.constraints = constraints;\n    this.constraintsByName = constraintsByName;\n\n    // then re-add Parsley DOM-API constraints\n    for (var name in this.options)\n      this.addConstraint(name, this.options[name], undefined, true);\n\n    // finally, bind special HTML5 constraints\n    return this._bindHtml5Constraints();\n  },\n\n  // Internal only.\n  // Bind specific HTML5 constraints to be HTML5 compliant\n  _bindHtml5Constraints: function () {\n    // html5 required\n    if (this.$element.hasClass('required') || this.$element.attr('required'))\n      this.addConstraint('required', true, undefined, true);\n\n    // html5 pattern\n    if ('string' === typeof this.$element.attr('pattern'))\n      this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n    // range\n    if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max'))\n      this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n    // HTML5 min\n    else if ('undefined' !== typeof this.$element.attr('min'))\n      this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n    // HTML5 max\n    else if ('undefined' !== typeof this.$element.attr('max'))\n      this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n\n    // length\n    if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength'))\n      this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n    // HTML5 minlength\n    else if ('undefined' !== typeof this.$element.attr('minlength'))\n      this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n    // HTML5 maxlength\n    else if ('undefined' !== typeof this.$element.attr('maxlength'))\n      this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n\n    // html5 types\n    var type = this.$element.attr('type');\n\n    if ('undefined' === typeof type)\n      return this;\n\n    // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n    if ('number' === type) {\n      return this.addConstraint('type', ['number', {\n        step: this.$element.attr('step'),\n        base: this.$element.attr('min') || this.$element.attr('value')\n      }], undefined, true);\n    // Regular other HTML5 supported types\n    } else if (/^(email|url|range)$/i.test(type)) {\n      return this.addConstraint('type', type, undefined, true);\n    }\n    return this;\n  },\n\n  // Internal only.\n  // Field is required if have required constraint without `false` value\n  _isRequired: function () {\n    if ('undefined' === typeof this.constraintsByName.required)\n      return false;\n\n    return false !== this.constraintsByName.required.requirements;\n  },\n\n  // Internal only.\n  // Shortcut to trigger an event\n  _trigger: function (eventName) {\n    return this.trigger('field:' + eventName);\n  },\n\n  // Internal only\n  // Handles whitespace in a value\n  // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n  // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n  _handleWhitespace: function (value) {\n    if (true === this.options.trimValue)\n      ParsleyUtils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n    if ('squish' === this.options.whitespace)\n      value = value.replace(/\\s{2,}/g, ' ');\n\n    if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n      value = ParsleyUtils.trimString(value);\n\n    return value;\n  },\n\n  // Internal only.\n  // Returns the constraints, grouped by descending priority.\n  // The result is thus an array of arrays of constraints.\n  _getGroupedConstraints: function () {\n    if (false === this.options.priorityEnabled)\n      return [this.constraints];\n\n    var groupedConstraints = [];\n    var index = {};\n\n    // Create array unique of priorities\n    for (var i = 0; i < this.constraints.length; i++) {\n      var p = this.constraints[i].priority;\n      if (!index[p])\n        groupedConstraints.push(index[p] = []);\n      index[p].push(this.constraints[i]);\n    }\n    // Sort them by priority DESC\n    groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n    return groupedConstraints;\n  }\n\n};\n\nexport default ParsleyField;\n","import $ from 'jquery';\n\nvar ParsleyMultiple = function () {\n  this.__class__ = 'ParsleyFieldMultiple';\n};\n\nParsleyMultiple.prototype = {\n  // Add new `$element` sibling for multiple field\n  addElement: function ($element) {\n    this.$elements.push($element);\n\n    return this;\n  },\n\n  // See `ParsleyField.refreshConstraints()`\n  refreshConstraints: function () {\n    var fieldConstraints;\n\n    this.constraints = [];\n\n    // Select multiple special treatment\n    if (this.$element.is('select')) {\n      this.actualizeOptions()._bindConstraints();\n\n      return this;\n    }\n\n    // Gather all constraints for each input in the multiple group\n    for (var i = 0; i < this.$elements.length; i++) {\n\n      // Check if element have not been dynamically removed since last binding\n      if (!$('html').has(this.$elements[i]).length) {\n        this.$elements.splice(i, 1);\n        continue;\n      }\n\n      fieldConstraints = this.$elements[i].data('ParsleyFieldMultiple').refreshConstraints().constraints;\n\n      for (var j = 0; j < fieldConstraints.length; j++)\n        this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n    }\n\n    return this;\n  },\n\n  // See `ParsleyField.getValue()`\n  getValue: function () {\n    // Value could be overriden in DOM\n    if ('function' === typeof this.options.value)\n      value = this.options.value(this);\n    else if ('undefined' !== typeof this.options.value)\n      return this.options.value;\n\n    // Radio input case\n    if (this.$element.is('input[type=radio]'))\n      return this._findRelated().filter(':checked').val() || '';\n\n    // checkbox input case\n    if (this.$element.is('input[type=checkbox]')) {\n      var values = [];\n\n      this._findRelated().filter(':checked').each(function () {\n        values.push($(this).val());\n      });\n\n      return values;\n    }\n\n    // Select multiple case\n    if (this.$element.is('select') && null === this.$element.val())\n      return [];\n\n    // Default case that should never happen\n    return this.$element.val();\n  },\n\n  _init: function () {\n    this.$elements = [this.$element];\n\n    return this;\n  }\n};\n\nexport default ParsleyMultiple;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\nimport ParsleyAbstract from './abstract';\nimport ParsleyForm from './form';\nimport ParsleyField from './field';\nimport ParsleyMultiple from './multiple';\n\nvar ParsleyFactory = function (element, options, parsleyFormInstance) {\n  this.$element = $(element);\n\n  // If the element has already been bound, returns its saved Parsley instance\n  var savedparsleyFormInstance = this.$element.data('Parsley');\n  if (savedparsleyFormInstance) {\n\n    // If the saved instance has been bound without a ParsleyForm parent and there is one given in this call, add it\n    if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n      savedparsleyFormInstance.parent = parsleyFormInstance;\n      savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n    }\n\n    return savedparsleyFormInstance;\n  }\n\n  // Parsley must be instantiated with a DOM element or jQuery $element\n  if (!this.$element.length)\n    throw new Error('You must bind Parsley on an existing element.');\n\n  if ('undefined' !== typeof parsleyFormInstance && 'ParsleyForm' !== parsleyFormInstance.__class__)\n    throw new Error('Parent instance must be a ParsleyForm instance');\n\n  this.parent = parsleyFormInstance || window.Parsley;\n  return this.init(options);\n};\n\nParsleyFactory.prototype = {\n  init: function (options) {\n    this.__class__ = 'Parsley';\n    this.__version__ = '@@version';\n    this.__id__ = ParsleyUtils.generateID();\n\n    // Pre-compute options\n    this._resetOptions(options);\n\n    // A ParsleyForm instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n    if (this.$element.is('form') || (ParsleyUtils.checkAttr(this.$element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n      return this.bind('parsleyForm');\n\n    // Every other element is bound as a `ParsleyField` or `ParsleyFieldMultiple`\n    return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n  },\n\n  isMultiple: function () {\n    return (this.$element.is('input[type=radio], input[type=checkbox]')) || (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple'));\n  },\n\n  // Multiples fields are a real nightmare :(\n  // Maybe some refactoring would be appreciated here...\n  handleMultiple: function () {\n    var name;\n    var multiple;\n    var parsleyMultipleInstance;\n\n    // Handle multiple name\n    if (this.options.multiple)\n      ; // We already have our 'multiple' identifier\n    else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length)\n      this.options.multiple = name = this.$element.attr('name');\n    else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length)\n      this.options.multiple = this.$element.attr('id');\n\n    // Special select multiple input\n    if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n      this.options.multiple = this.options.multiple || this.__id__;\n      return this.bind('parsleyFieldMultiple');\n\n    // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n    } else if (!this.options.multiple) {\n      ParsleyUtils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n      return this;\n    }\n\n    // Remove special chars\n    this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n    // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n    if ('undefined' !== typeof name) {\n      $('input[name=\"' + name + '\"]').each((i, input) => {\n        if ($(input).is('input[type=radio], input[type=checkbox]'))\n          $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n      });\n    }\n\n    // Check here if we don't already have a related multiple instance saved\n    var $previouslyRelated = this._findRelated();\n    for (var i = 0; i < $previouslyRelated.length; i++) {\n      parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n      if ('undefined' !== typeof parsleyMultipleInstance) {\n\n        if (!this.$element.data('ParsleyFieldMultiple')) {\n          parsleyMultipleInstance.addElement(this.$element);\n        }\n\n        break;\n      }\n    }\n\n    // Create a secret ParsleyField instance for every multiple field. It will be stored in `data('ParsleyFieldMultiple')`\n    // And will be useful later to access classic `ParsleyField` stuff while being in a `ParsleyFieldMultiple` instance\n    this.bind('parsleyField', true);\n\n    return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n  },\n\n  // Return proper `ParsleyForm`, `ParsleyField` or `ParsleyFieldMultiple`\n  bind: function (type, doNotStore) {\n    var parsleyInstance;\n\n    switch (type) {\n      case 'parsleyForm':\n        parsleyInstance = $.extend(\n          new ParsleyForm(this.$element, this.domOptions, this.options),\n          window.ParsleyExtend\n        )._bindFields();\n        break;\n      case 'parsleyField':\n        parsleyInstance = $.extend(\n          new ParsleyField(this.$element, this.domOptions, this.options, this.parent),\n          window.ParsleyExtend\n        );\n        break;\n      case 'parsleyFieldMultiple':\n        parsleyInstance = $.extend(\n          new ParsleyField(this.$element, this.domOptions, this.options, this.parent),\n          new ParsleyMultiple(),\n          window.ParsleyExtend\n        )._init();\n        break;\n      default:\n        throw new Error(type + 'is not a supported Parsley type');\n    }\n\n    if (this.options.multiple)\n      ParsleyUtils.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n    if ('undefined' !== typeof doNotStore) {\n      this.$element.data('ParsleyFieldMultiple', parsleyInstance);\n\n      return parsleyInstance;\n    }\n\n    // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n    this.$element.data('Parsley', parsleyInstance);\n\n    // Tell the world we have a new ParsleyForm or ParsleyField instance!\n    parsleyInstance._actualizeTriggers();\n    parsleyInstance._trigger('init');\n\n    return parsleyInstance;\n  }\n};\n\nexport default ParsleyFactory;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\nimport ParsleyDefaults from './defaults';\nimport ParsleyAbstract from './abstract';\nimport ParsleyValidatorRegistry from './validator_registry';\nimport ParsleyUI from './ui';\nimport ParsleyForm from './form';\nimport ParsleyField from './field';\nimport ParsleyMultiple from './multiple';\nimport ParsleyFactory from './factory';\n\nvar vernums = $.fn.jquery.split('.');\nif (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n  throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n}\nif (!vernums.forEach) {\n  ParsleyUtils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n}\n// Inherit `on`, `off` & `trigger` to Parsley:\nvar Parsley = $.extend(new ParsleyAbstract(), {\n    $element: $(document),\n    actualizeOptions: null,\n    _resetOptions: null,\n    Factory: ParsleyFactory,\n    version: '@@version'\n  });\n\n// Supplement ParsleyField and Form with ParsleyAbstract\n// This way, the constructors will have access to those methods\n$.extend(ParsleyField.prototype, ParsleyUI.Field, ParsleyAbstract.prototype);\n$.extend(ParsleyForm.prototype, ParsleyUI.Form, ParsleyAbstract.prototype);\n// Inherit actualizeOptions and _resetOptions:\n$.extend(ParsleyFactory.prototype, ParsleyAbstract.prototype);\n\n// ### jQuery API\n// `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n$.fn.parsley = $.fn.psly = function (options) {\n  if (this.length > 1) {\n    var instances = [];\n\n    this.each(function () {\n      instances.push($(this).parsley(options));\n    });\n\n    return instances;\n  }\n\n  // Return undefined if applied to non existing DOM element\n  if (!$(this).length) {\n    ParsleyUtils.warn('You must bind Parsley on an existing element.');\n\n    return;\n  }\n\n  return new ParsleyFactory(this, options);\n};\n\n// ### ParsleyField and ParsleyForm extension\n// Ensure the extension is now defined if it wasn't previously\nif ('undefined' === typeof window.ParsleyExtend)\n  window.ParsleyExtend = {};\n\n// ### Parsley config\n// Inherit from ParsleyDefault, and copy over any existing values\nParsley.options = $.extend(ParsleyUtils.objectCreate(ParsleyDefaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nwindow.ParsleyUtils = ParsleyUtils;\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ParsleyValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\nwindow.ParsleyValidator = {};\n$.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator'.split(' '), function (i, method) {\n  window.Parsley[method] = $.proxy(registry, method);\n  window.ParsleyValidator[method] = function () {\n    ParsleyUtils.warnOnce(`Accessing the method '${method}' through ParsleyValidator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n    return window.Parsley[method](...arguments);\n  };\n});\n\n// ### ParsleyUI\n// Deprecated global object\nwindow.Parsley.UI = ParsleyUI;\nwindow.ParsleyUI = {\n  removeError: function (instance, name, doNotUpdateClass) {\n    var updateClass = true !== doNotUpdateClass;\n    ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n    return instance.removeError(name, {updateClass});\n  },\n  getErrorsMessages: function (instance) {\n    ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n    return instance.getErrorsMessages();\n  }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n  window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n    var updateClass = true !== doNotUpdateClass;\n    ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n    return instance[method](name, {message, assert, updateClass});\n  };\n});\n\n// Alleviate glaring Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=1250521\n// See also https://github.com/guillaumepotier/Parsley.js/issues/1068\nif (/firefox/i.test(navigator.userAgent)) {\n  $(document).on('change', 'select', evt => {\n    $(evt.target).trigger('input');\n  });\n}\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n  $(function () {\n    // Works only on `data-parsley-validate`.\n    if ($('[data-parsley-validate]').length)\n      $('[data-parsley-validate]').parsley();\n  });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n  asyncValidators: {\n    'default': {\n      fn: function (xhr) {\n        // By default, only status 2xx are deemed successful.\n        // Note: we use status instead of state() because responses with status 200\n        // but invalid messages (e.g. an empty body for content type set to JSON) will\n        // result in state() === 'rejected'.\n        return xhr.status >= 200 && xhr.status < 300;\n      },\n      url: false\n    },\n    reverse: {\n      fn: function (xhr) {\n        // If reverse option is set, a failing ajax request is considered successful\n        return xhr.status < 200 || xhr.status >= 300;\n      },\n      url: false\n    }\n  },\n\n  addAsyncValidator: function (name, fn, url, options) {\n    Parsley.asyncValidators[name] = {\n      fn: fn,\n      url: url || false,\n      options: options || {}\n    };\n\n    return this;\n  }\n\n});\n\nParsley.addValidator('remote', {\n  requirementType: {\n    '': 'string',\n    'validator': 'string',\n    'reverse': 'boolean',\n    'options': 'object'\n  },\n\n  validateString: function (value, url, options, instance) {\n    var data = {};\n    var ajaxOptions;\n    var csr;\n    var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n    if ('undefined' === typeof Parsley.asyncValidators[validator])\n      throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n    url = Parsley.asyncValidators[validator].url || url;\n\n    // Fill current value\n    if (url.indexOf('{value}') > -1) {\n      url = url.replace('{value}', encodeURIComponent(value));\n    } else {\n      data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n    }\n\n    // Merge options passed in from the function with the ones in the attribute\n    var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n    // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n    ajaxOptions = $.extend(true, {}, {\n      url: url,\n      data: data,\n      type: 'GET'\n    }, remoteOptions);\n\n    // Generate store key based on ajax options\n    instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n    csr = $.param(ajaxOptions);\n\n    // Initialise querry cache\n    if ('undefined' === typeof Parsley._remoteCache)\n      Parsley._remoteCache = {};\n\n    // Try to retrieve stored xhr\n    var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n    var handleXhr = function () {\n      var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n      if (!result) // Map falsy results to rejected promise\n        result = $.Deferred().reject();\n      return $.when(result);\n    };\n\n    return xhr.then(handleXhr, handleXhr);\n  },\n\n  priority: -1\n});\n\nParsley.on('form:submit', function () {\n  Parsley._remoteCache = {};\n});\n\nwindow.ParsleyExtend.addAsyncValidator = function () {\n  ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n  return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n  defaultMessage: \"This value seems to be invalid.\",\n  type: {\n    email:        \"This value should be a valid email.\",\n    url:          \"This value should be a valid url.\",\n    number:       \"This value should be a valid number.\",\n    integer:      \"This value should be a valid integer.\",\n    digits:       \"This value should be digits.\",\n    alphanum:     \"This value should be alphanumeric.\"\n  },\n  notblank:       \"This value should not be blank.\",\n  required:       \"This value is required.\",\n  pattern:        \"This value seems to be invalid.\",\n  min:            \"This value should be greater than or equal to %s.\",\n  max:            \"This value should be lower than or equal to %s.\",\n  range:          \"This value should be between %s and %s.\",\n  minlength:      \"This value is too short. It should have %s characters or more.\",\n  maxlength:      \"This value is too long. It should have %s characters or fewer.\",\n  length:         \"This value length is invalid. It should be between %s and %s characters long.\",\n  mincheck:       \"You must select at least %s choices.\",\n  maxcheck:       \"You must select %s choices or fewer.\",\n  check:          \"You must select between %s and %s choices.\",\n  equalto:        \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\n\nexport default Parsley;\n"],"sourceRoot":"/source/"}assets/js/global-admin-script.js000064400000001060151336065400012650 0ustar00jQuery(document).ready(function ($) {
    $('.duplicator-admin-notice[data-to-dismiss]').each(function () {
        var notice = $(this);
        var notice_to_dismiss = notice.data('to-dismiss');

        notice.find('.notice-dismiss').on('click', function (event) {
            event.preventDefault();
            $.post(ajaxurl, {
                action: 'duplicator_admin_notice_to_dismiss',
                notice: notice_to_dismiss,
                nonce: dup_global_script_data.duplicator_admin_notice_to_dismiss
            });
        });
    });
});
assets/js/index.php000064400000000016151336065400010302 0ustar00<?php
//silentassets/js/handlebars.min.js000064400000234640151336065400011721 0ustar00/**!

 @license
 handlebars v4.7.7

Copyright (C) 2011-2019 by Yehuda Katz

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

*/
!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.parseWithoutProcessing=j.parseWithoutProcessing,a}var e=c(1)["default"];b.__esModule=!0;var f=c(2),g=e(f),h=c(45),i=e(h),j=c(46),k=c(51),l=c(52),m=e(l),n=c(49),o=e(n),p=c(44),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(37),j=f(i),k=c(6),l=f(k),m=c(5),n=e(m),o=c(38),p=e(o),q=c(44),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(30),k=c(32),l=e(k),m=c(33),n="4.7.7";b.VERSION=n;var o=8;b.COMPILER_REVISION=o;var p=7;b.LAST_COMPATIBLE_COMPILER_REVISION=p;var q={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 <4.3.0",8:">= 4.3.0"};b.REVISION_CHANGES=q;var r="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===r){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)===r)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)===r){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]},resetLoggedPropertyAccesses:function(){m.resetLoggedProperties()}};var s=l["default"].log;b.log=s,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0,i=void 0,j=void 0;c&&(g=c.start.line,h=c.end.line,i=c.start.column,j=c.end.column,a+=" - "+g+":"+i);for(var k=Error.prototype.constructor.call(this,a),l=0;l<f.length;l++)this[f[l]]=k[f[l]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,this.endLineNumber=h,e?(Object.defineProperty(this,"column",{value:i,enumerable:!0}),Object.defineProperty(this,"endColumn",{value:j,enumerable:!0})):(this.column=i,this.endColumn=j))}catch(m){}}var e=c(7)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","endLineNumber","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){h["default"](a),j["default"](a),l["default"](a),n["default"](a),p["default"](a),r["default"](a),t["default"](a)}function e(a,b,c){a.helpers[b]&&(a.hooks[b]=a.helpers[b],c||delete a.helpers[b])}var f=c(1)["default"];b.__esModule=!0,b.registerDefaultHelpers=d,b.moveHelperToHooks=e;var g=c(11),h=f(g),i=c(12),j=f(i),k=c(25),l=f(k),m=c(26),n=f(m),o=c(27),p=f(o),q=c(28),r=f(q),s=c(29),t=f(s)},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){(function(d){"use strict";var e=c(13)["default"],f=c(1)["default"];b.__esModule=!0;var g=c(5),h=c(6),i=f(h);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,d){l&&(l.key=b,l.index=c,l.first=0===c,l.last=!!d,m&&(l.contextPath=m+b)),k+=f(a[b],{data:l,blockParams:g.blockParams([a[b],b],[m+b,null])})}if(!b)throw new i["default"]("Must pass iterator to #each");var f=b.fn,h=b.inverse,j=0,k="",l=void 0,m=void 0;if(b.data&&b.ids&&(m=g.appendContextPath(b.data.contextPath,b.ids[0])+"."),g.isFunction(a)&&(a=a.call(this)),b.data&&(l=g.createFrame(b.data)),a&&"object"==typeof a)if(g.isArray(a))for(var n=a.length;j<n;j++)j in a&&c(j,j,j===a.length-1);else if(d.Symbol&&a[d.Symbol.iterator]){for(var o=[],p=a[d.Symbol.iterator](),q=p.next();!q.done;q=p.next())o.push(q.value);a=o;for(var n=a.length;j<n;j++)c(j,j,j===a.length-1)}else!function(){var b=void 0;e(a).forEach(function(a){void 0!==b&&c(b,j-1),b=a,j++}),void 0!==b&&c(b,j-1,!0)}();return 0===j&&(k=h(this)),k})},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b,c){a.exports={"default":c(14),__esModule:!0}},function(a,b,c){c(15),a.exports=c(21).Object.keys},function(a,b,c){var d=c(16);c(18)("keys",function(a){return function(b){return a(d(b))}})},function(a,b,c){var d=c(17);a.exports=function(a){return Object(d(a))}},function(a,b){a.exports=function(a){if(void 0==a)throw TypeError("Can't call method on  "+a);return a}},function(a,b,c){var d=c(19),e=c(21),f=c(24);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(20),e=c(21),f=c(22),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(23);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,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";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("if",function(a,b){if(2!=arguments.length)throw new g["default"]("#if requires exactly one argument");return e.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||e.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){if(2!=arguments.length)throw new g["default"]("#unless requires exactly one argument");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,c){return a?c.lookupProperty(a,b):a})},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("with",function(a,b){if(2!=arguments.length)throw new g["default"]("#with requires exactly one argument");e.isFunction(a)&&(a=a.call(this));var c=b.fn;if(e.isEmpty(a))return b.inverse(this);var d=b.data;return b.data&&b.ids&&(d=e.createFrame(b.data),d.contextPath=e.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:d,blockParams:e.blockParams([a],[d&&d.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(31),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,c){"use strict";function d(a){var b=i(null);b.constructor=!1,b.__defineGetter__=!1,b.__defineSetter__=!1,b.__lookupGetter__=!1;var c=i(null);return c.__proto__=!1,{properties:{whitelist:l.createNewLookupObject(c,a.allowedProtoProperties),defaultValue:a.allowProtoPropertiesByDefault},methods:{whitelist:l.createNewLookupObject(b,a.allowedProtoMethods),defaultValue:a.allowProtoMethodsByDefault}}}function e(a,b,c){return"function"==typeof a?f(b.methods,c):f(b.properties,c)}function f(a,b){return void 0!==a.whitelist[b]?a.whitelist[b]===!0:void 0!==a.defaultValue?a.defaultValue:(g(b),!1)}function g(a){o[a]!==!0&&(o[a]=!0,n.log("error",'Handlebars: Access has been denied to resolve the property "'+a+'" because it is not an "own property" of its parent.\nYou can add a runtime option to disable the check or this warning:\nSee https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details'))}function h(){j(o).forEach(function(a){delete o[a]})}var i=c(34)["default"],j=c(13)["default"],k=c(3)["default"];b.__esModule=!0,b.createProtoAccessControl=d,b.resultIsAllowed=e,b.resetLoggedProperties=h;var l=c(36),m=c(32),n=k(m),o=i(null)},function(a,b,c){a.exports={"default":c(35),__esModule:!0}},function(a,b,c){var d=c(9);a.exports=function(a,b){return d.create(a,b)}},function(a,b,c){"use strict";function d(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return f.extend.apply(void 0,[e(null)].concat(b))}var e=c(34)["default"];b.__esModule=!0,b.createNewLookupObject=d;var f=c(5)},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=v.COMPILER_REVISION;if(!(b>=v.LAST_COMPATIBLE_COMPILER_REVISION&&b<=v.COMPILER_REVISION)){if(b<v.LAST_COMPATIBLE_COMPILER_REVISION){var d=v.REVISION_CHANGES[c],e=v.REVISION_CHANGES[b];throw new u["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 u["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=s.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=s.extend({},e,{hooks:this.hooks,protoAccessControl:this.protoAccessControl}),g=b.VM.invokePartial.call(this,c,d,f);if(null==g&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),g=e.partials[e.name](d,f)),null!=g){if(e.indent){for(var h=g.split("\n"),i=0,j=h.length;i<j&&(h[i]||i+1!==j);i++)h[i]=e.indent+h[i];g=h.join("\n")}return g}throw new u["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(g,b,g.helpers,g.partials,f,i,h)}var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],f=e.data;d._setup(e),!e.partial&&a.useData&&(f=j(b,f));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=e.depths?b!=e.depths[0]?[b].concat(e.depths):e.depths:[b]),(c=k(a.main,c,g,e.depths||[],f,i))(b,e)}if(!b)throw new u["default"]("No environment passed to template");if(!a||!a.main)throw new u["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e=a.compiler&&7===a.compiler[0],g={strict:function(a,b,c){if(!(a&&b in a))throw new u["default"]('"'+b+'" not defined in '+a,{loc:c});return g.lookupProperty(a,b)},lookupProperty:function(a,b){var c=a[b];return null==c?c:Object.prototype.hasOwnProperty.call(a,b)?c:y.resultIsAllowed(c,g.protoAccessControl,b)?c:void 0},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++){var e=a[d]&&g.lookupProperty(a[d],b);if(null!=e)return a[d][b]}},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:s.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},mergeIfNeeded:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=s.extend({},b,a)),c},nullContext:n({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){if(c.partial)g.protoAccessControl=c.protoAccessControl,g.helpers=c.helpers,g.partials=c.partials,g.decorators=c.decorators,g.hooks=c.hooks;else{var d=s.extend({},b.helpers,c.helpers);l(d,g),g.helpers=d,a.usePartial&&(g.partials=g.mergeIfNeeded(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(g.decorators=s.extend({},b.decorators,c.decorators)),g.hooks={},g.protoAccessControl=y.createProtoAccessControl(c);var f=c.allowCallsToHelperMissing||e;w.moveHelperToHooks(g,"helperMissing",f),w.moveHelperToHooks(g,"blockHelperMissing",f)}},d._child=function(b,c,d,e){if(a.useBlockParams&&!d)throw new u["default"]("must pass block params");if(a.useDepths&&!e)throw new u["default"]("must pass parent depths");return f(g,b,a[b],c,0,d,e)},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=v.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=v.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=s.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new u["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?v.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),s.extend(b,g)}return b}function l(a,b){o(a).forEach(function(c){var d=a[c];a[c]=m(d,b)})}function m(a,b){var c=b.lookupProperty;return x.wrapHelper(a,function(a){return s.extend({lookupProperty:c},a)})}var n=c(39)["default"],o=c(13)["default"],p=c(3)["default"],q=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 r=c(5),s=p(r),t=c(6),u=q(t),v=c(4),w=c(10),x=c(43),y=c(33)},function(a,b,c){a.exports={"default":c(40),__esModule:!0}},function(a,b,c){c(41),a.exports=c(21).Object.seal},function(a,b,c){var d=c(42);c(18)("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){"use strict";function c(a,b){if("function"!=typeof a)return a;var c=function(){var c=arguments[arguments.length-1];return arguments[arguments.length-1]=b(c),a.apply(this,arguments)};return c}b.__esModule=!0,b.wrapHelper=c},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;i["default"].yy=o,o.locInfo=function(a){return new o.SourceLocation(b&&b.srcName,a)};var c=i["default"].parse(a);return c}function e(a,b){var c=d(a,b),e=new k["default"](b);return e.accept(c)}var f=c(1)["default"],g=c(3)["default"];b.__esModule=!0,b.parseWithoutProcessing=d,b.parse=e;var h=c(47),i=f(h),j=c(48),k=f(j),l=c(50),m=g(l),n=c(5);b.parser=i["default"];var o={};n.extend(o,m)},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_repetition0: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,0],[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.$=[];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]},{15:[2,48],17:39,18:[2,48]},{20:41,56:40,64:42,65:[1,43],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:44,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:45,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: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:41,56:48,64:42,65:[1,43],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:49,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,50]},{72:[1,35],86:51},{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:52,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:53,38:55,39:[1,57],43:56,44:[1,58],45:54,47:[2,54]},{28:59,43:60,44:[1,58],47:[2,56]},{13:62,15:[1,20],18:[1,61]},{33:[2,86],57:63,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:64,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:65,47:[1,66]},{30:67,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:68,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:69,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:70,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:74,33:[2,80],50:71,63:72,64:75,65:[1,43],69:73,70:76,71:77,72:[1,78],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,79]},{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,50]},{20:74,53:80,54:[2,84],63:81,64:75,65:[1,43],69:82,70:76,71:77,72:[1,78],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:83,47:[1,66]},{47:[2,55]},{4:84,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:85,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:86,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:87,47:[1,66]},{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:74,33:[2,88],58:88,63:89,64:75,65:[1,43],69:90,70:76,71:77,72:[1,78],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:91,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:92,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:74,31:93,33:[2,60],63:94,64:75,65:[1,43],69:95,70:76,71:77,72:[1,78],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:74,33:[2,66],36:96,63:97,64:75,65:[1,43],69:98,70:76,71:77,72:[1,78],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:74,22:99,23:[2,52],63:100,64:75,65:[1,43],69:101,70:76,71:77,72:[1,78],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:74,33:[2,92],62:102,63:103,64:75,65:[1,43],69:104,70:76,71:77,72:[1,78],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,105]},{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:106,72:[1,107],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,108],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,109]},{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:55,39:[1,57],43:56,44:[1,58],45:111,46:110,47:[2,76]},{33:[2,70],40:112,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,113]},{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:74,63:115,64:75,65:[1,43],67:114,68:[2,96],69:116,70:76,71:77,72:[1,78],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,117]},{32:118,33:[2,62],74:119,75:[1,120]},{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:121,74:122,75:[1,120]},{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,123]},{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,124]},{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,108]},{20:74,63:125,64:75,65:[1,43],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:74,33:[2,72],41:126,63:127,64:75,65:[1,43],69:128,70:76,71:77,72:[1,78],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,129]},{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,130]},{33:[2,63]},{72:[1,132],76:131},{33:[1,133]},{33:[2,69]},{15:[2,12],18:[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:134,74:135,75:[1,120]},{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,137],77:[1,136]},{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,138]},{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],54:[2,55],56:[2,20],60:[2,57],73:[2,81],82:[2,85],86:[2,18],90:[2,89],101:[2,53],104:[2,93],110:[2,19],111:[2,77],116:[2,97],119:[2,63],122:[2,69],135:[2,75],136:[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.substring(a,b.yyleng-c+a)}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:(e(5,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(49),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.substring(1,a.length-1):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=0,h=b.length;g<h;g++){var i=b[g].part,j=b[g].original!==i;if(d+=(b[g].separator||"")+i,j||".."!==i&&"."!==i&&"this"!==i)e.push(i);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===i&&f++}}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 l["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 l["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=m.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(m.isArray(a)&&m.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(34)["default"],j=c(1)["default"];b.__esModule=!0,b.Compiler=d,b.precompile=e,b.compile=f;var k=c(6),l=j(k),m=c(5),n=c(45),o=j(n),p=[].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){return this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[],b.knownHelpers=m.extend(i(null),{helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},b.knownHelpers),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 l["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 l["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 l["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,o["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=o["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:p.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=o["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&o["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||o["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&&m.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]),", ",JSON.stringify(b.source.currentLocation)," )"]:e}var g=c(13)["default"],h=c(1)["default"];b.__esModule=!0;var i=c(4),j=c(6),k=h(j),l=c(5),m=c(53),n=h(m);e.prototype={nameLookup:function(a,b){return this.internalNameLookup(a,b)},depthedLookup:function(a){return[this.aliasable("container.lookup"),"(depths, ",JSON.stringify(a),")"]},compilerInfo:function(){var a=i.COMPILER_REVISION,b=i.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return l.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("")},internalNameLookup:function(a,b){return this.lookupPropertyFunctionIsUsed=!0,["lookupProperty(",a,",",JSON.stringify(b),")"]},lookupPropertyFunctionIsUsed:!1,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 k["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, ",this.lookupPropertyFunctionVarDeclaration(),";\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 j=this.createFunctionContext(d);if(this.isChild)return j;var l={compiler:this.compilerInfo(),main:j};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 n["default"](this.options.srcName),this.decorators=new n["default"](this.options.srcName)},createFunctionContext:function(a){var b=this,c="",d=this.stackVars.concat(this.registers.list);d.length>0&&(c+=", "+d.join(", "));var e=0;g(this.aliases).forEach(function(a){var d=b.aliases[a];d.children&&d.referenceCount>1&&(c+=", alias"+ ++e+"="+a,d.children[0]="alias"+e)}),this.lookupPropertyFunctionIsUsed&&(c+=", "+this.lookupPropertyFunctionVarDeclaration());var f=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&f.push("blockParams"),this.useDepths&&f.push("depths");var h=this.mergeSource(c);return a?(f.push(h),Function.apply(this,f)):this.source.wrap(["function(",f.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()},lookupPropertyFunctionVarDeclaration:function(){return"\n      lookupProperty = container.lookupProperty || function(parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n        return undefined\n    }\n    ".trim()},blockValue:function(a){var b=this.aliasable("container.hooks.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("container.hooks.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){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&&f.push(e.name),f.push(d),this.options.strict||f.push(this.aliasable("container.hooks.helperMissing"));var g=["(",this.itemsSeparatedBy(f,"||"),")"],h=this.source.functionCall(g,"call",e.callParams);this.push(h)},itemsSeparatedBy:function(a,b){var c=[];c.push(a[0]);for(var d=1;d<a.length;d++)c.push(b,a[d]);return c},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("container.hooks.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 k["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 k["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.loc=JSON.stringify(this.source.currentLocation),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(g.isArray(a)){for(var d=[],e=0,f=a.length;e<f;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=[]}var f=c(13)["default"];b.__esModule=!0;var g=c(5),h=void 0;try{}catch(i){}h||(h=function(a,b,c,d){this.src="",d&&this.add(d)},h.prototype={add:function(a){g.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){g.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 h(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 h?a:(a=d(a,this,b),new h(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=this,c=[];f(a).forEach(function(e){var f=d(a[e],b);"undefined"!==f&&c.push([b.quotedString(e),":",f])});var e=this.generateList(c);return e.prepend("{"),e.add("}"),e},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"]}])});assets/js/jquery.qtip/jquery.qtip.min.js.map000064400000200531151336065400015150 0ustar00{"version":3,"file":"jquery.qtip.min.js","sources":["jquery.qtip.js"],"names":["window","document","undefined","factory","define","amd","jQuery","fn","qtip","$","QTip","target","options","id","attr","this","tooltip","NULL","elements","_id","NAMESPACE","timers","img","plugins","cache","event","disabled","FALSE","onTooltip","lastClass","rendered","destroyed","waiting","hiddenDuringWait","positioning","triggering","invalidOpt","a","type","invalidContent","c","isFunction","length","jquery","then","sanitizeOptions","opts","content","text","ajax","once","metadata","done","api","loading","deferred","extend","context","success","error","set","xhr","status","isPlainObject","title","button","position","my","at","show","TRUE","ready","hide","style","classes","each","PLUGINS","sanitize","convertNotation","notation","obj","i","option","levels","split","pop","setCallback","args","category","rule","match","checks","RegExp","exec","push","apply","createWidgetClass","cls","WIDGET","concat","join","delay","callback","duration","setTimeout","proxy","call","showMethod","hasClass","CLASS_DISABLED","clearTimeout","toggle","hideMethod","relatedTarget","ontoTooltip","closest","SELECTOR","ontoTarget","fixed","test","preventDefault","stopImmediatePropagation","e","inactiveMethod","inactive","repositionMethod","offsetWidth","reposition","delegate","selector","events","method","body","QTIP","ATTR_ID","arguments","init","elem","posOptions","config","docBody","newTarget","metadata5","name","html5","data","parseJSON","defaults","container","solo","viewport","eq","CORNER","overwrite","ATTR_HAS","suppress","removeAttr","oldtitle","camel","s","charAt","toUpperCase","slice","vendorCss","prop","cur","val","ucProp","props","cssPrefixes","cssProps","css","intCss","Math","ceil","parseFloat","Tip","_ns","offset","size","width","height","Modal","Ie6","PROTOTYPE","CHECKS","trackingBound","X","Y","WIDTH","HEIGHT","TOP","LEFT","BOTTOM","RIGHT","CENTER","FLIPINVERT","SHIFT","INACTIVE_EVENTS","CLASS_FIXED","CLASS_DEFAULT","CLASS_FOCUS","CLASS_HOVER","replaceSuffix","BROWSER","ie","v","createElement","innerHTML","getElementsByTagName","NaN","iOS","navigator","userAgent","replace","prototype","_when","deferreds","when","render","self","posClass","_createPosClass","class","tracking","adjust","mouse","role","aria-live","aria-atomic","aria-describedby","aria-hidden","toggleClass","appendTo","append","_createTitle","_updateTitle","_createButton","_updateContent","_setWidget","instance","initialize","_unassignEvents","_assignEvents","_trigger","destroy","immediate","process","timer","stop","find","remove","end","removeData","one","builtin","^id$","o","prev","nextid","new_id","^prerender","^content.text$","^content.attr$","^content.title$","_removeTitle","^content.button$","_updateButton","^content.title.(text|button)$","^position.(my|at)$","^position.container$","^show.ready$","^style.classes$","p","removeClass","addClass","^style.(width|height)","^style.widget|content.title","^style.def","^events.(render|show|move|hide|focus|blur)$","^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)","get","toLowerCase","result","precedance","string","rmove","rrender","value","previous","nodeType","_update","element","empty","display","visibility","html","_waitForContent","images","imagesLoaded","Deferred","resolve","promise","titlebar","widget","insertBefore","substr","abbrev","effect","pluginCalculations","adjusted","newClass","tooltipWidth","outerWidth","tooltipHeight","outerHeight","targetWidth","targetHeight","left","top","visible","isScroll","win","doc","ownerDocument","isArray","x","y","distance","origin","pageX","innerWidth","documentElement","clientWidth","pageY","scrollX","scrollLeft","scrollY","scrollTop","innerHeight","imagemap","is","svg","ownerSVGElement","adjustable","isNaN","queue","next","opacity","removeAttribute","pos","scroll","scrolled","parentOffset","overflow","quirks","compatMode","parent","getBoundingClientRect","offsetParent","C","Corner","corner","forceY","f","invert","z","center","clone","state","add","has","fix","identicalState","allow","after","contentOptions","animate","sameTarget","search","focus","bind","_storeMouse","not","Event","unbind","blur","autofocus","trigger","n","fadeTo","qtips","curIndex","parseInt","zIndex","newIndex","zindex","filter","disable","enable","isString","close","aria-label","prepend","click","on","def","_bind","targets","suffix","ns","_unbind","originalEvent","isDefaultPrevented","_bindEvents","showEvents","hideEvents","showTargets","hideTargets","similarTargets","toggleEvents","showIndex","inArray","splice","_assignInitialEvents","hoverIntent","prerender","showTarget","hideTarget","trim","onTarget","containerTarget","viewportTarget","documentTarget","windowTarget","leave","nodeName","indexOf","enabled","isAncestor","parents","inactiveEvents","limit","abs","resize","special","grep","toArray","currentTarget","newValue","command","returned","makeArray","timeStamp","keepData","elems","func","old","ui","cleanData","triggerHandler","version","move","hidden","TIP","MARGIN","BORDER","COLOR","BG_COLOR","TRANSPARENT","IMPORTANT","HASCANVAS","getContext","INVALID","PIXEL_RATIO","devicePixelRatio","BACKING_STORE_RATIO","backingStorePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","SCALE","createVML","tag","tip","prependTo","lineJoin","miterLimit","save","stopPropagation","create","_swapDimensions","_resetDimensions","_useTitle","_parseCorner","_parseWidth","side","use","_parseRadius","_invalidColour","compare","_parseColours","borderSide","colorElem","color","_calculateSize","bigHyp","ratio","isCenter","base","pow","round","smallHyp","sqrt","hyp","border","reverse","_calculateTip","scale","width2","height2","tips","br","bl","tr","tl","tc","bc","rc","lc","lt","rt","lb","rb","_drawCoords","coords","beginPath","moveTo","lineTo","closePath","update","bigCoords","translate","newSize","inner","children","curSize","mimic","lineHeight","restore","clearRect","fillStyle","fill","coordsize","antialias","Number","$this","path","fillcolor","filled","stroked","opera","calculate","corners","userOffset","b","max","margin","bottom","right","shiftflip","direction","popposite","opposite","newCorner","shiftonly","xy","shift","horizontal","vertical","cornerTop","cornerLeft","user","^position.my|style.tip.(corner|mimic|border)$","^style.tip.(height|width)$","^content.title|style.(classes|widget)$","MODAL","OVERLAY","MODALCLASS","MODALSELECTOR","focusable","expr","map","mapName","isTabIndexNotNaN","parentNode","href","focusInputs","blurElems","focusableElems","first","stealFocus","targetOnTop","current","onLast","prevState","mousedown","modal","escape","keyCode","stealfocus","visibleModals","detach","overlay","modal_zindex","oEvent","last","^show.modal.(on|blur)$","elemWidth","elemHeight","otherSide","side1","side2","lengthName","targetLength","elemLength","initialPos","mySide","atSide","isShift","myLength","atLength","sideOffset","viewportScroll","viewportOffset","containerStatic","containerOffset","overflow1","overflow2","viewportWidth","viewportHeight","min","newMy","methodX","methodY","polys","polygon","baseCoords","newWidth","newHeight","compareX","compareY","realX","realY","floor","rect","ax","ay","bx","by","_angles","ellipse","cx","cy","rx","ry","rxc","cos","PI","rys","sin","circle","r","frameOffset","mtx","transformed","len","points","root","strokeWidth2","getBBox","baseVal","x1","y1","x2","y2","numberOfItems","getItem","createSVGPoint","getScreenCTM","matrixTransform","defaultView","parentWindow","frameElement","area","imageOffset","shape","image","coordsString","coordsArray","IE6","BGIFRAME","_scroll","bgiframe","adjustBGIFrame","redrawContainer","redraw","tipAdjust","dimensions","plugin","drawing","perc","ie6","^content|style$"],"mappings":";;CAaC,SAAUA,EAAQC,EAAUC,IAG5B,SAAUC,GACV,YACqB,mBAAXC,SAAyBA,OAAOC,IACzCD,QAAQ,UAAWD,GAEZG,SAAWA,OAAOC,GAAGC,MAC5BL,EAAQG,SAGT,SAASG,GACT,YAoEA,SAASC,GAAKC,EAAQC,EAASC,EAAIC,GAEnCC,KAAKF,GAAKA,EACVE,KAAKJ,OAASA,EACdI,KAAKC,QAAUC,EACfF,KAAKG,UAAaP,OAAQA,GAG1BI,KAAKI,IAAMC,EAAY,IAAMP,EAC7BE,KAAKM,QAAWC,QAChBP,KAAKH,QAAUA,EACfG,KAAKQ,WAGLR,KAAKS,OACJC,SACAd,OAAQF,IACRiB,SAAUC,EACVb,KAAMA,EACNc,UAAWD,EACXE,UAAW,IAIZd,KAAKe,SAAWf,KAAKgB,UAAYhB,KAAKW,SAAWX,KAAKiB,QACrDjB,KAAKkB,iBAAmBlB,KAAKmB,YAAcnB,KAAKoB,WAAaR,EAoL9D,QAASS,GAAWC,GACpB,MAAOA,KAAMpB,GAAsB,WAAdR,EAAE6B,KAAKD,GAG7B,QAASE,GAAeC,GACvB,QAAU/B,EAAEgC,WAAWD,IAAOA,GAAKA,EAAE1B,MAAS0B,EAAEE,QAAyB,WAAdjC,EAAE6B,KAAKE,KAAoBA,EAAEG,QAAUH,EAAEI,OAIrG,QAASC,GAAgBC,GACxB,GAAIC,GAASC,EAAMC,EAAMC,CAEzB,OAAGd,GAAWU,GAAgBnB,GAE3BS,EAAWU,EAAKK,YAClBL,EAAKK,UAAab,KAAMQ,EAAKK,WAG3B,WAAaL,KACfC,EAAUD,EAAKC,QAEZX,EAAWW,IAAYA,EAAQJ,QAAUI,EAAQK,KACnDL,EAAUD,EAAKC,SACdC,KAAOA,EAAOT,EAAeQ,GAAWpB,EAAQoB,GAG3CC,EAAOD,EAAQC,KAInB,QAAUD,KACZE,EAAOF,EAAQE,KACfC,EAAOD,GAAQA,EAAKC,OAASvB,QACtBoB,GAAQE,KAEfF,EAAQC,KAAO,SAASvB,EAAO4B,GAC9B,GAAIC,GAAUN,GAAQvC,EAAEM,MAAMD,KAAKuC,EAAIzC,QAAQmC,QAAQjC,OAAS,aAEhEyC,EAAW9C,EAAEwC,KACZxC,EAAE+C,UAAWP,GAAQQ,QAASJ,KAE9BT,KAAKK,EAAKS,QAASzC,EAAMgC,EAAKU,OAC9Bf,KAAK,SAASG,GAEd,MADGA,IAAWG,GAAQG,EAAIO,IAAI,eAAgBb,GACvCA,GAER,SAASc,EAAKC,EAAQH,GAClBN,EAAItB,WAA4B,IAAf8B,EAAIC,QACxBT,EAAIO,IAAI,eAAgBE,EAAS,KAAOH,IAGzC,OAAQT,GAAsDI,GAA9CD,EAAIO,IAAI,eAAgBN,GAAUC,KAIjD,SAAWR,KACVtC,EAAEsD,cAAchB,EAAQiB,SAC1BjB,EAAQkB,OAASlB,EAAQiB,MAAMC,OAC/BlB,EAAQiB,MAAQjB,EAAQiB,MAAMhB,MAG5BT,EAAeQ,EAAQiB,OAASrC,KAClCoB,EAAQiB,MAAQrC,KAKhB,YAAcmB,IAAQV,EAAWU,EAAKoB,YACxCpB,EAAKoB,UAAaC,GAAIrB,EAAKoB,SAAUE,GAAItB,EAAKoB,WAG5C,QAAUpB,IAAQV,EAAWU,EAAKuB,QACpCvB,EAAKuB,KAAOvB,EAAKuB,KAAK1B,QAAWhC,OAAQmC,EAAKuB,MAC7CvB,EAAKuB,OAASC,GAASC,MAAOD,IAAW7C,MAAOqB,EAAKuB,OAGpD,QAAUvB,IAAQV,EAAWU,EAAK0B,QACpC1B,EAAK0B,KAAO1B,EAAK0B,KAAK7B,QAAWhC,OAAQmC,EAAK0B,OAAW/C,MAAOqB,EAAK0B,OAGnE,SAAW1B,IAAQV,EAAWU,EAAK2B,SACrC3B,EAAK2B,OAAUC,QAAS5B,EAAK2B,QAI9BhE,EAAEkE,KAAKC,EAAS,WACf7D,KAAK8D,UAAY9D,KAAK8D,SAAS/B,KAGzBA,GAkGR,QAASgC,GAAgBlE,EAASmE,GAOjC,IANA,GAAWC,GAAPC,EAAI,EAAQC,EAAStE,EAGzBuE,EAASJ,EAASK,MAAM,KAGjBF,EAASA,EAAQC,EAAOF,OAC3BA,EAAIE,EAAOzC,SAAUsC,EAAME,EAG/B,QAAQF,GAAOpE,EAASuE,EAAOE,OAYhC,QAASC,GAAYP,EAAUQ,GAC9B,GAAIC,GAAUC,EAAMC,CAEpB,KAAIF,IAAYzE,MAAK4E,OACpB,IAAIF,IAAQ1E,MAAK4E,OAAOH,IACpBE,EAAQ,GAAKE,QAAOH,EAAM,KAAMI,KAAKd,MACvCQ,EAAKO,KAAKJ,IAEM,YAAbF,GAA0BzE,KAAKQ,QAAQiE,KACzCzE,KAAK4E,OAAOH,GAAUC,GAAMM,MAC3BhF,KAAKQ,QAAQiE,IAAazE,KAAMwE,IAkuBtC,QAASS,GAAkBC,GAC1B,MAAOC,GAAOC,OAAO,IAAIC,KAAKH,EAAM,IAAIA,EAAI,IAAM,KA2BlD,QAASI,GAAMC,EAAUC,GAEzB,MAAGA,GAAW,EACNC,WACN/F,EAAEgG,MAAMH,EAAUvF,MAAOwF,OAGrBD,GAASI,KAAK3F,MAGrB,QAAS4F,GAAWlF,GAChBV,KAAKC,QAAQ4F,SAASC,MAGzBC,aAAa/F,KAAKM,OAAOgD,MACzByC,aAAa/F,KAAKM,OAAOmD,MAGzBzD,KAAKM,OAAOgD,KAAOgC,EAAMK,KAAK3F,KAC7B,WAAaA,KAAKgG,OAAOzC,EAAM7C,IAC/BV,KAAKH,QAAQyD,KAAKgC,QAIpB,QAASW,GAAWvF,GACnB,IAAGV,KAAKC,QAAQ4F,SAASC,MAAmB9F,KAAKgB,UAAjD,CAGA,GAAIkF,GAAgBxG,EAAEgB,EAAMwF,eAC3BC,EAAcD,EAAcE,QAAQC,GAAU,KAAOrG,KAAKC,QAAQ,GAClEqG,EAAaJ,EAAc,KAAOlG,KAAKH,QAAQyD,KAAK1D,OAAO,EAQ5D,IALAmG,aAAa/F,KAAKM,OAAOgD,MACzByC,aAAa/F,KAAKM,OAAOmD,MAItBzD,OAASkG,EAAc,IACS,UAAjClG,KAAKH,QAAQsD,SAASvD,QAAsBuG,GAC5CnG,KAAKH,QAAQ4D,KAAK8C,OAClB,wBAA0BC,KAAK9F,EAAMa,QAAU4E,GAAeG,GAG/D,IACC5F,EAAM+F,iBACN/F,EAAMgG,2BACL,MAAMC,QAMT3G,MAAKM,OAAOmD,KAAO6B,EAAMK,KAAK3F,KAC7B,WAAaA,KAAKgG,OAAOpF,EAAOF,IAChCV,KAAKH,QAAQ4D,KAAK6B,MAClBtF,OAIF,QAAS4G,GAAelG,IACpBV,KAAKC,QAAQ4F,SAASC,KAAoB9F,KAAKH,QAAQ4D,KAAKoD,WAG/Dd,aAAa/F,KAAKM,OAAOuG,UAEzB7G,KAAKM,OAAOuG,SAAWvB,EAAMK,KAAK3F,KACjC,WAAYA,KAAKyD,KAAK/C,IACtBV,KAAKH,QAAQ4D,KAAKoD,WAIpB,QAASC,GAAiBpG,GACtBV,KAAKe,UAAYf,KAAKC,QAAQ,GAAG8G,YAAc,GAAK/G,KAAKgH,WAAWtG,GAyBxE,QAASuG,GAASC,EAAUC,EAAQC,GACnC1H,EAAER,EAASmI,MAAMJ,SAASC,GACxBC,EAAO9C,MAAQ8C,EAASA,EAAO9B,KAAK,IAAIhF,EAAY,MAAQ,IAAIA,EACjE,WACC,GAAIiC,GAAMgF,EAAKhF,IAAK5C,EAAEK,KAAKC,KAAMuH,GACjCjF,KAAQA,EAAI3B,UAAYyG,EAAOpC,MAAM1C,EAAKkF,aA6S7C,QAASC,GAAKC,EAAM5H,EAAIiC,GACvB,GAAIkC,GAAK0D,EAAY5H,EAAM6H,EAAQ3E,EAGnC4E,EAAUnI,EAAER,EAASmI,MAGrBS,EAAYJ,EAAK,KAAOxI,EAAW2I,EAAUH,EAG7CtF,EAAYsF,EAAa,SAAIA,EAAKtF,SAASL,EAAKK,UAAYlC,EAG5D6H,EAAmC,UAAvBhG,EAAKK,SAASb,MAAoBa,EAAWA,EAASL,EAAKK,SAAS4F,MAAQ9H,EAGxF+H,EAAQP,EAAKQ,KAAKnG,EAAKK,SAAS4F,MAAQ,WAGxC,KAAMC,EAAyB,gBAAVA,GAAqBvI,EAAEyI,UAAUF,GAASA,EAAS,MAAMtB,IAY9E,GATAiB,EAASlI,EAAE+C,OAAOc,KAAU+D,EAAKc,SAAUrG,EACzB,gBAAVkG,GAAqBnG,EAAgBmG,GAAS/H,EACrD4B,EAAgBiG,GAAa3F,IAG9BuF,EAAaC,EAAOzE,SACpByE,EAAO9H,GAAKA,EAGT,iBAAqB8H,GAAO5F,QAAQC,KAAM,CAI5C,GAHAlC,EAAO2H,EAAK3H,KAAK6H,EAAO5F,QAAQjC,MAG7B6H,EAAO5F,QAAQjC,OAASa,IAASb,EAG7B,MAAOa,EAH8BgH,GAAO5F,QAAQC,KAAOlC,EAsBnE,GAfI4H,EAAWU,UAAU1G,SAAUgG,EAAWU,UAAYR,GACvDF,EAAW/H,SAAWgB,IAAS+G,EAAW/H,OAASkI,GACnDF,EAAOtE,KAAK1D,SAAWgB,IAASgH,EAAOtE,KAAK1D,OAASkI,GACrDF,EAAOtE,KAAKgF,OAAS/E,IAAQqE,EAAOtE,KAAKgF,KAAOX,EAAWU,UAAUjC,QAAQ,SAC7EwB,EAAOnE,KAAK7D,SAAWgB,IAASgH,EAAOnE,KAAK7D,OAASkI,GACrDF,EAAOzE,SAASoF,WAAahF,IAAQqE,EAAOzE,SAASoF,SAAWZ,EAAWU,WAG9EV,EAAWU,UAAYV,EAAWU,UAAUG,GAAG,GAG/Cb,EAAWtE,GAAK,GAAIoF,GAAOd,EAAWtE,GAAIE,GAC1CoE,EAAWvE,GAAK,GAAIqF,GAAOd,EAAWvE,IAGnCsE,EAAKQ,KAAK7H,GACZ,GAAGuH,EAAOc,UACThB,EAAKjI,KAAK,WAAW,OAEjB,IAAGmI,EAAOc,YAAc9H,EAC5B,MAAOA,EAiBT,OAZA8G,GAAK3H,KAAK4I,EAAU7I,GAGjB8H,EAAOgB,WAAa3F,EAAQyE,EAAK3H,KAAK,WAExC2H,EAAKmB,WAAW,SAAS9I,KAAK+I,GAAU7F,GAAOlD,KAAK,QAAS,IAI9DkE,EAAM,GAAItE,GAAK+H,EAAME,EAAQ9H,IAAMC,GACnC2H,EAAKQ,KAAK7H,EAAW4D,GAEdA,EA0PR,QAAS8E,GAAMC,GAAK,MAAOA,GAAEC,OAAO,GAAGC,cAAgBF,EAAEG,MAAM,GAO/D,QAASC,GAAU1B,EAAM2B,GACxB,GAECC,GAAKC,EAFFC,EAASH,EAAKJ,OAAO,GAAGC,cAAgBG,EAAKF,MAAM,GACtDM,GAASJ,EAAO,IAAMK,GAAYrE,KAAKmE,EAAS,KAAOA,GAAQnF,MAAM,KAC3DH,EAAI,CAGf,IAAGyF,GAASN,GAAS,MAAO3B,GAAKkC,IAAID,GAASN,GAE9C,MAAOC,EAAMG,EAAMvF,MAClB,IAAIqF,EAAM7B,EAAKkC,IAAIN,MAAUnK,EAC5B,MAAOwK,IAASN,GAAQC,EAAKC,EAMhC,QAASM,GAAOnC,EAAM2B,GACrB,MAAOS,MAAKC,KAAKC,WAAWZ,EAAU1B,EAAM2B,KAwB7C,QAASY,GAAIxK,EAAMI,GAClBG,KAAKkK,IAAM,MACXlK,KAAKH,QAAUA,EACfG,KAAKmK,OAAStK,EAAQsK,OACtBnK,KAAKoK,MAASvK,EAAQwK,MAAOxK,EAAQyK,QAGrCtK,KAAKyH,KAAOzH,KAAKP,KAAOA,GAguBzB,QAAS8K,GAAMjI,EAAKzC,GACnBG,KAAKH,QAAUA,EACfG,KAAKkK,IAAM,SAEXlK,KAAKyH,KAAOzH,KAAKP,KAAO6C,GAyfzB,QAASkI,GAAIlI,GACZtC,KAAKkK,IAAM,MACXlK,KAAKyH,KAAOzH,KAAKP,KAAO6C,GA5tGzB,GAsBAgF,GAAMmD,EAAWhC,EAAQiC,EAiBzBC,EAvCIpH,GAAO,EACX3C,GAAQ,EACRV,EAAO,KAGP0K,EAAI,IAAKC,EAAI,IACbC,EAAQ,QACRC,EAAS,SAGTC,EAAM,MACNC,EAAO,OACPC,EAAS,SACTC,EAAQ,QACRC,EAAS,SAITC,EAAa,aACbC,EAAQ,QAIRzH,KACAxD,EAAY,OACZsI,EAAW,eACXpB,EAAU,eACVpC,GAAU,YAAa,cACvBkB,EAAW,IAAIhG,EACfkL,EAAkB,mEAAmElH,MAAM,KAE3FmH,EAAcnL,EAAU,SACxBoL,EAAgBpL,EAAY,WAC5BqL,EAAcrL,EAAY,SAC1BsL,EAActL,EAAY,SAC1ByF,GAAiBzF,EAAU,YAE3BuL,GAAgB,kBAChB9C,GAAW,WAIX+C,IAOCC,GAAK,WACJ,IACC,GAAIC,GAAI,EAAG7H,EAAIhF,EAAS8M,cAAc,QACrC9H,EAAE+H,UAAY,iBAAmBF,EAAI,0BAA4B7H,EAAEgI,qBAAqB,KAAK,GAC9FH,GAAG,GAEJ,MAAOA,GAAI,EAAIA,EAAII,OAMpBC,IAAKpC,YACH,IAAM,yDAAyDlF,KAAKuH,UAAUC,aAAe,EAAE,KAAK,IACpGC,QAAQ,YAAa,OAAOA,QAAQ,IAAK,KAAKA,QAAQ,IAAK,MACxD3L,EA6BN6J,GAAY9K,EAAK6M,UAEjB/B,EAAUgC,MAAQ,SAASC,GAC1B,MAAOhN,GAAEiN,KAAK3H,MAAMtF,EAAGgN,IAGxBjC,EAAUmC,OAAS,SAAStJ,GAC3B,GAAGtD,KAAKe,UAAYf,KAAKgB,UAAa,MAAOhB,KAE7C,IAUCC,GAVG4M,EAAO7M,KACVH,EAAUG,KAAKH,QACfY,EAAQT,KAAKS,MACbN,EAAWH,KAAKG,SAChB8B,EAAOpC,EAAQmC,QAAQC,KACvBgB,EAAQpD,EAAQmC,QAAQiB,MACxBC,EAASrD,EAAQmC,QAAQkB,OACzByE,EAAa9H,EAAQsD,SAErBuJ,GADY,IAAI1M,KAAKI,IAAI,OAgG1B,OA3FAV,GAAEK,KAAKC,KAAKJ,OAAO,GAAI,mBAAoBI,KAAKI,KAGhDK,EAAMqM,SAAW9M,KAAK+M,iBACpB/M,KAAKmD,UAAaC,GAAIuE,EAAWvE,GAAIC,GAAIsE,EAAWtE,KAAMD,IAI5DpD,KAAKC,QAAUE,EAASF,QAAUA,EAAUP,EAAE,UAC7CI,GAAME,KAAKI,IACX4M,SAAW3M,EAAWoL,EAAe5L,EAAQ6D,MAAMC,QAASlD,EAAMqM,UAAWzH,KAAK,KAClFgF,MAASxK,EAAQ6D,MAAM2G,OAAS,GAChCC,OAAUzK,EAAQ6D,MAAM4G,QAAU,GAClC2C,SAAkC,UAAtBtF,EAAW/H,QAAsB+H,EAAWuF,OAAOC,MAG/DC,KAAQ,QACRC,YAAa,SACbC,cAAe1M,EACf2M,mBAAoBvN,KAAKI,IAAM,WAC/BoN,cAAejK,IAEfkK,YAAY3H,GAAgB9F,KAAKW,UACjCZ,KAAKwH,EAASvH,KAAKF,IACnBoI,KAAK7H,EAAWL,MAChB0N,SAAS/F,EAAWU,WACpBsF,OAEAxN,EAAS6B,QAAUtC,EAAE,WACpBsN,QAAS3M,EAAY,WACrBP,GAAME,KAAKI,IAAM,WACjBkN,cAAe/J,KAKjBvD,KAAKe,SAAW,GAChBf,KAAKmB,YAAcoC,EAGhBN,IACFjD,KAAK4N,eAGDlO,EAAEgC,WAAWuB,IAChByJ,EAAU3H,KAAM/E,KAAK6N,aAAa5K,EAAOrC,KAKxCsC,GAAUlD,KAAK8N,gBAGdpO,EAAEgC,WAAWO,IAChByK,EAAU3H,KAAM/E,KAAK+N,eAAe9L,EAAMrB,IAE3CZ,KAAKe,SAAWwC,EAGhBvD,KAAKgO,aAGLtO,EAAEkE,KAAKC,EAAS,SAASmE,GACxB,GAAIiG,EACmB,YAApBjO,KAAKkO,aAA4BD,EAAWjO,KAAK6M,MACnDA,EAAKrM,QAAQwH,GAAQiG,KAKvBjO,KAAKmO,kBACLnO,KAAKoO,gBAGLpO,KAAKyM,MAAMC,GAAW7K,KAAK,WAE1BgL,EAAKwB,SAAS,UAGdxB,EAAK1L,YAAcP,EAGfiM,EAAK3L,mBAAqBrB,EAAQyD,KAAKE,QAASF,GACnDuJ,EAAK7G,OAAOzC,EAAM9C,EAAMC,MAAOE,GAEhCiM,EAAK3L,iBAAmBN,IAIzB0G,EAAKhF,IAAItC,KAAKF,IAAME,KAEbA,MAGRyK,EAAU6D,QAAU,SAASC,GAK5B,QAASC,KACR,IAAGxO,KAAKgB,UAAR,CACAhB,KAAKgB,UAAYuC,CAEjB,IAECkL,GAFG7O,EAASI,KAAKJ,OACjBqD,EAAQrD,EAAOG,KAAK+I,GAIlB9I,MAAKe,UACPf,KAAKC,QAAQyO,KAAK,EAAE,GAAGC,KAAK,KAAKC,SAASC,MAAMD,SAIjDlP,EAAEkE,KAAK5D,KAAKQ,QAAS,WACpBR,KAAKsO,SAAWtO,KAAKsO,WAItB,KAAIG,IAASzO,MAAKM,OACjByF,aAAa/F,KAAKM,OAAOmO,GAI1B7O,GAAOkP,WAAWzO,GAChBwI,WAAWtB,GACXsB,WAAWF,GACXE,WAAW,oBAGV7I,KAAKH,QAAQ+I,UAAY3F,GAC3BrD,EAAOG,KAAK,QAASkD,GAAO4F,WAAWC,IAIxC9I,KAAKmO,kBAILnO,KAAKH,QAAUG,KAAKG,SAAWH,KAAKS,MAAQT,KAAKM,OAChDN,KAAKQ,QAAUR,KAAKmN,MAAQjN,QAGtBoH,GAAKhF,IAAItC,KAAKF,KA7CtB,MAAGE,MAAKgB,UAAoBhB,KAAKJ,QAiD7B2O,IAAchL,GAA4B,SAApBvD,KAAKoB,aAA0BpB,KAAKe,SAMvDyN,EAAQ7I,KAAK3F,OALnBA,KAAKC,QAAQ8O,IAAI,gBAAiBrP,EAAEgG,MAAM8I,EAASxO,QAClDA,KAAKoB,YAAcpB,KAAKyD,QAMnBzD,KAAKJ,SA+Fb8K,EAASD,EAAU7F,QAClBoK,SAECC,OAAQ,SAAShL,EAAKiL,EAAGnD,EAAGoD,GAC3B,GAAIrP,GAAKiM,IAAMxI,EAAO+D,EAAK8H,OAASrD,EACnCsD,EAAShP,EAAY,IAAMP,CAEzBA,KAAOc,GAASd,EAAG6B,OAAS,IAAMjC,EAAE,IAAI2P,GAAQ1N,QAClD3B,KAAKI,IAAMiP,EAERrP,KAAKe,WACPf,KAAKC,QAAQ,GAAGH,GAAKE,KAAKI,IAC1BJ,KAAKG,SAAS6B,QAAQ,GAAGlC,GAAKE,KAAKI,IAAM,WACzCJ,KAAKG,SAAS8C,MAAM,GAAGnD,GAAKE,KAAKI,IAAM,WAGlC6D,EAAIiL,GAAKC,GAEjBG,aAAc,SAASrL,EAAKiL,EAAGnD,GAC9BA,IAAM/L,KAAKe,UAAYf,KAAK4M,OAAO5M,KAAKH,QAAQyD,KAAKE,QAItD+L,iBAAkB,SAAStL,EAAKiL,EAAGnD,GAClC/L,KAAK+N,eAAehC,IAErByD,iBAAkB,SAASvL,EAAKiL,EAAGnD,EAAGoD,GAClCnP,KAAKH,QAAQmC,QAAQC,OAASjC,KAAKJ,OAAOG,KAAKoP,IACjDnP,KAAK+N,eAAgB/N,KAAKJ,OAAOG,KAAKgM,KAGxC0D,kBAAmB,SAASxL,EAAKiL,EAAGnD,GAEnC,MAAIA,IAGJA,IAAM/L,KAAKG,SAAS8C,OAASjD,KAAK4N,mBAClC5N,MAAK6N,aAAa9B,IAJF/L,KAAK0P,gBAMtBC,mBAAoB,SAAS1L,EAAKiL,EAAGnD,GACpC/L,KAAK4P,cAAc7D,IAEpB8D,gCAAiC,SAAS5L,EAAKiL,EAAGnD,GACjD/L,KAAK6C,IAAI,WAAWqM,EAAGnD,IAIxB+D,qBAAsB,SAAS7L,EAAKiL,EAAGnD,GACtC,gBAAoBA,KAAM/L,KAAKmD,SAAS+L,GAAKjL,EAAIiL,GAAK,GAAIzG,GAAOsD,EAAS,OAANmD,KAErEa,uBAAwB,SAAS9L,EAAKiL,EAAGnD,GACxC/L,KAAKe,UAAYf,KAAKC,QAAQyN,SAAS3B,IAIxCiE,eAAgB,SAAS/L,EAAKiL,EAAGnD,GAChCA,KAAO/L,KAAKe,UAAYf,KAAK4M,OAAOrJ,IAASvD,KAAKgG,OAAOzC,KAI1D0M,kBAAmB,SAAShM,EAAKiL,EAAGnD,EAAGmE,GACtClQ,KAAKe,UAAYf,KAAKC,QAAQkQ,YAAYD,GAAGE,SAASrE,IAEvDsE,wBAAyB,SAASpM,EAAKiL,EAAGnD,GACzC/L,KAAKe,UAAYf,KAAKC,QAAQ2J,IAAIsF,EAAGnD,IAEtCuE,8BAA+B,WAC9BtQ,KAAKe,UAAYf,KAAKgO,cAEvBuC,aAAc,SAAStM,EAAKiL,EAAGnD,GAC9B/L,KAAKe,UAAYf,KAAKC,QAAQwN,YAAYhC,IAAiBM,IAI5DyE,8CAA+C,SAASvM,EAAKiL,EAAGnD,GAC/D/L,KAAKe,UAAYf,KAAKC,SAASP,EAAEgC,WAAWqK,GAAK,GAAK,MAAQ,QAAQ,UAAUmD,EAAGnD,IAIpF0E,qFAAsF,WACrF,GAAIzQ,KAAKe,SAAT,CAGA,GAAI4G,GAAa3H,KAAKH,QAAQsD,QAC9BnD,MAAKC,QAAQF,KAAK,WAAkC,UAAtB4H,EAAW/H,QAAsB+H,EAAWuF,OAAOC,OAGjFnN,KAAKmO,kBACLnO,KAAKoO,oBAoBR3D,EAAUiG,IAAM,SAAS1M,GACxB,GAAGhE,KAAKgB,UAAa,MAAOhB,KAE5B,IAAIkP,GAAInL,EAAgB/D,KAAKH,QAASmE,EAAS2M,eAC9CC,EAAS1B,EAAE,GAAIA,EAAE,GAElB,OAAO0B,GAAOC,WAAaD,EAAOE,SAAWF,EAqB9C,IAAIG,IAAQ,iFACXC,GAAU,yBAEXvG,GAAU5H,IAAM,SAASsB,EAAQ8M,GAChC,GAAGjR,KAAKgB,UAAa,MAAOhB,KAE5B,EAAA,GAICgI,GAJGjH,EAAWf,KAAKe,SACnBiG,EAAapG,EACbf,EAAUG,KAAKH,OACNG,MAAK4E,OA2Cf,MAvCG,gBAAoBT,IACtB6D,EAAO7D,EAAQA,KAAaA,EAAO6D,GAAQiJ,GAErC9M,EAASzE,EAAE+C,UAAW0B,GAG7BzE,EAAEkE,KAAKO,EAAQ,SAASH,EAAUiN,GACjC,GAAGlQ,GAAYiQ,GAAQxK,KAAKxC,GACF,kBAAlBG,GAAOH,EAIf,IAA4DkN,GAAxDjN,EAAMF,EAAgBlE,EAASmE,EAAS2M,cAC5CO,GAAWjN,EAAI,GAAIA,EAAI,IACvBA,EAAI,GAAIA,EAAI,IAAOgN,GAASA,EAAME,SAAWzR,EAAEuR,GAASA,EAGxDjK,EAAa+J,GAAMvK,KAAKxC,IAAagD,EAGrC7C,EAAOH,IAAaC,EAAI,GAAIA,EAAI,GAAIgN,EAAOC,KAI5CpP,EAAgBjC,GAMhBG,KAAKmB,YAAcoC,EACnB7D,EAAEkE,KAAKO,EAAQzE,EAAEgG,MAAMnB,EAAavE,OACpCA,KAAKmB,YAAcP,EAGhBZ,KAAKe,UAAYf,KAAKC,QAAQ,GAAG8G,YAAc,GAAKC,GACtDhH,KAAKgH,WAAwC,UAA5BnH,EAAQsD,SAASvD,OAAqBM,EAAOF,KAAKS,MAAMC,OAGnEV,MAEPyK,EAAU2G,QAAU,SAASpP,EAASqP,GACtC,GAAIxE,GAAO7M,KACVS,EAAQT,KAAKS,KAGd,OAAIT,MAAKe,UAAaiB,GAGnBtC,EAAEgC,WAAWM,KACfA,EAAUA,EAAQ2D,KAAK3F,KAAKG,SAASP,OAAQa,EAAMC,MAAOV,OAAS,IAIjEN,EAAEgC,WAAWM,EAAQH,OACvBpB,EAAMQ,QAAUsC,EACTvB,EAAQH,KAAK,SAASJ,GAE5B,MADAhB,GAAMQ,QAAUL,EACTiM,EAAKuE,QAAQ3P,EAAG4P,IACrBnR,EAAM,SAASyG,GACjB,MAAOkG,GAAKuE,QAAQzK,EAAG0K,MAKtBrP,IAAYpB,IAAWoB,GAAuB,KAAZA,EAA0BpB,GAG5DoB,EAAQJ,QAAUI,EAAQL,OAAS,EACrC0P,EAAQC,QAAQ3D,OACf3L,EAAQ4H,KAAM2H,QAAS,QAASC,WAAY,aAKvCH,EAAQI,KAAKzP,GAGbhC,KAAK0R,gBAAgBL,GAASxP,KAAK,SAAS8P,GAC/C9E,EAAK9L,UAAY8L,EAAK5M,QAAQ,GAAG8G,YAAc,GACjD8F,EAAK7F,WAAWvG,EAAMC,OAAQiR,EAAOhQ,YAlCCf,GAuCzC6J,EAAUiH,gBAAkB,SAASL,GACpC,GAAI5Q,GAAQT,KAAKS,KAMjB,OAHAA,GAAMQ,QAAUsC,GAGP7D,EAAEF,GAAGoS,aAAeP,EAAQO,eAAiBlS,EAAEmS,WAAWC,aACjEzP,KAAK,WAAa5B,EAAMQ,QAAUL,IAClCmR,WAGHtH,EAAUsD,eAAiB,SAAS/L,EAASgF,GAC5ChH,KAAKoR,QAAQpP,EAAShC,KAAKG,SAAS6B,QAASgF,IAG9CyD,EAAUoD,aAAe,SAAS7L,EAASgF,GACvChH,KAAKoR,QAAQpP,EAAShC,KAAKG,SAAS8C,MAAO+D,KAAgBpG,GAC7DZ,KAAK0P,aAAa9O,IAIpB6J,EAAUmD,aAAe,WAExB,GAAIzN,GAAWH,KAAKG,SACnBL,EAAKE,KAAKI,IAAI,QAGZD,GAAS6R,UAAYhS,KAAK0P,eAG7BvP,EAAS6R,SAAWtS,EAAE,WACrBsN,QAAS3M,EAAY,cAAgBL,KAAKH,QAAQ6D,MAAMuO,OAAShN,EAAkB,UAAY,MAE/F0I,OACAxN,EAAS8C,MAAQvD,EAAE,WAClBI,GAAMA,EACNkN,QAAS3M,EAAY,SACrBiN,cAAe/J,KAGhB2O,aAAa/R,EAAS6B,SAGtBiF,SAAS,cAAe,2CAA4C,SAASvG,GAC7EhB,EAAEM,MAAMyN,YAAY,iCAA4D,SAA1B/M,EAAMa,KAAK4Q,OAAO,OAExElL,SAAS,cAAe,qBAAsB,SAASvG,GACvDhB,EAAEM,MAAMyN,YAAY,iBAAiC,cAAf/M,EAAMa,QAI1CvB,KAAKH,QAAQmC,QAAQkB,QAAUlD,KAAK8N,iBAGxCrD,EAAUiF,aAAe,SAAS1I,GAEjC,GAAI7G,GAAWH,KAAKG,QAEjBA,GAAS8C,QACX9C,EAAS6R,SAASpD,SAClBzO,EAAS6R,SAAW7R,EAAS8C,MAAQ9C,EAAS+C,OAAShD,EAGpD8G,IAAepG,GAASZ,KAAKgH,eAGjCyD,EAAUsC,gBAAkB,SAAS3J,GACrC,MAAO/C,GAAY,SAAW+C,GAAMpD,KAAKH,QAAQsD,SAASC,IAAIgP,UAG/D3H,EAAUzD,WAAa,SAAStG,EAAO2R,GACtC,IAAIrS,KAAKe,UAAYf,KAAKmB,aAAenB,KAAKgB,UAAa,MAAOhB,KAGlEA,MAAKmB,YAAcoC,CAEnB,IAqBC+O,GAAoBnI,EAAQoI,EAAUC,EArBnC/R,EAAQT,KAAKS,MAChBR,EAAUD,KAAKC,QACf0H,EAAa3H,KAAKH,QAAQsD,SAC1BvD,EAAS+H,EAAW/H,OACpBwD,EAAKuE,EAAWvE,GAChBC,EAAKsE,EAAWtE,GAChBkF,EAAWZ,EAAWY,SACtBF,EAAYV,EAAWU,UACvB6E,EAASvF,EAAWuF,OACpB9F,EAAS8F,EAAO9F,OAAO/C,MAAM,KAC7BoO,EAAexS,EAAQyS,WAAW9R,GAClC+R,EAAgB1S,EAAQ2S,YAAYhS,GACpCiS,EAAc,EACdC,EAAe,EACfvR,EAAOtB,EAAQ2J,IAAI,YACnBzG,GAAa4P,KAAM,EAAGC,IAAK,GAC3BC,EAAUhT,EAAQ,GAAG8G,YAAc,EACnCmM,EAAWxS,GAAwB,WAAfA,EAAMa,KAC1B4R,EAAMzT,EAAET,GACRmU,EAAM/K,EAAU,GAAGgL,cACnBlG,EAAQnN,KAAKmN,KAId,IAAGzN,EAAE4T,QAAQ1T,IAA6B,IAAlBA,EAAO+B,OAE9B0B,GAAOkQ,EAAGtI,EAAMuI,EAAGxI,GACnB7H,GAAa4P,KAAMnT,EAAO,GAAIoT,IAAKpT,EAAO,QAItC,IAAc,UAAXA,EAEPyD,GAAOkQ,EAAGtI,EAAMuI,EAAGxI,KAGdkC,EAAOC,OAASnN,KAAKH,QAAQ4D,KAAKgQ,WAAahT,EAAMiT,QAAUjT,EAAMiT,OAAOC,MAChFjT,EAASD,EAAMiT,QAIPhT,GAAUA,IAAyB,WAAfA,EAAMa,MAAoC,WAAfb,EAAMa,MAC7Db,EAAQD,EAAMC,MAIPyM,GAASA,EAAMwG,QACtBjT,EAAQyM,GAIG,WAAT5L,IAAqB4B,EAAWkF,EAAU8B,UAC1CiJ,EAAI/L,KAAKN,eAAiB9H,EAAO2U,YAAcR,EAAIS,gBAAgBC,eACrE3J,EAASzK,EAAER,EAASmI,MAAM8C,UAI3BhH,GACC4P,KAAMrS,EAAMiT,MAAQxQ,EAAS4P,MAAQ5I,GAAUA,EAAO4I,MAAQ,GAC9DC,IAAKtS,EAAMqT,MAAQ5Q,EAAS6P,KAAO7I,GAAUA,EAAO6I,KAAO,IAIzD9F,EAAOC,OAAS+F,GAAY/F,IAC9BhK,EAAS4P,OAAS5F,EAAM6G,SAAW,GAAKb,EAAIc,aAC5C9Q,EAAS6P,MAAQ7F,EAAM+G,SAAW,GAAKf,EAAIgB,iBAKxC,CAiBJ,GAfc,UAAXvU,EACCc,GAASA,EAAMd,QAAyB,WAAfc,EAAMa,MAAoC,WAAfb,EAAMa,KAC5Dd,EAAMb,OAASF,EAAEgB,EAAMd,QAEfc,EAAMd,SACda,EAAMb,OAASI,KAAKG,SAASP,QAGZ,UAAXA,IACPa,EAAMb,OAASF,EAAEE,EAAOgC,OAAShC,EAASI,KAAKG,SAASP,SAEzDA,EAASa,EAAMb,OAGfA,EAASF,EAAEE,GAAQ4I,GAAG,GACD,IAAlB5I,EAAO+B,OAAgB,MAAO3B,KAGzBJ,GAAO,KAAOV,GAAYU,EAAO,KAAOX,GAC/C4T,EAAchH,GAAQO,IAAMnN,EAAO2U,WAAahU,EAAOyK,QACvDyI,EAAejH,GAAQO,IAAMnN,EAAOmV,YAAcxU,EAAO0K,SAEtD1K,EAAO,KAAOX,IAChBkE,GACC6P,KAAMzK,GAAY3I,GAAQuU,YAC1BpB,MAAOxK,GAAY3I,GAAQqU,gBAMtBpQ,EAAQwQ,UAAYzU,EAAO0U,GAAG,QACrChC,EAAqBzO,EAAQwQ,SAASrU,KAAMJ,EAAQyD,EAAIQ,EAAQ0E,SAAWnB,EAASxG,GAI7EiD,EAAQ0Q,KAAO3U,GAAUA,EAAO,GAAG4U,gBAC1ClC,EAAqBzO,EAAQ0Q,IAAIvU,KAAMJ,EAAQyD,EAAIQ,EAAQ0E,SAAWnB,EAASxG,IAK/EiS,EAAcjT,EAAO8S,WAAW9R,GAChCkS,EAAelT,EAAOgT,YAAYhS,GAClCuC,EAAWvD,EAAOuK,UAIhBmI,IACFO,EAAcP,EAAmBjI,MACjCyI,EAAeR,EAAmBhI,OAClCH,EAASmI,EAAmBnI,OAC5BhH,EAAWmP,EAAmBnP,UAI/BA,EAAWnD,KAAKgH,WAAWmD,OAAOvK,EAAQuD,EAAUkF,IAGhDwD,GAAQO,IAAM,KAAOP,GAAQO,IAAM,KACrCP,GAAQO,KAAO,KAAOP,GAAQO,IAAM,OACnCP,GAAQO,KAAgB,UAAT7K,KAEjB4B,EAAS4P,MAAQI,EAAIc,aACrB9Q,EAAS6P,KAAOG,EAAIgB,eAIjB7B,GAAuBA,GAAsBA,EAAmBmC,aAAe7T,KAClFuC,EAAS4P,MAAQ1P,EAAGkQ,IAAMpI,EAAQ0H,EAAcxP,EAAGkQ,IAAMnI,EAASyH,EAAc,EAAI,EACpF1P,EAAS6P,KAAO3P,EAAGmQ,IAAMtI,EAAS4H,EAAezP,EAAGmQ,IAAMpI,EAAS0H,EAAe,EAAI,GA+BxF,MA1BA3P,GAAS4P,MAAQ7F,EAAOqG,GAAKnQ,EAAGmQ,IAAMpI,GAASsH,EAAerP,EAAGmQ,IAAMnI,GAAUqH,EAAe,EAAI,GACpGtP,EAAS6P,KAAO9F,EAAOsG,GAAKpQ,EAAGoQ,IAAMtI,GAAUyH,EAAgBvP,EAAGoQ,IAAMpI,GAAUuH,EAAgB,EAAI,GAGnG9O,EAAQ0E,UACVgK,EAAWpP,EAASoP,SAAW1O,EAAQ0E,SACtCvI,KAAMmD,EAAUwE,EAAYkL,EAAaC,EAAcL,EAAcE,GAInExI,GAAUoI,EAASQ,OAAQ5P,EAAS4P,MAAQ5I,EAAO4I,MACnD5I,GAAUoI,EAASS,MAAQ7P,EAAS6P,KAAO7I,EAAO6I,KAGlDT,EAASnP,KAAMpD,KAAKmD,SAASC,GAAKmP,EAASnP,KAIxCD,EAASoP,UAAaQ,KAAM,EAAGC,IAAK,GAGxCvS,EAAMqM,YAAc0F,EAAWxS,KAAK+M,gBAAgB/M,KAAKmD,SAASC,MACpEnD,EAAQkQ,YAAY1P,EAAMqM,UAAUsD,SAAW3P,EAAMqM,SAAW0F,GAI7DxS,KAAKqO,SAAS,QAASlL,EAAUoF,EAASb,MAAQa,GAAW7H,UAC1DyC,GAASoP,SAGbF,IAAWzR,IAAUqS,GAAWyB,MAAMvR,EAAS4P,OAAS2B,MAAMvR,EAAS6P,MAAmB,UAAXpT,IAAuBF,EAAEgC,WAAWiG,EAAW0K,QAChIpS,EAAQ2J,IAAIzG,GAILzD,EAAEgC,WAAWiG,EAAW0K,UAC/B1K,EAAW0K,OAAO1M,KAAK1F,EAASD,KAAMN,EAAE+C,UAAWU,IACnDlD,EAAQ0U,MAAM,SAASC,GAEtBlV,EAAEM,MAAM4J,KAAMiL,QAAS,GAAIvK,OAAQ,KAChCuB,GAAQC,IAAM9L,KAAK0D,MAAMoR,gBAAgB,UAE5CF,OAKF5U,KAAKmB,YAAcP,EAEZZ,MAvB2EA,MA2BnFyK,EAAUzD,WAAWmD,OAAS,SAASzC,EAAMqN,EAAK1M,GAQjD,QAAS2M,GAAOrO,EAAGzC,GAClB6Q,EAAIhC,MAAQ7O,EAAIyC,EAAEsN,aAClBc,EAAI/B,KAAO9O,EAAIyC,EAAEwN,YATlB,IAAI9L,EAAU,GAAM,MAAO0M,EAE3B,IAGCE,GAAU9R,EAAU+R,EAAcC,EAH/B9B,EAAgB3T,EAAEgI,EAAK,GAAG2L,eAC7B+B,IAAWvJ,GAAQC,IAA8B,eAAxB5M,EAASmW,WAClCC,EAASjN,EAAU,EASpB,GAC+C,YAA1ClF,EAAWzD,EAAEkK,IAAI0L,EAAQ,eACZ,UAAbnS,GACF+R,EAAeI,EAAOC,wBACtBP,EAAO3B,EAAe,MAGtB6B,EAAexV,EAAE4V,GAAQnS,WACzB+R,EAAanC,MAAS/I,WAAWtK,EAAEkK,IAAI0L,EAAQ,qBAAuB,EACtEJ,EAAalC,KAAQhJ,WAAWtK,EAAEkK,IAAI0L,EAAQ,oBAAsB,GAGrEP,EAAIhC,MAAQmC,EAAanC,MAAQ/I,WAAWtK,EAAEkK,IAAI0L,EAAQ,gBAAkB,GAC5EP,EAAI/B,KAAOkC,EAAalC,KAAOhJ,WAAWtK,EAAEkK,IAAI0L,EAAQ,eAAiB,GAGrEL,GAAuD,YAA1CE,EAAWzV,EAAEkK,IAAI0L,EAAQ,cAA0C,YAAbH,IAA0BF,EAAWvV,EAAE4V,WAGzGA,EAASA,EAAOE,aAOvB,OAJGP,KAAaA,EAAS,KAAO5B,EAAc,IAAM+B,IACnDJ,EAAOC,EAAU,GAGXF,EAIR,IAAIU,KAAKhN,EAASgC,EAAUzD,WAAW0O,OAAS,SAASC,EAAQC,GAChED,GAAU,GAAKA,GAAQpJ,QAAQ,UAAW,OAAOA,QAAQ,WAAYnB,GAAQuF,cAC7E3Q,KAAKuT,GAAKoC,EAAOhR,MAAM,gBAAkBgR,EAAOhR,MAAM,YAAc,YAAY,GAAGgM,cACnF3Q,KAAKwT,GAAKmC,EAAOhR,MAAM,wBAA0B,YAAY,GAAGgM,cAChE3Q,KAAK4V,SAAWA,CAEhB,IAAIC,GAAIF,EAAO1M,OAAO,EACtBjJ,MAAK6Q,WAAoB,MAANgF,GAAmB,MAANA,EAAYhL,EAAID,IAC9C4B,SAEHiJ,IAAEK,OAAS,SAASC,EAAGC,GACtBhW,KAAK+V,GAAK/V,KAAK+V,KAAO9K,EAAOE,EAAQnL,KAAK+V,KAAO5K,EAAQF,EAAO+K,GAAUhW,KAAK+V,IAGhFN,GAAE3E,OAAS,SAASzL,GACnB,GAAIkO,GAAIvT,KAAKuT,EAAGC,EAAIxT,KAAKwT,EAErB5C,EAAS2C,IAAMC,EACX,WAAND,GAAwB,WAANC,IAAmBxT,KAAK6Q,aAAehG,GAAK7K,KAAK4V,SAClEpC,EAAED,IAAMA,EAAEC,IAEZD,EAED,OAAOlO,MAAS,EAAQuL,EAAOvL,KAAK,KAAOuL,GAG5C6E,GAAErD,OAAS,WACV,GAAIxB,GAAS5Q,KAAK8Q,QAAO,EACzB,OAAOF,GAAO,GAAG3H,OAAO,IAAM2H,EAAO,IAAMA,EAAO,GAAG3H,OAAO,IAAM,KAGnEwM,GAAEQ,MAAQ,WACT,MAAO,IAAIxN,GAAQzI,KAAK8Q,SAAU9Q,KAAK4V,SAIxCnL,EAAUzE,OAAS,SAASkQ,EAAOxV,GAClC,GAAID,GAAQT,KAAKS,MAChBZ,EAAUG,KAAKH,QACfI,EAAUD,KAAKC,OAGhB,IAAGS,EAAO,CACT,GAAG,aAAe8F,KAAK9F,EAAMa,OAASd,EAAMC,OAAS,YAAc8F,KAAK/F,EAAMC,MAAMa,OACnF1B,EAAQyD,KAAK1D,OAAOuW,IAAIzV,EAAMd,QAAQ+B,SAAW9B,EAAQyD,KAAK1D,OAAO+B,QACrE1B,EAAQmW,IAAI1V,EAAMwF,eAAevE,OACjC,MAAO3B,KAIRS,GAAMC,MAAQhB,EAAEgB,MAAM2V,IAAI3V,GAO3B,GAHAV,KAAKiB,UAAYiV,IAAUlW,KAAKkB,iBAAmBqC,IAG/CvD,KAAKe,SAAY,MAAOmV,GAAQlW,KAAK4M,OAAO,GAAK5M,IAChD,IAAGA,KAAKgB,WAAahB,KAAKW,SAAY,MAAOX,KAElD,IASCsW,GAAgBC,EAAyBC,EATtCjV,EAAO2U,EAAQ,OAAS,OAC3BnU,EAAO/B,KAAKH,QAAQ0B,GAEpBoG,GADY3H,KAAKH,QAAUqW,EAAiB,OAAT,QACtBlW,KAAKH,QAAQsD,UAC1BsT,EAAiBzW,KAAKH,QAAQmC,QAC9BqI,EAAQrK,KAAKC,QAAQ2J,IAAI,SACzBqJ,EAAUjT,KAAKC,QAAQqU,GAAG,YAC1BoC,EAAUR,GAAgC,IAAvBnU,EAAKnC,OAAO+B,OAC/BgV,GAAcjW,GAASqB,EAAKnC,OAAO+B,OAAS,GAAKlB,EAAMb,OAAO,KAAOc,EAAMd,MAa5E,cATWsW,IAAOU,OAAO,oBAAqBV,GAASjD,GAGvDqD,GAAkBrW,EAAQqU,GAAG,cAAgBrB,IAAYiD,GAASS,EAGlEJ,EAASD,EAA+CpW,IAA5BF,KAAKqO,SAAS9M,GAAO,KAG9CvB,KAAKgB,UAAoBhB,MAGzBuW,IAAU3V,GAASsV,GAASlW,KAAK6W,MAAMnW,IAGtC6V,GAASD,EAAyBtW,MAGtCN,EAAEK,KAAKE,EAAQ,GAAI,eAAkBiW,GAGlCA,GAEFlW,KAAKmN,QAAU1M,EAAMiT,OAAShU,EAAEgB,MAAM2V,IAAIrW,KAAKmN,QAG5CzN,EAAEgC,WAAW+U,EAAexU,OAASjC,KAAK+N,eAAe0I,EAAexU,KAAMrB,GAC9ElB,EAAEgC,WAAW+U,EAAexT,QAAUjD,KAAK6N,aAAa4I,EAAexT,MAAOrC,IAG7E+J,GAAuC,UAAtBhD,EAAW/H,QAAsB+H,EAAWuF,OAAOC,QACvEzN,EAAER,GAAU4X,KAAK,aAAazW,EAAWL,KAAK+W,aAC9CpM,EAAgBpH,GAIb8G,GAASpK,EAAQ2J,IAAI,QAAS3J,EAAQyS,WAAW9R,IACrDZ,KAAKgH,WAAWtG,EAAO8G,UAAU,IAC7B6C,GAASpK,EAAQ2J,IAAI,QAAS,IAG7B7H,EAAKuG,OACa,gBAAdvG,GAAKuG,KAAoB5I,EAAEqC,EAAKuG,MAAQ5I,EAAE2G,EAAUtE,EAAKuG,OAC/D0O,IAAI/W,GAAS+W,IAAIjV,EAAKnC,QAAQH,KAAK,OAAQC,EAAEuX,MAAM,kBAKtDlR,aAAa/F,KAAKM,OAAOgD,YAGlB7C,GAAMiT,OAGV/I,IAAkBjL,EAAE2G,EAAS,4BAA6BtE,EAAKuG,MAAM0O,IAAI/W,GAAS0B,SACpFjC,EAAER,GAAUgY,OAAO,aAAa7W,GAChCsK,EAAgB/J,GAIjBZ,KAAKmX,KAAKzW,IAIX8V,EAAQ9W,EAAEgG,MAAM,WACZwQ,GAECrK,GAAQC,IAAM7L,EAAQ,GAAGyD,MAAMoR,gBAAgB,UAGlD7U,EAAQ2J,IAAI,WAAY,IAGrB,gBAAoB7H,GAAKqV,WAC3B1X,EAAEM,KAAKH,QAAQyD,KAAK8T,UAAWnX,GAAS4W,QAIzC7W,KAAKH,QAAQyD,KAAK1D,OAAOyX,QAAQ,QAAQrX,KAAKF,GAAG,cAIjDG,EAAQ2J,KACP2H,QAAS,GACTC,WAAY,GACZqD,QAAS,GACT9B,KAAM,GACNC,IAAK,KAKPhT,KAAKqO,SAAS6H,EAAQ,UAAY,WAChClW,MAGA+B,EAAKsQ,SAAWzR,GAAS8V,IAAY9V,GACvCX,EAASsB,KACTiV,KAIO9W,EAAEgC,WAAWK,EAAKsQ,SACzBpS,EAAQyO,KAAK,EAAG,GAChB3M,EAAKsQ,OAAO1M,KAAK1F,EAASD,MAC1BC,EAAQ0U,MAAM,KAAM,SAAS2C,GAC5Bd,IAASc,OAKJrX,EAAQsX,OAAO,GAAIrB,EAAQ,EAAI,EAAGM,GAGtCN,GAASnU,EAAKnC,OAAOyX,QAAQ,QAAQrX,KAAKF,GAAG,aAEzCE,QAGRyK,EAAUnH,KAAO,SAAS5C,GAAS,MAAOV,MAAKgG,OAAOzC,EAAM7C,IAE5D+J,EAAUhH,KAAO,SAAS/C,GAAS,MAAOV,MAAKgG,OAAOpF,EAAOF,IAC5D+J,EAAUoM,MAAQ,SAASnW,GAC3B,IAAIV,KAAKe,UAAYf,KAAKgB,UAAa,MAAOhB,KAE9C,IAAIwX,GAAQ9X,EAAE2G,GACbpG,EAAUD,KAAKC,QACfwX,EAAWC,SAASzX,EAAQ,GAAGyD,MAAMiU,OAAQ,IAC7CC,EAAWtQ,EAAKuQ,OAASL,EAAM7V,MAyBhC,OArBI1B,GAAQ4F,SAAS6F,IAEjB1L,KAAKqO,SAAS,SAAUuJ,GAAWlX,KAElC+W,IAAaG,IAEfJ,EAAM5T,KAAK,WACP5D,KAAK0D,MAAMiU,OAASF,IACtBzX,KAAK0D,MAAMiU,OAAS3X,KAAK0D,MAAMiU,OAAS,KAK1CH,EAAMM,OAAO,IAAMpM,GAAajM,KAAK,OAAQiB,IAI9CT,EAAQmQ,SAAS1E,GAAa,GAAGhI,MAAMiU,OAASC,GAI3C5X,MAGRyK,EAAU0M,KAAO,SAASzW,GACzB,OAAIV,KAAKe,UAAYf,KAAKgB,UAAoBhB,MAG9CA,KAAKC,QAAQkQ,YAAYzE,GAGzB1L,KAAKqO,SAAS,QAAUrO,KAAKC,QAAQ2J,IAAI,WAAalJ,GAE/CV,OAEPyK,EAAUsN,QAAU,SAAS7B,GAC7B,MAAGlW,MAAKgB,UAAoBhB,MAGf,WAAVkW,EACFA,IAAUlW,KAAKe,SAAWf,KAAKC,QAAQ4F,SAASC,IAAkB9F,KAAKW,UAIhE,iBAAqBuV,KAC5BA,EAAQ3S,GAGNvD,KAAKe,UACPf,KAAKC,QAAQwN,YAAY3H,GAAgBoQ,GACvCnW,KAAK,gBAAiBmW,GAGzBlW,KAAKW,WAAauV,EAEXlW,OAGRyK,EAAUuN,OAAS,WAAa,MAAOhY,MAAK+X,QAAQnX,IACnD6J,EAAUqD,cAAgB,WAE1B,GAAIjB,GAAO7M,KACVG,EAAWH,KAAKG,SAChBF,EAAUE,EAASF,QACnBiD,EAASlD,KAAKH,QAAQmC,QAAQkB,OAC9B+U,EAA6B,gBAAX/U,GAClBgV,EAAQD,EAAW/U,EAAS,eAE1B/C,GAAS+C,QAAU/C,EAAS+C,OAAO0L,SAIrCzO,EAAS+C,OADPA,EAAOtB,OACSsB,EAGAxD,EAAE,SACnBsN,QAAS,eAAiBhN,KAAKH,QAAQ6D,MAAMuO,OAAS,GAAK5R,EAAU,SACrE4C,MAASiV,EACTC,aAAcD,IAEdE,QACA1Y,EAAE,YACDsN,QAAS,wBACTyE,KAAQ,aAMXtR,EAAS+C,OAAOwK,SAASvN,EAAS6R,UAAY/R,GAC5CF,KAAK,OAAQ,UACbsY,MAAM,SAAS3X,GAEf,MADIT,GAAQ4F,SAASC,KAAmB+G,EAAKpJ,KAAK/C,GAC3CE,KAIV6J,EAAUmF,cAAgB,SAAS1M,GAGlC,IAAIlD,KAAKe,SAAY,MAAOH,EAE5B,IAAI8G,GAAO1H,KAAKG,SAAS+C,MACtBA,GAAUlD,KAAK8N,gBACXpG,EAAKkH,UAQbnE,EAAUuD,WAAa,WAEtB,GAAIsK,GAAKtY,KAAKH,QAAQ6D,MAAMuO,OAC3B9R,EAAWH,KAAKG,SAChBF,EAAUE,EAASF,QACnBU,EAAWV,EAAQ4F,SAASC,GAE7B7F,GAAQkQ,YAAYrK,IACpBA,GAAiBwS,EAAK,oBAAsB,gBAC5CrY,EAAQwN,YAAY3H,GAAgBnF,GAEpCV,EAAQwN,YAAY,mBAAmBxI,IAAqBqT,GAAI7K,YAAYhC,EAAezL,KAAKH,QAAQ6D,MAAM6U,MAAQD,GAEnHnY,EAAS6B,SACX7B,EAAS6B,QAAQyL,YAAaxI,EAAkB,WAAYqT,GAE1DnY,EAAS6R,UACX7R,EAAS6R,SAASvE,YAAaxI,EAAkB,UAAWqT,GAE1DnY,EAAS+C,QACX/C,EAAS+C,OAAOuK,YAAYpN,EAAU,SAAUiY,IAgFlD7N,EAAUsM,YAAc,SAASrW,GAEhC,OADCV,KAAKmN,MAAQzN,EAAEgB,MAAM2V,IAAI3V,IAAQa,KAAO,YAClCvB,MAIRyK,EAAU+N,MAAQ,SAASC,EAAStR,EAAQC,EAAQsR,EAAQhW,GAC3D,GAAI+V,GAAYrR,GAAWD,EAAOxF,OAAlC,CACA,GAAIgX,GAAK,IAAM3Y,KAAKI,KAAOsY,EAAS,IAAIA,EAAS,GAKjD,OAJAhZ,GAAE+Y,GAAS3B,MACT3P,EAAO9C,MAAQ8C,EAASA,EAAO9B,KAAKsT,EAAK,MAAQA,EAClDjZ,EAAEgG,MAAM0B,EAAQ1E,GAAW1C,OAErBA,OAERyK,EAAUmO,QAAU,SAASH,EAASC,GAErC,MADAD,IAAW/Y,EAAE+Y,GAASvB,OAAO,IAAMlX,KAAKI,KAAOsY,EAAS,IAAIA,EAAS,KAC9D1Y,MAcRyK,EAAU4D,SAAW,SAAS9M,EAAMiD,EAAM9D,GACzC,GAAI6E,GAAW7F,EAAEuX,MAAM,UAAU1V,EAOjC,OANAgE,GAASsT,cAAiBnY,GAAShB,EAAE+C,UAAW/B,IAAWV,KAAKS,MAAMC,OAASR,EAE/EF,KAAKoB,WAAaG,EAClBvB,KAAKC,QAAQoX,QAAQ9R,GAAWvF,MAAMoF,OAAOZ,QAC7CxE,KAAKoB,WAAaR,GAEV2E,EAASuT,sBAGlBrO,EAAUsO,YAAc,SAASC,EAAYC,EAAYC,EAAaC,EAAavT,EAAYK,GAE9F,GAAImT,GAAiBF,EAAYpB,OAAQqB,GAAchD,IAAKgD,EAAYrB,OAAOoB,IAC9EG,IAGED,GAAezX,SAGjBjC,EAAEkE,KAAKqV,EAAY,SAAS/U,EAAG3C,GAC9B,GAAI+X,GAAY5Z,EAAE6Z,QAAQhY,EAAMyX,EAIhCM,GAAY,IAAMD,EAAatU,KAAMiU,EAAWQ,OAAQF,EAAW,GAAI,MAIrED,EAAa1X,SAEf3B,KAAKwY,MAAMY,EAAgBC,EAAc,SAAS3Y,GACjD,GAAIwV,GAAQlW,KAAKe,SAAWf,KAAKC,QAAQ,GAAG8G,YAAc,GAAI,GAC7DmP,EAAQjQ,EAAaL,GAAYD,KAAK3F,KAAMU,KAI9CwY,EAAcA,EAAYlC,IAAIoC,GAC9BD,EAAcA,EAAYnC,IAAIoC,KAKhCpZ,KAAKwY,MAAMU,EAAaF,EAAYpT,GACpC5F,KAAKwY,MAAMW,EAAaF,EAAYhT,IAGrCwE,EAAUgP,qBAAuB,SAAS/Y,GA+BzC,QAASgZ,GAAYhZ,GAEpB,MAAGV,MAAKW,UAAYX,KAAKgB,UAAoBJ,GAG7CZ,KAAKS,MAAMC,MAAQA,GAAShB,EAAEgB,MAAM2V,IAAI3V,GACxCV,KAAKS,MAAMb,OAASc,GAAShB,EAAEgB,EAAMd,QAGrCmG,aAAa/F,KAAKM,OAAOgD,WACzBtD,KAAKM,OAAOgD,KAAOgC,EAAMK,KAAK3F,KAC7B,WAAaA,KAAK4M,OAAwB,gBAAVlM,IAAsBb,EAAQyD,KAAKE,QACnE3D,EAAQ8Z,UAAY,EAAI9Z,EAAQyD,KAAKgC,SA1CvC,GAAIzF,GAAUG,KAAKH,QAClB+Z,EAAa/Z,EAAQyD,KAAK1D,OAC1Bia,EAAaha,EAAQ4D,KAAK7D,OAC1BoZ,EAAanZ,EAAQyD,KAAK5C,MAAQhB,EAAEoa,KAAK,GAAKja,EAAQyD,KAAK5C,OAAO2D,MAAM,QACxE4U,EAAapZ,EAAQ4D,KAAK/C,MAAQhB,EAAEoa,KAAK,GAAKja,EAAQ4D,KAAK/C,OAAO2D,MAAM,OAGzErE,MAAKwY,MAAMxY,KAAKG,SAASP,QAAS,SAAU,cAAe,WAC1DI,KAAKsO,SAAQ,IACX,WAMA,qBAAqB9H,KAAK3G,EAAQyD,KAAK5C,SAAW,oBAAoB8F,KAAK3G,EAAQ4D,KAAK/C,QAC1FuY,EAAWlU,KAAK,cAQjB/E,KAAKwY,MAAMoB,EAAY,YAAa,SAASlZ,GAC5CV,KAAK+W,YAAYrW,GACjBV,KAAKS,MAAMsZ,SAAWxW,IAqBvBvD,KAAK+Y,YAAYC,EAAYC,EAAYW,EAAYC,EAAYH,EAAa,WAC7E,MAAI1Z,MAAKM,WACTyF,cAAa/F,KAAKM,OAAOgD,MADC1C,KAKxBf,EAAQyD,KAAKE,OAAS3D,EAAQ8Z,YAAaD,EAAY/T,KAAK3F,KAAMU,IAItE+J,EAAU2D,cAAgB,WACzB,GAAIvB,GAAO7M,KACVH,EAAUG,KAAKH,QACf8H,EAAa9H,EAAQsD,SAErBlD,EAAUD,KAAKC,QACf2Z,EAAa/Z,EAAQyD,KAAK1D,OAC1Bia,EAAaha,EAAQ4D,KAAK7D,OAC1Boa,EAAkBrS,EAAWU,UAC7B4R,EAAiBtS,EAAWY,SAC5B2R,EAAiBxa,EAAER,GAEnBib,GADaza,EAAER,EAASmI,MACT3H,EAAET,IAEjB+Z,EAAanZ,EAAQyD,KAAK5C,MAAQhB,EAAEoa,KAAK,GAAKja,EAAQyD,KAAK5C,OAAO2D,MAAM,QACxE4U,EAAapZ,EAAQ4D,KAAK/C,MAAQhB,EAAEoa,KAAK,GAAKja,EAAQ4D,KAAK/C,OAAO2D,MAAM,OAIzE3E,GAAEkE,KAAK/D,EAAQsH,OAAQ,SAASa,EAAMzC,GACrCsH,EAAK2L,MAAMvY,EAAkB,WAAT+H,GAAqB,cAAc,gBAAkB,UAAUA,GAAOzC,EAAU,KAAMtF,KAIxG,oBAAoBuG,KAAK3G,EAAQ4D,KAAK/C,QAAiC,WAAvBb,EAAQ4D,KAAK2W,OAC/Dpa,KAAKwY,MAAM0B,GAAiB,WAAY,QAAS,SAASxZ,GACrD,gBAAgB8F,KAAK9F,EAAMd,OAAOya,WAAc3Z,EAAMwF,eACzDlG,KAAKyD,KAAK/C,KAMVb,EAAQ4D,KAAK8C,MACfsT,EAAaA,EAAW1D,IAAKlW,EAAQmQ,SAAS5E,IAOvC,qBAAqBhF,KAAK3G,EAAQyD,KAAK5C,QAC9CV,KAAKwY,MAAMqB,EAAY,aAAc,WACpC9T,aAAa/F,KAAKM,OAAOgD,SAKvB,GAAKzD,EAAQ4D,KAAK/C,OAAO4Z,QAAQ,WAAa,IACjDta,KAAKwY,MAAMwB,EAAgB5T,QAAQ,SAAU,YAAa,cAAe,SAAS1F,GACjF,GAAIgH,GAAOhI,EAAEgB,EAAMd,QAClB2a,EAAUva,KAAKe,WAAaf,KAAKC,QAAQ4F,SAASC,KAAmB9F,KAAKC,QAAQ,GAAG8G,YAAc,EACnGyT,EAAa9S,EAAK+S,QAAQpU,GAAUyR,OAAO9X,KAAKC,QAAQ,IAAI0B,OAAS,CAEnE+F,GAAK,KAAO1H,KAAKJ,OAAO,IAAM8H,EAAK,KAAO1H,KAAKC,QAAQ,IAAOua,GAC/Dxa,KAAKJ,OAAOwW,IAAI1O,EAAK,IAAI/F,SAAU4Y,GAEpCva,KAAKyD,KAAK/C,KAMV,gBAAoBb,GAAQ4D,KAAKoD,WAEnC7G,KAAKwY,MAAMoB,EAAY,QAAQ5Z,KAAKF,GAAG,YAAa8G,EAAgB,YAGpE5G,KAAKwY,MAAMqB,EAAW1D,IAAIlW,GAAUqH,EAAKoT,eAAgB9T,IAI1D5G,KAAK+Y,YAAYC,EAAYC,EAAYW,EAAYC,EAAYjU,EAAYK,GAG7EjG,KAAKwY,MAAMoB,EAAWzD,IAAIlW,GAAU,YAAa,SAASS,GAEzD,GAAG,gBAAoBb,GAAQ4D,KAAKgQ,SAAU,CAC7C,GAAIC,GAAS1T,KAAKS,MAAMiT,WACvBiH,EAAQ3a,KAAKH,QAAQ4D,KAAKgQ,SAC1BmH,EAAM9Q,KAAK8Q,KAGTA,EAAIla,EAAMiT,MAAQD,EAAOC,QAAUgH,GAASC,EAAIla,EAAMqT,MAAQL,EAAOK,QAAU4G,IACjF3a,KAAKyD,KAAK/C,GAKZV,KAAK+W,YAAYrW,KAIO,UAAtBiH,EAAW/H,QAEV+H,EAAWuF,OAAOC,QAEjBtN,EAAQ4D,KAAK/C,OAEfV,KAAKwY,MAAMoB,GAAa,aAAc,cAAe,SAASlZ,GAC7D,MAAIV,MAAKS,WACTT,KAAKS,MAAMsZ,SAA0B,eAAfrZ,EAAMa,MADJX,IAM1BZ,KAAKwY,MAAM0B,EAAgB,YAAa,SAASxZ,GAE7CV,KAAKe,UAAYf,KAAKS,MAAMsZ,WAAa/Z,KAAKC,QAAQ4F,SAASC,KAAmB9F,KAAKC,QAAQ,GAAG8G,YAAc,GAClH/G,KAAKgH,WAAWtG,OAOjBiH,EAAWuF,OAAO2N,QAAUZ,EAAetY,SAC7C3B,KAAKwY,MAAO9Y,EAAEgB,MAAMoa,QAAQD,OAASZ,EAAiBE,EAAc,SAAUrT,GAI5Ea,EAAWuF,OAAO8H,QACpBhV,KAAKwY,MAAO2B,EAAahE,IAAIxO,EAAWU,WAAY,SAAUvB,IAKhE2D,EAAU0D,gBAAkB,WAC3B,GAAItO,GAAUG,KAAKH,QAClBqZ,EAAcrZ,EAAQyD,KAAK1D,OAC3BuZ,EAActZ,EAAQ4D,KAAK7D,OAC3B6Y,EAAU/Y,EAAEqb,MACX/a,KAAKG,SAASP,OAAO,GACrBI,KAAKe,UAAYf,KAAKC,QAAQ,GAC9BJ,EAAQsD,SAASkF,UAAU,GAC3BxI,EAAQsD,SAASoF,SAAS,GAC1B1I,EAAQsD,SAASkF,UAAUjC,QAAQ,QAAQ,GAC3CnH,EACAC,GACE,SAASgF,GACX,MAAoB,gBAANA,IAIbgV,IAAeA,EAAY8B,UAC7BvC,EAAUA,EAAQrT,OAAO8T,EAAY8B,YAEnC7B,GAAeA,EAAY6B,UAC7BvC,EAAUA,EAAQrT,OAAO+T,EAAY6B,YAItChb,KAAK4Y,QAAQH,GACXG,QAAQH,EAAS,WACjBG,QAAQH,EAAS,aAIpB/Y,EAAE,WACDuH,EAASZ,GAAW,aAAc,cAAe,SAAS3F,GACzD,GAAIwV,GAAuB,eAAfxV,EAAMa,KACjBtB,EAAUP,EAAEgB,EAAMua,eAClBrb,EAASF,EAAEgB,EAAMwF,eAAiBxF,EAAMd,QACxCC,EAAUG,KAAKH,OAGbqW,IAEFlW,KAAK6W,MAAMnW,GAGXT,EAAQ4F,SAAS2F,KAAiBvL,EAAQ4F,SAASC,KAAmBC,aAAa/F,KAAKM,OAAOmD,OAMhE,UAA5B5D,EAAQsD,SAASvD,QAAsBC,EAAQsD,SAAS+J,OAAOC,OACjEtN,EAAQ4D,KAAK/C,OAASb,EAAQyD,KAAK1D,SAAWA,EAAOwG,QAAQvG,EAAQyD,KAAK1D,OAAO,IAAI+B,QACrF3B,KAAKyD,KAAK/C,GAKZT,EAAQwN,YAAY9B,EAAauK,KAIlCjP,EAAS,IAAIM,EAAQ,IAAKgE,EAAiB3E,KAsF5CU,EAAO5H,EAAEF,GAAGC,KAAO,SAASI,EAASmE,EAAUkX,GAE9C,GAAIC,IAAW,GAAKtb,GAAS8Q,cAC5ByK,EAAWlb,EACXsE,EAAO9E,EAAE2b,UAAU7T,WAAW2B,MAAM,GACpCzI,EAAQ8D,EAAKA,EAAK7C,OAAS,GAC3BI,EAAO/B,KAAK,GAAKN,EAAEwI,KAAKlI,KAAK,GAAIK,GAAaH,CAG/C,QAAKsH,UAAU7F,QAAUI,GAAqB,QAAZoZ,EAC1BpZ,EAIA,gBAAoBlC,IAC3BG,KAAK4D,KAAK,WACT,GAAItB,GAAM5C,EAAEwI,KAAKlI,KAAMK,EACvB,KAAIiC,EAAO,MAAOiB,EAMlB,IAHG7C,GAASA,EAAM4a,YAAahZ,EAAI7B,MAAMC,MAAQA,IAG9CsD,GAAyB,WAAZmX,GAAoC,YAAZA,EAWhC7Y,EAAI6Y,IACX7Y,EAAI6Y,GAASnW,MAAM1C,EAAKkC,OAZuC,CAC/D,GAAG0W,IAAa/b,IAAaO,EAAEsD,cAAcgB,GAK5C,MADAoX,GAAW9Y,EAAIoO,IAAI1M,GACZpD,CAJP0B,GAAIO,IAAImB,EAAUkX,MAcdE,IAAalb,EAAOkb,EAAWpb,MAI/B,gBAAoBH,IAAY2H,UAAU7F,OAA7C,QAEJI,EAAOD,EAAgBpC,EAAE+C,OAAOc,KAAU1D,IAEnCG,KAAK4D,KAAK,SAASM,GACzB,GAAI5B,GAAKxC,CAQT,OALAA,GAAKJ,EAAE4T,QAAQvR,EAAKjC,IAAMiC,EAAKjC,GAAGoE,GAAKnC,EAAKjC,GAC5CA,GAAMA,GAAMA,IAAOc,GAASd,EAAG6B,OAAS,GAAK2F,EAAKhF,IAAIxC,GAAMwH,EAAK8H,SAAWtP,EAG5EwC,EAAMmF,EAAK/H,EAAEM,MAAOF,EAAIiC,GACrBO,IAAQ1B,EAAgB2C,GACpB+D,EAAKhF,IAAIxC,GAAMwC,EAGtB5C,EAAEkE,KAAKC,EAAS,WACQ,eAApB7D,KAAKkO,YAA+BlO,KAAKsC,SAI7CA,GAAImX,qBAAqB/Y,QAM5BhB,EAAED,KAAOE,EAGT2H,EAAKhF,OACJ5C,EAAEkE,MAEF7D,KAAM,SAASA,EAAMwJ,GACpB,GAAGvJ,KAAK2B,OAAQ,CACf,GAAIkL,GAAO7M,KAAK,GACfiD,EAAQ,QACRX,EAAM5C,EAAEwI,KAAK2E,EAAM,OAEpB,IAAG9M,IAASkD,GAASX,GAAO,gBAAoBA,IAAOA,EAAIzC,QAAQ+I,SAClE,MAAGpB,WAAU7F,OAAS,EACdjC,EAAEK,KAAK8M,EAAM/D,KAIlBxG,GAAOA,EAAIzC,QAAQmC,QAAQjC,OAASkD,GAASX,EAAI7B,MAAMV,MACzDuC,EAAIO,IAAI,eAAgB0G,GAIlBvJ,KAAKD,KAAK+I,GAAUS,IAI7B,MAAO7J,GAAEF,GAAG,OAAOoM,IAAe5G,MAAMhF,KAAMwH,YAI/CyO,MAAO,SAASsF,GACf,GAGAC,IAHa9b,MAGLA,EAAEF,GAAG,QAAQoM,IAAe5G,MAAMhF,KAAMwH,WAUhD,OAPI+T,IACHC,EAAM1D,OAAO,IAAIhP,GAAS,KAAK/I,KAAK,QAAS,WAC5C,MAAOL,GAAEK,KAAKC,KAAM8I,MAEpBD,WAAWC,IAGN0S,IAEN,SAASxT,EAAMyT,GACjB,IAAIA,GAAQ/b,EAAEF,GAAGwI,EAAK4D,IAAkB,MAAOrI,EAE/C,IAAImY,GAAMhc,EAAEF,GAAGwI,EAAK4D,IAAiBlM,EAAEF,GAAGwI,EAC1CtI,GAAEF,GAAGwI,GAAQ,WACZ,MAAOyT,GAAKzW,MAAMhF,KAAMwH,YAAckU,EAAI1W,MAAMhF,KAAMwH,cAQpD9H,EAAEic,KACLjc,EAAE,YAAYkM,IAAiBlM,EAAEkc,UACjClc,EAAEkc,UAAY,SAAUJ,GACvB,IAAI,GAAW9T,GAAPxD,EAAI,GAAUwD,EAAOhI,EAAG8b,EAAMtX,KAAMvC,OAAQuC,IACnD,GAAGwD,EAAK3H,KAAK4I,GACZ,IAAMjB,EAAKmU,eAAe,cAC1B,MAAOlV,IAGTjH,EAAE,YAAYkM,IAAe5G,MAAMhF,KAAMwH,aAI3CF,EAAKwU,QAAU,YAGfxU,EAAK8H,OAAS,EAGd9H,EAAKoT,eAAiBnP,EAGtBjE,EAAKuQ,OAAS,KAGdvQ,EAAKc,UACJuR,UAAW/Y,EACXd,GAAIc,EACJ8H,UAAWnF,EACXqF,SAAUrF,EACVvB,SACCC,KAAMsB,EACNxD,KAAM,QACNkD,MAAOrC,EACPsC,OAAQtC,GAETuC,UACCC,GAAI,WACJC,GAAI,eACJzD,OAAQgB,EACRyH,UAAWzH,EACX2H,SAAU3H,EACVsM,QACCqG,EAAG,EAAGC,EAAG,EACTrG,MAAO5J,EACPyR,OAAQzR,EACRsX,OAAQtX,EACR6D,OAAQ,yBAETiL,OAAQ,SAAS/P,EAAKyS,GACrBrV,EAAEM,MAAM0W,QAAQ3B,GACfvP,SAAU,IACVmP,MAAO/T,MAIV0C,MACC1D,OAAQgB,EACRF,MAAO,aACP2R,OAAQ9O,EACR+B,MAAO,GACPgD,KAAM1H,EACN4C,MAAO5C,EACPwW,UAAWxW,GAEZ6C,MACC7D,OAAQgB,EACRF,MAAO,aACP2R,OAAQ9O,EACR+B,MAAO,EACPiB,MAAO3F,EACPiG,SAAUjG,EACVwZ,MAAO,SACP3G,SAAU7S,GAEX8C,OACCC,QAAS,GACTsO,OAAQrR,EACRyJ,MAAOzJ,EACP0J,OAAQ1J,EACR2X,IAAKhV,GAEN4D,QACCyF,OAAQ1M,EACR6b,KAAM7b,EACNoD,KAAMpD,EACNuD,KAAMvD,EACN8F,OAAQ9F,EACR+S,QAAS/S,EACT8b,OAAQ9b,EACR2W,MAAO3W,EACPiX,KAAMjX,GAGP,IAAI+b,IAMLC,GAAS,SACTC,GAAS,SACTC,GAAQ,QACRC,GAAW,mBACXC,GAAc,cACdC,GAAY,cAGZC,KAActd,EAAS8M,cAAc,UAAUyQ,WAG/CC,GAAU,8CAUN/S,MAAeD,IAAe,SAAU,IAAK,MAAO,KAuBxD,IAAI8S,GASH,GAAIG,IAAc1d,EAAO2d,kBAAoB,EAC5CC,GAAuB,WACtB,GAAIna,GAAUxD,EAAS8M,cAAc,UAAUyQ,WAAW,KAC1D,OAAO/Z,GAAQoa,wBAA0Bpa,EAAQqa,8BAAgCra,EAAQsa,2BACvFta,EAAQua,0BAA4Bva,EAAQwa,yBAA2B,KAE1EC,GAAQR,GAAcE,OAdvB,IAAIO,IAAY,SAASC,EAAK5T,EAAO/F,GACpC,MAAO,YAAY2Z,EAAI,4DAA4D5T,GAAO,IACzF,yCAAyC/F,GAAO,IAAK,OA0BxDhE,GAAE+C,OAAOwH,EAAIuC,WACZ/E,KAAM,SAAShI,GACd,GAAIiD,GAAS4a,CAGbA,GAAMtd,KAAKqR,QAAU5R,EAAKU,SAASmd,IAAM5d,EAAE,WAAasN,QAAS3M,EAAU,SAAUkd,UAAU9d,EAAKQ,SAGjGuc,IAEF9Z,EAAUhD,EAAE,cAAcgO,SAAS1N,KAAKqR,SAAS,GAAGoL,WAAW,MAG/D/Z,EAAQ8a,SAAW,QACnB9a,EAAQ+a,WAAa,IACrB/a,EAAQgb,SAGRhb,EAAU0a,GAAU,QAAS,oBAAqB,sBAClDpd,KAAKqR,QAAQI,KAAK/O,EAAUA,GAG5BjD,EAAK+Y,MAAO9Y,EAAE,IAAK4d,GAAKnH,IAAImH,IAAO,QAAS,aAAc,SAAS5c,GAASA,EAAMid,mBAAsB3d,KAAKkK,MAI9GzK,EAAK+Y,MAAM/Y,EAAKQ,QAAS,cAAeD,KAAKgH,WAAYhH,KAAKkK,IAAKlK,MAGnEA,KAAK4d,UAGNC,gBAAiB,WAChB7d,KAAKoK,KAAK,GAAKpK,KAAKH,QAAQyK,OAC5BtK,KAAKoK,KAAK,GAAKpK,KAAKH,QAAQwK,OAE7ByT,iBAAkB,WACjB9d,KAAKoK,KAAK,GAAKpK,KAAKH,QAAQwK,MAC5BrK,KAAKoK,KAAK,GAAKpK,KAAKH,QAAQyK,QAG7ByT,UAAW,SAASpI,GACnB,GAAI3D,GAAWhS,KAAKP,KAAKU,SAAS6R,QAClC,OAAOA,KACN2D,EAAOnC,IAAMxI,GAAQ2K,EAAOnC,IAAMpI,GAAUpL,KAAKqR,QAAQlO,WAAW6P,IAAOhT,KAAKoK,KAAK,GAAK,EAAKpK,KAAKH,QAAQsK,OAAS6H,EAASY,YAAYrP,KAI5Iya,aAAc,SAASrI,GACtB,GAAIvS,GAAKpD,KAAKP,KAAKI,QAAQsD,SAASC,EAcpC,OAXGuS,KAAW/U,GAASwC,IAAOxC,EAC7B+U,EAAS/U,EAEF+U,IAAWpS,EAClBoS,EAAS,GAAIlN,GAAQrF,EAAG0N,UAEhB6E,EAAO7E,SACf6E,EAAS,GAAIlN,GAAOkN,GACpBA,EAAOpP,MAAQhD,GAGToS,GAGRsI,YAAa,SAAStI,EAAQuI,EAAMC,GACnC,GAAIhe,GAAWH,KAAKP,KAAKU,SACxBkJ,EAAO8S,GAASpT,EAAMmV,GAAQ,OAE/B,QAAQC,EAAMtU,EAAOsU,EAAK9U,GACzBQ,EAAO1J,EAAS6B,QAASqH,IACzBQ,EAAO7J,KAAK+d,UAAUpI,IAAWxV,EAAS6R,UAAY7R,EAAS6B,QAASqH,IACxEQ,EAAO1J,EAASF,QAASoJ,KACpB,GAGP+U,aAAc,SAASzI,GACtB,GAAIxV,GAAWH,KAAKP,KAAKU,SACxBkJ,EAAO8S,GAASpT,EAAM4M,EAAOnC,GAAKzK,EAAM4M,EAAOpC,GAAK,QAErD,OAAO1H,IAAQC,GAAK,EAAI,EACvBjC,EAAO7J,KAAK+d,UAAUpI,IAAWxV,EAAS6R,UAAY7R,EAAS6B,QAASqH,IACxEQ,EAAO1J,EAASF,QAASoJ,IAAS,GAGpCgV,eAAgB,SAAS3W,EAAM2B,EAAMiV,GACpC,GAAI/U,GAAM7B,EAAKkC,IAAIP,EACnB,QAAQE,GAAQ+U,GAAW/U,IAAQ7B,EAAKkC,IAAI0U,IAAa5B,GAAQlW,KAAK+C,GAAO3I,EAAQ2I,GAGtFgV,cAAe,SAAS5I,GACvB,GAAIxV,GAAWH,KAAKP,KAAKU,SACxBmd,EAAMtd,KAAKqR,QAAQzH,IAAI,UAAW,IAClC4U,EAAarC,GAASpT,EAAM4M,EAAQA,EAAO9E,aAAgB9H,EAAMqT,IACjEqC,EAAYze,KAAK+d,UAAUpI,IAAWxV,EAAS6R,UAAY7R,EAAS6B,QACpE4H,EAAM5J,KAAKqe,eAAgBK,IAa5B,OAVAA,GAAM,GAAK9U,EAAI0T,EAAKjB,KAAazS,EAAI6U,EAAWpC,KAAazS,EAAIzJ,EAAS6B,QAASqa,KAClFzS,EAAIzJ,EAASF,QAASoc,KAAaiB,EAAI1T,IAAIyS,IAG5CqC,EAAM,GAAK9U,EAAI0T,EAAKkB,EAAYpC,KAAUxS,EAAI6U,EAAWD,EAAYpC,KACpExS,EAAIzJ,EAAS6B,QAASwc,EAAYpC,KAAUxS,EAAIzJ,EAASF,QAASue,EAAYpC,KAAUjc,EAASF,QAAQ2J,IAAI4U,GAG9G9e,EAAE,IAAK4d,GAAKnH,IAAImH,GAAK1T,IAAI,UAAWyS,GAAS,IAAIC,GAAYC,GAAU,IAAIJ,GAAO,KAAKI,GAAU,KAE1FmC,GAGRC,eAAgB,SAAShJ,GACxB,GAOCiJ,GAAQC,EAAOjO,EAPZ4C,EAAImC,EAAO9E,aAAehG,EAC7BR,EAAQrK,KAAKH,QAAe,MAC5ByK,EAAStK,KAAKH,QAAgB,OAC9Bif,EAA+B,MAApBnJ,EAAOvD,SAClB2M,GAAQvL,EAAInJ,EAAOC,IAAWwU,EAAW,GAAM,GAC/CE,EAAMlV,KAAKkV,IACXC,EAAQnV,KAAKmV,MAGdC,EAAWpV,KAAKqV,KAAMH,EAAID,EAAM,GAAKC,EAAI1U,EAAQ,IACjD8U,GAASpf,KAAKqf,OAASN,EAAQG,EAAWlf,KAAKqf,OAAS/U,EAAU4U,EASlE,OAPAE,GAAI,GAAKtV,KAAKqV,KAAMH,EAAII,EAAI,GAAI,GAAKJ,EAAIhf,KAAKqf,OAAQ,IACtDD,EAAI,GAAKtV,KAAKqV,KAAMH,EAAII,EAAI,GAAI,GAAKJ,EAAIhf,KAAKqf,OAAQ,IAEtDT,EAASM,EAAWE,EAAI,GAAKA,EAAI,IAAMN,EAAW,EAAIM,EAAI,IAC1DP,EAAQD,EAASM,EAEjBtO,GAAWqO,EAAMJ,EAAQxU,GAAQ4U,EAAMJ,EAAQvU,IACxCkJ,EAAI5C,EAASA,EAAO0O,WAI5BC,cAAe,SAAS5J,EAAQvL,EAAMoV,GACrCA,EAAQA,GAAS,EACjBpV,EAAOA,GAAQpK,KAAKoK,IAEpB,IAAIC,GAAQD,EAAK,GAAKoV,EACrBlV,EAASF,EAAK,GAAKoV,EACnBC,EAAS3V,KAAKC,KAAKM,EAAQ,GAAIqV,EAAU5V,KAAKC,KAAKO,EAAS,GAG7DqV,GACCC,IAAK,EAAE,EAAIvV,EAAMC,EAAQD,EAAM,GAC/BwV,IAAK,EAAE,EAAIxV,EAAM,EAAI,EAAEC,GACvBwV,IAAK,EAAExV,EAAQD,EAAM,EAAIA,EAAMC,GAC/ByV,IAAK,EAAE,EAAI,EAAEzV,EAASD,EAAMC,GAC5B0V,IAAK,EAAE1V,EAAQmV,EAAO,EAAIpV,EAAMC,GAChC2V,IAAK,EAAE,EAAI5V,EAAM,EAAIoV,EAAOnV,GAC5B4V,IAAK,EAAE,EAAI7V,EAAMqV,EAAS,EAAEpV,GAC5B6V,IAAK9V,EAAM,EAAGA,EAAMC,EAAQ,EAAEoV,GAO/B,OAHAC,GAAKS,GAAKT,EAAKC,GAAID,EAAKU,GAAKV,EAAKE,GAClCF,EAAKW,GAAKX,EAAKG,GAAIH,EAAKY,GAAKZ,EAAKI,GAE3BJ,EAAMhK,EAAOvD,WAIrBoO,YAAa,SAAS9d,EAAS+d,GAC9B/d,EAAQge,YACRhe,EAAQie,OAAOF,EAAO,GAAIA,EAAO,IACjC/d,EAAQke,OAAOH,EAAO,GAAIA,EAAO,IACjC/d,EAAQke,OAAOH,EAAO,GAAIA,EAAO,IACjC/d,EAAQme,aAGTjD,OAAQ,WAEP,GAAInc,GAAIzB,KAAK2V,QAAU6G,IAAa3Q,GAAQC,KAAO9L,KAAKge,aAAahe,KAAKH,QAAQ8V,OAclF,QAXK3V,KAAKua,UAAYva,KAAK2V,QAAmC,MAAzB3V,KAAK2V,OAAOvD,YAEhDpS,KAAKP,KAAKgB,MAAMkV,OAASlU,EAAEwU,QAG3BjW,KAAK8gB,UAIN9gB,KAAKqR,QAAQrL,OAAOhG,KAAKua,SAElBva,KAAK2V,QAGbmL,OAAQ,SAASnL,EAAQxS,GACxB,IAAInD,KAAKua,QAAW,MAAOva,KAE3B,IAOC0e,GAAO7N,EAAYnO,EACnB+d,EAAQM,EAAWC,EAAWC,EAAS5B,EARpClf,EAAWH,KAAKP,KAAKU,SACxBmd,EAAMtd,KAAKqR,QACX6P,EAAQ5D,EAAI6D,WACZthB,EAAUG,KAAKH,QACfuhB,EAAUphB,KAAKoK,KACfiX,EAAQxhB,EAAQwhB,MAChBpC,EAAQnV,KAAKmV,KAKVtJ,KAAUA,EAAS3V,KAAKP,KAAKgB,MAAMkV,QAAU3V,KAAK2V,QAGnD0L,IAAUzgB,EAASygB,EAAQ1L,GAI7B0L,EAAQ,GAAI5Y,GAAO4Y,GACnBA,EAAMxQ,WAAa8E,EAAO9E,WAEX,YAAZwQ,EAAM9N,EAAmB8N,EAAM9N,EAAIoC,EAAOpC,EACzB,YAAZ8N,EAAM7N,EAAmB6N,EAAM7N,EAAImC,EAAOnC,EAC1C6N,EAAM9N,IAAM8N,EAAM7N,IACzB6N,EAAO1L,EAAO9E,YAAe8E,EAAQA,EAAO9E,cAG9CA,EAAawQ,EAAMxQ,WAGhB8E,EAAO9E,aAAejG,EAAK5K,KAAK6d,kBAC5B7d,KAAK8d,mBAGZY,EAAQ1e,KAAK0e,MAAQ1e,KAAKue,cAAc5I,GAGrC+I,EAAM,KAAOpC,IAEf+C,EAASrf,KAAKqf,OAASrf,KAAKie,YAAYtI,EAAQA,EAAOA,EAAO9E,aAG3DhR,EAAQwf,QAAmB,EAATA,IAAe3C,GAAQlW,KAAKkY,EAAM,MAAOA,EAAM,GAAKA,EAAM,IAG/E1e,KAAKqf,OAASA,EAASxf,EAAQwf,SAAW9b,EAAO1D,EAAQwf,OAASA,GAI5Drf,KAAKqf,OAASA,EAAS,EAG9B4B,EAAUjhB,KAAKoK,KAAOpK,KAAK2e,eAAehJ,GAC1C2H,EAAI1T,KACHS,MAAO4W,EAAQ,GACf3W,OAAQ2W,EAAQ,GAChBK,WAAYL,EAAQ,GAAG,OAKvBD,EADErL,EAAO9E,aAAehG,GAEvBoU,EAAMoC,EAAM9N,IAAMtI,EAAOoU,EAASgC,EAAM9N,IAAMpI,EAAQ8V,EAAQ,GAAKG,EAAQ,GAAK/B,GAAU4B,EAAQ,GAAKG,EAAQ,IAAM,GACrHnC,EAAMoC,EAAM7N,IAAMxI,EAAMiW,EAAQ,GAAKG,EAAQ,GAAK,KAKlDnC,EAAMoC,EAAM9N,IAAMtI,EAAOgW,EAAQ,GAAKG,EAAQ,GAAK,GACnDnC,EAAMoC,EAAM7N,IAAMxI,EAAMqU,EAASgC,EAAM7N,IAAMtI,EAAS+V,EAAQ,GAAKG,EAAQ,GAAK/B,GAAU4B,EAAQ,GAAKG,EAAQ,IAAM,IAKpH5E,IAEF9Z,EAAUwe,EAAM,GAAGzE,WAAW,MAC9B/Z,EAAQ6e,UAAW7e,EAAQgb,OAC3Bhb,EAAQ8e,UAAU,EAAE,EAAE,IAAK,KAG3Bf,EAASzgB,KAAKuf,cAAc8B,EAAOD,EAASjE,IAC5C4D,EAAY/gB,KAAKuf,cAAc8B,EAAOrhB,KAAKoK,KAAM+S,IAGjD+D,EAAMnhB,KAAK+K,EAAOmW,EAAQ,GAAK9D,IAAOpd,KAAKgL,EAAQkW,EAAQ,GAAK9D,IAChE+D,EAAMtX,IAAIkB,EAAOmW,EAAQ,IAAIrX,IAAImB,EAAQkW,EAAQ,IAGjDjhB,KAAKwgB,YAAY9d,EAASqe,GAC1Bre,EAAQ+e,UAAY/C,EAAM,GAC1Bhc,EAAQgf,OAGRhf,EAAQse,UAAUA,EAAU,GAAK7D,GAAO6D,EAAU,GAAK7D,IACvDnd,KAAKwgB,YAAY9d,EAAS+d,GAC1B/d,EAAQ+e,UAAY/C,EAAM,GAC1Bhc,EAAQgf,SAMRjB,EAASzgB,KAAKuf,cAAc8B,GAG5BZ,EAAS,IAAMA,EAAO,GAAK,IAAMA,EAAO,GAAK,KAAOA,EAAO,GAC1D,IAAMA,EAAO,GAAK,IAAMA,EAAO,GAAK,IAAMA,EAAO,GAAK,MAGvDO,EAAU,GAAK3B,GAAU,UAAU7Y,KAAKmP,EAAO7E,UAC/B,IAAfjF,GAAQC,GAAW,EAAI,EAAI,EAG5BoV,EAAMtX,KACL+X,UAAYV,EAAQ,GAAG5B,EAAU,KAAO4B,EAAQ,GAAG5B,GACnDuC,UAAW,IAAIP,EAAMvQ,SAASwJ,QAAQlP,GAAU,IAChD2H,KAAMiO,EAAU,GAAMA,EAAU,GAAKa,OAAOhR,IAAejG,GAC3DoI,IAAKgO,EAAU,GAAMA,EAAU,GAAKa,OAAOhR,IAAehG,GAC1DR,MAAO4W,EAAQ,GAAK5B,EACpB/U,OAAQ2W,EAAQ,GAAK5B,IAErBzb,KAAK,SAASM,GACd,GAAI4d,GAAQpiB,EAAEM,KAGd8hB,GAAOA,EAAMzY,KAAO,OAAS,SAC5BsY,UAAYV,EAAQ,GAAG5B,EAAU,KAAO4B,EAAQ,GAAG5B,GACnD0C,KAAMtB,EACNuB,UAAWtD,EAAM,GACjBuD,SAAU/d,EACVge,SAAUhe,IAEV8B,UAAUqZ,IAAUnb,KAGpBA,GAAK4d,EAAMrQ,KAAM2L,GACjB,SAAU,WAAmB,EAAPiC,EAAU,cAAcX,EAAM,GAAG,6CAO1Dzf,EAAOkjB,OAAS1c,WAAW,WAC1BtF,EAASmd,IAAI1T,KACZ2H,QAAS,eACTC,WAAY,aAEX,GAGArO,IAAavC,GAASZ,KAAKoiB,UAAUzM,EAAQsL,IAGjDmB,UAAW,SAASzM,EAAQvL,GAC3B,IAAIpK,KAAKua,QAAW,MAAO3Z,EAE3B,IAMCiQ,GAAYwR,EANTxV,EAAO7M,KACVG,EAAWH,KAAKP,KAAKU,SACrBmd,EAAMtd,KAAKqR,QACXiR,EAAatiB,KAAKH,QAAQsK,OAE1BhH,GADWhD,EAASF,QAAQ4F,SAAS,gBAsCtC,OAjCA8P,GAASA,GAAU3V,KAAK2V,OACxB9E,EAAa8E,EAAO9E,WAGpBzG,EAAOA,GAAQpK,KAAK2e,eAAehJ,GAGnC0M,GAAY1M,EAAOpC,EAAGoC,EAAOnC,GAC1B3C,IAAejG,GAAKyX,EAAQ/C,UAG/B5f,EAAEkE,KAAKye,EAAS,SAASne,EAAGga,GAC3B,GAAIqE,GAAGtC,EAAIL,CAER1B;IAAS9S,GACXmX,EAAI1R,IAAehG,EAAII,EAAOD,EAC9B7H,EAAUof,GAAM,MAChBpf,EAAS+Y,GAAO,IAAMqG,IAAMzY,KAAKmV,MAAM7U,EAAMyG,IAAehG,EAAI,EAAI,GAAM,GAAKyX,IAG/EC,EAAI1V,EAAKoR,YAAYtI,EAAQuI,EAAM/d,EAASF,SAC5CggB,EAAKpT,EAAKoR,YAAYtI,EAAQuI,EAAM/d,EAAS6B,SAC7C4d,EAAK/S,EAAKuR,aAAazI,GAEvBxS,EAAU+a,GAASpU,KAAK0Y,KAAK3V,EAAKwS,OAAQnb,EAAI+b,EAAMqC,GAAc1C,EAAK2C,EAAI3C,GAAM2C,OAKnFpf,EAAUwS,EAAO9E,KAAiBzG,EAAMyG,IAAejG,EAAI,EAAI,GAG/D0S,EAAI1T,KAAM6Y,OAAQ,GAAIzP,IAAK,GAAI0P,OAAQ,GAAI3P,KAAM,GAAI4P,MAAO,KAAM/Y,IAAIzG,GAC/DA,GAGR6D,WAAY,SAAStG,EAAO4B,EAAKyS,GAYhC,QAAS6N,GAAUC,EAAWhS,EAAYiS,EAAW5E,EAAM6E,GAEvDF,IAAcvX,GAAS0X,EAAUnS,aAAeA,GAAc3D,EAAOgR,IAAS8E,EAAUF,KAAe1X,EACzG4X,EAAUnS,WAAamS,EAAUnS,aAAejG,EAAIC,EAAID,EAEjDiY,IAAcvX,GAAS4B,EAAOgR,KACrC8E,EAAUnS,GAAcmS,EAAUnS,KAAgBzF,EAChD8B,EAAOgR,GAAQ,EAAIA,EAAO6E,EAAaC,EAAUnS,KAAgBqN,EAAO6E,EAAW7E,GAIvF,QAAS+E,GAAUC,EAAIhF,EAAM6E,GACzBC,EAAUE,KAAQ9X,EACpBxB,EAAIsS,GAAO,IAAIgC,GAAQiF,EAAMD,GAAM/Y,EAAO+R,GAAO,IAAIgC,GAAQhR,EAAOgR,IAGpEzU,EAAQU,EAAO4Y,KAAc5jB,GAC1B+N,EAAOgR,IAAQ/T,EAAO+T,MAAahR,EAAOgR,GAAO/T,EAAO+T,KAEtDiF,EAAMD,GAAMpZ,KAAK0Y,IAAI/Y,EAAM,GAAIA,EAAM,KAAOA,EAAM,KACtDsL,EAAImJ,IAAShR,EAAOgR,GACpBiF,EAAMjF,GAAQtd,GAGfgJ,EAAKO,EAAO4Y,KAAc5jB,EAAY4jB,EAAW7E,GAASiF,EAAMD,IAnClE,GAAIljB,KAAKua,QAAT,CAEA,GAOCpQ,GAAkBV,EAPfhJ,EAAQ6B,EAAI7B,MACfuiB,EAAYhjB,KAAK2V,OAAOM,QACxB/I,EAAS6H,EAAIxC,SACbnL,EAAS9E,EAAIzC,QAAQsD,SAAS+J,OAAO9F,OAAO/C,MAAM,KAClD+e,EAAahc,EAAO,GACpBic,EAAWjc,EAAO,IAAMA,EAAO,GAC/B+b,GAAUpQ,KAAMnS,EAAOoS,IAAKpS,EAAO2S,EAAG,EAAGC,EAAG,GACpC5J,IA+BN5J,MAAK2V,OAAOpP,QAAUhD,IAExBqf,EAAUQ,EAAYxY,EAAGC,EAAGI,EAAME,GAClCyX,EAAUS,EAAUxY,EAAGD,EAAGI,EAAKE,IAG5B8X,EAAUlS,WAAarQ,EAAMkV,OAAO7E,UAAYrQ,EAAM6iB,YAAcpW,EAAO8F,KAAOvS,EAAM8iB,aAAerW,EAAO6F,OAChH/S,KAAK8gB,OAAOkC,EAAWpiB,IAKzBuJ,EAASnK,KAAKoiB,UAAUY,GAGrB7Y,EAAOwY,QAAUxjB,IAAagL,EAAO4I,MAAQ5I,EAAOwY,OACpDxY,EAAOuY,SAAWvjB,IAAagL,EAAO6I,KAAO7I,EAAOuY,QACvDvY,EAAOqZ,KAAOxjB,KAAKmK,QAGhBgZ,EAAMpQ,KAAQqQ,IAAe9X,KAAW4B,EAAO6F,OAASkQ,EAAUrY,EAAGK,EAAME,IAC3EgY,EAAMnQ,IAAOqQ,IAAa/X,KAAW4B,EAAO8F,MAAQiQ,EAAUpY,EAAGG,EAAKE,GAOzElL,KAAKqR,QAAQzH,IAAIA,GAAK5D,SAClBmd,EAAM5P,GAAK4P,EAAM3P,GAAOwP,EAAUzP,IAAMnI,GAAU+X,EAAM3P,GAAOwP,EAAUxP,IAAMpI,GAAU+X,EAAM5P,IAInGwB,EAAIhC,MAAQ5I,EAAO4I,KAAK9J,OAASkB,EAAOqZ,KACvCJ,IAAe9X,GAAS6X,EAAMnQ,MAAQmQ,EAAMpQ,OAASoQ,EAAMnQ,IAAM7I,EAAO4I,KAAO/S,KAAKqf,OAAS,EAC9FtK,EAAI/B,KAAO7I,EAAO6I,IAAI/J,OAASkB,EAAOqZ,KACrCH,IAAa/X,GAAS6X,EAAMpQ,OAASoQ,EAAMpQ,OAASoQ,EAAMnQ,IAAM7I,EAAO6I,IAAMhT,KAAKqf,OAAS,EAG5F5e,EAAM8iB,WAAarW,EAAO6F,KAAMtS,EAAM6iB,UAAYpW,EAAO8F,IACzDvS,EAAMkV,OAASqN,EAAU/M,UAG1B3H,QAAS,WAERtO,KAAKP,KAAKmZ,QAAQ5Y,KAAKP,KAAKQ,QAASD,KAAKkK,KAGvClK,KAAKP,KAAKU,SAASmd,KACrBtd,KAAKP,KAAKU,SAASmd,IAAI3O,KAAK,KAC1BC,SAASC,MAAMD,YAKpBqN,GAAMpY,EAAQyZ,IAAM,SAAShb,GAC5B,MAAO,IAAI2H,GAAI3H,EAAKA,EAAIzC,QAAQ6D,MAAM4Z,MAIvCrB,GAAI/N,WAAa,SAGjB+N,GAAInY,SAAW,SAASjE,GACvB,GAAGA,EAAQ6D,OAAS,OAAS7D,GAAQ6D,MAAO,CAC3C,GAAI3B,GAAOlC,EAAQ6D,MAAM4Z,GACN,iBAATvb,KAAqBA,EAAOlC,EAAQ6D,MAAM4Z,KAAQ3H,OAAQ5T,IAChE,kBAAoByE,WAAYzE,GAAK4T,UAAW5T,EAAK4T,OAASpS,KAKpEmH,EAAO4S,KACNmG,gDAAiD,WAEhDzjB,KAAK4d,SAGL5d,KAAKP,KAAKuH,cAEX0c,6BAA8B,SAASzf,GAEtCjE,KAAKoK,MAASnG,EAAIoG,MAAOpG,EAAIqG,QAC7BtK,KAAK8gB,SAGL9gB,KAAKP,KAAKuH,cAEX2c,yCAA0C,WACzC3jB,KAAK8gB,WAKPphB,EAAE+C,OAAOc,EAAM+D,EAAKc,UACnB1E,OACC4Z,KACC3H,OAAQpS,EACR8d,MAAOzgB,EACPyJ,MAAO,EACPC,OAAQ,EACR+U,OAAQ9b,EACR4G,OAAQ,KAIV,IAAIyZ,IAAOC,GACXC,GAAa,aACbC,GAAgB,IAAID,EAErBD,IAAU,WAST,QAASG,GAAU3S,GAElB,GAAG3R,EAAEukB,KAAK,KAAKD,UAAa,MAAOtkB,GAAEukB,KAAK,KAAKD,SAE/C,IAECE,GAAKC,EAAS5jB,EAFX6jB,GAAoB1P,MAAMhV,EAAEK,KAAKsR,EAAS,aAC7CgJ,EAAWhJ,EAAQgJ,UAAYhJ,EAAQgJ,SAAS1J,aAGjD,OAAG,SAAW0J,GACb6J,EAAM7S,EAAQgT,WACdF,EAAUD,EAAIlc,KACVqJ,EAAQiT,MAASH,GAA0C,QAA/BD,EAAI7J,SAAS1J,eAG7CpQ,EAAMb,EAAE,eAAiBykB,EAAU,KAAK,KAC/B5jB,GAAOA,EAAI+T,GAAG,cAHf,GAKD,sCAAsC9N,KAAM6T,IACjDhJ,EAAQ1Q,SACT,MAAQ0Z,EACPhJ,EAAQiT,MAAQF,EAChBA,EAKJ,QAASG,GAAYC,GAEjBC,EAAe9iB,OAAS,GAAK6iB,EAAU7iB,OAAU6iB,EAAUxN,IAAI,QAAQG,OAGnEsN,EAAeC,QAAQ7N,QAI/B,QAAS8N,GAAWjkB,GACnB,GAAIgH,EAAK4M,GAAG,YAAZ,CAEA,GAGCsQ,GAHGhlB,EAASF,EAAEgB,EAAMd,QACpBK,EAAU4kB,EAAQ5kB,QAClBoI,EAAYzI,EAAOwG,QAAQC,EAI5Bue,GAAcvc,EAAU1G,OAAS,EAAIf,EACnC8W,SAASrP,EAAU,GAAG3E,MAAMiU,OAAQ,IAAMD,SAASzX,EAAQ,GAAGyD,MAAMiU,OAAQ,IAK1EiN,GAAehlB,EAAOwG,QAAQC,GAAU,KAAOpG,EAAQ,IAC1DskB,EAAY3kB,GAIbklB,EAASpkB,EAAMd,SAAW6kB,EAAeA,EAAe9iB,OAAS,IA9DlE,GAECkjB,GAASC,EACTC,EAAWrd,EAHRmF,EAAO7M,KACVykB,IAgED/kB,GAAE+C,OAAOoK,GACRpF,KAAM,WA0BL,MAxBAC,GAAOmF,EAAKnF,KAAOhI,EAAE,WACpBI,GAAI,eACJ2R,KAAM,cACNuT,UAAW,WAAa,MAAOpkB,MAE/B6C,OAGD/D,EAAER,EAASmI,MAAMyP,KAAK,UAAUiN,GAAeY,GAG/CjlB,EAAER,GAAU4X,KAAK,UAAUiN,GAAe,SAASrjB,GAC/CmkB,GAAWA,EAAQhlB,QAAQyD,KAAK2hB,MAAMC,QAA4B,KAAlBxkB,EAAMykB,SACxDN,EAAQphB,KAAK/C,KAKfgH,EAAKoP,KAAK,QAAQiN,GAAe,SAASrjB,GACtCmkB,GAAWA,EAAQhlB,QAAQyD,KAAK2hB,MAAM9N,MACxC0N,EAAQphB,KAAK/C,KAIRmM,GAGRiU,OAAQ,SAASxe,GAEhBuiB,EAAUviB,EAITmiB,EADEniB,EAAIzC,QAAQyD,KAAK2hB,MAAMG,aAAexkB,EACvB0B,EAAIrC,QAAQ0O,KAAK,KAAKmJ,OAAO,WAC7C,MAAOkM,GAAUhkB,YAMpBgG,OAAQ,SAAS1D,EAAK4T,EAAO1Q,GAC5B,GACCvF,IADaP,EAAER,EAASmI,MACd/E,EAAIrC,SACdJ,EAAUyC,EAAIzC,QAAQyD,KAAK2hB,MAC3B5S,EAASxS,EAAQwS,OACjB9Q,EAAO2U,EAAQ,OAAQ,OACvBjD,EAAUvL,EAAK4M,GAAG,YAClB+Q,EAAgB3lB,EAAEqkB,IAAejM,OAAO,2BAA2Bd,IAAI/W,EAqBxE,OAjBA4M,GAAKiU,OAAOxe,GAIT4T,GAASrW,EAAQulB,aAAexkB,GAClC2jB,EAAa7kB,EAAE,WAIhBgI,EAAK+F,YAAY,QAAS5N,EAAQsX,MAG/BjB,GACFxO,EAAKgG,SAASxO,EAASmI,MAIpBK,EAAK4M,GAAG,cAAgBrB,IAAYiD,GAAS6O,IAAcnkB,IAAYsV,GAASmP,EAAc1jB,OAC1FkL,GAIRnF,EAAKgH,KAAKnL,EAAM3C,GAGblB,EAAEgC,WAAW2Q,GACfA,EAAO1M,KAAK+B,EAAMwO,GAIX7D,IAAWzR,EAClB8G,EAAMnG,KAKNmG,EAAK6P,OAAQG,SAASlS,EAAU,KAAO,GAAI0Q,EAAQ,EAAI,EAAG,WACrDA,GAASxO,EAAKjE,SAKhByS,GACHxO,EAAKiN,MAAM,SAASC,GACnBlN,EAAKkC,KAAMmJ,KAAM,GAAIC,IAAK,KACtBtT,EAAEqkB,IAAepiB,QAAU+F,EAAK4d,SACpC1Q,MAKFmQ,EAAY7O,EAGT2O,EAAQ7jB,YAAa6jB,EAAU3kB,GAE3B2M,MAITA,EAAKpF,QAENoc,GAAU,GAAIA,IASdnkB,EAAE+C,OAAO8H,EAAMiC,WACd/E,KAAM,SAAShI,GACd,GAAIQ,GAAUR,EAAKQ,OAGnB,OAAID,MAAKH,QAAQyY,IAGjB7Y,EAAKU,SAASolB,QAAU1B,GAAQnc,KAGhCzH,EAAQmQ,SAAS0T,IAAYla,IAAI,UAAWtC,EAAKke,aAAe9lB,EAAEqkB,IAAepiB,QAGjFlC,EAAK+Y,MAAMvY,GAAU,cAAe,eAAgB,SAASS,EAAO4B,EAAKkD,GACxE,GAAIigB,GAAS/kB,EAAMmY,aAGnB,IAAGnY,EAAMd,SAAWK,EAAQ,GAC3B,GAAGwlB,GAAyB,gBAAf/kB,EAAMa,MAA0B,qBAAqBiF,KAAKif,EAAOlkB,OAAS7B,EAAE+lB,EAAOvf,eAAeE,QAAQyd,GAAQnc,KAAK,IAAI/F,OACvI,IAAMjB,EAAM+F,iBAAoB,MAAME,UAE9B8e,GAAWA,GAA0B,gBAAhBA,EAAOlkB,OACpCvB,KAAKgG,OAAOtF,EAAsB,gBAAfA,EAAMa,KAAwBiE,IAGjDxF,KAAKkK,IAAKlK,MAGbP,EAAK+Y,MAAMvY,EAAS,eAAgB,SAASS,EAAO4B,GAEnD,IAAG5B,EAAMoY,sBAAwBpY,EAAMd,SAAWK,EAAQ,GAA1D,CAEA,GAAIuX,GAAQ9X,EAAEqkB,IAGdnM,EAAWtQ,EAAKke,aAAehO,EAAM7V,OACrC8V,EAAWC,SAASzX,EAAQ,GAAGyD,MAAMiU,OAAQ,GAG7CkM,IAAQnc,KAAK,GAAGhE,MAAMiU,OAASC,EAAW,EAG1CJ,EAAM5T,KAAK,WACP5D,KAAK0D,MAAMiU,OAASF,IACtBzX,KAAK0D,MAAMiU,QAAU,KAKvBH,EAAMM,OAAO,IAAMpM,GAAajM,KAAK,OAAQiB,EAAMmY,eAGnD5Y,EAAQmQ,SAAS1E,GAAa,GAAGhI,MAAMiU,OAASC,EAGhDiM,GAAQ/C,OAAOxe,EAGf,KAAM5B,EAAM+F,iBAAoB,MAAME,OACpC3G,KAAKkK,IAAKlK,UAGbP,GAAK+Y,MAAMvY,EAAS,cAAe,SAASS,GACxCA,EAAMd,SAAWK,EAAQ,IAC3BP,EAAEqkB,IAAejM,OAAO,YAAYd,IAAI/W,GAASylB,OAAOjmB,KAAK,QAASiB,IAErEV,KAAKkK,IAAKlK,OA9DiBA,MAiE/BgG,OAAQ,SAAStF,EAAOwV,EAAO1Q,GAE9B,MAAG9E,IAASA,EAAMoY,qBAA+B9Y,SAGjD6jB,IAAQ7d,OAAOhG,KAAKP,OAAQyW,EAAO1Q,IAGpC8I,QAAS,WAERtO,KAAKP,KAAKQ,QAAQkQ,YAAY2T,IAG9B9jB,KAAKP,KAAKmZ,QAAQ5Y,KAAKP,KAAKQ,QAASD,KAAKkK,KAG1C2Z,GAAQ7d,OAAOhG,KAAKP,KAAMmB,SACnBZ,MAAKP,KAAKU,SAASolB,WAK5B3B,GAAQ/f,EAAQohB,MAAQ,SAAS3iB,GAChC,MAAO,IAAIiI,GAAMjI,EAAKA,EAAIzC,QAAQyD,KAAK2hB,QAIxCrB,GAAM9f,SAAW,SAAS/B,GACtBA,EAAKuB,OACuB,gBAApBvB,GAAKuB,KAAK2hB,MAAsBljB,EAAKuB,KAAK2hB,OAAU3M,KAAMvW,EAAKuB,KAAK2hB,OACxC,mBAAvBljB,GAAKuB,KAAK2hB,MAAM3M,KAAsBvW,EAAKuB,KAAK2hB,MAAM3M,GAAK/U,KAK5E+D,EAAKke,aAAele,EAAKuQ,OAAS,IAGlC+L,GAAM1V,WAAa,SAGnBxD,EAAOua,OACNU,yBAA0B,WAEzB3lB,KAAKsO,UACLtO,KAAKyH,OAGLzH,KAAKP,KAAK+b,MAAM+J,QAAQvf,OACvBhG,KAAKP,KAAKQ,QAAQ,GAAG8G,YAAc,KAMtCrH,EAAE+C,OAAOc,EAAM+D,EAAKc,UACnB9E,MACC2hB,OACC3M,GAAI1X,EACJyR,OAAQ9O,EACR4T,KAAM5T,EACN6hB,WAAY7hB,EACZ2hB,OAAQ3hB,MAIVM,EAAQ0E,SAAW,SAASjG,EAAKa,EAAUwE,EAAYkL,EAAaC,EAAc8S,EAAWC,GAkC7F,QAASzD,GAAUlE,EAAM4H,EAAWvkB,EAAM2L,EAAQ6Y,EAAOC,EAAOC,EAAYC,EAAcC,GACzF,GAAIC,GAAajjB,EAAS4iB,GACzBM,EAASjjB,EAAG8a,GACZoI,EAASjjB,EAAG6a,GACZqI,EAAUhlB,IAAS+J,EACnBkb,EAAWH,IAAWN,EAAQI,EAAaE,IAAWL,GAASG,GAAcA,EAAa,EAC1FM,EAAWH,IAAWP,EAAQG,EAAeI,IAAWN,GAASE,GAAgBA,EAAe,EAChGQ,EAAaC,EAAeZ,GAASa,EAAeb,IAAUc,EAAkB,EAAIC,EAAgBf,IACpGgB,EAAYL,EAAaN,EACzBY,EAAYZ,EAAaD,GAAcF,IAAenb,EAAQmc,EAAgBC,GAAkBR,EAChGvc,EAASqc,GAAYpjB,EAAGyN,aAAeqN,GAAQmI,IAAWjjB,EAAG0iB,GAAaW,EAAW,IAAMH,IAAWlb,EAAS8a,EAAe,EAAI,EAgDnI,OA7CGK,IACFpc,GAAUkc,IAAWN,EAAQ,EAAI,IAAMS,EAGvCrjB,EAAS4iB,IAAUgB,EAAY,EAAIA,EAAYC,EAAY,GAAKA,EAAY,EAC5E7jB,EAAS4iB,GAASjc,KAAK0Y,KACrBsE,EAAgBf,GAASa,EAAeb,GACzCK,EAAajc,EACbL,KAAKqd,IACJrd,KAAK0Y,KACHsE,EAAgBf,GAASa,EAAeb,IAAUE,IAAenb,EAAQmc,EAAgBC,GAC1Fd,EAAajc,GAEdhH,EAAS4iB,GAGE,WAAXM,EAAsBD,EAAaI,EAAW,QAShDtZ,GAAW3L,IAAS8J,EAAa,EAAI,EAGlC0b,EAAY,IAAMV,IAAWN,GAASiB,EAAY,IACpD7jB,EAAS4iB,IAAU5b,EAAS+C,EAC5Bka,EAAMtR,OAAOoI,EAAM6H,IAIZiB,EAAY,IAAMX,IAAWL,GAASe,EAAY,KACzD5jB,EAAS4iB,KAAWM,IAAWjb,GAAUjB,EAASA,GAAU+C,EAC5Dka,EAAMtR,OAAOoI,EAAM8H,IAIjB7iB,EAAS4iB,GAASY,IAAmBxjB,EAAS4iB,GAASiB,IACzD7jB,EAAS4iB,GAASK,EAAYgB,EAAQhkB,EAAG6S,UAIpC9S,EAAS4iB,GAASK,EA1F1B,GAYC7f,GAAO6gB,EAAON,EAAiBD,EAC/BI,EAAeC,EAAgBP,EAAgBC,EAb5ChnB,EAAS+H,EAAW/H,OACvBK,EAAUqC,EAAInC,SAASF,QACvBmD,EAAKuE,EAAWvE,GAChBC,EAAKsE,EAAWtE,GAChB6J,EAASvF,EAAWuF,OACpB9F,EAAS8F,EAAO9F,OAAO/C,MAAM,KAC7BgjB,EAAUjgB,EAAO,GACjBkgB,EAAUlgB,EAAO,IAAMA,EAAO,GAC9BmB,EAAWZ,EAAWY,SACtBF,EAAYV,EAAWU,UAEvBkK,GADQjQ,EAAI7B,OACCsS,KAAM,EAAGC,IAAK,GAK5B,OAAIzK,GAAS3G,QAAUhC,EAAO,KAAOX,GAAUW,EAAO,KAAOV,EAASmI,MAA0B,SAAlB6F,EAAO9F,QAKrF0f,EAAkBze,EAAU8B,UAAYoI,EACxCsU,EAAgD,WAA9Bxe,EAAUuB,IAAI,YAGhCrD,EAAoC,UAA5BtG,EAAQ2J,IAAI,YACpBqd,EAAgB1e,EAAS,KAAOtJ,EAASsJ,EAAS8B,QAAU9B,EAASmK,WAAW9R,GAChFsmB,EAAiB3e,EAAS,KAAOtJ,EAASsJ,EAAS+B,SAAW/B,EAASqK,YAAYhS,GACnF+lB,GAAmB5T,KAAMxM,EAAQ,EAAIgC,EAAS0L,aAAcjB,IAAKzM,EAAQ,EAAIgC,EAAS4L,aACtFyS,EAAiBre,EAAS4B,UAAYoI,GAiEvB,UAAZ8U,GAAmC,UAAZC,KAAuBF,EAAQhkB,EAAG6S,SAG5D1D,GACCQ,KAAkB,SAAZsU,EAAqBjF,EAAWxX,EAAGC,EAAGwc,EAASna,EAAOqG,EAAGtI,EAAME,EAAOL,EAAO+H,EAAa+S,GAAc,EAC9G5S,IAAiB,SAAZsU,EAAqBlF,EAAWvX,EAAGD,EAAG0c,EAASpa,EAAOsG,EAAGxI,EAAKE,EAAQH,EAAQ+H,EAAc+S,GAAe,EAChHziB,GAAIgkB,IAnFG7U,GAwFR1O,EAAQ0jB,OAIRC,QAAS,SAASC,EAAY9R,GAC7B,GAQOf,GAIP8S,EAAUC,EAZN/W,GACHvG,MAAO,EAAGC,OAAQ,EAClBnH,UACC6P,IAAK,KAAM2P,MAAO,EAClBD,OAAQ,EAAG3P,KAAM,MAElB0B,WAAY7T,GAEbsD,EAAI,EACJuc,KACAmH,EAAW,EAAGC,EAAW,EACzBC,EAAQ,EAAGC,EAAQ,CAII,KAAvB7jB,EAAIujB,EAAW9lB,OAAcuC,KAC5B0Q,GAAS8C,SAAS+P,IAAavjB,GAAI,IAAKwT,SAAS+P,EAAWvjB,EAAE,GAAI,KAE/D0Q,EAAK,GAAKhE,EAAOzN,SAASwf,QAAQ/R,EAAOzN,SAASwf,MAAQ/N,EAAK,IAC/DA,EAAK,GAAKhE,EAAOzN,SAAS4P,OAAOnC,EAAOzN,SAAS4P,KAAO6B,EAAK,IAC7DA,EAAK,GAAKhE,EAAOzN,SAASuf,SAAS9R,EAAOzN,SAASuf,OAAS9N,EAAK,IACjEA,EAAK,GAAKhE,EAAOzN,SAAS6P,MAAMpC,EAAOzN,SAAS6P,IAAM4B,EAAK,IAE9D6L,EAAO1b,KAAK6P,EAQb,IAJA8S,EAAW9W,EAAOvG,MAAQP,KAAK8Q,IAAIhK,EAAOzN,SAASwf,MAAQ/R,EAAOzN,SAAS4P,MAC3E4U,EAAY/W,EAAOtG,OAASR,KAAK8Q,IAAIhK,EAAOzN,SAASuf,OAAS9R,EAAOzN,SAAS6P,KAGvD,MAApB2C,EAAOvD,SACTxB,EAAOzN,UACN4P,KAAMnC,EAAOzN,SAAS4P,KAAQnC,EAAOvG,MAAQ,EAC7C2I,IAAKpC,EAAOzN,SAAS6P,IAAOpC,EAAOtG,OAAS,OAGzC,CAEJ,KAAMod,EAAW,GAAKC,EAAY,GAAKC,EAAW,GAAKC,EAAW,GAa9C,IAXnBH,EAAW5d,KAAKke,MAAMN,EAAW,GACjCC,EAAY7d,KAAKke,MAAML,EAAY,GAEhChS,EAAOpC,IAAMtI,EAAO2c,EAAWF,EAC1B/R,EAAOpC,IAAMpI,EAAQyc,EAAWhX,EAAOvG,MAAQqd,EACjDE,GAAY9d,KAAKke,MAAMN,EAAW,GAErC/R,EAAOnC,IAAMxI,EAAM6c,EAAWF,EACzBhS,EAAOnC,IAAMtI,EAAS2c,EAAWjX,EAAOtG,OAASqd,EACnDE,GAAY/d,KAAKke,MAAML,EAAY,GAEzCzjB,EAAIuc,EAAO9e,OAAcuC,OAErBuc,EAAO9e,OAAS,IAEnBmmB,EAAQrH,EAAOvc,GAAG,GAAK0M,EAAOzN,SAAS4P,KACvCgV,EAAQtH,EAAOvc,GAAG,GAAK0M,EAAOzN,SAAS6P,KAEnC2C,EAAOpC,IAAMtI,GAAQ6c,GAASF,GACjCjS,EAAOpC,IAAMpI,GAAkByc,GAATE,GACtBnS,EAAOpC,IAAMnI,IAAmBwc,EAARE,GAAoBA,EAASlX,EAAOvG,MAAQud,IACpEjS,EAAOnC,IAAMxI,GAAO+c,GAASF,GAC7BlS,EAAOnC,IAAMtI,GAAmB2c,GAATE,GACvBpS,EAAOnC,IAAMpI,IAAmByc,EAARE,GAAoBA,EAASnX,EAAOtG,OAASud,KACrEpH,EAAOjH,OAAOtV,EAAG,EAIpB0M,GAAOzN,UAAa4P,KAAM0N,EAAO,GAAG,GAAIzN,IAAKyN,EAAO,GAAG,IAGxD,MAAO7P,IAGRqX,KAAM,SAASC,EAAIC,EAAIC,EAAIC,GAC1B,OACChe,MAAOP,KAAK8Q,IAAIwN,EAAKF,GACrB5d,OAAQR,KAAK8Q,IAAIyN,EAAKF,GACtBhlB,UACC4P,KAAMjJ,KAAKqd,IAAIe,EAAIE,GACnBpV,IAAKlJ,KAAKqd,IAAIgB,EAAIE,MAKrBC,SACCtI,GAAI,IAAOF,GAAI,EAAI,EAAGC,GAAI,EAAI,EAC9BE,GAAI,GAAOL,GAAI,IAAOC,GAAI,IAC1BK,GAAI,EAAGC,GAAI,EAAG1e,EAAG,GAElB8mB,QAAS,SAASC,EAAIC,EAAIC,EAAIC,EAAIhT,GACjC,GAAIlU,GAAIoC,EAAQ0jB,MAAMe,QAAS3S,EAAOvD,UACrCwW,EAAY,IAANnnB,EAAU,EAAIinB,EAAK5e,KAAK+e,IAAKpnB,EAAIqI,KAAKgf,IAC5CC,EAAMJ,EAAK7e,KAAKkf,IAAKvnB,EAAIqI,KAAKgf,GAE/B,QACCze,MAAa,EAALqe,EAAU5e,KAAK8Q,IAAIgO,GAC3Bte,OAAc,EAALqe,EAAU7e,KAAK8Q,IAAImO,GAC5B5lB,UACC4P,KAAMyV,EAAKI,EACX5V,IAAKyV,EAAKM,GAEXtU,WAAY7T,IAGdqoB,OAAQ,SAAST,EAAIC,EAAIS,EAAGvT,GAC3B,MAAO9R,GAAQ0jB,MAAMgB,QAAQC,EAAIC,EAAIS,EAAGA,EAAGvT,KAG5C9R,EAAQ0Q,IAAM,SAASjS,EAAKiS,EAAKoB,GAYjC,IAVA,GAKCwT,GAAaC,EAAKC,EAClBC,EAAK1U,EAAM1Q,EAAGqlB,EACd3Y,EAAQzN,EANRuE,GADShI,EAAER,GACJqV,EAAI,IACXiV,EAAO9pB,EAAEgI,EAAK8M,iBACdnB,EAAgB3L,EAAK2L,cACrBoW,GAAgB/R,SAASnD,EAAI3K,IAAI,gBAAiB,KAAO,GAAK,GAMxDlC,EAAKgiB,SAAWhiB,EAAOA,EAAK2c,UACnC,KAAI3c,EAAKgiB,UAAYhiB,EAAK2c,WAAc,MAAOzjB,EAG/C,QAAO8G,EAAK2S,UACX,IAAK,UACL,IAAK,SACJzJ,EAAS/M,EAAQ0jB,MAAMgB,QACtB7gB,EAAK8gB,GAAGmB,QAAQ1Y,MAChBvJ,EAAK+gB,GAAGkB,QAAQ1Y,OACfvJ,EAAKghB,IAAMhhB,EAAKwhB,GAAGS,QAAQ1Y,MAAQwY,GACnC/hB,EAAKihB,IAAMjhB,EAAKwhB,GAAGS,QAAQ1Y,MAAQwY,EACpC9T,EAEF,MAEA,KAAK,OACL,IAAK,UACL,IAAK,WAOJ,IALA4T,EAAS7hB,EAAK6hB,UACXhW,EAAG7L,EAAKkiB,GAAGD,QAAQ1Y,MAAOuC,EAAG9L,EAAKmiB,GAAGF,QAAQ1Y,QAC7CsC,EAAG7L,EAAKoiB,GAAGH,QAAQ1Y,MAAOuC,EAAG9L,EAAKqiB,GAAGJ,QAAQ1Y,QAG5CL,KAAa1M,EAAI,GAAIolB,EAAMC,EAAOS,eAAiBT,EAAO5nB,SAAUuC,EAAIolB,GAC3E1U,EAAO2U,EAAOU,QAAUV,EAAOU,QAAQ/lB,GAAKqlB,EAAOrlB,GACnD0M,EAAO7L,KAAKC,MAAM4L,GAASgE,EAAKrB,EAAGqB,EAAKpB,GAGzC5C,GAAS/M,EAAQ0jB,MAAMC,QAAQ5W,EAAQ+E,EACxC,MAGA,SACC/E,EAASlJ,EAAKgiB,UACd9Y,GACCvG,MAAOuG,EAAOvG,MACdC,OAAQsG,EAAOtG,OACfnH,UACC4P,KAAMnC,EAAO2C,EACbP,IAAKpC,EAAO4C,IAoChB,MA7BArQ,GAAWyN,EAAOzN,SAClBqmB,EAAOA,EAAK,GAGTA,EAAKU,iBACPd,EAAM1hB,EAAKyiB,eACXZ,EAASC,EAAKU,iBAEdX,EAAOhW,EAAIpQ,EAAS4P,KACpBwW,EAAO/V,EAAIrQ,EAAS6P,IACpBqW,EAAcE,EAAOa,gBAAiBhB,GACtCjmB,EAAS4P,KAAOsW,EAAY9V,EAC5BpQ,EAAS6P,IAAMqW,EAAY7V,GAIzBH,IAAkBnU,GAAoC,UAAxBoD,EAAIa,SAASvD,SAC7CupB,EAAczpB,GAAG2T,EAAcgX,aAAehX,EAAciX,cAAcC,cAAcpgB,SACrFgf,IACFhmB,EAAS4P,MAAQoW,EAAYpW,KAC7B5P,EAAS6P,KAAOmW,EAAYnW,MAK9BK,EAAgB3T,EAAE2T,GAClBlQ,EAAS4P,MAAQM,EAAcY,aAC/B9Q,EAAS6P,KAAOK,EAAcc,YAEvBvD,GAEP/M,EAAQwQ,SAAW,SAAS/R,EAAKkoB,EAAM7U,GAEnC6U,EAAK5oB,SAAU4oB,EAAO9qB,EAAE8qB,GAE5B,IAICC,GAAahK,EAAQvc,EAAS0M,EAAQ0Y,EAJnCoB,GAASF,EAAKzqB,KAAK,UAAY,QAAQ4Q,cAAcpE,QAAQ,OAAQ,WACxEoe,EAAQjrB,EAAE,gBAAgB8qB,EAAKlV,OAAO,OAAOvV,KAAK,QAAQ,MAC1D6qB,EAAelrB,EAAEoa,KAAK0Q,EAAKzqB,KAAK,WAChC8qB,EAAcD,EAAare,QAAQ,KAAM,IAAIlI,MAAM,IAIpD,KAAIsmB,EAAMhpB,OAAU,MAAOf,EAG3B,IAAa,YAAV8pB,EACF9Z,EAAS/M,EAAQ0jB,MAAMC,QAAQqD,EAAalV,OAIxC,CAAA,IAAG9R,EAAQ0jB,MAAMmD,GAWf,MAAO9pB,EAVb,KAAIsD,EAAI,GAAIolB,EAAMuB,EAAYlpB,OAAQ8e,OAAevc,EAAIolB,GACxD7I,EAAO1b,KAAM2S,SAASmT,EAAY3mB,GAAI,IAGvC0M,GAAS/M,EAAQ0jB,MAAMmD,GAAO1lB,MAC7BhF,KAAMygB,EAAOrb,OAAOuQ,IAgBtB,MARA8U,GAAcE,EAAMxgB,SACpBsgB,EAAY1X,MAAQjJ,KAAKC,MAAM4gB,EAAMjY,WAAW9R,GAAS+pB,EAAMtgB,SAAW,GAC1EogB,EAAYzX,KAAOlJ,KAAKC,MAAM4gB,EAAM/X,YAAYhS,GAAS+pB,EAAMrgB,UAAY,GAG3EsG,EAAOzN,SAAS4P,MAAQ0X,EAAY1X,KACpCnC,EAAOzN,SAAS6P,KAAOyX,EAAYzX,IAE5BpC,EAEP,IAAIka,IAMLC,GAAW,+OASXrrB,GAAE+C,OAAO+H,EAAIgC,WACZwe,QAAU,WACT,GAAIzF,GAAUvlB,KAAKP,KAAKU,SAASolB,OACjCA,KAAYA,EAAQ,GAAG7hB,MAAMsP,IAAMtT,EAAET,GAAQkV,YAAc,OAG5D1M,KAAM,SAAShI,GACd,GAAIQ,GAAUR,EAAKQ,OAIhBP,GAAE,kBAAkBiC,OAAS,IAC/B3B,KAAKirB,SAAWxrB,EAAKU,SAAS8qB,SAAWvrB,EAAEqrB,IAAUrd,SAASzN,GAG9DR,EAAK+Y,MAAMvY,EAAS,cAAeD,KAAKkrB,eAAgBlrB,KAAKkK,IAAKlK,OAInEA,KAAKmrB,gBAAkBzrB,EAAE,UAAYI,GAAIO,EAAU,gBACjDqN,SAASxO,EAASmI,MAGhB5H,EAAKU,SAASolB,SAAW9lB,EAAKU,SAASolB,QAAQnV,SAAS,sBAC3D3Q,EAAK+Y,MAAMvZ,GAAS,SAAU,UAAWe,KAAKgrB,QAAShrB,KAAKkK,IAAKlK,MACjEP,EAAK+Y,MAAMvY,GAAU,eAAgBD,KAAKgrB,QAAShrB,KAAKkK,IAAKlK,OAI9DA,KAAKorB,UAGNF,eAAgB,WACf,GAOCG,GAAWlhB,EAPRlK,EAAUD,KAAKP,KAAKQ,QACvBqrB,GACChhB,OAAQrK,EAAQ2S,YAAYhS,GAC5ByJ,MAAOpK,EAAQyS,WAAW9R,IAE3B2qB,EAASvrB,KAAKP,KAAKe,QAAQ8c,IAC3BA,EAAMtd,KAAKP,KAAKU,SAASmd,GAI1BnT,GAASuN,SAASzX,EAAQ2J,IAAI,mBAAoB,KAAO,EACzDO,GAAW4I,MAAO5I,EAAQ6I,KAAM7I,GAG7BohB,GAAUjO,IACZ+N,EAA0C,MAA7BE,EAAO5V,OAAO9E,YAAuB/F,EAAOG,IAASF,EAAQC,GAC1Eb,EAAQkhB,EAAU,KAAQ/N,EAAK+N,EAAU,OAI1CrrB,KAAKirB,SAASrhB,IAAIO,GAAQP,IAAI0hB,IAI/BF,OAAQ,WACP,GAAGprB,KAAKP,KAAKsB,SAAW,GAAKf,KAAKwrB,QAAW,MAAOxrB,KAEpD,IAGCyrB,GAAMphB,EAAOmY,EAAK2E,EAHflnB,EAAUD,KAAKP,KAAKQ,QACvByD,EAAQ1D,KAAKP,KAAKI,QAAQ6D,MAC1B2E,EAAYrI,KAAKP,KAAKI,QAAQsD,SAASkF,SAsCxC,OAlCArI,MAAKP,KAAK+rB,QAAU,EAGjB9nB,EAAM4G,QAAUrK,EAAQ2J,IAAImB,EAAQrH,EAAM4G,QAC1C5G,EAAM2G,MAASpK,EAAQ2J,IAAIkB,EAAOpH,EAAM2G,QAK1CpK,EAAQ2J,IAAIkB,EAAO,IAAI4C,SAAS1N,KAAKmrB,iBAGrC9gB,EAAQpK,EAAQoK,QACD,EAAZA,EAAQ,IAASA,GAAS,GAG7BmY,EAAMviB,EAAQ2J,IAAI,aAAe,GACjCud,EAAMlnB,EAAQ2J,IAAI,aAAe,GAGjC6hB,GAAQjJ,EAAM2E,GAAK7M,QAAQ,KAAO,GAAKjS,EAAUgC,QAAU,IAAM,EAClEmY,GAAQA,EAAIlI,QAAQ,KAAO,GAAKmR,EAAO,GAAK/T,SAAS8K,EAAK,KAAQnY,EACjE8c,GAAQA,EAAI7M,QAAQ,KAAO,GAAKmR,EAAO,GAAK/T,SAASyP,EAAK,KAAQ,EAGlE9c,EAAQmY,EAAM2E,EAAMrd,KAAKqd,IAAIrd,KAAK0Y,IAAInY,EAAO8c,GAAM3E,GAAOnY,EAG1DpK,EAAQ2J,IAAIkB,EAAOhB,KAAKmV,MAAM5U,IAAQqD,SAASrF,IAIhDrI,KAAKwrB,QAAU,EAERxrB,MAGRsO,QAAS,WAERtO,KAAKirB,UAAYjrB,KAAKirB,SAASrc,SAG/B5O,KAAKP,KAAKmZ,SAAS3Z,EAAQe,KAAKP,KAAKQ,SAAUD,KAAKkK,QAItD4gB,GAAMjnB,EAAQ6nB,IAAM,SAASppB,GAE5B,MAAsB,KAAfuJ,GAAQC,GAAW,GAAItB,GAAIlI,GAAO1B,GAG1CkqB,GAAI5c,WAAa,SAEjBxD,EAAOghB,KACNC,kBAAmB,WAClB3rB,KAAKorB,cAIJnsB,OAAQC"}assets/js/jquery.qtip/jquery.qtip.min.js000064400000126410151336065400014377 0ustar00/* qTip2 v2.2.1 | Plugins: tips modal viewport svg imagemap ie6 | Styles: core basic css3 | qtip2.com | Licensed MIT | Sat Sep 06 2014 23:12:07 */

!function(a,b,c){!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.qtip&&a(jQuery)}(function(d){"use strict";function e(a,b,c,e){this.id=c,this.target=a,this.tooltip=F,this.elements={target:a},this._id=S+"-"+c,this.timers={img:{}},this.options=b,this.plugins={},this.cache={event:{},target:d(),disabled:E,attr:e,onTooltip:E,lastClass:""},this.rendered=this.destroyed=this.disabled=this.waiting=this.hiddenDuringWait=this.positioning=this.triggering=E}function f(a){return a===F||"object"!==d.type(a)}function g(a){return!(d.isFunction(a)||a&&a.attr||a.length||"object"===d.type(a)&&(a.jquery||a.then))}function h(a){var b,c,e,h;return f(a)?E:(f(a.metadata)&&(a.metadata={type:a.metadata}),"content"in a&&(b=a.content,f(b)||b.jquery||b.done?b=a.content={text:c=g(b)?E:b}:c=b.text,"ajax"in b&&(e=b.ajax,h=e&&e.once!==E,delete b.ajax,b.text=function(a,b){var f=c||d(this).attr(b.options.content.attr)||"Loading...",g=d.ajax(d.extend({},e,{context:b})).then(e.success,F,e.error).then(function(a){return a&&h&&b.set("content.text",a),a},function(a,c,d){b.destroyed||0===a.status||b.set("content.text",c+": "+d)});return h?f:(b.set("content.text",f),g)}),"title"in b&&(d.isPlainObject(b.title)&&(b.button=b.title.button,b.title=b.title.text),g(b.title||E)&&(b.title=E))),"position"in a&&f(a.position)&&(a.position={my:a.position,at:a.position}),"show"in a&&f(a.show)&&(a.show=a.show.jquery?{target:a.show}:a.show===D?{ready:D}:{event:a.show}),"hide"in a&&f(a.hide)&&(a.hide=a.hide.jquery?{target:a.hide}:{event:a.hide}),"style"in a&&f(a.style)&&(a.style={classes:a.style}),d.each(R,function(){this.sanitize&&this.sanitize(a)}),a)}function i(a,b){for(var c,d=0,e=a,f=b.split(".");e=e[f[d++]];)d<f.length&&(c=e);return[c||a,f.pop()]}function j(a,b){var c,d,e;for(c in this.checks)for(d in this.checks[c])(e=new RegExp(d,"i").exec(a))&&(b.push(e),("builtin"===c||this.plugins[c])&&this.checks[c][d].apply(this.plugins[c]||this,b))}function k(a){return V.concat("").join(a?"-"+a+" ":" ")}function l(a,b){return b>0?setTimeout(d.proxy(a,this),b):void a.call(this)}function m(a){this.tooltip.hasClass(ab)||(clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this.timers.show=l.call(this,function(){this.toggle(D,a)},this.options.show.delay))}function n(a){if(!this.tooltip.hasClass(ab)&&!this.destroyed){var b=d(a.relatedTarget),c=b.closest(W)[0]===this.tooltip[0],e=b[0]===this.options.show.target[0];if(clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this!==b[0]&&"mouse"===this.options.position.target&&c||this.options.hide.fixed&&/mouse(out|leave|move)/.test(a.type)&&(c||e))try{a.preventDefault(),a.stopImmediatePropagation()}catch(f){}else this.timers.hide=l.call(this,function(){this.toggle(E,a)},this.options.hide.delay,this)}}function o(a){!this.tooltip.hasClass(ab)&&this.options.hide.inactive&&(clearTimeout(this.timers.inactive),this.timers.inactive=l.call(this,function(){this.hide(a)},this.options.hide.inactive))}function p(a){this.rendered&&this.tooltip[0].offsetWidth>0&&this.reposition(a)}function q(a,c,e){d(b.body).delegate(a,(c.split?c:c.join("."+S+" "))+"."+S,function(){var a=y.api[d.attr(this,U)];a&&!a.disabled&&e.apply(a,arguments)})}function r(a,c,f){var g,i,j,k,l,m=d(b.body),n=a[0]===b?m:a,o=a.metadata?a.metadata(f.metadata):F,p="html5"===f.metadata.type&&o?o[f.metadata.name]:F,q=a.data(f.metadata.name||"qtipopts");try{q="string"==typeof q?d.parseJSON(q):q}catch(r){}if(k=d.extend(D,{},y.defaults,f,"object"==typeof q?h(q):F,h(p||o)),i=k.position,k.id=c,"boolean"==typeof k.content.text){if(j=a.attr(k.content.attr),k.content.attr===E||!j)return E;k.content.text=j}if(i.container.length||(i.container=m),i.target===E&&(i.target=n),k.show.target===E&&(k.show.target=n),k.show.solo===D&&(k.show.solo=i.container.closest("body")),k.hide.target===E&&(k.hide.target=n),k.position.viewport===D&&(k.position.viewport=i.container),i.container=i.container.eq(0),i.at=new A(i.at,D),i.my=new A(i.my),a.data(S))if(k.overwrite)a.qtip("destroy",!0);else if(k.overwrite===E)return E;return a.attr(T,c),k.suppress&&(l=a.attr("title"))&&a.removeAttr("title").attr(cb,l).attr("title",""),g=new e(a,k,c,!!j),a.data(S,g),g}function s(a){return a.charAt(0).toUpperCase()+a.slice(1)}function t(a,b){var d,e,f=b.charAt(0).toUpperCase()+b.slice(1),g=(b+" "+rb.join(f+" ")+f).split(" "),h=0;if(qb[b])return a.css(qb[b]);for(;d=g[h++];)if((e=a.css(d))!==c)return qb[b]=d,e}function u(a,b){return Math.ceil(parseFloat(t(a,b)))}function v(a,b){this._ns="tip",this.options=b,this.offset=b.offset,this.size=[b.width,b.height],this.init(this.qtip=a)}function w(a,b){this.options=b,this._ns="-modal",this.init(this.qtip=a)}function x(a){this._ns="ie6",this.init(this.qtip=a)}var y,z,A,B,C,D=!0,E=!1,F=null,G="x",H="y",I="width",J="height",K="top",L="left",M="bottom",N="right",O="center",P="flipinvert",Q="shift",R={},S="qtip",T="data-hasqtip",U="data-qtip-id",V=["ui-widget","ui-tooltip"],W="."+S,X="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),Y=S+"-fixed",Z=S+"-default",$=S+"-focus",_=S+"-hover",ab=S+"-disabled",bb="_replacedByqTip",cb="oldtitle",db={ie:function(){for(var a=4,c=b.createElement("div");(c.innerHTML="<!--[if gt IE "+a+"]><i></i><![endif]-->")&&c.getElementsByTagName("i")[0];a+=1);return a>4?a:0/0}(),iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||E};z=e.prototype,z._when=function(a){return d.when.apply(d,a)},z.render=function(a){if(this.rendered||this.destroyed)return this;var b,c=this,e=this.options,f=this.cache,g=this.elements,h=e.content.text,i=e.content.title,j=e.content.button,k=e.position,l=("."+this._id+" ",[]);return d.attr(this.target[0],"aria-describedby",this._id),f.posClass=this._createPosClass((this.position={my:k.my,at:k.at}).my),this.tooltip=g.tooltip=b=d("<div/>",{id:this._id,"class":[S,Z,e.style.classes,f.posClass].join(" "),width:e.style.width||"",height:e.style.height||"",tracking:"mouse"===k.target&&k.adjust.mouse,role:"alert","aria-live":"polite","aria-atomic":E,"aria-describedby":this._id+"-content","aria-hidden":D}).toggleClass(ab,this.disabled).attr(U,this.id).data(S,this).appendTo(k.container).append(g.content=d("<div />",{"class":S+"-content",id:this._id+"-content","aria-atomic":D})),this.rendered=-1,this.positioning=D,i&&(this._createTitle(),d.isFunction(i)||l.push(this._updateTitle(i,E))),j&&this._createButton(),d.isFunction(h)||l.push(this._updateContent(h,E)),this.rendered=D,this._setWidget(),d.each(R,function(a){var b;"render"===this.initialize&&(b=this(c))&&(c.plugins[a]=b)}),this._unassignEvents(),this._assignEvents(),this._when(l).then(function(){c._trigger("render"),c.positioning=E,c.hiddenDuringWait||!e.show.ready&&!a||c.toggle(D,f.event,E),c.hiddenDuringWait=E}),y.api[this.id]=this,this},z.destroy=function(a){function b(){if(!this.destroyed){this.destroyed=D;var a,b=this.target,c=b.attr(cb);this.rendered&&this.tooltip.stop(1,0).find("*").remove().end().remove(),d.each(this.plugins,function(){this.destroy&&this.destroy()});for(a in this.timers)clearTimeout(this.timers[a]);b.removeData(S).removeAttr(U).removeAttr(T).removeAttr("aria-describedby"),this.options.suppress&&c&&b.attr("title",c).removeAttr(cb),this._unassignEvents(),this.options=this.elements=this.cache=this.timers=this.plugins=this.mouse=F,delete y.api[this.id]}}return this.destroyed?this.target:(a===D&&"hide"!==this.triggering||!this.rendered?b.call(this):(this.tooltip.one("tooltiphidden",d.proxy(b,this)),!this.triggering&&this.hide()),this.target)},B=z.checks={builtin:{"^id$":function(a,b,c,e){var f=c===D?y.nextid:c,g=S+"-"+f;f!==E&&f.length>0&&!d("#"+g).length?(this._id=g,this.rendered&&(this.tooltip[0].id=this._id,this.elements.content[0].id=this._id+"-content",this.elements.title[0].id=this._id+"-title")):a[b]=e},"^prerender":function(a,b,c){c&&!this.rendered&&this.render(this.options.show.ready)},"^content.text$":function(a,b,c){this._updateContent(c)},"^content.attr$":function(a,b,c,d){this.options.content.text===this.target.attr(d)&&this._updateContent(this.target.attr(c))},"^content.title$":function(a,b,c){return c?(c&&!this.elements.title&&this._createTitle(),void this._updateTitle(c)):this._removeTitle()},"^content.button$":function(a,b,c){this._updateButton(c)},"^content.title.(text|button)$":function(a,b,c){this.set("content."+b,c)},"^position.(my|at)$":function(a,b,c){"string"==typeof c&&(this.position[b]=a[b]=new A(c,"at"===b))},"^position.container$":function(a,b,c){this.rendered&&this.tooltip.appendTo(c)},"^show.ready$":function(a,b,c){c&&(!this.rendered&&this.render(D)||this.toggle(D))},"^style.classes$":function(a,b,c,d){this.rendered&&this.tooltip.removeClass(d).addClass(c)},"^style.(width|height)":function(a,b,c){this.rendered&&this.tooltip.css(b,c)},"^style.widget|content.title":function(){this.rendered&&this._setWidget()},"^style.def":function(a,b,c){this.rendered&&this.tooltip.toggleClass(Z,!!c)},"^events.(render|show|move|hide|focus|blur)$":function(a,b,c){this.rendered&&this.tooltip[(d.isFunction(c)?"":"un")+"bind"]("tooltip"+b,c)},"^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)":function(){if(this.rendered){var a=this.options.position;this.tooltip.attr("tracking","mouse"===a.target&&a.adjust.mouse),this._unassignEvents(),this._assignEvents()}}}},z.get=function(a){if(this.destroyed)return this;var b=i(this.options,a.toLowerCase()),c=b[0][b[1]];return c.precedance?c.string():c};var eb=/^position\.(my|at|adjust|target|container|viewport)|style|content|show\.ready/i,fb=/^prerender|show\.ready/i;z.set=function(a,b){if(this.destroyed)return this;{var c,e=this.rendered,f=E,g=this.options;this.checks}return"string"==typeof a?(c=a,a={},a[c]=b):a=d.extend({},a),d.each(a,function(b,c){if(e&&fb.test(b))return void delete a[b];var h,j=i(g,b.toLowerCase());h=j[0][j[1]],j[0][j[1]]=c&&c.nodeType?d(c):c,f=eb.test(b)||f,a[b]=[j[0],j[1],c,h]}),h(g),this.positioning=D,d.each(a,d.proxy(j,this)),this.positioning=E,this.rendered&&this.tooltip[0].offsetWidth>0&&f&&this.reposition("mouse"===g.position.target?F:this.cache.event),this},z._update=function(a,b){var c=this,e=this.cache;return this.rendered&&a?(d.isFunction(a)&&(a=a.call(this.elements.target,e.event,this)||""),d.isFunction(a.then)?(e.waiting=D,a.then(function(a){return e.waiting=E,c._update(a,b)},F,function(a){return c._update(a,b)})):a===E||!a&&""!==a?E:(a.jquery&&a.length>0?b.empty().append(a.css({display:"block",visibility:"visible"})):b.html(a),this._waitForContent(b).then(function(a){c.rendered&&c.tooltip[0].offsetWidth>0&&c.reposition(e.event,!a.length)}))):E},z._waitForContent=function(a){var b=this.cache;return b.waiting=D,(d.fn.imagesLoaded?a.imagesLoaded():d.Deferred().resolve([])).done(function(){b.waiting=E}).promise()},z._updateContent=function(a,b){this._update(a,this.elements.content,b)},z._updateTitle=function(a,b){this._update(a,this.elements.title,b)===E&&this._removeTitle(E)},z._createTitle=function(){var a=this.elements,b=this._id+"-title";a.titlebar&&this._removeTitle(),a.titlebar=d("<div />",{"class":S+"-titlebar "+(this.options.style.widget?k("header"):"")}).append(a.title=d("<div />",{id:b,"class":S+"-title","aria-atomic":D})).insertBefore(a.content).delegate(".qtip-close","mousedown keydown mouseup keyup mouseout",function(a){d(this).toggleClass("ui-state-active ui-state-focus","down"===a.type.substr(-4))}).delegate(".qtip-close","mouseover mouseout",function(a){d(this).toggleClass("ui-state-hover","mouseover"===a.type)}),this.options.content.button&&this._createButton()},z._removeTitle=function(a){var b=this.elements;b.title&&(b.titlebar.remove(),b.titlebar=b.title=b.button=F,a!==E&&this.reposition())},z._createPosClass=function(a){return S+"-pos-"+(a||this.options.position.my).abbrev()},z.reposition=function(c,e){if(!this.rendered||this.positioning||this.destroyed)return this;this.positioning=D;var f,g,h,i,j=this.cache,k=this.tooltip,l=this.options.position,m=l.target,n=l.my,o=l.at,p=l.viewport,q=l.container,r=l.adjust,s=r.method.split(" "),t=k.outerWidth(E),u=k.outerHeight(E),v=0,w=0,x=k.css("position"),y={left:0,top:0},z=k[0].offsetWidth>0,A=c&&"scroll"===c.type,B=d(a),C=q[0].ownerDocument,F=this.mouse;if(d.isArray(m)&&2===m.length)o={x:L,y:K},y={left:m[0],top:m[1]};else if("mouse"===m)o={x:L,y:K},(!r.mouse||this.options.hide.distance)&&j.origin&&j.origin.pageX?c=j.origin:!c||c&&("resize"===c.type||"scroll"===c.type)?c=j.event:F&&F.pageX&&(c=F),"static"!==x&&(y=q.offset()),C.body.offsetWidth!==(a.innerWidth||C.documentElement.clientWidth)&&(g=d(b.body).offset()),y={left:c.pageX-y.left+(g&&g.left||0),top:c.pageY-y.top+(g&&g.top||0)},r.mouse&&A&&F&&(y.left-=(F.scrollX||0)-B.scrollLeft(),y.top-=(F.scrollY||0)-B.scrollTop());else{if("event"===m?c&&c.target&&"scroll"!==c.type&&"resize"!==c.type?j.target=d(c.target):c.target||(j.target=this.elements.target):"event"!==m&&(j.target=d(m.jquery?m:this.elements.target)),m=j.target,m=d(m).eq(0),0===m.length)return this;m[0]===b||m[0]===a?(v=db.iOS?a.innerWidth:m.width(),w=db.iOS?a.innerHeight:m.height(),m[0]===a&&(y={top:(p||m).scrollTop(),left:(p||m).scrollLeft()})):R.imagemap&&m.is("area")?f=R.imagemap(this,m,o,R.viewport?s:E):R.svg&&m&&m[0].ownerSVGElement?f=R.svg(this,m,o,R.viewport?s:E):(v=m.outerWidth(E),w=m.outerHeight(E),y=m.offset()),f&&(v=f.width,w=f.height,g=f.offset,y=f.position),y=this.reposition.offset(m,y,q),(db.iOS>3.1&&db.iOS<4.1||db.iOS>=4.3&&db.iOS<4.33||!db.iOS&&"fixed"===x)&&(y.left-=B.scrollLeft(),y.top-=B.scrollTop()),(!f||f&&f.adjustable!==E)&&(y.left+=o.x===N?v:o.x===O?v/2:0,y.top+=o.y===M?w:o.y===O?w/2:0)}return y.left+=r.x+(n.x===N?-t:n.x===O?-t/2:0),y.top+=r.y+(n.y===M?-u:n.y===O?-u/2:0),R.viewport?(h=y.adjusted=R.viewport(this,y,l,v,w,t,u),g&&h.left&&(y.left+=g.left),g&&h.top&&(y.top+=g.top),h.my&&(this.position.my=h.my)):y.adjusted={left:0,top:0},j.posClass!==(i=this._createPosClass(this.position.my))&&k.removeClass(j.posClass).addClass(j.posClass=i),this._trigger("move",[y,p.elem||p],c)?(delete y.adjusted,e===E||!z||isNaN(y.left)||isNaN(y.top)||"mouse"===m||!d.isFunction(l.effect)?k.css(y):d.isFunction(l.effect)&&(l.effect.call(k,this,d.extend({},y)),k.queue(function(a){d(this).css({opacity:"",height:""}),db.ie&&this.style.removeAttribute("filter"),a()})),this.positioning=E,this):this},z.reposition.offset=function(a,c,e){function f(a,b){c.left+=b*a.scrollLeft(),c.top+=b*a.scrollTop()}if(!e[0])return c;var g,h,i,j,k=d(a[0].ownerDocument),l=!!db.ie&&"CSS1Compat"!==b.compatMode,m=e[0];do"static"!==(h=d.css(m,"position"))&&("fixed"===h?(i=m.getBoundingClientRect(),f(k,-1)):(i=d(m).position(),i.left+=parseFloat(d.css(m,"borderLeftWidth"))||0,i.top+=parseFloat(d.css(m,"borderTopWidth"))||0),c.left-=i.left+(parseFloat(d.css(m,"marginLeft"))||0),c.top-=i.top+(parseFloat(d.css(m,"marginTop"))||0),g||"hidden"===(j=d.css(m,"overflow"))||"visible"===j||(g=d(m)));while(m=m.offsetParent);return g&&(g[0]!==k[0]||l)&&f(g,1),c};var gb=(A=z.reposition.Corner=function(a,b){a=(""+a).replace(/([A-Z])/," $1").replace(/middle/gi,O).toLowerCase(),this.x=(a.match(/left|right/i)||a.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(a.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase(),this.forceY=!!b;var c=a.charAt(0);this.precedance="t"===c||"b"===c?H:G}).prototype;gb.invert=function(a,b){this[a]=this[a]===L?N:this[a]===N?L:b||this[a]},gb.string=function(a){var b=this.x,c=this.y,d=b!==c?"center"===b||"center"!==c&&(this.precedance===H||this.forceY)?[c,b]:[b,c]:[b];return a!==!1?d.join(" "):d},gb.abbrev=function(){var a=this.string(!1);return a[0].charAt(0)+(a[1]&&a[1].charAt(0)||"")},gb.clone=function(){return new A(this.string(),this.forceY)},z.toggle=function(a,c){var e=this.cache,f=this.options,g=this.tooltip;if(c){if(/over|enter/.test(c.type)&&e.event&&/out|leave/.test(e.event.type)&&f.show.target.add(c.target).length===f.show.target.length&&g.has(c.relatedTarget).length)return this;e.event=d.event.fix(c)}if(this.waiting&&!a&&(this.hiddenDuringWait=D),!this.rendered)return a?this.render(1):this;if(this.destroyed||this.disabled)return this;var h,i,j,k=a?"show":"hide",l=this.options[k],m=(this.options[a?"hide":"show"],this.options.position),n=this.options.content,o=this.tooltip.css("width"),p=this.tooltip.is(":visible"),q=a||1===l.target.length,r=!c||l.target.length<2||e.target[0]===c.target;return(typeof a).search("boolean|number")&&(a=!p),h=!g.is(":animated")&&p===a&&r,i=h?F:!!this._trigger(k,[90]),this.destroyed?this:(i!==E&&a&&this.focus(c),!i||h?this:(d.attr(g[0],"aria-hidden",!a),a?(this.mouse&&(e.origin=d.event.fix(this.mouse)),d.isFunction(n.text)&&this._updateContent(n.text,E),d.isFunction(n.title)&&this._updateTitle(n.title,E),!C&&"mouse"===m.target&&m.adjust.mouse&&(d(b).bind("mousemove."+S,this._storeMouse),C=D),o||g.css("width",g.outerWidth(E)),this.reposition(c,arguments[2]),o||g.css("width",""),l.solo&&("string"==typeof l.solo?d(l.solo):d(W,l.solo)).not(g).not(l.target).qtip("hide",d.Event("tooltipsolo"))):(clearTimeout(this.timers.show),delete e.origin,C&&!d(W+'[tracking="true"]:visible',l.solo).not(g).length&&(d(b).unbind("mousemove."+S),C=E),this.blur(c)),j=d.proxy(function(){a?(db.ie&&g[0].style.removeAttribute("filter"),g.css("overflow",""),"string"==typeof l.autofocus&&d(this.options.show.autofocus,g).focus(),this.options.show.target.trigger("qtip-"+this.id+"-inactive")):g.css({display:"",visibility:"",opacity:"",left:"",top:""}),this._trigger(a?"visible":"hidden")},this),l.effect===E||q===E?(g[k](),j()):d.isFunction(l.effect)?(g.stop(1,1),l.effect.call(g,this),g.queue("fx",function(a){j(),a()})):g.fadeTo(90,a?1:0,j),a&&l.target.trigger("qtip-"+this.id+"-inactive"),this))},z.show=function(a){return this.toggle(D,a)},z.hide=function(a){return this.toggle(E,a)},z.focus=function(a){if(!this.rendered||this.destroyed)return this;var b=d(W),c=this.tooltip,e=parseInt(c[0].style.zIndex,10),f=y.zindex+b.length;return c.hasClass($)||this._trigger("focus",[f],a)&&(e!==f&&(b.each(function(){this.style.zIndex>e&&(this.style.zIndex=this.style.zIndex-1)}),b.filter("."+$).qtip("blur",a)),c.addClass($)[0].style.zIndex=f),this},z.blur=function(a){return!this.rendered||this.destroyed?this:(this.tooltip.removeClass($),this._trigger("blur",[this.tooltip.css("zIndex")],a),this)},z.disable=function(a){return this.destroyed?this:("toggle"===a?a=!(this.rendered?this.tooltip.hasClass(ab):this.disabled):"boolean"!=typeof a&&(a=D),this.rendered&&this.tooltip.toggleClass(ab,a).attr("aria-disabled",a),this.disabled=!!a,this)},z.enable=function(){return this.disable(E)},z._createButton=function(){var a=this,b=this.elements,c=b.tooltip,e=this.options.content.button,f="string"==typeof e,g=f?e:"Close tooltip";b.button&&b.button.remove(),b.button=e.jquery?e:d("<a />",{"class":"qtip-close "+(this.options.style.widget?"":S+"-icon"),title:g,"aria-label":g}).prepend(d("<span />",{"class":"ui-icon ui-icon-close",html:"&times;"})),b.button.appendTo(b.titlebar||c).attr("role","button").click(function(b){return c.hasClass(ab)||a.hide(b),E})},z._updateButton=function(a){if(!this.rendered)return E;var b=this.elements.button;a?this._createButton():b.remove()},z._setWidget=function(){var a=this.options.style.widget,b=this.elements,c=b.tooltip,d=c.hasClass(ab);c.removeClass(ab),ab=a?"ui-state-disabled":"qtip-disabled",c.toggleClass(ab,d),c.toggleClass("ui-helper-reset "+k(),a).toggleClass(Z,this.options.style.def&&!a),b.content&&b.content.toggleClass(k("content"),a),b.titlebar&&b.titlebar.toggleClass(k("header"),a),b.button&&b.button.toggleClass(S+"-icon",!a)},z._storeMouse=function(a){return(this.mouse=d.event.fix(a)).type="mousemove",this},z._bind=function(a,b,c,e,f){if(a&&c&&b.length){var g="."+this._id+(e?"-"+e:"");return d(a).bind((b.split?b:b.join(g+" "))+g,d.proxy(c,f||this)),this}},z._unbind=function(a,b){return a&&d(a).unbind("."+this._id+(b?"-"+b:"")),this},z._trigger=function(a,b,c){var e=d.Event("tooltip"+a);return e.originalEvent=c&&d.extend({},c)||this.cache.event||F,this.triggering=a,this.tooltip.trigger(e,[this].concat(b||[])),this.triggering=E,!e.isDefaultPrevented()},z._bindEvents=function(a,b,c,e,f,g){var h=c.filter(e).add(e.filter(c)),i=[];h.length&&(d.each(b,function(b,c){var e=d.inArray(c,a);e>-1&&i.push(a.splice(e,1)[0])}),i.length&&(this._bind(h,i,function(a){var b=this.rendered?this.tooltip[0].offsetWidth>0:!1;(b?g:f).call(this,a)}),c=c.not(h),e=e.not(h))),this._bind(c,a,f),this._bind(e,b,g)},z._assignInitialEvents=function(a){function b(a){return this.disabled||this.destroyed?E:(this.cache.event=a&&d.event.fix(a),this.cache.target=a&&d(a.target),clearTimeout(this.timers.show),void(this.timers.show=l.call(this,function(){this.render("object"==typeof a||c.show.ready)},c.prerender?0:c.show.delay)))}var c=this.options,e=c.show.target,f=c.hide.target,g=c.show.event?d.trim(""+c.show.event).split(" "):[],h=c.hide.event?d.trim(""+c.hide.event).split(" "):[];this._bind(this.elements.target,["remove","removeqtip"],function(){this.destroy(!0)},"destroy"),/mouse(over|enter)/i.test(c.show.event)&&!/mouse(out|leave)/i.test(c.hide.event)&&h.push("mouseleave"),this._bind(e,"mousemove",function(a){this._storeMouse(a),this.cache.onTarget=D}),this._bindEvents(g,h,e,f,b,function(){return this.timers?void clearTimeout(this.timers.show):E}),(c.show.ready||c.prerender)&&b.call(this,a)},z._assignEvents=function(){var c=this,e=this.options,f=e.position,g=this.tooltip,h=e.show.target,i=e.hide.target,j=f.container,k=f.viewport,l=d(b),q=(d(b.body),d(a)),r=e.show.event?d.trim(""+e.show.event).split(" "):[],s=e.hide.event?d.trim(""+e.hide.event).split(" "):[];d.each(e.events,function(a,b){c._bind(g,"toggle"===a?["tooltipshow","tooltiphide"]:["tooltip"+a],b,null,g)}),/mouse(out|leave)/i.test(e.hide.event)&&"window"===e.hide.leave&&this._bind(l,["mouseout","blur"],function(a){/select|option/.test(a.target.nodeName)||a.relatedTarget||this.hide(a)}),e.hide.fixed?i=i.add(g.addClass(Y)):/mouse(over|enter)/i.test(e.show.event)&&this._bind(i,"mouseleave",function(){clearTimeout(this.timers.show)}),(""+e.hide.event).indexOf("unfocus")>-1&&this._bind(j.closest("html"),["mousedown","touchstart"],function(a){var b=d(a.target),c=this.rendered&&!this.tooltip.hasClass(ab)&&this.tooltip[0].offsetWidth>0,e=b.parents(W).filter(this.tooltip[0]).length>0;b[0]===this.target[0]||b[0]===this.tooltip[0]||e||this.target.has(b[0]).length||!c||this.hide(a)}),"number"==typeof e.hide.inactive&&(this._bind(h,"qtip-"+this.id+"-inactive",o,"inactive"),this._bind(i.add(g),y.inactiveEvents,o)),this._bindEvents(r,s,h,i,m,n),this._bind(h.add(g),"mousemove",function(a){if("number"==typeof e.hide.distance){var b=this.cache.origin||{},c=this.options.hide.distance,d=Math.abs;(d(a.pageX-b.pageX)>=c||d(a.pageY-b.pageY)>=c)&&this.hide(a)}this._storeMouse(a)}),"mouse"===f.target&&f.adjust.mouse&&(e.hide.event&&this._bind(h,["mouseenter","mouseleave"],function(a){return this.cache?void(this.cache.onTarget="mouseenter"===a.type):E}),this._bind(l,"mousemove",function(a){this.rendered&&this.cache.onTarget&&!this.tooltip.hasClass(ab)&&this.tooltip[0].offsetWidth>0&&this.reposition(a)})),(f.adjust.resize||k.length)&&this._bind(d.event.special.resize?k:q,"resize",p),f.adjust.scroll&&this._bind(q.add(f.container),"scroll",p)},z._unassignEvents=function(){var c=this.options,e=c.show.target,f=c.hide.target,g=d.grep([this.elements.target[0],this.rendered&&this.tooltip[0],c.position.container[0],c.position.viewport[0],c.position.container.closest("html")[0],a,b],function(a){return"object"==typeof a});e&&e.toArray&&(g=g.concat(e.toArray())),f&&f.toArray&&(g=g.concat(f.toArray())),this._unbind(g)._unbind(g,"destroy")._unbind(g,"inactive")},d(function(){q(W,["mouseenter","mouseleave"],function(a){var b="mouseenter"===a.type,c=d(a.currentTarget),e=d(a.relatedTarget||a.target),f=this.options;b?(this.focus(a),c.hasClass(Y)&&!c.hasClass(ab)&&clearTimeout(this.timers.hide)):"mouse"===f.position.target&&f.position.adjust.mouse&&f.hide.event&&f.show.target&&!e.closest(f.show.target[0]).length&&this.hide(a),c.toggleClass(_,b)}),q("["+U+"]",X,o)}),y=d.fn.qtip=function(a,b,e){var f=(""+a).toLowerCase(),g=F,i=d.makeArray(arguments).slice(1),j=i[i.length-1],k=this[0]?d.data(this[0],S):F;return!arguments.length&&k||"api"===f?k:"string"==typeof a?(this.each(function(){var a=d.data(this,S);if(!a)return D;if(j&&j.timeStamp&&(a.cache.event=j),!b||"option"!==f&&"options"!==f)a[f]&&a[f].apply(a,i);else{if(e===c&&!d.isPlainObject(b))return g=a.get(b),E;a.set(b,e)}}),g!==F?g:this):"object"!=typeof a&&arguments.length?void 0:(k=h(d.extend(D,{},a)),this.each(function(a){var b,c;return c=d.isArray(k.id)?k.id[a]:k.id,c=!c||c===E||c.length<1||y.api[c]?y.nextid++:c,b=r(d(this),c,k),b===E?D:(y.api[c]=b,d.each(R,function(){"initialize"===this.initialize&&this(b)}),void b._assignInitialEvents(j))}))},d.qtip=e,y.api={},d.each({attr:function(a,b){if(this.length){var c=this[0],e="title",f=d.data(c,"qtip");if(a===e&&f&&"object"==typeof f&&f.options.suppress)return arguments.length<2?d.attr(c,cb):(f&&f.options.content.attr===e&&f.cache.attr&&f.set("content.text",b),this.attr(cb,b))}return d.fn["attr"+bb].apply(this,arguments)},clone:function(a){var b=(d([]),d.fn["clone"+bb].apply(this,arguments));return a||b.filter("["+cb+"]").attr("title",function(){return d.attr(this,cb)}).removeAttr(cb),b}},function(a,b){if(!b||d.fn[a+bb])return D;var c=d.fn[a+bb]=d.fn[a];d.fn[a]=function(){return b.apply(this,arguments)||c.apply(this,arguments)}}),d.ui||(d["cleanData"+bb]=d.cleanData,d.cleanData=function(a){for(var b,c=0;(b=d(a[c])).length;c++)if(b.attr(T))try{b.triggerHandler("removeqtip")}catch(e){}d["cleanData"+bb].apply(this,arguments)}),y.version="2.2.1",y.nextid=0,y.inactiveEvents=X,y.zindex=15e3,y.defaults={prerender:E,id:E,overwrite:D,suppress:D,content:{text:D,attr:"title",title:E,button:E},position:{my:"top left",at:"bottom right",target:E,container:E,viewport:E,adjust:{x:0,y:0,mouse:D,scroll:D,resize:D,method:"flipinvert flipinvert"},effect:function(a,b){d(this).animate(b,{duration:200,queue:E})}},show:{target:E,event:"mouseenter",effect:D,delay:90,solo:E,ready:E,autofocus:E},hide:{target:E,event:"mouseleave",effect:D,delay:0,fixed:E,inactive:E,leave:"window",distance:E},style:{classes:"",widget:E,width:E,height:E,def:D},events:{render:F,move:F,show:F,hide:F,toggle:F,visible:F,hidden:F,focus:F,blur:F}};var hb,ib="margin",jb="border",kb="color",lb="background-color",mb="transparent",nb=" !important",ob=!!b.createElement("canvas").getContext,pb=/rgba?\(0, 0, 0(, 0)?\)|transparent|#123456/i,qb={},rb=["Webkit","O","Moz","ms"];if(ob)var sb=a.devicePixelRatio||1,tb=function(){var a=b.createElement("canvas").getContext("2d");return a.backingStorePixelRatio||a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||1}(),ub=sb/tb;else var vb=function(a,b,c){return"<qtipvml:"+a+' xmlns="urn:schemas-microsoft.com:vml" class="qtip-vml" '+(b||"")+' style="behavior: url(#default#VML); '+(c||"")+'" />'};d.extend(v.prototype,{init:function(a){var b,c;c=this.element=a.elements.tip=d("<div />",{"class":S+"-tip"}).prependTo(a.tooltip),ob?(b=d("<canvas />").appendTo(this.element)[0].getContext("2d"),b.lineJoin="miter",b.miterLimit=1e5,b.save()):(b=vb("shape",'coordorigin="0,0"',"position:absolute;"),this.element.html(b+b),a._bind(d("*",c).add(c),["click","mousedown"],function(a){a.stopPropagation()},this._ns)),a._bind(a.tooltip,"tooltipmove",this.reposition,this._ns,this),this.create()},_swapDimensions:function(){this.size[0]=this.options.height,this.size[1]=this.options.width},_resetDimensions:function(){this.size[0]=this.options.width,this.size[1]=this.options.height},_useTitle:function(a){var b=this.qtip.elements.titlebar;return b&&(a.y===K||a.y===O&&this.element.position().top+this.size[1]/2+this.options.offset<b.outerHeight(D))},_parseCorner:function(a){var b=this.qtip.options.position.my;return a===E||b===E?a=E:a===D?a=new A(b.string()):a.string||(a=new A(a),a.fixed=D),a},_parseWidth:function(a,b,c){var d=this.qtip.elements,e=jb+s(b)+"Width";return(c?u(c,e):u(d.content,e)||u(this._useTitle(a)&&d.titlebar||d.content,e)||u(d.tooltip,e))||0},_parseRadius:function(a){var b=this.qtip.elements,c=jb+s(a.y)+s(a.x)+"Radius";return db.ie<9?0:u(this._useTitle(a)&&b.titlebar||b.content,c)||u(b.tooltip,c)||0},_invalidColour:function(a,b,c){var d=a.css(b);return!d||c&&d===a.css(c)||pb.test(d)?E:d},_parseColours:function(a){var b=this.qtip.elements,c=this.element.css("cssText",""),e=jb+s(a[a.precedance])+s(kb),f=this._useTitle(a)&&b.titlebar||b.content,g=this._invalidColour,h=[];return h[0]=g(c,lb)||g(f,lb)||g(b.content,lb)||g(b.tooltip,lb)||c.css(lb),h[1]=g(c,e,kb)||g(f,e,kb)||g(b.content,e,kb)||g(b.tooltip,e,kb)||b.tooltip.css(e),d("*",c).add(c).css("cssText",lb+":"+mb+nb+";"+jb+":0"+nb+";"),h},_calculateSize:function(a){var b,c,d,e=a.precedance===H,f=this.options.width,g=this.options.height,h="c"===a.abbrev(),i=(e?f:g)*(h?.5:1),j=Math.pow,k=Math.round,l=Math.sqrt(j(i,2)+j(g,2)),m=[this.border/i*l,this.border/g*l];return m[2]=Math.sqrt(j(m[0],2)-j(this.border,2)),m[3]=Math.sqrt(j(m[1],2)-j(this.border,2)),b=l+m[2]+m[3]+(h?0:m[0]),c=b/l,d=[k(c*f),k(c*g)],e?d:d.reverse()},_calculateTip:function(a,b,c){c=c||1,b=b||this.size;var d=b[0]*c,e=b[1]*c,f=Math.ceil(d/2),g=Math.ceil(e/2),h={br:[0,0,d,e,d,0],bl:[0,0,d,0,0,e],tr:[0,e,d,0,d,e],tl:[0,0,0,e,d,e],tc:[0,e,f,0,d,e],bc:[0,0,d,0,f,e],rc:[0,0,d,g,0,e],lc:[d,0,d,e,0,g]};return h.lt=h.br,h.rt=h.bl,h.lb=h.tr,h.rb=h.tl,h[a.abbrev()]},_drawCoords:function(a,b){a.beginPath(),a.moveTo(b[0],b[1]),a.lineTo(b[2],b[3]),a.lineTo(b[4],b[5]),a.closePath()},create:function(){var a=this.corner=(ob||db.ie)&&this._parseCorner(this.options.corner);return(this.enabled=!!this.corner&&"c"!==this.corner.abbrev())&&(this.qtip.cache.corner=a.clone(),this.update()),this.element.toggle(this.enabled),this.corner},update:function(b,c){if(!this.enabled)return this;var e,f,g,h,i,j,k,l,m=this.qtip.elements,n=this.element,o=n.children(),p=this.options,q=this.size,r=p.mimic,s=Math.round;b||(b=this.qtip.cache.corner||this.corner),r===E?r=b:(r=new A(r),r.precedance=b.precedance,"inherit"===r.x?r.x=b.x:"inherit"===r.y?r.y=b.y:r.x===r.y&&(r[b.precedance]=b[b.precedance])),f=r.precedance,b.precedance===G?this._swapDimensions():this._resetDimensions(),e=this.color=this._parseColours(b),e[1]!==mb?(l=this.border=this._parseWidth(b,b[b.precedance]),p.border&&1>l&&!pb.test(e[1])&&(e[0]=e[1]),this.border=l=p.border!==D?p.border:l):this.border=l=0,k=this.size=this._calculateSize(b),n.css({width:k[0],height:k[1],lineHeight:k[1]+"px"}),j=b.precedance===H?[s(r.x===L?l:r.x===N?k[0]-q[0]-l:(k[0]-q[0])/2),s(r.y===K?k[1]-q[1]:0)]:[s(r.x===L?k[0]-q[0]:0),s(r.y===K?l:r.y===M?k[1]-q[1]-l:(k[1]-q[1])/2)],ob?(g=o[0].getContext("2d"),g.restore(),g.save(),g.clearRect(0,0,6e3,6e3),h=this._calculateTip(r,q,ub),i=this._calculateTip(r,this.size,ub),o.attr(I,k[0]*ub).attr(J,k[1]*ub),o.css(I,k[0]).css(J,k[1]),this._drawCoords(g,i),g.fillStyle=e[1],g.fill(),g.translate(j[0]*ub,j[1]*ub),this._drawCoords(g,h),g.fillStyle=e[0],g.fill()):(h=this._calculateTip(r),h="m"+h[0]+","+h[1]+" l"+h[2]+","+h[3]+" "+h[4]+","+h[5]+" xe",j[2]=l&&/^(r|b)/i.test(b.string())?8===db.ie?2:1:0,o.css({coordsize:k[0]+l+" "+(k[1]+l),antialias:""+(r.string().indexOf(O)>-1),left:j[0]-j[2]*Number(f===G),top:j[1]-j[2]*Number(f===H),width:k[0]+l,height:k[1]+l}).each(function(a){var b=d(this);b[b.prop?"prop":"attr"]({coordsize:k[0]+l+" "+(k[1]+l),path:h,fillcolor:e[0],filled:!!a,stroked:!a}).toggle(!(!l&&!a)),!a&&b.html(vb("stroke",'weight="'+2*l+'px" color="'+e[1]+'" miterlimit="1000" joinstyle="miter"'))})),a.opera&&setTimeout(function(){m.tip.css({display:"inline-block",visibility:"visible"})},1),c!==E&&this.calculate(b,k)},calculate:function(a,b){if(!this.enabled)return E;var c,e,f=this,g=this.qtip.elements,h=this.element,i=this.options.offset,j=(g.tooltip.hasClass("ui-widget"),{});return a=a||this.corner,c=a.precedance,b=b||this._calculateSize(a),e=[a.x,a.y],c===G&&e.reverse(),d.each(e,function(d,e){var h,k,l;
e===O?(h=c===H?L:K,j[h]="50%",j[ib+"-"+h]=-Math.round(b[c===H?0:1]/2)+i):(h=f._parseWidth(a,e,g.tooltip),k=f._parseWidth(a,e,g.content),l=f._parseRadius(a),j[e]=Math.max(-f.border,d?k:i+(l>h?l:-h)))}),j[a[c]]-=b[c===G?0:1],h.css({margin:"",top:"",bottom:"",left:"",right:""}).css(j),j},reposition:function(a,b,d){function e(a,b,c,d,e){a===Q&&j.precedance===b&&k[d]&&j[c]!==O?j.precedance=j.precedance===G?H:G:a!==Q&&k[d]&&(j[b]=j[b]===O?k[d]>0?d:e:j[b]===d?e:d)}function f(a,b,e){j[a]===O?p[ib+"-"+b]=o[a]=g[ib+"-"+b]-k[b]:(h=g[e]!==c?[k[b],-g[b]]:[-k[b],g[b]],(o[a]=Math.max(h[0],h[1]))>h[0]&&(d[b]-=k[b],o[b]=E),p[g[e]!==c?e:b]=o[a])}if(this.enabled){var g,h,i=b.cache,j=this.corner.clone(),k=d.adjusted,l=b.options.position.adjust.method.split(" "),m=l[0],n=l[1]||l[0],o={left:E,top:E,x:0,y:0},p={};this.corner.fixed!==D&&(e(m,G,H,L,N),e(n,H,G,K,M),(j.string()!==i.corner.string()||i.cornerTop!==k.top||i.cornerLeft!==k.left)&&this.update(j,E)),g=this.calculate(j),g.right!==c&&(g.left=-g.right),g.bottom!==c&&(g.top=-g.bottom),g.user=this.offset,(o.left=m===Q&&!!k.left)&&f(G,L,N),(o.top=n===Q&&!!k.top)&&f(H,K,M),this.element.css(p).toggle(!(o.x&&o.y||j.x===O&&o.y||j.y===O&&o.x)),d.left-=g.left.charAt?g.user:m!==Q||o.top||!o.left&&!o.top?g.left+this.border:0,d.top-=g.top.charAt?g.user:n!==Q||o.left||!o.left&&!o.top?g.top+this.border:0,i.cornerLeft=k.left,i.cornerTop=k.top,i.corner=j.clone()}},destroy:function(){this.qtip._unbind(this.qtip.tooltip,this._ns),this.qtip.elements.tip&&this.qtip.elements.tip.find("*").remove().end().remove()}}),hb=R.tip=function(a){return new v(a,a.options.style.tip)},hb.initialize="render",hb.sanitize=function(a){if(a.style&&"tip"in a.style){var b=a.style.tip;"object"!=typeof b&&(b=a.style.tip={corner:b}),/string|boolean/i.test(typeof b.corner)||(b.corner=D)}},B.tip={"^position.my|style.tip.(corner|mimic|border)$":function(){this.create(),this.qtip.reposition()},"^style.tip.(height|width)$":function(a){this.size=[a.width,a.height],this.update(),this.qtip.reposition()},"^content.title|style.(classes|widget)$":function(){this.update()}},d.extend(D,y.defaults,{style:{tip:{corner:D,mimic:E,width:6,height:6,border:D,offset:0}}});var wb,xb,yb="qtip-modal",zb="."+yb;xb=function(){function a(a){if(d.expr[":"].focusable)return d.expr[":"].focusable;var b,c,e,f=!isNaN(d.attr(a,"tabindex")),g=a.nodeName&&a.nodeName.toLowerCase();return"area"===g?(b=a.parentNode,c=b.name,a.href&&c&&"map"===b.nodeName.toLowerCase()?(e=d("img[usemap=#"+c+"]")[0],!!e&&e.is(":visible")):!1):/input|select|textarea|button|object/.test(g)?!a.disabled:"a"===g?a.href||f:f}function c(a){k.length<1&&a.length?a.not("body").blur():k.first().focus()}function e(a){if(i.is(":visible")){var b,e=d(a.target),h=f.tooltip,j=e.closest(W);b=j.length<1?E:parseInt(j[0].style.zIndex,10)>parseInt(h[0].style.zIndex,10),b||e.closest(W)[0]===h[0]||c(e),g=a.target===k[k.length-1]}}var f,g,h,i,j=this,k={};d.extend(j,{init:function(){return i=j.elem=d("<div />",{id:"qtip-overlay",html:"<div></div>",mousedown:function(){return E}}).hide(),d(b.body).bind("focusin"+zb,e),d(b).bind("keydown"+zb,function(a){f&&f.options.show.modal.escape&&27===a.keyCode&&f.hide(a)}),i.bind("click"+zb,function(a){f&&f.options.show.modal.blur&&f.hide(a)}),j},update:function(b){f=b,k=b.options.show.modal.stealfocus!==E?b.tooltip.find("*").filter(function(){return a(this)}):[]},toggle:function(a,e,g){var k=(d(b.body),a.tooltip),l=a.options.show.modal,m=l.effect,n=e?"show":"hide",o=i.is(":visible"),p=d(zb).filter(":visible:not(:animated)").not(k);return j.update(a),e&&l.stealfocus!==E&&c(d(":focus")),i.toggleClass("blurs",l.blur),e&&i.appendTo(b.body),i.is(":animated")&&o===e&&h!==E||!e&&p.length?j:(i.stop(D,E),d.isFunction(m)?m.call(i,e):m===E?i[n]():i.fadeTo(parseInt(g,10)||90,e?1:0,function(){e||i.hide()}),e||i.queue(function(a){i.css({left:"",top:""}),d(zb).length||i.detach(),a()}),h=e,f.destroyed&&(f=F),j)}}),j.init()},xb=new xb,d.extend(w.prototype,{init:function(a){var b=a.tooltip;return this.options.on?(a.elements.overlay=xb.elem,b.addClass(yb).css("z-index",y.modal_zindex+d(zb).length),a._bind(b,["tooltipshow","tooltiphide"],function(a,c,e){var f=a.originalEvent;if(a.target===b[0])if(f&&"tooltiphide"===a.type&&/mouse(leave|enter)/.test(f.type)&&d(f.relatedTarget).closest(xb.elem[0]).length)try{a.preventDefault()}catch(g){}else(!f||f&&"tooltipsolo"!==f.type)&&this.toggle(a,"tooltipshow"===a.type,e)},this._ns,this),a._bind(b,"tooltipfocus",function(a,c){if(!a.isDefaultPrevented()&&a.target===b[0]){var e=d(zb),f=y.modal_zindex+e.length,g=parseInt(b[0].style.zIndex,10);xb.elem[0].style.zIndex=f-1,e.each(function(){this.style.zIndex>g&&(this.style.zIndex-=1)}),e.filter("."+$).qtip("blur",a.originalEvent),b.addClass($)[0].style.zIndex=f,xb.update(c);try{a.preventDefault()}catch(h){}}},this._ns,this),void a._bind(b,"tooltiphide",function(a){a.target===b[0]&&d(zb).filter(":visible").not(b).last().qtip("focus",a)},this._ns,this)):this},toggle:function(a,b,c){return a&&a.isDefaultPrevented()?this:void xb.toggle(this.qtip,!!b,c)},destroy:function(){this.qtip.tooltip.removeClass(yb),this.qtip._unbind(this.qtip.tooltip,this._ns),xb.toggle(this.qtip,E),delete this.qtip.elements.overlay}}),wb=R.modal=function(a){return new w(a,a.options.show.modal)},wb.sanitize=function(a){a.show&&("object"!=typeof a.show.modal?a.show.modal={on:!!a.show.modal}:"undefined"==typeof a.show.modal.on&&(a.show.modal.on=D))},y.modal_zindex=y.zindex-200,wb.initialize="render",B.modal={"^show.modal.(on|blur)$":function(){this.destroy(),this.init(),this.qtip.elems.overlay.toggle(this.qtip.tooltip[0].offsetWidth>0)}},d.extend(D,y.defaults,{show:{modal:{on:E,effect:D,blur:D,stealfocus:D,escape:D}}}),R.viewport=function(c,d,e,f,g,h,i){function j(a,b,c,e,f,g,h,i,j){var k=d[f],s=u[a],t=v[a],w=c===Q,x=s===f?j:s===g?-j:-j/2,y=t===f?i:t===g?-i:-i/2,z=q[f]+r[f]-(n?0:m[f]),A=z-k,B=k+j-(h===I?o:p)-z,C=x-(u.precedance===a||s===u[b]?y:0)-(t===O?i/2:0);return w?(C=(s===f?1:-1)*x,d[f]+=A>0?A:B>0?-B:0,d[f]=Math.max(-m[f]+r[f],k-C,Math.min(Math.max(-m[f]+r[f]+(h===I?o:p),k+C),d[f],"center"===s?k-x:1e9))):(e*=c===P?2:0,A>0&&(s!==f||B>0)?(d[f]-=C+e,l.invert(a,f)):B>0&&(s!==g||A>0)&&(d[f]-=(s===O?-C:C)+e,l.invert(a,g)),d[f]<q&&-d[f]>B&&(d[f]=k,l=u.clone())),d[f]-k}var k,l,m,n,o,p,q,r,s=e.target,t=c.elements.tooltip,u=e.my,v=e.at,w=e.adjust,x=w.method.split(" "),y=x[0],z=x[1]||x[0],A=e.viewport,B=e.container,C=(c.cache,{left:0,top:0});return A.jquery&&s[0]!==a&&s[0]!==b.body&&"none"!==w.method?(m=B.offset()||C,n="static"===B.css("position"),k="fixed"===t.css("position"),o=A[0]===a?A.width():A.outerWidth(E),p=A[0]===a?A.height():A.outerHeight(E),q={left:k?0:A.scrollLeft(),top:k?0:A.scrollTop()},r=A.offset()||C,("shift"!==y||"shift"!==z)&&(l=u.clone()),C={left:"none"!==y?j(G,H,y,w.x,L,N,I,f,h):0,top:"none"!==z?j(H,G,z,w.y,K,M,J,g,i):0,my:l}):C},R.polys={polygon:function(a,b){var c,d,e,f={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10},adjustable:E},g=0,h=[],i=1,j=1,k=0,l=0;for(g=a.length;g--;)c=[parseInt(a[--g],10),parseInt(a[g+1],10)],c[0]>f.position.right&&(f.position.right=c[0]),c[0]<f.position.left&&(f.position.left=c[0]),c[1]>f.position.bottom&&(f.position.bottom=c[1]),c[1]<f.position.top&&(f.position.top=c[1]),h.push(c);if(d=f.width=Math.abs(f.position.right-f.position.left),e=f.height=Math.abs(f.position.bottom-f.position.top),"c"===b.abbrev())f.position={left:f.position.left+f.width/2,top:f.position.top+f.height/2};else{for(;d>0&&e>0&&i>0&&j>0;)for(d=Math.floor(d/2),e=Math.floor(e/2),b.x===L?i=d:b.x===N?i=f.width-d:i+=Math.floor(d/2),b.y===K?j=e:b.y===M?j=f.height-e:j+=Math.floor(e/2),g=h.length;g--&&!(h.length<2);)k=h[g][0]-f.position.left,l=h[g][1]-f.position.top,(b.x===L&&k>=i||b.x===N&&i>=k||b.x===O&&(i>k||k>f.width-i)||b.y===K&&l>=j||b.y===M&&j>=l||b.y===O&&(j>l||l>f.height-j))&&h.splice(g,1);f.position={left:h[0][0],top:h[0][1]}}return f},rect:function(a,b,c,d){return{width:Math.abs(c-a),height:Math.abs(d-b),position:{left:Math.min(a,c),top:Math.min(b,d)}}},_angles:{tc:1.5,tr:7/4,tl:5/4,bc:.5,br:.25,bl:.75,rc:2,lc:1,c:0},ellipse:function(a,b,c,d,e){var f=R.polys._angles[e.abbrev()],g=0===f?0:c*Math.cos(f*Math.PI),h=d*Math.sin(f*Math.PI);return{width:2*c-Math.abs(g),height:2*d-Math.abs(h),position:{left:a+g,top:b+h},adjustable:E}},circle:function(a,b,c,d){return R.polys.ellipse(a,b,c,c,d)}},R.svg=function(a,c,e){for(var f,g,h,i,j,k,l,m,n,o=(d(b),c[0]),p=d(o.ownerSVGElement),q=o.ownerDocument,r=(parseInt(c.css("stroke-width"),10)||0)/2;!o.getBBox;)o=o.parentNode;if(!o.getBBox||!o.parentNode)return E;switch(o.nodeName){case"ellipse":case"circle":m=R.polys.ellipse(o.cx.baseVal.value,o.cy.baseVal.value,(o.rx||o.r).baseVal.value+r,(o.ry||o.r).baseVal.value+r,e);break;case"line":case"polygon":case"polyline":for(l=o.points||[{x:o.x1.baseVal.value,y:o.y1.baseVal.value},{x:o.x2.baseVal.value,y:o.y2.baseVal.value}],m=[],k=-1,i=l.numberOfItems||l.length;++k<i;)j=l.getItem?l.getItem(k):l[k],m.push.apply(m,[j.x,j.y]);m=R.polys.polygon(m,e);break;default:m=o.getBBox(),m={width:m.width,height:m.height,position:{left:m.x,top:m.y}}}return n=m.position,p=p[0],p.createSVGPoint&&(g=o.getScreenCTM(),l=p.createSVGPoint(),l.x=n.left,l.y=n.top,h=l.matrixTransform(g),n.left=h.x,n.top=h.y),q!==b&&"mouse"!==a.position.target&&(f=d((q.defaultView||q.parentWindow).frameElement).offset(),f&&(n.left+=f.left,n.top+=f.top)),q=d(q),n.left+=q.scrollLeft(),n.top+=q.scrollTop(),m},R.imagemap=function(a,b,c){b.jquery||(b=d(b));var e,f,g,h,i,j=(b.attr("shape")||"rect").toLowerCase().replace("poly","polygon"),k=d('img[usemap="#'+b.parent("map").attr("name")+'"]'),l=d.trim(b.attr("coords")),m=l.replace(/,$/,"").split(",");if(!k.length)return E;if("polygon"===j)h=R.polys.polygon(m,c);else{if(!R.polys[j])return E;for(g=-1,i=m.length,f=[];++g<i;)f.push(parseInt(m[g],10));h=R.polys[j].apply(this,f.concat(c))}return e=k.offset(),e.left+=Math.ceil((k.outerWidth(E)-k.width())/2),e.top+=Math.ceil((k.outerHeight(E)-k.height())/2),h.position.left+=e.left,h.position.top+=e.top,h};var Ab,Bb='<iframe class="qtip-bgiframe" frameborder="0" tabindex="-1" src="javascript:\'\';"  style="display:block; position:absolute; z-index:-1; filter:alpha(opacity=0); -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";"></iframe>';d.extend(x.prototype,{_scroll:function(){var b=this.qtip.elements.overlay;b&&(b[0].style.top=d(a).scrollTop()+"px")},init:function(c){var e=c.tooltip;d("select, object").length<1&&(this.bgiframe=c.elements.bgiframe=d(Bb).appendTo(e),c._bind(e,"tooltipmove",this.adjustBGIFrame,this._ns,this)),this.redrawContainer=d("<div/>",{id:S+"-rcontainer"}).appendTo(b.body),c.elements.overlay&&c.elements.overlay.addClass("qtipmodal-ie6fix")&&(c._bind(a,["scroll","resize"],this._scroll,this._ns,this),c._bind(e,["tooltipshow"],this._scroll,this._ns,this)),this.redraw()},adjustBGIFrame:function(){var a,b,c=this.qtip.tooltip,d={height:c.outerHeight(E),width:c.outerWidth(E)},e=this.qtip.plugins.tip,f=this.qtip.elements.tip;b=parseInt(c.css("borderLeftWidth"),10)||0,b={left:-b,top:-b},e&&f&&(a="x"===e.corner.precedance?[I,L]:[J,K],b[a[1]]-=f[a[0]]()),this.bgiframe.css(b).css(d)},redraw:function(){if(this.qtip.rendered<1||this.drawing)return this;var a,b,c,d,e=this.qtip.tooltip,f=this.qtip.options.style,g=this.qtip.options.position.container;return this.qtip.drawing=1,f.height&&e.css(J,f.height),f.width?e.css(I,f.width):(e.css(I,"").appendTo(this.redrawContainer),b=e.width(),1>b%2&&(b+=1),c=e.css("maxWidth")||"",d=e.css("minWidth")||"",a=(c+d).indexOf("%")>-1?g.width()/100:0,c=(c.indexOf("%")>-1?a:1)*parseInt(c,10)||b,d=(d.indexOf("%")>-1?a:1)*parseInt(d,10)||0,b=c+d?Math.min(Math.max(b,d),c):b,e.css(I,Math.round(b)).appendTo(g)),this.drawing=0,this},destroy:function(){this.bgiframe&&this.bgiframe.remove(),this.qtip._unbind([a,this.qtip.tooltip],this._ns)}}),Ab=R.ie6=function(a){return 6===db.ie?new x(a):E},Ab.initialize="render",B.ie6={"^content|style$":function(){this.redraw()}}})}(window,document);
//# sourceMappingURL=jquery.qtip.min.js.mapassets/js/jquery.qtip/index.php000064400000000016151336065400012575 0ustar00<?php
//silentassets/js/jquery.qtip/jquery.qtip.min.css000064400000021543151336065400014554 0ustar00/* qTip2 v2.2.1 | Plugins: tips modal viewport svg imagemap ie6 | Styles: core basic css3 | qtip2.com | Licensed MIT | Sat Sep 06 2014 23:12:07 */

.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:375px;min-width:50px;font-size:11px;line-height:12px;direction:ltr;box-shadow:none;padding:0}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;z-index:11;cursor:pointer;outline:0;border:1px solid transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-icon .ui-icon,.qtip-titlebar .ui-icon{display:block;text-indent:-1000em;direction:ltr}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;line-height:14px;text-align:center;text-indent:0;font:400 bold 10px/13px Tahoma,sans-serif;color:inherit;background:-100em -100em no-repeat}.qtip-default{border:1px solid #F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111}.qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1}.qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0}.qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon,.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252}.qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0}.qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-bootstrap,.qtip-rounded,.qtip-tipsy{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-rounded .qtip-titlebar{-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border:0 solid transparent;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,#000));background-image:-webkit-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,#000 100%)}.qtip-youtube .qtip-titlebar{background-color:transparent}.qtip-youtube .qtip-content{padding:.75em;font:12px arial,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)"}.qtip-jtools .qtip-content,.qtip-jtools .qtip-titlebar{background:0 0;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px #000}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10px;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10px}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:0 0}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}.qtip .qtip-tip,x:-o-prefocus{visibility:hidden}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml,.qtip .qtip-tip canvas{position:absolute;color:#123456;background:0 0;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:0;top:0;width:100%;height:100%}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"alpha(Opacity=70)"}.qtipmodal-ie6fix{position:absolute!important}assets/webfonts/fa-solid-900.woff000064400000273764151336065400012612 0ustar00wOFFw�
�tIyXFFTM0�qqGDEFL*�OS/2lO`C��cmap�?
A6Mgasp���glyfErz�� �#headMx56��hheaM� $ChmtxM�,�0u�locaQ�	w�.�maxp[t �name[�%I�2�post]�N-_�zƱx�c```d�	�9`�c�U(}G/��x�c`a�������Ø�����2H2�0001�23�����04|`���x�=�3!
@5`�V�K��#v'-x���kp���'!1�=gϫHJS@먵��
x�2� H
�:��S��R� *� P
� 	��r��4҄�D@�B��Rv��g�%���;�8�~�_���Μ��p��o��8-�oN;'¿��(���Q-�;N�Hǹ�/"E�࢕h-ڊv"^��D�H��"]L��b�X ��r�+
�Q+��q\��7$�\�!��x�Qv���_��eO�O>#�9L��W�t9KfɅr�\"���In��r����e�l�g�%i�
�bSmT���zL�PϪ��~�&�Ij����W�R�\�R��P�TŪDU�Zu@ի3Ꜻ�.+����n��.���nw7�Mq��#�i�j����V�{�w�{�=�q/�M�u�Yߦ�Q��~\?�{�>��~Z�׃t��u�Nѯ�:M����qz�~GO�3�=O���z�ު�t�.��R����QݨOy-��2/�[�m��y;������z�C^�W�5z'���9�o�	�V�����`��n�I���3��@�+3Լ`�L�i���M�3Ό7M�y�d��f����5k�:��|l�M�)7��S��|f�0���`N��漹l�i2׬c�r����x��>h;ۧlo����m�}�&�W�h��}�N�6�β��E6���<��n����[n+l�������[g��K��Uֳ�~�	�wl|(ع��q�#�D����B�:�>b��.��e��E�X)6�r�O�ݝ�A�H���w�^�'�Ȯ��|J���
����,��ir�\v�-7����\ք������.��bU��[uP]Uw�[
VC}wTC���-S9j��v�KU�}��MwRy!w�nː�nnR�]��������_ܽ��{M���M�St���������$��wwP7蓺ɋ��*o���+�2�ګ��5|�ݵo���{�w�����(3�����d�]���������w��ɐ�KF|��4[滻+����>q���lj��X�n���]�]V��
��*��n���N�]�������oq$�]k�݃_��D"5�
�F_�U���%I���%�@�����H�t���}B{��vSUP)S���6�&�;�F����:ʧմ�VR��ʤt�L�h"M��i4�F�h8���H����@OS?�K}�=J]�z�~F?��Ԟ�$Nȯ�k����K~���'�q���a~�ʫ�n^�+x/��c��o�9|1��_�oy���#��1<�G�A���cx��s܋�0��j\�y��9��q).�Ř���=��s�/8g���8�`:N�I8�p�`2���0	��s8�3��Ŏ��c<���=x7��6����?�bFC��ih�:85P
�P��(�B��`�X���@�B��e�
Kaِ̅	�a*�
��`,��4xF�o`$��TH�a�/@"<��Y�=�t�_@gx�{�-�]@�C4�`M�*s�E�%;�αӬ�c��A���`��^��U�ݬ�U�]����RV�6���z��ְ�,�-a��=6���M�f����}'�6�&����D~�����!��He���x���	�Gy(��W�5==�=�s��;�޳;;3�k5Z]+��
$[G^۲%l���c��d��%8`�
�#�@X;��	��	����8yɋ�/1��WU�s�J��v����뮯���C�~qn���*�r‘�t4⌢\m��	�J�z5;E���ِ��U��������۾��%�~����8ȋCOr)�9W��W�ݚi�C3�B=�s�����`���@+��d�P/�_��̃d�l����y�rq.�q��Drn� 9O�&��P@q�>S���9�)��#xv�;�|��1Kÿ�a߾�I���F���ŝ�-�b����j�{��^@sa��WJ�Q���BOOʣ�k	��Qyr�Ƣ�oD���}JӞ���WK�SR�/���O�ǹ�S��I^nT�DX.nEг[Բ��~�0o���[���Lù}&�7�ͣ�ۮ�c���?j�(�g���s�Kr�k����ȑ��t
��tEh���KSNk�I]��/ʯ���xic�I���ƥ�E�UY�h���6q��WrWq7r�so��m��!E��(�=��k!RZ�ل������ӱ�~�<iܗ�-zN3MM1�Fk��&�Z��Y�SF���:	�M�uZ3�p����b'�&Mt��}r�0���Q�]k�r��t�s�r�Ч[��l��t��@z�W������WIC���h1�	*�cъ��O��z��ub�ط��*�<�
���-�gG:U$Uqu�#��j���I��ډ�>(���}��Ԯ#u�X��'~p2�茈ɏڋ���S���c;N�[�ꠓ��G�_@!����$U=�I�	�c�]�+�{���5s�RXu\�������O�{f�y��xPs��w�_��M�n�<�AI�G<�O43�y�\�w>�nz���V��G���<։e{���o�hu�8��K� �4�����QN�U"���Q��8�������
���9.��F7sy���L!���}���F��z䈚Т*y��W�L��/%��*A�O��n���(��`��x�-�T�H���4��F~��O�laG�#�'O �+�1�~��v;O���]uԹ7�Ց�����.\�Dž�s�����P�an�Ya��s�9s�n�Q�BĉV�뵙bimEs�.�:U����[�'&2jD�D[�vͮ��e�(ZR�*Sː�zG��-Ge��Es�,�)%,�Rd���.�Ia%�Jϒ�gي���0Ǡ����5��W_���l/�6^$�,VU\!�bۇ*m��u|+*^%Op�T�D�ପ�u�~���eXf�
�{��[�Gg�׸���?a."cn��(�ȳ�Iq�a0�ATo�fuZu�Ӎ|�X��
����&sj���#�\	� ��7�y�P;od�G��Zm�qט�x��)Í�x��J��P(N_K�5�51�ϏO�<�M�����3M�D�vnN�-J�Sfv��r��9�S� B͇�(&*�c*>�U�4I��P�$	�"�� �b\_0s�WaiV�h��z����addM�OA2aP��'i�|�����#a,���Zʹ�`M<x`�a���,E�N�m��}����}hJ�UmCB��G⾅Ւ�'��S	,:����N��rt�Q���f����"xÆvb'
���J�.CG���r�����Q�߂á'u���?
�w)�5�$��w��|Z�Z�1�g7���*O�|��52D��X�i�Ё�kόI�"��Ӓ"UdE�+ࡸ�*�Qn�����W��	$�S��Fq���V�D�`U�{>�ˡ��>$[�C�8d�i�*d�?0	N=��w�aXQ���#qH��Y�N� i��
��H�����M��(�<��.��OvYW�U�ڨ��YPRnF��ʭ�|c�D��i�!(�=A�#�&���fs��R��S<�����w�q'`k�	�$�$A��BG�%x�~F��S����.�s���S��S��W8�u��5yN��I���F��tC"�I!���+d�h
Z�w	Ԥ�
&�Y-�i�q1y�\�%31׃ҕ�}���Uչ�LX�̇~�UPɯ�0L/}�ͤ�0�&
����.F �F\�I�p��í��*m��F[bt%���]x���sn+�6����hs޼����.%r?z��D��j}:纽�wS$�/��7�ZC�h�=]�G�N{���IK�B?X#�:Pj5�8ĝ��O9�+�bqd�ș��J��,l�⊭鑑���
]��C�<���.��O��Ww��u`7������`�ܴu�Xbn��,�s1�����c��28�iHλ�)���@,�P:��f�)������5A�Cr�^[zf�$�@��<�)&�m�⪱����9;���xS��*JH��[M
(���7_��h`�8CJ����O�B��t:L��U�Yc`����
�a�N[�~���̖��/�=�^�6����],�	�c�3��̡�����H<QUR#ptGo��1\6$9dKƄ!�!�#(}��g��7�-�Wn�S���9@� 
6'�s���UD�w�ج8��f'�TQw��ê
P^���[5G���-}}����ᄏ$K�#E��-m:��Kzb�qYRT[6��&Ɔ�Ir��N�)�
�0]8n��a%�F9n�FJ�j�Q���|�X�a�!H��K�[]n.���"�d�2ͥf&gHL��
?xI�˙���r&��6ߤ��$�EV�I�-
�р��
U��aU
�Cj2�TɿD8&��p�D��rk�W�y����!.Nz�.7B����R�7�;��M��{˩T9��7��	�gR$�M#-{y�r��r�QJ	��̶I�h�hyO�b�i��D�O�H~���痢�.D|&�7�$��
F�aDf���C#�@_���w���,�uѪ**���gg�h��U�;r��Ah���mX����k�gM�&G�yu�q�������$��{J�ް�D�P�]9᷃��[Ҏ6lcF�b��hVЏ���j4>}�}5Y���V6P��@v@�P��R����i:&�
I@��H���8�,�lHh�������,�$%k����0>�߽���{p6���9h$�b �����!'urב]��gffP�u���1Y�TBf6�=�z���:,��{ag�(�q�?ΦS�.U��T�]'��&ޑ��C�{Dc���k�e^�2*�8��w��u��z�{�
�?:���P�7P�+P�w�w�5����Kż
�8��!Me�ӥd�IRN6K�/O�3C��\O�Mwܲs�;��gKc�u�Uf+�Ūa�
V�y01��?�s���=d�B�F�nJ�š$��JvU���[�J�oa����Ga>P��I�H|+,bx.c�L��PSR%�m�z��ⷣOp��nؓ�����P���%Q�1���
��JZ��y���"N�AcT�w���W*��,�z��x�s���5j͊GRK��9��E��=@g���ߠ�C?�W�Ț�׺�H�i:�
�z���KZ��{W�o���N<O��˝�/��n�=���!������]T�6R����X��)�f�9���m��'mLjb�h����e� ��}n��<�<��r�s73H��y�_�6��NQf	8�ӝJ��:�%�}O}�֩�9�<^��v��S�Է�^a��:�������5��k������9�W�~���<����We�+?{˩^^y?��<��g
�a��un���j�~���s�E�v~�Ӡ���t����������X�ĨU�x 	���z�����L'��a,a�yyCx��/\Z�`���̿��%��o�v��tg��o����Ҥ�4��7$��wj��/%���E��1l�GV.�	-�#�)�!���}f8�Gc~E���|
����AD~�쇏Md��ch�����U�V+-d��<����F�R���	�ƎL��?ے�����	!��[b8Q��Es�����x.Z:��z������j9� hh^��̣?~����<��q�����!k<-P���ߨO�S2�D�e�DzG�?��Yxܥ(Ҥj���S3W��;���0{x&�jB�$E�&�=�d�k�3c��� 4�V�ޠd
۴�]a�_(��ōBY�0����.#����>�1���^�,}~J+�\�@M���
�7W�[F���o���$�eY�0��0(�E�J��4�5��ǹ�I��,5�YE�u���`�|<z�0N>vZ�N8��7ظ�������ɣ'#?7�l<,<J�{��Q9:f}���8�U��o%���y�d�4�ʹ��7c�d����ڊ��Jw�������S�'��$�w�#�Xkŝ�F�ɬ�Ϙ�ZI�M_F��[>Ja���j)tNch�)�P���'q��q0R�W'Fg׮�nZi����a�0k
��u�_y}��]D}�	��b1ˎ�o�sH�[;���C�CJ�mi����Ϛp:��'zo�7�P{֑�>�S�gIh{Z�X=!WʯU�L�Mn��`<r�1OG��&�&Nu��jY��:�s?A�r�̲�n<N�L�	��(F�'
�'�o?����;I��*��QBQ�vr�����ˬ���x��-AC�ס:��4�4f��=�3��vEW��ow�w��i�Y��nC
��|����[�R�	�}D�цfo����w����u�6JO�+��y���_��z����if�>fQCp�㘎J���xL�]�ē�1���~��,��3��v4�x*�&c�o3x(3�g�{E.��U�i��
C�}�L,d��d1�U�M'�h��4�H�"@I5l#��O���[� ��=��v�
2#����5���&�N�
��!4�q��'1�a��m���{���E��@~���'0�J���jxb
i�by��Kk"\e�C
�62�+�Vi\�d`ɮ��4���v��ƶjÆ1�m���������L\R�=y�ϯ���|j��i�{����F
${�����3[���u��]dI/��ͤ����H`����׿/9B�I9u��.Y�t�c@�h������n�2	�RCa�O`O�e؞@��b݊�`�4�����֏�� ��t�2$��{�@�l
�f&Q["�(�l>�UvT�-����
��
��Q{�%b�:Ow����<B�GNZ���\��%*="43=�(���Ԏi7 F�|%=}��L�@<���Bz|�9j�J����p\E�����l/�ל�3*��_��0�QL�`O͝����O;������]�q�l��.��㽆�/�(t������c�zEB�
�u"k4�#���:��X��9��֙v�i�T�W�Xĵ�Ƽ���S�l�q�|�ͽi�;;B+dK?e2�T�{�?�y���)�jg	�U��LѼ�2��K6��
_�)��)N"v4
�&��,>O�hv�9�����T?R%ɖ�2��n"ᝊ1���ww^a���E�՜*�~W7M�w�m�K���I��5��@g���ݡ�`ަu�nM�RS�Ԕ��Q~�nD�'u����G3^��s��@fT�V�}�(�z��?K&'�䀟�G����1�-B��>�Y�A@�*�y��c��Pz"��H�h���,�
�a�ې놌P&��b�+0l�i�X�"]dh&34��r�Z��ȱ9*P9���Υ�f.�	;VcN�ꂋl������{�쫓5[��tI�4��i7)瓯�O,.N^�l�K�%U�(�M�7"�s�P�Ly����>�y�R�N�,e�LxmB$���槦�7�憞.$�E;1`ˑ��C���Ǧ/�$GΗl0��d��e��ȖBP�i}�C�<�h�ѹ	"��t:����
��A
X�:�EFz���^�"�/<����q�����D�rR����‹W�_Z�ϫ��f��,��P
jʱ�}vw�ë�?S�n��Ԥ�pӼ��U�<q*rrG1,�V�HU���K�G�Mfj3ÅW?4"����DWɂ#)���x��p��)����H����U��*°v�"T?1���%��KqY@_�<��!�>�9�a`p��� IЪ�
)~t�y���m:`T����
�k��H�Z�T2p֜5����*�Z��}�
�ky|�J/`�=���=�";l����I�ϧoy���+*?utT"�4�dA��ѣSI�8�J�A\i����n�
�qŐ7>*(��<mU��*PqY�U���~���1����|�^f<��Z��v���'��얾_>o�p�Z͔SaԵ��:D��4���<~D��	X2���P���yS�'��$j���m�@���l�hD�5�G�jD�dQOo��]�Z&���5�����E鵰I�cSZ_�	�dgQ7���oㆲe�G�� ���/"�Z��pl�08�x�-,6��,����7�V�]ċ��R��r�w�U��pd*�a�e>=@d�>ʙ�frB���*�c
�#Mu�#HI��CF$x,��rA��H�a�\r�o�K��<�ZF"�E	�K4t��ԅ�6m�mA�ᬙ������r���I�lSܒl�l������F[�!��bx0��ٞN��?_��u��U8�K�M�^XC���ZޓS���4�kK~����N�r��寨��3�,CPǭ�=Aܛ��"q��_���6����N�;���yzZ�&�����̨����>�s4
}�0o�v�2
�&/g���_��M��(G����4L�;���ͺ1ˊ�g&�.��`�2֙�?�i��RQ�{���&Y�m�x�������bByI&�w,z>�oك���	��ăN�f�`�N�9@���cqfaR�(E���6S���Q�}�싼w��K(%t1��-gc���:�CO,*�"@Q��Fb��mgW��Ӥ���V����
D��bv����t�$5�y��d;2�U5�	��=�;J������BO ��Ī|�,����>�Y~�
p�YjG�(�rN3*ֈ�̒��¸<$����!!3*��0�b�e��$P(��>	�9Eފ|�Y_t���	Y1�L�L��望�+{���bE��sTH*eX�d�_���M�*�'�JT0���Ź?�߂�����op�q��K4+}�ԥH6�zGʾ#[�Ս����藢s�"�v	탧D���{����N��^��9@�	��Fu鿠B<�HZ�T$E�-�"�-Y���$Ų.�6.��ͅ��
�ұ����>2ee9V����u�X�,@2�6'�1$F�(u�ի���
��i�����*XT��TE9 ���a=/�TS�3���τ4;Qj���S`�02��	i�R��B�Ax�,5+�����dE�鎥[�$�E+�����*0Ul�튐7�"�"��N�yX�6����_BM�0��X�p �G�7\��::A	!,��ςA�&F����ba���B����q@.D'7\�?ܺ7�Z<^�o�TW���l��2�>C)Bm�W��2U�m*Zm-�P]羣fQ���=�ߎZ���n[l�����=�Eh$^tM�$��C'5�R4F(��"��?��f�(Vx���
m��Ԩr8]g�S�%o�&2��'�p��aL�d��"Rԅuq
���aI�.�*s��J�`��5
Ɋh�(S;�j�����&��v�(��Ύ��Lt!� ��Dz�׊1�����O���2<n��5>�m9GO�b�k,����.>��F�E���lYO���(S<��R�̺�n�d�.E�W�B�5)�(}��~y�+0۞����K#�OQS.�ch������P�N�w��ӄ��lNU�Zi~��M㣁�蚘/�X���
&$��
Q;���
F�7m�5_� ���kb��,�f[�1v������]�s�(��:H����]�v��-�$��eLmzur��+��>!ګ���1[�`ss�ʍ�z�DX��*��ĉ���6Y��(�'ZKg@q��"n���q�O���i$�%,�j�n���O�a �%@���2J���y�;B'>�ϯI��A�ޯP�WQ��hz`=	��W]��.@+=2�>��g”_�hR*����e����]~�zˌo2ŚU��Ƃ<��U�N������:0��B�Z���Oq�/��z\�	�I�T�^Ú8a�P+kߥ�y��dU÷=�>��)��C���D^�5U>p�L��o#�S�`Aa�-b}іIC�O�=-es����Q���_�~o��WZ+xu[���`���J��a�f�>�vt��Dc؟~�`�7�qC���TM�#jJ�Zh#������G�]���,]=80%&`��(q>�,����������go��Z�Y�h�ʇj-��\Jj;pT{��(�ؾ���x~ŭ�y��ThS�l�iւC�6x�8A�w��7&4%�5,:�%���q5%Xs�#��m�����z��41I�M?qR�};9ٕUR����Õ<�L�VT��h��)fG}
ҡ��+�I?�P���#�S��	���Ê��	N"�I�o����������P"0�X&8$����` 0n�ƌ@"�62�e���]�����#�"U"��d�_��"l����c�);�۪�A�e� 8��y�y�$��F�#�d}ȯ����@C#6:`���
%
�B88H��	�c�;����wΓ����r��Q��ERT��<J��JX>Q\����;�wZ~hHr�B}�V��"��lX$Mz�qa|I��^_�5�ݮ�A
0�F�_2��k�hw4��>p��e����G��,��̷IR�RV@
��A5oa#j��t��L��/���x�U܋��*f�yZ�<���
x�����L����]�`4�S�_��/X�w&����e�J�6�G�W.����ھ�O�\\cL���=�J�N��W�w(t�R�N�S�,�)�s�8�ң�O6�����@�*�p��/�P�1Ē���ϔ���a(��[5a*��<ը;���i����i�˂�e4<������C���+э�z� � �B�e���M�#4��8p�I���r崵���WV�}8��s�f:n�͐d/�������x	�	���F`��9Œ#:odS�]��uc~�:��b�v�`7H�‚�W߱O
�63��W�I
�ߵ5�{��IG�Ҿ�^Ih��)�x<"��q����+���rxț�v[(���<����-t[��o&���Z�ꤪU�m*jHQ�#��u啻�gd�����T�[U�RaY)�����B�)ח�Y�
"*k�$;	z�2�/%�E�K:��N�_j�"Pf��/�igc�*���!%ő��l�s�@�Psu�n-��T��=����{�h.��@Ā}��|��
��d2L�k�������<|qr��KbU�N<5�t)��K�y���K1����j����m���F�7EO�oKf�{X�F�i\݃�b���Q�k�:��o=
��A��)g��w�#�(ځy��8v�+�篜�W�3Y��5�+��tY���D3q�H?����L�vG��=O>�f{e�`����6��d�Y�������Y_3֔�CZBר{��6cl�P�$�D��=�=6�c��+Ɗ�FHp �"�͑푈$�U�7\�F>Gx�nx\q7$T�dB�fdS$
�6G$QT�FD�N_��J���%踥|^%�f�︝��:|b`"���:��@}����Hl�<�7�P=]�w`��ޠ$��f�a
�~x�7�m�B�ts+��{y�0Yq��t�0�|�<�zz�}���5���G+rS��ٓ���B����E[Y��6џ@J�����k���̸�:a-�ʈ>E?���]��☚��r6+��,p�6x����uh{�����i��"�]8�qE�E���գl��9(�ˆ��MƄ9ѪMI�֢Ka45M�E-�,d�G(�y1��)W���ֳn��m��=�/.aK��|�h'�L���m��p2U���7��4g��Q4����l6��h3A�D��*����Y�E����>:~wx������rWe��%��t=j�@z���H0�̨�iÈ���qo	/���)������){�
a5�Y��d0�ub�oED�'�񜁀&j��gA��wHd���8f��L5��/�{���e�/ES�E�A�K?	S-
Bu������鈷���Z.э�LO�ߩ�(#u��m4�
��^�U+/��Y^�����qwp'���g�\Y#O����/xFlF�����ѷ
�:b��=V�NS	W�=_k��$A�*T��r�F0��+��F�bA��n�D\�$EQT�L���*�C�`��EXEY6D%`
9d�1�R^J��e����ő����@�Td��q�X@0T]�_SeA!lIO� �#�F8A4�^|0����'(�"������*�h��Ө-�T�3����Ƿ|	��؈R�FM��D�T���@~��{�G�IK���K�
+�S+:)�]S�Wlj0��F��Dz[��NXi��8n,��S2M�5z�;b���9���J�^,������� �E�\8E
�M,�ju��͗�t�⟾44�|�+\ٕ��	v��u�9���
HlJH޳�����
Z&N�uii��d��އ��ړh+�#AĞX��"�9d��>ce2�V��Z~h��6��	�����ty�2�D�Z�M�L~�{��� �Ճ����U/�����電�9��@��m�f�a����l�J������?�vI�I�9��5F���>���-с ȏ�L9H�?����G�]��)�ԡ6b��'׌X�~
�E�gDI5X
0xN���
^X%��,$���Qceh	��Zf��j���da��<K���c��L3Y�v������tv���t">���Ȗ|��!.^���Y����7e;TʶZ���z�!se]A�	u�U?���w��|�}Ôw��������[k{3�e��;�a��y���(/#p�yTE'=��.�^_f����v nn�
��������S4�S9V���VH��s�Υ�!MϝA3��t���n�g��m��A���.-@�fu�"�,�Qǹ	>�z��8g����:�7��hj�
��P\3��Q���:�&�4]�q�&�o�?ćՀ,aC5����j�26l��6p��U����a���otI�ϡj�p s�ʗԕ}S�y
r����GO���^�[Ss�:=O���_#a|KO�%�Qt߷�k��^;z��R�-6�k�n�.��&�� �7Kkd�(5@���Rl�b,��˪z��T'�C�_���~�ђn&���M-�|����	}�'2ye+wy)���U��ڒ&s2����P�D�4�il�0q;6d�A�Ÿ���Č�3F�xB1�YY�l�-��ej;������و�kb�V�9���U�/L��)�Z���?+�+�YЭ�V���bۻ�?�bec�mv�M7��R�,vb:��	���8�y��2��S����[�ET�����DH>ƙ&��Q:�j|J�ֈ��pE��`X,;�!�3I�@��\	�ڕ�i}7���l|D���+�:V?�h8ȏb�������xt�LaM��N-Lj���4ߒ��b�a�*�����#m�P�{��s�o�ȭ���y�d��LM���
��̓nv�rW�yFDO��Zp#�9fC:�!�(C🟢a�.I8���ȯQ}���̹���,��Jf6
���LQ��x�ZZ�BZh.����#��+W����Lՙh=�Ţ�$L3������3?=ZA�2:}?Q��`Z�\7�Lp��㲯�M��6lD��?��Z�q����HHD��5K5=5Bz"P�l�?O����{v�w�D�r��h��S�@�!sP��bW*6�dC)f����/��ۉ�=>�O�/
�D��^���Є460f�"–��L<�N��bab�fd`L�wr�	�L��@H��^zWgZM�ԑ);l�Ex�jJ��4O��2���p:�9�g�Q��GW�j/�:��\��t�����������Y��S�A���p!|��k�ڡ_��j�7�Kr��X��X�S�! k"
��ɉĖћ��DaQ%yp�6�U�Y.�rw��B�Zs�1��1�L��W�W��tk��>W2
~-g2��8'��R����^�Ͼ��y#�(
�U�F�1X�q�ٜ��aq���/f���S�fkY
**�!ga`@ac�	y��ݬ����c/�#d�G��|ql{,(�s��{|4»(y��g�ۄ#cg���!R=��2:Y۷���-C��b��e
�s�_�RBiΖ��L�u�Y�Y.�[˙F�J�Fq{�$�-If?����y�ML�#Oz�:-�;b���]_�g�!�Z��V��t+��V�خ?DEn�L�s�`|s�[�^KȎ��e�s`Z�<.Sk=�2,]ӗ�?p�X�$*����Ѧi|�a�á�O94.�!}�TŪ2�T��=>��i�v}�̞�P�0@�t
���:Z��.��ڵ���g�]"X��R�.���-�(@ЖY��S�`��7��E�ZYou��OO�\7�y��m<1��@��<Η�Q��j@ ��FՅ�}�V]>���\�����jU��t��lV=��b���_���D#��^�xxQ�i	ʈ"X;�Ň
�V�>#9]����o�3��s�H�Bk�ev��L;w�щ�d"������&���~����P]���+iCL"�����=X},.��o�9=�Y�^kv�^�_�=��1l��L��wa�Љ�K�:��NtR�v�xq�]����.�ж�)��=m�Y�!�~�k`��b� �$��߲E�ӨmZ�`��/�9���%I$�@q	�v,Ӹ��I��C*# ��}����������C���F��N���`j�Q�L_�k�!��*�~_���V���Gۀ~duY{�@}�ԭ�Mj��8�o/R
�
į^�΢ �$��.��ܠ@*��^���y	�}�z�8�!06�?�9r��Yg2�7�^^��q^���:CG�8�R�����:C�2k��@^M�׺=�Ng.�ͪ#SG,�vn�!�[��D��+�P6�S��j��;y���f�L�I!�*�6+l� �:Ӷ���7e�	`��wdnCI�	�L�P���(��ߜ�3��hq�;��G��G	�z$�u�ڲj��qx��Q���O��`���YmO�dU+�ٱ��}��oSh�G���]{���{w��E��Fh;L@��^2�ײ�:<��J�Ƭ�p�9;��L͵1�uBk��w̺��S�KR�Nዞ�m_���i�]��A�|����f��??��6�D��c��nk�FEx��;=�B���_ا$�.0�g��Q��T[̳���=��X{��,��IԺ���1�L@ʣ�������(����)/j�,���+���}��c��FF���X_S���@UmrXNp�N��aI׸�C8�:�]-�^�!�pk�?�)ۗrt�	�T�^=X��g�Ö�jY�j�.�ә̲���,s���S�]��Z�3����{�|tf����WNn'�%cȎ�{�	r�͖���T��\W
cf�Ώ�u�K�:ٶ�9w-�ko���=�}d�}���/�/�
��I�[i�T�JF�-]��:�^��9���{L��1���K�����)��!ԡ�Fnd�.x��F���i\�q�^ �\�K�"�iD�n$�֢�i@L��Su:k��^��F`ƂI�����ϕ���R>_4�y�1�*g���|��I"�	;�5�ւ\����5���BpW��C�����Ev��]f�1�ˑw���5�Ծ�P�q�#��G�,����j<���<�sױ>�G�5H�^#��/�}��cN�9X�T"v��!�\j��(�X���a�n1ē�A\�M�zJ�N�ʨ����@����Q���=C�GkĸMUޮ�oW�	UY\T�ɶo���p��z�=.A8�6�Բa)׋%O���v�OG��(��t򴑪^2�����p e�V�ƀ~]�u�׉
 b�bdx����b�z�v ����<�u�t=�[�(�U�*��?��(u�%��.��@_MM_S2i�t<���+�$lQ!SN�O�u_m�����<��N-�����o'j}ͤ:Q��qX����>�k}y��D-�mb2�L�(���҉i�䁥M�pڦ���èl9�,�E�t!��M��Q	v�L�6�<��tq˛�	�F��|Y��o8m9C��x&5mi�����4V|���؆X,�uJ!�>��]���+�e$a�2/)��dz����`Tz
�$�?9�O�2/�j &E3a������o�jx�O��"�1.�lL��2B&J�Ī\ϼg���*ue�Ġ	]�.=w���8��F��##�#�b�׋�;X���l�"��FHt�ݐH��6��oX^/��QL����p(�cv'�;m�j1D�[�c�(��<�;Df�[�����B��v2:���l+�� oݵ�\�XF��jf��ND�ɴѢ���#�h*`� Y������
���8>Gp|"g�5��'Z}
~]�QC9��8��##�Gb��B���=�A���w��U�4�Aݎ��wWfD��iz-�1S#����5s���ւAB<`ew��M�]x6v;U�iP�=c��I�R�u0{\rP��Ց9�}�#���tY��)J�s�4��>&�ԲsbC����TŲ�°��!�ɣ@$������՜,mJ�Yq�mt��PDY��W^��aA��y
���D
�h(Ě6����&F�,�1z���_�OPo���]����u��K�ֲ�#�i7j��o��G��H�?S6؎}��A�w����a�>�K��8�l���?�k��y7���1
��7-n���)`�<�7�ra?˙<��Z&�#D�뫸Q��y�2y5�oE,W��<'���3
�t���
�͡|24r�!�p�D��J�"�������au�#�@(����CD^��J$>`$��AWu$�"�Xӧ�i7��*�PX
]w�8ئ���ݒ���9�txg�x�؁�oLƍRk2�g�(�,́˷͒��[��.W1̗��
0�K��«_)Sqe�Z5G_R'��f��^"��V����K��a.�n�I�<d��ő�;�ֻ*\C}�
S��B��;
�ь��>�`��KH	��¹���3��d��aK�qCE_��w��g��rb	ƍ).�6'�`+�|����b��.�J�Kݳؾs4@jx�V����S�*��_R:B4�c�I�����cv�O˝�m�rsb>�#R�oJ�[�Q���ՙF���ϒ�������{��Ŵ��8�J�V��f=�N唍�=�8R��$�x+)�c�����lMI�lCU��^LN�'->���pDmmM���"�TA��*��KL�C����l��H�F��VUU��f
SR�8V�n���N��Ч��GJ�qiJ0�c��V!}��d�Z�ڲ����q}z\���\��1֥"�Ƶ$lDKQ��p
��'=�������_�޿;��wl���a]�p[�5�{T�K���}���v��)��������{�ҥ�橷�S�o�pmϵ�3?x!=�o�<Gffm�{)��n��_j��a�|�E�v(�IV��+*t	
m(�C�jݪ�
3�I����w[����� ����?��)iӃ�
͖�5	Ke	��<U�S��=(ӫ����O�d�}�
=R��j�`^@���
1�H��ֱ��[z���:�V*r=�2b�������7�����k+�0O�n�͔�|/�-P�6�a���>~Dݮ?�_��S�#�z���̳���D��)k��2�����:�*@Ɓ ��ޘ�v�����׽R�惢����!p����/x�X�Xz��$,�u��fKo�,��޳�"]0c�	,::?�8.ÿ�F,曝~�`�p#6�gL���4���h�M�6���{�g���>���:K���Ou�����jx���<Fc�E��}C��9��/M"r/.j"&�r�P���]�N�6�ņt4M�9�]�{����
�L�d����Q�"�r�2I�П�դ6�`���e��W2�3T���{A����5���񭕈!:��hj|������
 I2Y�;�
���#�TEM<�ւ�6���]:<2W����p�6��H�|����z�T=� �qs�M-��@�O� = $}�x��w���z��)]��ߢ�l$�I'(�$�K�)Ñ��7?k��%�L�L�ŷ>x��������~��S#�}yw�j1�N:z��3�G:9[�讌���f�9MW_e��JW;|��D�?�����/\lKS�'��ؗ����@�j���������A|��k�IQ�!�Py�zv2�=��oc�[��`1u�ܘ.(���R�p�XJ�E	�X�y��W��vU9�ڙh@��0u�f=Co�جgښȖF���b[�j�Vl��g�MF��-�I`5�TC����q�XZ"Zg�o��cmH�mQ��Bd��\��(��4��6��u"ܶđ����(Ԟ!|�R�[�k�*�C%�����q��8Ĥp�2/�4-h�B���	Q�6ů}e��ϖ��Ӓ)գ�Q9���v�ǫ��Շ3D_��q�D��y�x��/z�Lp�g���&èImx�,+���߃��`I��a���Y��Z
���fw���&�Lb�X��~bw��	����*CP��������)�g��2��U�
�s�0���@�!�ظ(`�MI�6��F�($���,#Y�A�7/�7c������0���Nu�仉�h���b�߮��a|C71�	�<�c��?x�P��_&�s���s��1.�?7.]����2��k7�:��{�*�w����1��@��+������߻R#Onٜ�	�wI�R^�n#~��g��g�b�����m��0,�]ʜaT�P��Ƈ~���1�wn2ymV�]1ZwE]F	ie���/�/�c�A@�O�q��_T�/�퀲�_R��.c?i?D<X�O�{2U7���3���d<���K��Z�\_����Z�	J��ʲ��k0����c�#��f�)/C�'���9c^�vl��lw��u�65�-�i<b�-�W�ֻ�Ӹ���c�uϽp�Ч`No|%w�ua�[Q�>ի>D��n�lK��&�5�<�MWK�>A��	�
���wS��]�G��1ˈ�NRyuT��!���EGY �MT��D�QX6�W"��k���(����ɏ(�����3��Op��V���t#��K��y�zc�5�%�S�7�����>�i�Ru�&i\��6�k�*�q�l8L�Al�6p�x�ƻF��ϪO�/�'�R�Þу��w]qwVŴ	���~�eϩ�����:��'|�����m���S�j�����Am��m���ӗ�F��5�=������LC��9��I�=��-C�>˶�~Ր'P�Pᄉ��K�E�A	'��u�ĵRa0S���4A��i�_��@��,�K"�2����g������H�Z�Հ�"+bI�&����o���u�_��B�=5�_��Я���O����d�v���j+x823���7L�AL��7�����"q��~С�.���"d͐
m$; T�!�ϝ�eꦣG�3�b8LY�!��Nn�&Bΰ��&����=I�\�m��Ckڰ��B���V�d�HmKĐ)m�4�#����G��),☼�pʬ.��4S��P~�"D�C1��F�
����P&�S�^C�i�[�mʣ!*���z8a;�*;����x|((<M:��'=���(�h߭2��%��u��Ә�̬Y�*|@�]	�h���h����r,l�b=��m�g�=嵵���dm��pR�f�ZS3-�L9P�Wҍ)���i'�T(�uF��L]����eO^�3�;�4d§dx�b��]�i��BP;R������I�ԏLJ~Ե�˶e��rL�@JeiG�F�o�m��9�|��Ìb�Ղ鏒;_��b�"�����(Rlnos��v���[R�p���|PN��=v����U�7Rt[��'�_�B(�c�l�H�l��Âd�D
؞]!�&�R꘍'QQ%=-�=$/�6�&d	�FS<���0+??�sN�anQ�V/W��Q-׵��n1��N�7�@�&gv�/��?�@��l&q����g�I�y c���i���q�ld�OL��G��NQ
;�vpj�F�|\���`�L�'��q�1��<IO�ۼ*�2�e/'�9K*NBE�Ce�3��^/7���P�5Q�f$�wa>��Ȍ[�[�h�A�W	�
��D��ڞ�[�E)>8?1�U�K�!+���,��b8Bh(n
��,� 2:~�͋���ƣ{W�����ư�;��Ѫ0�"�<�w�&̇Z��um*�m�}�n����)YU���x��:����*���0�!�a�7Ҿg�aT�?��=�xAľ�2�Y��C��ea2E�;L����1j�֦ӂ����i<]/RqK~�������a����H#g9)bE/�X����|�i��;kA�*g�3ј&+��|ty��l��1~�day9
����(�����?-P[�}\`b�~zH�!�����dl��	�DD��0��n�[PH	jA%����|Ţ{��ZA��{�L᧗/�&��Z&N�n<��jȐUQTe�B�f�q���,ԙ��n�7��@�N����n����Z�7Mm�mB�#�qL��C"zN�i�Ҫ(�6�$���֒1���B��K�!t�o}�
E��]%���!�Ey���S����[b�����%�˧�VB�@6��o5�(S8�'�}��-3�TeVQQ´P�#�u���+'���$�䃊��t���݊
ߪYa5	�7�1v31�{��/�-�+�(��.�#Z0��(Z�G;��6��yٍ�2����wœ���ö] �,DfJCN#jQ�ʘk��~H/ꊄ��J�=�8�iX�2�[T���J�Xj:�ͯ�z8d9ģ]7^8
S$�zN37!^]UP7�ϥ4��Q�����2�_�y���[F$��,�2RUY3u���]��=�
��:8$�'�M��y��5�븛��V���Ի>�0MDX�Q�v_�}��c�#M�;���f��uB]��=k��z~ϐ{�:�O28�g�ZZ�bz�:q���Sdu��1[�=�OW��T{oC�k���1�r�5����LQ�(��t(���m��P��Y��*�f�{i�qꮰ+���hW<s����$zޱ"�Zj�m��q=f���^e��mQ�*�\v�ez=x\����!cr��0A!.�\���¾!������e*��ջ�d����>��0
O�\���K̇���x<H6������ʹb.~��8�+��-'j�]Iq�><9vb�������c��9���s�㓎*�"�3ۯ*&��x:Q�ꆙqI��ĸ6`�5d1��d��m<��Y���h4�V2�����8�IK�N�{��f��8�6jB���-z�%��D�I��h%��,˗ȱ�Ӂc�~,��q0&[�%��_|ۼ���(�cPF�Ze��>��M���W�){u
GJ���F	���D��:G,��1�:�W�G�#n����_}��Ap�e����MQmZQffeZ��W���բ$�q�gh�{��0*����t�J��]ޓȼ���Wiߤ�Yj}���M�M���5�Q�A�.=�W��`��D����frמyS
�	-�%>���Z�&<���~�w�CjX�s�nH��հ�u�&]P˟�ƓK>��d��$� 嗵��oe�8Ҷ���o0�hrT�����r@�	c>.D����h��E�g�1
Gd�ϵ`��h�i�H����VA�n˶}�B�o�j�	좫&��x��/uo'�Uދ֩����[uUOo��t���3=�=�F3��j�#[��}�&ye��Elc�����-2I` ����֘\�(�%$,Q�#yNn��un�s�S�]=3vx�~O�>u�ԩ�Sg�η������zZ�y�-cVF؈�Ϩ�KP-;3�y!�R��tX�%��#�>�–z�%�g�u�Y������:!B��r�P4r\��+�H�m���x%U�:LF�Rv021�?�x��\�<(	9�(<��|��K@ϥ���.Pu�s��8m;|�*�@��/�T��ٔm㡤4zr�~d�5d��&~�P�B,8���@��"ŊS/O晟�|�� �f���O{
.T��ү�F�����O�E����E�	�Ќ�cQUTU�<4��ޠ�HeY�S�eY�S��`��j{w���*��~eB���x^x�0���l۳o�KN�D�R��Q(Ӻ��N̋���\���4�}�N4�����!+gA��c���̱�׺GW��2gpW"�;@�(��',Li�:�7L1Z�#����U�ǡ��LC���K
�4*���y^�͘Q
{eC��w�&�6
I�ټl:�t�P̞��p_�Ҵ�L%q�8���p=�a=�U	!�#�xT3���M]��5K!m��y5�=��K��AB��er�i�K_GF��r�rUd%��٩��$m��d5�
�j6h��S���H����C�"�U!��ԒƗ`֓�紛R�{T�%y��ʧU��9���E,�͕�c��֑b�^BMz_�fkF3�w��O��P,
��i�</��"KYW�ِ��mr@��Zݬ�����%�ۇ`.��i�=���1xms�I�I�%��$���/|�?w��SF/�'5�O�������P���[�a^����fn/�ឮr*\��s��B����9KqjeWQ(��X�<��緖S�rz�_Q��+J?��R���!P���"�p�f���
��d�v������'�65�ƚ���GL����`��b�X�a=���pP�&���<�m.e{&z����ο�������z(��_��r��J=G4�m��Ļe�92�n������Ao���NR�p��h��^����4(��F��ij�P�z���hIYM&u-�4ו���"�}Ɣ�'�SzBVc�,��q�N�R�SzBR_��v���̤�Ǭף�h�&�|a��8��X��
܁��gܾ�*2E�o��L�Vj0��RW���Nnᢽ7@ل��Չ%}�R%��$M��d+f9Ly��;
CH���=�yd!BIl�-�Ĩ!͈)?ǒ�?ۺ���Y2Q_���̋�f4.~Q�.v8i�;#Y�:<��@}�y��R��x.)R�>��Ҳe!�.��Vb6~�ų	�N�)?��˻쁓�;��,+��?%e���>0p*�Կ"Д>�R
e#�[���z�	t�A=ٸ��S���AO�{��ֻ��<v�m1�4�)t����o�;{}H��8���W9�ms8�8��z	Kd)o��z�]|L{cS˾((b��o5����uC����QQ����r�����H�]�B�q�Ƃ�m7�T��P1��6E^�^z���m
Rt9�'��藐�Kџ���'v�p�O��-``;��2*���8F�#����D[*~BW��ֳ� We���Եǃ��4i�\��֔$\X-�u����*.�6�o���u��"V[>�Ȓ�#���3?���R���z�#�n����r�8�d�p��붢e��N� :ʎǯ}�]��n�ix��D�[l��)��=�{;O������@|����Y]��-D�<g!z�e5��[|��W�������L\GŮc�c�[2�lS�����yj:�O�̃�!�Kp�k��Ě��I�&I]��:�Oy\&�]�
#���`�L���ðW#@��C�x~[�vr�ќqh"9�u)��Kp�x H/8�EH�;}<�.�,�r��y�n�g��OVK��'˙�� �+ڔ�-�7�<3��89�ԉ�G��‰�}�7�J<>�D԰V.�AX
or����a>Emy�ORx�����1�0��I#����r���Y�r;=�$J�ީ~�|!t�A�|���
�ס7ȁ,{d���YBaӋصyMb6�/Ϙ{��3�Bh6QR./fff2�˕�K���3���K��CB=�;8���6�s�y}_IJ"��x����G�Կ����Q#d���;�]��½�{�{�$�{�'	�ȧ`zD��&�%�T��Mq��#�'�^m\�5�_�^i�g>�MS�$]���‚�]./�k�L����Ƿi��
*�4](L��X@�vIR��b����+L��*�!t�f���"�N��W��\8#3�әktk_d(��^����.j-GY��E�H$�BQ�B��] ]�EfQ�u��NV�,��@ty��<��6
G�vӄ�eռ_�4�yny��n�d��o�E�_#�����Wf���h"
���%�f��I���l�E6�f7�o�A?�1�&\�|P+�"�)�/��v��j��~�2�>�|�/_ �ѱ�RO�d��wr�F��B?3�S����a�B�Z�
m��R9�����Q^zI1@���O\��v��Op�m��r)�]��c{�
E�R޽T��_/Iy]����;u=/IG~���t�0{z��?���ISn��&��
Z�Z!R�mM��5�\���qD=_���(��Z����h��p[�$�b��M�y��|W��+[KCD�����"�־v�Gڱׯ��Q��n�Q0�Wf�[`z3]V�tY��e���à���5Q����dPL��HE�7���P4ZӰ?QZ
g�x�~V?��g�f �яBmМ��b2�	wa��.Zm���n#!'��A	�i����8xw�L//��R��?����F4�����Z�%�Ht�oL���\�B\�	*�M�GeX�3�)�n�����0m�P��%D]���D����\ڷu ;v�Q&���ɖNR���
�E^,�$"A��,^�y`�u�l��j	��eO����c�mDž�`��_ƌԋ2
|�DŽ�����C�)��Ƀ#�1L>.HF"{�~�Y��(���ͻ�=��X1v�,��n�=���7������` ����݇ɮ%-	�Pcr?�)=;���ј��Bu�t�;$t�8R�6�P0����7-�)���f��Ծ��E�av�K�C�g�S#I�05O3X����s�r��3Vé�
,ը�F*��be��n��(ڱ��䍀���@��Y��Q�h�HQ,�\��D޾�Sͣ[y�
����);���k�Z�R͐�D
�Sɐ˫����M��i7�3��yم���G�O�	�
?�PE��5�I��FъQ+��q�_����B�Dp�$���z9�"�iV�#ww���5Ohn����.�$*�6Sv�[}�<���k[ �i��G�"퇹�FdujŁ���:ek�/�d�J��qN��BB�ݰ������9�o҂��`p��&+�����1�#�>Ƈ���ͺ�������Xj��oKH�޳pR���:�l��`�Α��ߖ��B�-\���U6µ���k��jvd��m+TɎ�Nb5�g��v�(�Qn��K��j���#��R��Bɭ��G��r;��΂[G׷0�1tR'i-n�m�=<�(
��gi~qq~�K�����{||--./������y��w5�����6vd��n�Y-4�Idܝ'���Y��=��?�|G�L1�K�!�Ø�c*V�ZXJ]���+����,*`:��Y
���d'�xTۃО�䞁�a�Է��%�̸fb���*h��~������;ޯ4MeDQscc_ٽ�_�O��4mD�F,����V�M�>9U��]��O�Q*�&�Ќq���ߨ�.�%��~lnl�le���sc�.�$�<qg��w��A�IRO{���2�V+:l^�x�������.iҖB4�b2� W D��ß{��9VG���4D![����lGIh�eH��GG��L�� �b�`{n(S�5�m2�#M��F)�ծ�-���s>޻����0/�\�e���(X�g33�^I� �ּ4)Q�����K:�|,.�A�&G��RJ��t�tO�FAx�SI�R_���ɇ��/�Epboj���!�V�Nk&�,:9���s]���Lr�2/|wj��d�5!��-���H�;B�!9�C���4
4J�uS�2���L�@5�W��k}OF���l.ng�|3\��z�Pw젽蘤aB>f�˜xoƁ��F���'XprY�'�S8�ޘnet���*�D��S̗��z6�����f�Z����{pȈCmp�W�]Kӆ1�Rx:�t�:M-&��4��/qK�B���Tg�>��=�V=fs1,�z��<L�{��W2KV!�G��L`�����&��4��b��OҤ�������`2����;�|<e0z��T|�h��KG�2��%�B�	}z�ӛ�x:��R��\R�����bԍ1�4�a�Q�_�T�ՠ"_\���䀖���5ec���Lb[K�fJ�q��ьlR4�l|�?N�w�Ó���M˒y��i[V�l.0�'}3�i����V`<�J���)Ij~�j��zM�ɜ����ZtY�ɜ�r8,˱�$3�X{��E��ln��2㰚�c{K�8
0fm�t�p
�,�ԥX�^��Y�&���d�	DBA�Y��d��5aG�Pv�����[s�z6�]�M�4k��-xx@�d�C/��IQ�ݥ����!�홬�%Kݦr,80ׂ��}��.�V��if�QT��g�����5oo~�?(D�<�R'���gcC�;�[�	=�-���w<��K�f��eo�xjhqˁ�}�}�(J��:�ԉ�Ue��*���p)lX)��H���M��QC)�)+9�Ď�-`0�C4@VEIY��c��9�G�T��T��6��(|�rm��\ԂՉ������ҧ��l-�}b���o�bb��9�O(�Ie�w��1��,?��ͪ��[��z�êv���"�ߟJ��m[�,Y�r�.V�z�.�G���x�a�*��g=p�3KU��n:U��W�Jzf
�D�O`�Ik\���Kq�r�\:�^#(���
���aIV>�`��d���8dK��
��gI��������q��6v��WWE�$:�_�Ű��	���/c$�D���ㅵձuH�c��E���j�4���<�����8�!���E[�B���VU�J�IISr�0�
�^�ʅ������l<���-3�`��EYu�K��uJ���퐥*)U�FI�h��U�4�B�
�^�W�M��B�R�m� Y9@�e)V��d�쏎�#�f�H�Fu��b_r�,5/2�r���DLw��5�����ً���/`+�'��lO���~�?R����V]�8��>����B�z�,w�E�J~�νl�z���p�V��X+}J����lY�eHb�hA!��|�%,�+��m�j� �:�� �i���X&'Dh�6��KdU�_�}�>X����įq�*?�}��D��q��m���C����~��ޞ,�Mo���I[hM�>���[(�0~qڬ��2��Gw�쓀7�j��0�SUS�bFh��ʃ�H��O����#��4#�$�$�1�V��P}���>
�
mx��ƶ	����*>HJ4�鷨�'��N�dY����2-��wI�z`0�&�-d��8M��sWZg�h��8׀H�6¬qe�3m��q�;^y�UuJ
��D�����y%�~
ey�+�aX���䄖��Xg�g�n<`:"��A�"sy:��d�@�:��1��۲�ۘ����A���E>�Bp�k�|�ޫ���: �`r�#�u�t>t�@�g����_�::�j��c�`��£�2e�$��(s��>���Μ�<�!��~z�$^-a �s�Ƹr�N����*50���pao���X�|��4)�a�q �?�߻�Gx@�<����e�?b�����c#]g���Wҳ�eu�f�).�R�S)j�����y*5>f%n���s�渎朊٤spn�@��?{�l���ji0-���0�{^%���V���YQ�[geA���`|ebŏ���(�A��	Aׅ�
eD�>��$�u�D2ʵ�
��б���e�,�>���w���dj��^3��D8a�G�������x�cf����#҂9�<�肦���ƩGF>�ʢs�l�l��eH��UZ@ٕfs)e����yZXZ��}������W��B�.���������҅_�w�����_��;8W_��h�b��w��@v��;���S���q@�Ql#B|�(6���CW�����P����w#jc�VN����h
��E(R�os�:t�$fV"3<�%q�jh`���Q��ɌD"���Y� � 
��q	W�¼8���"�H����Nn�*��%o�f��07�Ƽ[�<L|�
P�-�g���H����|jKy��0�� �X�$j�LmĘ����ى
�v��إ��m�O�G�!4\���uK�|M#���~Aپ}sS���DB&���W l���Gك��p��r�2C���I���ܴN��
�kV�i����r���K��J|=��_�s液�R�zj��]LuFrk%�jl��+s	�Y/R5ŶX���K�g�-4�]�KnPoE �+���M��˸*1UiviF�]����	�p��>�q��%�0�r<-���V"�-�:���o*�H�$�.��;�+�ѝ8SR&�d���4�RZ�[#�8ӓ�D����V���ٱ�TM��lݻ:�z���[
0=)�5j��ǿg��AJ�{�xRYX2	�S<?m�.�`-�V�m�&=��
�^��t���h��[o�Dn�
Q�ܘ:0�Vs��o��Ѳ�_UiF��c�^+X���$&�'��g�WR�����>�e��ں���b4�I�5:~�2QD��|-]�0��|�&o]����K"_���޻��K�2O�̢���lw-����[���L��_b���:~�,}�ٴM)��hځG�Ƚ���u��p̼1=4g��V?J��e!�':���+>�+'+#)��X�6��L4��W�=�E5))$C_���$�S�$)WH��tYqB�$��zD��+3���\T
�I��?�]r����ן���3G�q�o1�>B�1l�Z���lˣ<Hh `b��N8K1˳0�}�	���|��,*F�|T���j�Q�#���]�z���kH�)Y��-d�זl�*�	r|�uux�݇�(U�_�
�ݚYL�A���i�H��~-.�n0���;1Ye�EC����C�M@m����^@_K@��
��_[+���&�<U� ���j���)���lD�Ą�������윱��J@	�ĂV#!�
��Ά�a�WD7(�Г�>h�Fo�sq�o��%Py��ɿ$��rP��/��J:���Pt��
7s5�딗u�0��Wk��� bՆ�#��
�y�2�X?r�Fr�9E9
g$�Q3:��h�?�O�8
i����ee�\@IW`I��gB�:D�)�@�^�MChb��݃C�>e;��@��w��PI�i���Ѿ`(�4�}�'�]Z�!B�eFF����"*�Vp{�_�]�<��.���Du�t9���x���(Pב�t��	�� �'�u#Ҡ[Ta(�TeHP��-2rH�/Rb�E,
�?�����_^���h,����Z6�fE_���sk|�O؞צh�\y��[6�uE�TƉ���Bq�nݩ�����al�M����zwX>��'�05P�uY ����uc]�u�^�.�C����]���)|��y�u���h�˻ngO�&��N�S�@��<������Hv~YC�Z����e�1M��(����vܹ<��G�8nU����>�틗�����E[�T��z�F��L����\�������Rnr���%_^���[�=�^�}n(��E��
��[G��}�����˽�R�[�RZ吢�S�]t?����p�l�}��!�N�e����A)�4�7j���Q����T��װ'1�/{��IP۝ ��b8�EC�S�>i�z��-��;9Iʡ�������7�BvO} �ۚ�~hu��6
f��~��4�N��a�f���NU�������0���l�C���&�MׇU�s��Z)_9����٬[?$4��8�3�./<Ia�Ô��;�(Y�I]�d5����Y1WV>.����ݲ��S��YAS*h��ZB_ K��(\@K�n���o��f{n[�.�O�Q,�Z)%Z��kE���l��j�v�V��mV������:QW)�3�m��vЭ��}�V&�u߀�v�^�܎��
�1�A�X�-��~�[<�[���0�k�ˍ-����Ri��>`�?�2�[/�f1��ʥYRa�w���K�}��qun�J.��ٰ���uX�������i��e_�oRw�| f��I
	`$l�MIآ2�/�h'�۶R+�";�c��	�=�;����ݺJ�wܡ'B��n��u8����3?��H憭0+�/�Bx��m����hG\
~$=U�*`�Y^;��� m>����CH ���_��Y�iڒ*�k�5U�z�&�i�Ք����χ�H���Ɂ<�^?�R�e.]���zn�깫��/~<k�J�	l�M��������W|q�AfЄ��j��E#����Hy΋<OIuO�5CM8�<�V�
gJSe2
w�!t?������SԾ��u@�A��/3�X&v���ڻ��kiU�x�Q#B��yMV��$5�|��0خ�m1z�>d0�8��8�%Ǧ$�T� ˒���-c"��?�}5յN���I`�XoP��c�;È����^��K�qe��?nf=�Ao�y��"�	�8+���O�K$���y[�fċ�wN��R=D5�6c���Y$���ϒ���~�GӍ�h:Ao��b��ևx�G���0�xཏ[t�_w�L.R[�W&sx�PK;�"�4�l���v4Sf`.r��aΠ�$��&��U*���1��/"Kz�_7�j�"l��*(����EY�L|$�PFk��Ț�艏_]�]���iE9
��*�C�!K�%<I�`?#��!�52GV�x����v�H���P����M�)Q�W�%��Z�
���K���_��Ռ������T6;��!f�Ҕ$���
:�/"�G��~�Ȉ�I�R,*����IE�ISZX��M�?�����K� ��+������I��P(�y��C$�,����*+�Ƚ#�"����9�Jb.�`���+�[n�7�Vz�'e�v'r�_�7tۘ�H�P�%��뇍��|߂xԗ��k����� }N�=��߂�w����ھ�d�wL���]�w#��
ㄧ�A���;�F&h��&g�3{�L�W{��xÓT��bW��,�r㻡8� !Y���u,�gG�PȰ3N��q�r�2��; �9��6uM�ՐތZO���Е����K�C	+��̒2vO1Z�رc�^����; �K��#���%UD|���������ƿ
=�Mp[�{���X��Ed�>
e6o��_��z�T�No4��q�m]רWKE;��"���y���P9d���S�P��:�i8��
 ��Q!���!�P��P�ڭ�����m�b��b�z!�NldHÒ+jv��B���p-�ʭZݹU�RW�|���11$��j��'�Ԝ(�W���+7�e���#�*�ZL�i�BZU+dB�)�9FWN���;�-�}���xH�v�_�>��;��E��x� �Sp���;�ϩ���R�#��:�v�G�zP^]/�-�<��Ď�*}��Q${�����\�Y���yk"
)3����oR�tu��^��(��P�7�D�6�]̼���7�����hDP�X�&�q�
f�n3B����q% 
���#���&I���ⵊ���N��Ba'�g��a�H��!�	� �Wj�wQ>*�~<Jn'������(�U¶qe��J^���A-��KN�׳�#%#LJ��K�?Oh�/�n�����G)BF�C�)\����ֳ��;�P��l

��!��D-��V��m�
���`�s��?x�{��O%��R�G��H�)E��'�CC�l�ݤZ/���?G��9�\ڥ��ruj^M���5z"��=��2��pY��,�JV�X��?��v��#���a�*�émD�����ϣp%�D!�_�F�+��!D�?jCߕ04) ���^
|y���CޗW����F���Ԥ��kD�5�HC
���-kyޒ��$��
I�i�n�tt�Ҥ���ĝD�';� K���br��s
u�5M��'���/��4��ܦ�HcV@�ΏS\"�^��w�/�:�3�N�&�<���R��(��z�@dNą������E��v��Ĭ�c��>����f�ʘ��j�ʬ���d��ʺj�jR�M�������DBy�����6�髭���<�(]݂�.�����z�$��Ï�+��2��T+��J��H@��@Y*ro2v#;�)�U�4�+J0�*��}�Qʉr
���*����~�DcfUۢt����r��P�s�Ie�_7�����8-�f������j��>���?�E�i}�9EdjQj����O>����
b�?&
�I�eJ�Oҫ��oK��(���=͸5��􍴂�$_���|GZ�m�j	X���D�
ե55�1�	֮*YU{�eg�K]�1���
m/�`o��^e�u�u{*mܗI�*|��1ZXۚ��/��<���i>���R̞m�5�^D���rM��/�(J�GQt���+���"���1з��� "��=���a�wIE�>��SC���_�Bn��[WQ�5�zn�X1����TL�E��X���[�������l��AU��.?@d�#S��cE{���#�D���9��i�W���bš����'�)|h����X��c��T���:w��q�_��Z�[��U��|�-3&��Ύ�U��X�J
zl2c����.;j;����P�Wp��n�������?ƀ�A��l�…0���p�a��C�v��~�'���f_��6�M^uDo����q�����e���6$�D�G �M'`�]����_��>��,�9�k�f[�&6]VT����;���b��;��h��ۍ��K���K�0�~�s�Z���۔i���g��|��C�)k���}d�d(�u*
Cb@��L�(;��B6ȜM�G�̍��I�n
�E������u�~Ѿ�Ir�&��4�ϕ����8���A��r����%0�%+���dj��z�8H�w��\2_'�&��#�7\���$bS�қ�5���}ˎ)AF"*GrC��%��r*��Ԁ��\�;�B��"�l���n�2,+AM��x�VB�[���=ɋbҊ�M׆��c�F��y!�#�|�k�0�]=I�~b
�!���i���Y�8����jɱ��))(�,ӵ��r�]iL�a���	�K\���Ȉ*%�+c�����o����Kt�&�͍Q��=>�g�0&=Oҏ��f�7�rt�N�5��U'|껯��X�|�X��WyN��-G�A\���\�!u�&�R�
Y�+�|����4�p��� c�k�>l�a�{��|�
oԞ �vT븑�l@�,e70�Y�mB�$�A�|
<��{;"�[
���NK�m����D�YB��ɼ,eEgk��K���,V-3$�>�ur]F8g�b�X�E�����#��q"o*�Q�$EE&�������-�
Q$�B}/�g��:&�d[	Y�E�;����[��(C���b���1�ݐ$JCQ1-��� y�*x-�H}y�3���I5�y�{�}�W��9��ө��r�9KtrD�J����UE��X�o�1�<��x_ �תRUe�x��butb��~}��(��4����	'fO4f�Z�5y&��(b��pm�
�ԚZb��?̓VG�@#�D�����
��kJ'�>y���j?V҃��u��;y^߹	�B��x���ַ
���NCH#����,��C�O�q)�����
 q[��ı�vjj��Tfw�����Uu#�6���};�3s�l=�DS!9���wހ��1����o����=�1���u1d�͠(�/_5;���D
�>�;��]�@�Bh�u�� �:�,>�
?�-�O��w�7�d֟���UCI�M��\w�%�f��=�s�2ym��Q��+o����W�i88>W�VQWe@�FvN��t��}^�?��Gr�]ɴ�!R�&u�L��gQ@�z۵�O���̉�Nܴ'eFjj8	�?i�?�F�q�������3��ڗ� �n\�z�>exc䗤��JZ~�����hSXt��VO���3x\�z�a�D3�i�z�8D�t����!���7/�ڂf.��;���S�+�S�T�J �.��@Ι���y���E����0�*���;��"��W����˿N���1�u�>K�����B�r�B`Q	
�u�>�n�������7!��E�W���{�]�NWF膝ۯ���|�/��|8U�)�;�:!���]t�9dv��z,#��C����^��Da0�:�,$҃�.%B���*�O�r�d����
��%$�gD	)�S�EH9 �'ɢ�I��v!3M'Jc��?����`�p��1c���m���&�NJ��G��M��<�8�s�c`t��K�������������QEy��|Y��8���)k�G,T�|L��:�y�}�~��Q�l�M����(��
d�������kUu��7��A���F������k���gd�hbTU_��|$[
�_�|�8�u��4�F�q�ʃI�q�ao��x'���?�m�P��inX�@ގn i2�F�&��g}���9I��{A(ӹ(��E?�Ǘ_���c�5R#ʹ����s�>��H��D^:vw��}��;�q��h�����~JڜL�
����<��y��("�ɨ;L�è1eܜ!��,�F
����>�U�~��k�y������O�~�+���H�'K���<��U��<A�<��M�x�!��~����w|��#��&<��dtՎ�~5Jx%�Om�[@gi����ԏ����-6^i��هZ�,�5����$��9�g.�~���lub��v?|Қ>����A�/M�Ș�4�|�?%�?���wtT�/5	a7Z�l�ko�O���e�
C�k�*:�U���d�۠�A�6�i�/�g7�]��ՠ��\�1;־�[g�*-�������.��w*�|���#��N�i���o�7(�T)x��Z�<׳N�8���q���ck0��V?��QI
IAIuȮ��k�J~�3�.�Qc>�(P��A����+�z��K�x���_��w��P�B	�2��B.�#$<�$�����F���f~Lϴ9
��]CXk�D�Mtz�v��a���?���u���x=5C��VNjأI<��u|.�~eo����a�(h�/�j��~9K	D�S�������P��?%�;H}q\��:��R��w�3TL
���ϓ��f2X딗��!ͬ�͓o�'o����VWZ��u	p)M��}��$3�r\2�u��!���'ң�=����C��k�w����cE���[tߪ�?���ڞC�c���0w�p_h�?r�%bѢy^UY�z�kұ~Y~����v��/�~��rK��S��U �@'�H�N�\pr�BbUʵr��/Ϣ*���?^y���?o_��~�M�Gډ⏑]�����=rF��./g�<w��%����y^�\۷/��KD�soM�|E�]*�z��b)�5#�<$	z�+��S�����QH����3<�n��m'�c�ۨ��3v�Hm��3��P�A:D�ѷ�]z�:Y
JS"
��EJU!�^�H��\�wƐ���!�&�-o���2�J��6sW�RHm>38�ٙ�@�L�Mo\~�,�C�9����cJ�ƥ|��oN����(�|bs',�Ϩ����|O���{�v��hA{��!C�ghrO�0�V;b��U�fs@�*��T�۵�Yu�( �-Sm��-G�on|�!Q����q���ݠ�!y��m�e���}S�/O�/ӽ�R���æ �����e��Nf�p#V�aX�=�u�N��[��bFIW�)� [?�O�Is#dF���m�%.zu���9��KP�W�*�65jn�M����[6ZP����(�‹A�

ѝ���:�,&����P�h�D��e�
$�V�&*G��H��$����yt��'O8�L�����?%{R��z�ae�L�dq�T�Х�\��`t���FŸ%���ċm��zM:<m�=�i+�g���R��cb@J����~�W��Ë).F��:m���ЫӀ�K�?����	�)��d}�=�Z�rFt�3hT,�K�r�HM���T
zLT��Ɍ��)㌂�SZ 8�Ԟ�����{��(��	
�S�fc0t�s���!c�(��ˣBmrF�	J�!D4��ʌnސ�D�5˂�Uy��R�=7�g��R<8{�e[tE	o��ᝲ�)���֎�o���C�?6��$�\"K?:ٙ�~�Y�Em�v�����wp2W�rs��@���J�����7z���(����\}�/�d�|�YN�2:�m���~���im��eD�0�UUy$�����p��D,jasOA�Su�ja:,$y�]_�����[��yF *�����9�&oM��T�����蛃T]��]x��\���r}�۸*P���o�/wCՖP���N�,��Ak��1���^��ھ��ʽd�ϤB^[�ȇQ����"HPhl�B�=�I�����e0�wO
�Gr1jӊ��k�QI��2쒇�ݺUU�Uun]g�b�����􋲤�
SmD����e\�l��B2��s!��R�X/c7dr����]7޸+k�éz=JG���ە��C�z#n����c?�����C��;z�f.���%s�R����\���#��i[��$�5�S��9����HKH�,*�rݡ8��D�	K�G��Q��E�,�L��)����-��e���o�����&���7:�_6���I��@ҳ4+����?�q�8��?�o����^��J@��f�d��,ǯ�卮����3
��`�0N��ζSeH�����2��;�9n+������{��Z��vՕԹ������ʫ-9=� ��B��g��^yg�G�I+�m~�޼��U[�ӲM~�]�!��/R�#N�_J@=�{h,��H���L�ş�d�����D�M�,��|��edGN��ϑ3�|�U��!���췃G����B&#���_���(yaP�ޤw�X�zLf��M�P�P\t���5�v0x$%���vME�!�ԏe
�&b�7�N�����<o�W:�~&������i��@w��5��Ğ
�<���k�Z�W6nT�K�����Gt�~�=ǰ=B����k�2��c\��E�eDmڨ�˸#�U��o�q�q�%}�~�ܛ)'-V�jU*�-�c�Ʃͨ��$J>�@~��uҋ�s���r���{��k�W&?��2Ik�������J����f�k6y��<9ϑi�W�?D����%��K4���W�d]bQ�H�,�c��+��}:Zb'K���(�f�-��I�@��;�_}�Q��b��&(ɖ���B�̛�qC	�X<�z�0�ǖ'dyB��!E]h*���|�M&�J�>[�����w*8��� �$����G�z�[��oZJ�-�V��=dk���4�
��&o�g~�bN�����΍�e--�&tI�y���|@�jJ��֊��<o��'�������r�ѫ|��N,��
����j�Y���;�v�ad3�!R�����b�H^�
���=9�t4�a�`t�L��>����5y�g�-�=�I�����u�3<TO0�]�	eЧ�V��X.7�Eb��ni����lۦ) �aPs�)(F����&+�,�	Kļ�:���EK�JA�&������lOI�ژ�[���7gV;���u����
o>��ǃ#"Հ��.	W@t'�P\��<��w��4(J��05�c��8��;TI�;��W���!�z�;{=��G�*���a&�]��G�`��f�%nj|7�{\�$�(Z TX�W*
y�;Pt)H]!����=?���b|1�\�L�ۨT��e�+�(�ȫ�G�5F�:����@�S�fZ��	�:�]�9��%C��Yzt���i	�p*]�*z�d�w����bǯ����ߐ:�r�;iI�$���m�r��z���3-�8E�[Uh*����O�2y\pG4��-��#�A�������@B
G�4}��Gj'�:�)3j㴥�%�	(�m�9�����O�?HֆKf���'���b��=�(Gmk;�|>�0�i��ejE�,�����׿� ��`#o�g2�wR���?�{t�V�X�toH�p�(�����W�>J	&��SfPLd���t(�H�&��Y��I'����:j��h��yA�7�1�|@�����}��X��좈��۱�G)�(N���>9$ȸ�!!q�i�-��2υs<�"���=;+^%�4��%B3�G�S��GQó�D/T��{j��ٱ�Od} �w��k2>VH�14�v*k��<�c=fG�	)�w�<a��B�`�#�r�Р��ן�<�p}���5(�MF�]���,�C
L
�<0�c�ۊh���PL.�Kwg_�
_�=�7s]Op��7�����Z�-{/+���U�{����OkV�382"��|�
c;�Ύ���03�����|�S�x�����34��RkS�zgx�u�|m�O���7�Q�������������B��xrU�]{��W����NG�ND�X<� ��dWB�?�k�&�%k�~�X4
����B1���^��픢<C��(�)�|W����{��|�L
�c|�T�ԳE�ž7�Zǃ8E(�>W^������B��7��o�uq;:(松8�h���+%V%�֓��p�R��Ż�9U2_�Ȁ�8��Ch�8�8��P��w�S��$s@O���
a����
>��{����7���=N@��Ԋ�������W�ZJ��l��o�z�K�*�f,�b�v"�:�9i�c��[w't�i/���7̧�e+���U��zL��ယ~�W`�W���K�,ʔGQiy��LV2}�\~�m����C�����6^{�}�n���;j�S��25��+;�w�	55F��Y���2<ͅ$�~���!�H
jE-��d���ο˔y;:��i��z�.�L��6�S�&�c-��Q������pΊ���"��ő��ت1��ƀ�����>n�Ļ8;v��e���:t�׀�U'	��]�8�O�$�g�)�9k�n�3_�d�����-q�X­�����0�{���ĭ���)߈f���>|���=�/�8)U�\�����:��f�
�^�}C���r�BEv�t��[3]����'�_0�6�׵>���G�û��K�13�D�	m�qnj\K��ob�$���1��0�W`��	�x/$I�˚�ӛ�{
�0I�&uI�D��*���^ߤ'Í_�(7����"�"7M�}'iy.6#4�q��'�9�1ELvmԳJ���ʓ�ȹZ��z�`7r�S��R� fvndd.K�FΚ<ϣ)�Y�!^��ο9 f��%H�E���,ߗZJ�~���}�e$)�����m��ӗl�a�T4M1u�������]9� Wd�|��z�x�x(j�
Q.*w�t1��7����e;
Bex�]]:�]�K~GtN����gF� Y��m�m(@�4/�rZ$�oh�HzHR�����q$���[�u��/�
F�
�
1�xI�#l��օ��S�4�iPZ�n}��$�<�"�w��,���*ol��v��0�z,Fo�|������I�C��2��L��������bđC6Kb�9XD ?���9�E�B�o�S�`��_y2�0�u�-ы�>H1�q��;���E����i&��-�Y��EQ�~����W�g� ݡ�\����2EZD�+=ʶK���k��J��,n��;��H��R�5���Q�{��Az��t�f���|z�*x,���%�/
���:�ٴ]_Eo_&k)YQ�P�<���`ʭ�E�W�FVZ��%��.�����4m�.�n����x1�]`�w.�޸q�5��RǼ/��j�K�r{�c*��o���E~��Z�Z���b �|����K�Cx�/�i�S�D�K\�̧Ѕ�ƾ��K��l�I�/��{@+���_P��G�<�&��Nr��xU��m[�m��e�JY�����'Wv��6�m�,��;K౥{�]XX���̏8����=�x�����^��/F'0jgWw�V�п�<�vu��<y�7�Ro�M�O��N!�V���z�fK�B,G~С�M��Yb.Rؒ��<�Eh}l--��ΦSive��ce�>���
�w4C1�o�r8.�ڠ��A.hh�-��_����}������Ԃ��%�1��*
>��̷�TP/�o7��y?�y��IEk�ά��D]�Bc��ȩ���w�0��f�i��m��J�ŷZ7���eЪwD�6%��̔���V�J�z-񽺕EP��voO���HF=��y%vʮ����}U��nf�Ļ�#����]U�wH�5!Zb�f�|†�^���F}���y���%R�b�
�� ��0=��`s]c�Y1_�
 
��y��~U���7�Z��z<R�;6j�B�9i�L�O-Q�0ӱ�E~SL�~�2o4[��iC!\�qxꂲ��o�����f��jݾ���)�F�~��+��l?we��PUu����[ª�F�<��eu|���ӻ�;0J}�iB
��g����K�$8
y]��&��g%S����E��[/�Y�)�i��,��"r4�p��9�a���V�?����E���r�
w;���Q��3+��J=#��9�|���Rs�[��LL�1Ž/3���%2Y���av�0¸�(���?JIx+d�k���)`;7F�(���GvK�>��/���c}���
�V�-:�����p���N+F��F�2i�=�aw.���U*���YAR�	���4S�$�`"$��o��HN�o#!腍7�߾X�xZ��m0ҩq̏��OҲ!�e��:��n7�jk��q�R��������ژ��gWG���S�KS/_�M_q�h*pb�1%�L����~�>E��-��7��똡6��P�ի�<34֛�3?��\�q�=H��K}�K3/���%�����se0n���K��\�˖̝(%�z^Fȷ�=��X!Tog�DG���8�/,,��|�JV]��g:pﷸcە�I���^k�8%U�!�Qc��d�H5U_"3W�^����&��+Q���%�
)���#+��v#����D�8�4t$k�%����N�C5ɮ�ϲ�:���F}ɘ� ��h�H���7���k�z�r�q��%���Q3Q���Ց�ܵ4��x�*�2�zrW{3��*��=H	�-Itu;�qw��k~ڠ��[{���g5�x)]T�?�3��t��<���G�+�q��!�b�)�.�2ФK��d�~h�������sLӕ�"}��Yx��!H����������|�"�M���ډoF(�9v�fi������|5���X~��&��f>&��l�/���5C�����?K�/����)��—���B]�BX��;���,b���SY�i({J�x��hLw�������
���h�:�VW��֩ꖽd9�q8%o�������ND�/�ظ�a��V�yRm���k�Z@6&�W�F�Q�k�2к���*�^�o�DaX�o�Rt�咅[߷�l"�K-Z��ɡ
'�4\/��8�k#�|"�A�N��k
��"�n=D���Т�K��T?j�O��-'JY7I�Y�C�\��h�\�Di�R��PJ�E�jP�~0ڗ(Et�ԍ'�����J����!�Cq���ͣ4�.!�M����Y�[�x��i�aL�.��?����YC�%-$�D)W��5�j��\�T$F�l���s�";�lfh�t��5�9����WQ_"����ϑ�4�Da�i8��Q�Z/�ʠ�#A���q=eO_ ��eN�Q�#uU�Td�+�W��.L�I�y}e���Y�����s��h�m�����×'Ę�y�c���6�Y�>���<w�"��!�/>x|sCն��sc����\�pK�w`��*�tj�M��XT����͈�-�c��`��-c?=��	_���2�&��J	�4��u�n�o�o!u���b�r�aD���E�p���9���y{8G��^\�GU��VKj]��1���h$�^��{��w����}�m�<��
�lCHH��1< �����!$$�/$���#/��_��n�53�v�{����Gu�����W��ˊ�[��r/^��ݙ:���I�H���ԝ�๪�׵H��b�U��@�
�x�4�:t�4k��4��W�S�.q�9�%6KpR�8�Ѕ�E��T<���_�����!��N�����91\{�rE�Z��Jؗ�IT��N�"Ġ#b�*�qIP����oz�~Q2�
��@?�i�V��`�4X��lq{r���W�3�.�����as��[2*y�!��F���+%K65���������HD�xQ3[�LR�4S��+�w�4A��P�b:߃���[�l�z���5��o����D���
]5e|˻̈�o~N8M�c�&=[n��,MG@�*Ɂ�F�ӛ����|<%״�����3d	}ix��q4	�E�S�����pE�lN�P���^�����v/D�/T�4�/��15��M!~}����Ax�5�ې��MD�({L�dW����ZQ���!MWxH%����-�^MP��E���T�W�w^��	,�0�?���]���[V��v���[�&��'�2t��٥�:Dl���r���
Zș���QR�>gb3H��eF���r�a�7�OfA۔�x��e�e�8�d�1�$�htR(H4m���C�����1B�	SԐm�Ȉ	ڞ$qI~(;b�63GۺY�����	Y9��e�ʻ���,�����GN*&������	�,JIE�M���_n��8y$]X*�F4Q+i"R+�Q�,||��g�Z��ځ�3�/�ޕ!�F�̔{G�B�� �&әn�
T���l���g�en��5cl���;d��K��-�ֈ D�	��+��,�)�F�ެz)�����g�H3/�+o.�j�L5my�cY�
�}�P:��s�����BA|���#
DXS�s�|Y��ӈ�e�i+�������w{�۫��3DP���3
"�X+�<��I�$J���E�˯��J���r6��8�����W�l��:��f�U����ھm����![Gc�{���_
:���Şu�>��[�*����z*Ř�޽���&�U%Sq��}���r9`Y#�-�0/0���FrF5k�a�}���*�8�\;'O3)�$���W_bOD�涡��'����';���;f2�y'd#��&�1ӹ�,&�ͷ�({O=ós"*sq�7a��讝9�1Ơ��/\����Ԫ1@8:�a!%U1��*�%W�f��Q
��'��+"�bM�~��dy�mSZZ+��c�Q����bE���b���B��Vˈ�>��I�}�I�a����_cN�ľ�O���<��4k?->}��;��LdX �&9����{�{/�"�4�r���F�������
"����GE"Kh�R��A���S���k�t��#i?-)X���>���@ta�@����wEP��h��v;�=W�G��z�M���L���IRI4j�r@��[]`Nfv��%�GS���k�Uӭҙb����'d,��o��K��(�TQ�
3E�Ħ��BH��f}B>Ӌ5��wy�%�GS�O~��6O�E*M��	�2��|���
��.��x�p�]r���n3��hL�SF���v��Ϥ:�;�3��v��<��7�B�y>�x�R���	��Y��]�S�U<gt�#���`Ֆ;��(���m\�~FƒB�i_f�=�>F��҃&X����s�~�a�-�ѹ����Z���cڀ�z�̎��g�U����k�c\W�l�yJG[��a�F��[������Kأ��˼�S�Dӳ�i'{�@�s̼=�P���R=5]�S���-/�2��х\��x�1Y�G��ؗ�/Q��t��}���([�.����O4��H�?lN\�bD�2fW�0����4�x��`i�G���ľ���~\��#�B��3n�Ço:\m��cm�|��.V�G�"�85u�����n>��x��m�(
�帢fUu�E
�	��m�L�A6����Oz�Z�Q��>�b��ժ��i۵�G��st36�j|��6������#)�^B� ��_�h}��k�[���0n�@A�⠠TNn���`i���1��1��WP���n"�
�-mt�K@�쁃\�k����i)�JLq\,⸓�%OpZ���'ə�JZ�R�3�Ìl�k�����UQ�!��$#g8��ȇ�".�%!j�<r�'VT��,B6��]�3��j�q�ok2Q��Df�H�$��Y6dI���/���f3�Q��W
|^��jB@"q��m�PAI��[|��C;�4!��
��MU�����W:�0A����JUB"��_?}��yfCh�0�whC�_�	3��{��}O]-�/"�����ݹ�G�hvH�ƽ5���>�c��Ƕl��|�t<G��ږ�(ǿ
|l��'��)OP��'���Q�%�����xh�v��){�uշ,����-k٢]e�6�(@$�K2e�����-
����
W�%1#NKҴ������M@N_���ʋ�a�ma{�V4|D��y[��[yD�˾�u�������i�"@��0��4�-]u��\��ӻ&���M��z��};s/&�q���ss+s���ͨ`(�{}#�ů��3t�׬ͷ��9oQ��g���%���o�ׁ�W�ML���Pم�1���]o�����y��#�u_o
5F�lL��i��}�E�o��A�y���K
B��"�|)OnB��X�-ˍ�]o.���u��MZ��3�����(��(��tf�IJw]#S����V�Ww�,DG^�G`�����)Җ�ij�Ex�X^(6׫ݟ
5��p��p	wZôcv��_�R�>�1�l���G�
���"���rV�4���G�F�{�^�j/����b1�X6�r��cͲ�+o+n��pnk�u��8A8��g�����GtS�Vܺ����<�6��涺~��0�;���GY�� =-4�Ь
˅'��6�@j^(|��#A^�V��WG~9��3kdPW����P1���cR"%#=��.��V����2�kf��/}_����i&�N��ur7]U��j��H����ΨŲ H�t9Ee
VS�F?ˏʻA�dn��_W���4x�=�d�H�З4M���!'^�@�W�C��2%�,=kH_�Y�ףq��Urފ��틵�?��2Z�V8�J%˭U�}��)ʛbw*ʍ�وz=�x��^t���SɲH�B��c��#!G��2�c謬c��,�C��^Fa��e�!��&.�yI!o��m�d:����D�co3�����bV����RUF���̌�vߥ�RM��Cj��y�C>�Ñ#��r"q�8؆p���fr���%�bY�ۋ�%c����-��Bb�V��>�5*�l�v!��#�F�qCT�()��(��\eD%ORղ&e3�^Viy����5h�pYݺǎ? �8�
q��YѠG�����Ky��rE�L+��Jb2��O%�ON(Qu�}[�(�-%Bc/ky�#;���~
T��k^�ez``�Վ;y������1}c�諼�0�'�M����P�"��?0�gx�^2��p��F�</�"��z�:D�/w<=�x�������V����pwD~,L�����6��0pJc�
��'�H��j
�N1��R����p�v�Hbb4!r搻e�T�Y�tW������7�sgv}�!R�ݯ$�(���\l:1ԗ�^St�p}G�A�a-onԆ��܄��	Єz�&z�^��*�����W���ʭ�b��S�Pc?Y��$�?��{��j�?WqfM%��$�%�Z?o$��=e8��f��F�����K+M5��@6��rI/�@x����}w�]7��ak��b�Vw�t��i����Q��ў��q�
F\����)gJ�v�	Վ��d�bjɓ+���pE<�1�T��9����}�'ط=��~�+
w[f�3��,�~�*KG���L�.�K�?.C.�J���*�.,�1&�IC�D��jU~���E���b-}�G�V��ҮW�N�"��w;��DUTIg
�8>!�'S>��n&E|��Xpt�9.q�v�ф%��g��G��|��rP�ÇtP���1z;�3�A)�2�=��/"� �i�oz{4	�%};����c�X]�H�U��t)dKcy�Q�g|�1u�L����ñ�raɇZ{0�j"�֤e}$:��}���ʆ,^�">N��C���إ����ge�¶w�����`>�e(�\HX/����F������R��P'[�r�?���~��`ʛ��%���j��V�o�h#t��'�M��M�q6�"��[�|�v���/�?O
m���$�����gc
�#f�>�I`���E߼��>�xsC������:�����LV+�1�m�Yʜ��%��e�-���4�Y^�<�N$��p��9N�x]nh��G�|�{�j����?��x�-���E`���l'^���x��t�i�liof����ŻE_��v�ȋn�c��s&R�}��{p�,�!��j��P��w�Z����%�E
�36,DH��ڌ�d	E�$�vM+��Z�����}[����I�������U�w֮�2��f3Ê�w��/���L���45Yt�n�Y���[I�����Z�<j���
��mEZ�������u,�ﹺUW�Vp5�?W6h;��B�-��g3�\���u<�u�_��'�'���D}cj�ʼnDFK��L�ڝ�Ci%3{���4T������:�t�
ͳ���)8��A�9��՚�p�gLq�i��ݙb��9J�L5���*#�U%ɐ,��WC��7�ׅ	Q��9�)�l����~q8�X��o~�>я�{2����'�6��//��sx�T�2��i�����ŀ�$#����d�yy;aQ�S�L��Q�=]����=#6�2�m�XԖjcc�ڇ����j��YT���=Z��R�\�'*�<j�T�e	��D�IE�?�g�d�6�c��~E��Պ	��}$LT�=F&c��Q	�xz!A6+��?��f%1��*�9�f���텳/�_B�ae�A�^�#��C��t����-��=SŖ�6~�$J��~;-2���h���y���1�E�i���o�`=!lMF�!gM4�y�o[YِM��/�h��.��yÐ�!��{d�ț)i�p�؍ׄ_b����4#Vy™��/:L��%ӂ����-T���ڥ��*��<�,#h��铧]s�
�<�Y)��.�7=�c�չE1��p�铦�����ݳ�%�yx���S>ֆ�1���w/�aG�`�1w��ܢ�sA'џ������3�x1>��ɘE&��-��M�8v�m�t:T��T�aǵL�/g��}*c�y]U�)a��y�@��n7�Q$��lj����{ML��!�t�0�q��%�R�`r>7RϨ�߳�M�{-%-��b��۟�����m�/������[�i�[��q�	���;�8*��/�����+\�X�eܺ���o���`���o_7��pl�m�[��E`��<4m��iӤYko�}�)y�^)e�`�=''�|�St<"#T�� �����"�5��Z	bj�r�����b(r�zaŊ�,��x���-+��C;հ�hZ��9�O�ef�Xa��-/g����ƭ�G}M3r	mR2�Fon�}�5���
ۙ�䦀�,Ibۣ�R�����X{lR��l�ŏ�a���cĚ�c�ƣ����Sa\�e�S�V��bj���-�B�P
�zg(�y?󙘤3h+�ƒe�ts�5y�P�j�ɉ9����4*�ܴI��UpR��U���'f�����v���Г�!�d�%T�,G��4�e�V��/�gs1�$�+F��ݡX�.t�^3#�\�U̺���jb��)�v�X�#!�ͫ�;^�M��]󑥂�[a1�A���Hd6��y�"QN�q_x�7�_��V8�7Z��QӍ��JwEAuE�>��+���a����z?sg�<�@�:��ϟ�~���Ñ�"�Dn�(W��k�=�y�^��;F	0�E	�u8)���Ѵ��>�������5�9G0��X�s,�I��+V�%�A�&��[
s���*��FS�)j�"��NdA?�Ll��B(��l��k�4(�.��*�g�)۽��O��߉V�>�a���O�f��m8y��7Y%��Χ���ˌɿ���Î7�pݟ��4�e�8��q[y����>XN ����/�f���N43<s�Ҙ�m�IX��a6��w�a��)��d|�
{��|ne�)�=�^��r9l�j�&�?I�<�� _���QzT�:}�
}yx���K����H��4�о.�
��
�T+��~M�D�hIMC1�GV���?�%�2����ڀ}|�e[g�6�H-�|��&.��M�̙Έ{��_�D~9���B�S?U�K�n�F+�7�#g6"k�߰��ǁ���Rp��Sb1�ڒ5��6�u�F=�}�Z���xjJ�-Ag�%�?�))���|_0�gv���%|$�
� л"e*���LFp���I�DL=[���3�S�p݉� |��Ϊ�C&��1if���j�.��k��=��B!8�e�d��*�NS~��s��sE�n�Lz�}��ݨ��K��K�$�����smzN���9�g��}�~�����ҧޢ�I�UD�b�u�3l_���D6���Ȁ���^FB���R6����v#�AX�_}��"���C���.��X��:�X@l}(����q�}�X�p�H�C偎���0��6�S�t��L=�R��X���r��2��iX.��t����a�t����n�;��*7��Vw�3��<�g)��m���=2�A�~Ӈ�i���`+�V8$���ĕg�N��f�]r׀
�%��(��龕{����fY�wf2���}���2�G�d��M
�h�L�u�O[?��\�Hޭ���ҕ�MN,~29�HKia^��|��"Pe�;�'�nT�����dyR����r\0���p���h����/Om�MD�����pf��F'r[��
Th�t�67]��h�`�+�jP��]�LU_�MA
��#s��޻���ց��E~��
���#�H��x�?.�]����ܛ�k��r���'K�Z	��-Y&�Nv�z����cf����1h{\ƙ�!:�9�Q`٣�o{�����}�-�6���,^��?��r&2��U�\~
Q[�(�c��ӑ;�+4r#w�1w�i5��TYB�(�	1��9�,:�?�!겊�������v��R��a?r�YN!I��Ҷ���v�J�j�{���1�V��!Z�2��8�ffSJ=@r�n3T�M
W�u��ɡ��y�oh
�z�Rc�]1j�cĪj:h�F�^�Q����7D��BH�*�5��U!��k鸀|�›�m>�b;�����HT8�DP=���o�N�#��]��/��1��A�9j�+q:�g-C���K%{Ų�yd�T{1<��/T3�׫
���}�R(�1G��;�%�Y�>�?����-�F��|bI�
��A=�5�c[��D뺟�d}Z�s�)Y��}.\�9�ץM7�SSS���ć�ga���.9p�	v��)M���n��&;�w}t���������^��_���M�w�X���2/�������'���9�U-|�>CN^��
��&Փ׃#�s����i�l0���>���ƒ���H5O�x{��IbV�%U�t��y�y��v}?��o�a�{�c!�=d@n�Œ�E4�-J�O����H�_��<�3��E߉e1'�j��3�*�D���r"�I�0�C{��V���OJ�Y-��N�NJ�d����)����
�H`�f֑�a��ӆj�
�SegJ�����Ę�o��hƐ	N��풔 �jY��`�ߌ+���n�2�:����iz�n��}s�}��a�<5v�K�uI�tx�U�蒇����=�M�u��f�95S��ٯ%�b`��(���7�]�JO�s�����X������s܊���[�~0#�V�X��Oيf��2?;3�F�E���E����i���Fx���<H_& d��Dt�<���$�a<|uA��B���1e��"-�=��>��6������e	��ف�>	QsժH?}�����	#z�NtY��,��C��]K� S	��چu�Nq��c�k��b6;^`B�o��Y��!pЋ��d՞/��8�$�N��
&t┫�d-/x�E:�I��Uk�d��]�B͋3Ơf��H��n����LB�&S�J�B�@�Dϕ�)�&AQ�?�A���O���ch�G���;�Y��&��
cC��+'�������ٱ��8��Ǣ�:oh�mX���X;S�1#܉�b�����ϣ�諑xd2rO�4]�1a�����Hz2�c�8x�
H”�m��>c�Z���L�����5�)����q�N�^�X��� �r�L�c�<��*�&N��U	EM��`G�wb�$�JU��o�qH�jJ5r�(I�@DULb,G)]��<*c�L+��$Z"�D�DKH��uQ�(�O�/l�'2�Kڊ"�`)�4	F��%T��%x#I�g0&t'�"��K���Lj	��&I�� ��Ŗe��J}��ВI�Ve6��$�Kt�e&3���s@����y2�	��H�}\Uw3(��hIC_\dI���
�m�V�Ǵ�������l�>�F���`+^g����~��˖��� �:�TOQ��NX����S>p
q˙ӷ�/�F�ՠ����.�hi|�>��%��]�m���p�2j;���jT�T�J�~ؿ�lV�>V�Y3���d���Eߟ��苑Y����n�4o��4�Zr�2����I�rM�e5����{��v"VS
C׍y�U'���_V ���Z�'�W��C����=�C�7�a�NL7����Z��'1%UF�"}ݿ�� @>Vm@��іv)�Q��ѡ�A��qψ5�<�Dp*�V�0�T���}�z�����<r�z�M
��U}�`�a�N�\!�w��8��e�?��*���>�]�V�le]ec�Q�=�Gu,mI�~[�rG�u�UV\/MO��Lk����N��!�o��h��E���WN���RKp�!�T�~�m@��^�t��σ_:����Ģ����$)��n�@U
Y$�l�v��
�[���P���ja27��*�^:Q,&)&Ij�6�'J:؃�Dn�rٕ���Jddd;����H&����xiY��-���eD�<5j"���Ee�4�X�˗{�4�}���@r�d:`O�����%�?�=�$��(#$��z^I��_/��ؒ��W���9����w�w�B���(/_��p{T�7C�4�<���@�4D��!�<	z�?�B���<�x��S���Cjm��o-���QF���!?��
O����г�sqb��Lr��ӓf��G�⦤b�\�m��m�m�"G)G`�ڡ���ߨ�}�k7���$?-`�5�nH𴱖���?���fCbJ��sXpP��#��i�j�G�	�m&C�F��
%�y(�~4d��~q��O�\y�%��0��D숦틖(��P�9����}?H��� e���E�@y�F<y���noނ�8:�<��
�_������;6�{_ߘb9�����^��i$ʛacpj6�V�ڞ��h�p�mY:��:��2h_zW�m���R�_����偸~���q�=ʛ�^�q�9hd�C�6�"[9��?����f�Q���N7��h���8C���zX\�������}rR���]}9��E��J�!�`�j�Σ��f�P�/����t��qd���T�Ѥ!���G���6=�Q%|��bѢ����{%�a�}o��v���ϳ�u6R�@���ȤP�iJ��9��Lj�R�4KX�L�`��o�	�H�=y<{���sZT8�Ɂ�'����V|�A��1_�7aO����a��a��ل�ay����U��v��{H���r%l��b&b�Irh��#��6�3&�J���͛=�˔j�e��|�0@v�h��n��U�� ��f��PP�G흐
p�~�ٿl�O�v��~=cb���5�o����!�!]��#�@�5���2�����a���-��7��{�әb4� ����ܜ�=���c��"�bɜr�̡�kQ�*���U�'9��'m��|�'O��T������%�oƥ�׿��)�!2S�Zܻ����z��Q�k�C�I����i#n>b����Vo%�\4Y�&�C�pN�"=���/�||�v5���:u�E���Wm=<������+H��ޗ�t���f:9;��Җ�o�ǦK���S19��bx�"���nH�A�ۆ]P����c�Mon�!�17;X�� �řp.������"
',�J�1��TbX��;��4I-���@��[@ƍ�������A�#����j[�sR���3��^�yp�R�f�v[���޼)GE�Ŗ�]��,˖��M�� �3��8Y�et�W�ۅ0��1�D�0�X�/N�	8�uL���ԕ�&�@+��gc��;�8�@%O�jHk�4%���&_�7A�;P���`PCz�����d
���/��Ͳ�p�)�VEZ;�x֣�ץQY��g�\�A�M�̣� �F��Hт�n�7#F$���n*�D �:�/����&*�����/CE�ޗ�f��y|cB����]��q����@��[ϛ�&ܞ�ج>��t��,��@[������\�6K��[9c�?D��3�?,;��=+��=��|���#��XP������l���`�
��}��/+�%��w��u*��<���y��o�9�n���R�U�_�Yߖg�*��o(9z��� }mD���q\�7��$Q=�>�5���Y��€��=7V´`���&��>�۵��{?��br{sTL��h�P����i��E1e
�����B#<��i�M�7�9�mJsJ�ܣ��3����h�r@y�in Clv5�]1�����k��t05��[�ݝ�]u)��]z+fs�65�U�]d���ђ���{��MLSGoR�?��M٘��)��:�Z�Ĥ���~ЗV!!��Ȝ/Z���e�
ٝ�/���٧�RĤ�߮��#�E~�E�%���n���HM����* �'9�'�=�*�F�AA�P�P�6N�ޠ�r�%�1����A�h0��9}鐗�UI�)+Tg��o./�,n	�r,�y��XD�,U5��tE���mD���evYCt�>t�V���k&���E[b��Ⱥ�B1li�0]�4PJv\6��h���[�1�Lt��-Ë��Yڝ���7k�h���Ò� ���
��8zD�%[�����*����"���e笲�|��fS�U���-�cH��#��&5+��<�� +�*q]T�\�V�-�SX�Q-q�C�g��.�+;T�Lq[W^���l+˾����t�����h��S��ո�Nq�꩷�Ѩ*�DD�c�F���>����m�i:�=��SA,�-�}��� ��D�����zo�8/dj�g��ab�����ퟷ��~������6����͑�ؓ�~���w�$�ST�ԡo[s3O�&�w��ђ�Luv~,�>�N�L4�l�rUC�>K��L���߀$���H�+��=�賞�}�su��z�sk\����=>��\�uS�~����GA`=�0�8Ǥ�k �p�4:��o��Lj���]o�nAO�$f]�M�iEVDl*�������&�E�ɂ�G'��:�a#�U�(�)�DDIrEY��ߙ����� t�$Q鯪�mA$XO�Y�+�d�u�Fܦ���Ĵ$��8�R�$��H~�����b8�=���<���v�7֖��Cz��[hq��ӓd&p0�A�QR���F��'�����uȢ령GJb�҉2,
�9��eI�"A$�V��X�u}�0�J�@!�*�:�a[�MJM�s�xՐ�0��JR,PO����B�`����$��~	�h�F����1|�j*Ī��SՇ��<#XD�U���8�<�pV��?{��/��A�W#��&�!I��Eֳ�oΒr&�7� �4ڽ�@�c�dAJ4�����E"��"x����1�e�>-��E�M�$ ,�t���aўH����2�Y
��v�()jT���}"��_F�35�_�.E$�J�7SF����D��1�?H
�m3�W��/属�����P�5˔�i�v�V@�hi�y��<��J��Σ���(�[`�Y��O�wyTu��7��p��v��������Tu+���
8�~+�u��q�S\o�a������v�
B��3XÈ�u�B�?nՀzF�ik�ND��S����!��̄>�mZ��(BQ����g�V�NK	Uݰ�>;P�5p���9R„��0�A�<��B�Ž���ZQ3��*�Hx�
�"E���^���T��(;ɤ#�$?>3�1�t�W��T5_�C��ň��?�ԏH�O`Zȹ6�>9j
��D{���_���E��:[P�?����O���N�ڢ���b�q=��X�*N+�Fb)�dz6��;U�r[C��D��%Lό?N��a���6�\Wʖ�_�c[)I V���cٖ,Y1�Rʲ).�q8��b��?�D�T��{��S�E�	%�#��(}Kd]�t^̆V6��0yv4����7j����"V��Q,KYbE�o6¦(��QetTR� �FG��\���ãC.g��忚�l�|���f�z�a�q%f�.�I*/�
���x�׾:#�.g�,��~&��@	ʀ_�Z�=��5>d9�_��cy�A�Sc��=y��B���C�_��鼌�'Q\�DdV𗥴'�$��I��&�wВ,������z�H�Ɂ'_K�a!t<�2�	�G�&<O�J�H�,�^9B�2y�G��hn�;"�S��ܐ���kB��\��~�0x7��Wɢ��sG��3�(���'�����ޅr�	��U�'�H�e�D:���rZT�\��B�_C�+A�<x7(�m#��Vd�R�5h���ML��	!)�,�fL�/�<�����4ZG��@�\��	��4��w)$�z�R��=r��[�aS��Ҧ/�&�n�7���B�8��-{�n��~��
A8y��W����V����
�w؏��2�F��f�d+$�a��@i0���U���WT�q�!x\=xů�jA�T͚��Ő��`Q�S��Aq��7f����HPߑ�t<�}��/-������Vt'e�T)��]X׶m��W]9wm��6�����v��s�-T9g#ٴ�H!��@	M�S���t�y�bW�RR
9@'����W��+h��%��5w]�/��޹;З�?�i��6�S�dVQ��C@a�������j�YJ9��ؐ#bv���Nh�0h�,f����V�&�0})G1��@��U%\�W�$l�jX�2����CL���1*OF���ި�'��t=��uG��~�˫�����_���Q��y�ן�"����b�/��Rܱ�|�C�����G���>‫�	i	�s7��5��Jy=G9�OC���X��Q@�d+tkC�7��.��tay���,P��'�ly�o��&թK�7�������i'���΋)TQ^2es�9�ݢ�f�a�}����ַY��/�������S�p[�V��fp����+M@�v~K���{/�PA���?i/g#�D�#Av�Z�5
J
�]��)��>\����)�ը�ݧ�nO؅�{��.x�!&�6!c�C���O�nfn7aأ�-�@��7G�bY���`F1��U��l]�S��s���8@�DiĶ���m��}���p�&��~����v�ϰptd�&G��鎎�U�-:���bh	��l����pQw0��[i��jTvz�|�x���p����b༶>G��
�����x7x.�yt
��{�n#��]��\��u���a�W�Xcy|6������`������zw��w�����.,�j���5?OP>Ҏ�\�tG/�w(ɷ����V8�78���g	ϣaf9��B�3}2|��d��>����W�D�7�n�����k��\ۻ��f��S^�t?�w.��n�}��!<=S3{)��B�0�Y�)�2Շ7������X��w�����>�^��g}�\vJ	,b'�pd��dxL+�9o���e%5�B����cD��Q*B	���Z�A}Ns@.K��R���p�P����Z�?�!��\��U�s�~�h�X�p���v���$�7^�7Gz:���m���hG#��T�<�g�
b�8m�Vu�	�F3mH��t&�6�S��Nh�'����$Q��ϛ�gjGW{�*�VO�˚��i��$��
[�k�J�}�֙���夠�0<[\[�~1׌^?=)V�r�WW,Sټ��DY� S�7Te�8� �\zO�	�3έ��=�Q�����H�^8�"�NZ�駦#�ú����mH�%r�"@��ش�=	����B%L�Fh!%$�J��z��:�X1�N�+��W��^j�:�S/E��f�tΣ������E�Mnڿ0k{x�
\�0T:u7c�+W����M��TT�F��q-�c_��P��x
ndW��b{����ǁ&e�GN��u9Q�a&�Q��p�8�|pO��?�ƶ'|�e�[�ŗ��
�s�����)
������#� �G���~�"�%t��e��!���@�h���L���5�^�Ŗ5Hb��
��-��_y-��,��h1��)��Y�߆��/��7/�J=���ND���qF+?�|�2�	AT�Ć&,�B��A�\:&#$\������R:]J���T�W���^Rm�?��R<�&�}�Ӌpo���@��5^qx�p���Fr��������e���zѨ$���2���;���a�#~�w�`#�,�-\D<2�~��0ָ1Uʚ7pϢ��&��Ι۱����%��o�ٹO���;����#S��|����<�媊<3�
����o(�m;�oLhw٫��-�D�!3
}�2Oe�t�
O�A;/C�^�Q$7a>��9p7�����ۛr8�0P���vy���l������y`���j<�6�\�pj����I}�����-�-$B�1̈	�]���>F�Q]?J=y?0�t£}Y��h��1�#��*���cb|�,�)�H@����'�hO��'4�Ϯ}�OTC%��2U�{Zq�R�3�P����q��wI�YF��2�-� �l����P�F��2T@>��b�{?�����<W�VFW{
�Jvt�X�B%�](�!�
��e]|1������Z<��^գla�B5�TALw���p���
;=@**�W���(������B��@��Q��Xl�S~��^h1���o�#���E���g�x�.���&fǂ>&�O�\�y|����+f�
�b����)�я�'�x���MF��ɑ�_���5G�I�0�O��"���x�W�c	���J��u/s����C��LH)����c��� ȏEO
D�tt�emY�b�Z�9�򸕖OF��B������5x7�wY,~)��1��b�Y��7�g7�!,��!�<�s��z��^�f��"Ɣ�'��wL�WMY_���g7�ࢿ�\���Ey��'���+U��L����!��h�>�
�~���x՛'��b��VЗ�<��H
�+j�>ɠk�j-�>d�JMs��Me�*^{�Dn��Nt�Xz�&��n�JU)Ӭ��������e�������
[�ք��i}f7�q���s(b����!x4T�]GeQ���
�Œ�K����LLL���d����@�_��O�����IL*
��(��F��"�����2|%ȷ�c|�zY+��b�Ch#�$x�!���yO^x!�p%@�tt�>r1/�~�ǘ���O�0m�uat�%_̋��8�A^4����x�X�RC���P(�{�O���hW����k�鶽��&oa�_#�)?&��w?u���~�/ޱ����)�i�T�*�e�`=�h���f�%�n$za���LWӹ1�o|'��Gؕ���� �~�E�]��,�sa�u�Ŗ��aK9���e��=xr�Y���'��Z�V���ⰰ�I�Y2�ݤ�=��|������w,���n�O�h��ۗ�O38��,/?�@L�1,��	h�ːZ�!�`�*O�9�J+/D�y����\{Qn'e(��Ҩ��<��o�Lז�&ik+6Řb�s[��9~�P�MHHt=���@��KDFN<%�ӹ�oQ��Ϭ�R�D�5Պ#�C7h�U��(1OOɵ�:�
b��UH���۵�Qg�����-�K�]�۩�5�|��u��ػ!�8ݴ>D��!J$ȫ��F&)?1Y�wg��+����c��,���(�!�FMl��NT&m�!����L�X}�m5���%�m#�Rз�X�s�۴/�7�h�΃���v���N��4�~�B}��9�N`��n� ���峑S�V��WO=ʎy5��B�EW�I9��	zxZlγ��I��^ePn3P��
��ቡZ+vm��܄�M��u�f2��~E9�.e�(�D+�v�/�(�s[%��ёlma���ʷyi������$��׳Fy�߁�L��}#�ܟ���l�%�n�s�,̷҅�Ն�3c��X�`11�>��d�?�=��hn���F]U燷dR�C[D,$g2�⎬�y�F]��b�+r�P!��<�����,3����_�ߟYa,����=nat�C ���?¶G7I��G�5F�TN�l�""�]h����A6���:�
�$�5�	q���%ׅ���B�B���:PY�F������r4��NEF9���c��971�U�'�
���p�x�!��9���0��c@��<��.��.�gDg�~y�kFoJ�qK!�OŊ�離���]꨺+}�δ�H^�J(.T���MJ{�J��;���b�M�؛~�"[��~�hݙ��}�6�k�.v;[� �9Pmk��`%<���b�d��l��s�*��Ta�/V��z��K�k�|9�_�Y��>�{�]��F����:�p/>��k?K�Ǡ��O��g�N��V�������Hƃ����f��w��>�SU��S��-��8ZQ��M̻`��A�D�w�;�a)�5m�F�Q�5V��U�y�w��,iC�3��G^
jm.���Ԋ.��}?�q��v���n���H�<Q�����nR)���#�iu-=d��:z�}í��ٿ���Vܨc;Q�к}�;��CD��ַiI�TMJI$�KBBU=O-�!T`��Ø	��2��>&�'���_�_ia�Ă�Z�c��3�,s��?�ޕ�f���6�BǶ�����ނj⿁��_�8���Ȧ����.�@�5�w��W�D�T��2P��
�����[�E�}�����\?�&�W;��U��XwF�ߞ�a��z�鮓�u�Y�����Ǐ�HV��ƈ���U��8�uYp�Ԧn�O��c�
�X
Nt��r;X���|̐͐�����b��l��NJ��FU(I����pZ��t}�+��RFQ5�4T+͡����='��tk�f,f�U3M���Ğѹ����I�-���4����WX��Ȅ.��Q���>�����*h׹�W0*X�E(��������	S�Ne�[w
�r]V����p?�`�.�m��M�ܡ�Jr���L>pPQ���C��c}y�����Оl�l��q}RHubA_�R�7�z�AW�Fӡt�H��Ն/>	f*o��
���Jk�ri�t��]���J�E�;�9��M2x�PX�?�`���:=�,|гmX�j/�6ផ}���Tw95D.};fgx�BGɗ�B#����hİl{t�^�:�P2}\x'��w���"��I�&"!R����<�x��|G���r��ܙ��<C|̞������XR�3�ˌ��*]Gų�A��&���q�����d���q5��@'�
�zհ�R6�N=l�+fu�܉�h��$�>{)W��9s��(�Sp�+]��:���F�]c���
�?����Wb��I��A�+�HS�h���\�� ԡ�j�Bcdb����]#-I�k��tzd|��l7*�����NR���8Pߪ)���~`bbf�L$l�z��2�b#.죮�EԳ�H��;���2J{���/��JB�BD�A����
�I��aZW� �N��vs�
&�	-��y�m$Yk��ϱ�&����l侑ˆ��a�fR�D*�N�76LHR��c1{��Eq�Xb�zU���$dR��G���7�K/��y�?�=��V~,�Ͳ��
&w?�v���	�N��(������˦N�u���9���o�ɛ�Bn�d1�?m|k�'�c�΋�%*;.��� 1�p!nr2��)X�D#ݟ�
�%h�RK�'�.��J��!D	a~��E[�FJ~2�!���H�l^n2�$F��
���!�ȿ!��A�5��/����7�KV�xs	�5)�Z���]�&����튥D�����{у,��?K�ψ"�1��m�HQ����E�Q{?S����\䆞�!a|n��<$��6�m���E��!�m5����"nƣ_A�蝌"0:�|6[I�0��xޫ"��Q2;�d=��$'���&�x^&���ǝ����ꕬ�X�*ي�e�Q�V�r�km����?���c����iω�GUB�+av�e��=����M���g�Vdň*�,{.�x���Aw���Ҍ�\��k����9��t;�E��0��"�r`f [?���&�~�/큼��O�<Nb�F8��bF'�g��ňw�<�"q9m�X�-��uLĒ��p���S=B4������b�>D_+��Nj$7�ƴja.37g:�G� b)Z��%�r1�S%,
���
d������ͽ���W��h>O��gv�Cgxz	V=���m�F|G�����:ah+]ŷ�V�{�ш|�{�3›З�t~]��ȃ��P���A�k@\rO��>t%��d��a���5��Z����]� ����L�_��އR��P�U֗�	Rz��
���$\|�!eY��v!�]*��>�!�i��.�=UA?4%J.,A2��&e���9����Y6�!U�dlD�u�����L��6!�7SS��D���-"#1��j�.|�ܘ�E4dS����ߧmwhC}�@�	���w�1$q�ȶ�H���UTp�yY�9�yCB�	�
BT�䢤Z�D��7b��H%|]D"]2����-BrQЕ��cJʢ��?"b�y�|ym��ni ��l&"�#�/Z�m��S0C"r:�|�2Z�D����!���}L�|���o���+>�N@O�DI��U�LD�%-�@������`3�(�۱�-9O�Sʽ�!�O.]&d�Ej�����6�h̵�9QP���JC5���]�V����Ie�a*�Q�	P�#�ՠ��WGt����ɍ����t�W�)N��t>Ͳ��1tm~$g:���Q�3ߛ�O�eYoȊz�LNȊ��Xc���X��0����˨
`g��v��^��%�v�t�����ֿBw?�BQ�[���(��,��p��Z/��e&����kMΥ���p�^&Iʾ��I�Q+�r��v�Ni_u�:��̭�P̙3q%���
��J����g�ʳU�
��*ѧ'�Z�Ϯ1���NP�3�2R�b��+Z��R�(â�*W�
=;�C�~O�Yj�Ѿ���2{]���;azy=��ڮS�A�Ez9��0�2t����$8�Jb�j��TU�Oqs�C_�Frq��u�+�ަ���n���:��:f�u�k=�Dѩ��Ly�K9��Ξ=�9f[�h��&]l����c�;����0�Ɇ�#���Y��'��o��l
N�~N�$���&�Qʇ�d��I™d����b�����3>�7�/���r(�3�+K��&c�*�\B�2�`�<�P�(��#8�NJP�+~���*�)+,r�+�B�+K��s�o:ܹ�������5;G%�],�����GE͏�h�s�@��\n�2��a^;�k$,��jvl���(�����B?�斨5�]���&5}"=�F�`�D�9�5g!f\�DU����^�$�k��xR���E/�N��ꌃ�f�#t�Խy�Wy.\��sj�ꮮ�ޗ��e��Ӌ��h�,����,�<ބ��`ll�m��J �@�IB���7@B`BH�sC�|��B���yϩ�������'MW��:]]�Y�y*�H��j�A���%�\�4��ύ�R����Nq:�+�6��o�Əɵtn|<���~)7�f���b�۵H��κ���f�.��򆼑>bK����b�b�wK=0r}�3��ݨW�5��?����;
ΊC�
�@_gxV}~��vE6�5�C�.'fyH2���
���d��Y�z[tK?>����������{�=�>�s���m��=:�_���ڑЏ�ǣ,��Jx�p����Mx��x^�Z�U�1ڵ^��D���V<�:����/����J��X=g�<�ߡC��a�͗����ŷ�������|��B;�7y���ۄ�
�o����4�����Mγ�[�y�p9� .�3x��':x��CP�G9�����>(�;<o��^k_(�4�����K���/��[/�ˋ���LJ	�=(EG.�g�<2X��� 󮼘�!����
�������h!̖3���V+
����i`�S�no@��d�)D��fs;P�eBPM��I-Đ�~�|�b��T��.ȱ��M9�dΧ"���?"�p2"�MZz�I�9qӞcMR��޻�$��I�8�O=:"}����Pt�F��[sF��F�U>�U��X��x�M�q[�ܨB4�y�e���,{��>����J4�ݧ"��L0^;�#n�u�Au��Q:� ��m�x�8C �H��X[g���
N��U�jLq�ͻځh�r'3
���dݷ��:��3�Zr�+���֭��\������=�qz�r�վuh9�y�}&��h��(|k����0J,�e=�uxCy�	�!��
��-L˜�!��J? ���t��,4[���!A�?��2+��O�}]Q�:�����G��Q6Ok�k���Z'c�k����#Q芅E�:��3�p[���Ux����_p��lw<��r##�~6ڒ����Y��.�d����
����C�*_V�~�3�����<<��6�b�r���վZ^�b�ą�}l9J�+���5�����A;�{ᗯL-,L)F�)�,�O�q�TW��:�C�%�M�t~��,J�$Һ��,9�ۈk�T��՟{*�j�l6{o,�v�U��/��&6E���J7EM���z@���0I�4A�X
l\h4��G�}��/��R��Z�U��<�ab�<�cc-�+A�0��2<�!�;��1�%[/����y��2�����<	�d��=ǎ�il�0�Kl��Ś���H`lʛ�1���5��~Z�06�iuS�)��pif �������t�2ޥ���<�z�[�?�<Lk:,aX7u���!Y��)6��/aQa�s�<N���?x��'��µ��;�Nk�w�]̺+nv��j�辎����fW5r�$T^0����W�ͺ3Yw-
��J�=򽛃k����q�‹���T�f��/	���,���^����q�PG�]�9����X��𥭟�W�fn��^�k�Z�vuC��L����Ah��2�u�����9yٞ޷�6�n�A���E(1VR:B�AYT��#;o9�s���=�H�NX��3 f
��/n�QE%��[Q"�Jb":�5��**�ʈ�V��I�bx�?�V��Cn]�$ٝ����b9M*DTQ�5MIY�G�2ΦGB��z�1��^C���9��k�f-�{f6��g��,B�y��>�;���M/����)U���C>ǰ���E��gǴFgl�j�S���1��7����k�&��i����Y �pP*���Ȓt:7�!�~d#����'��I�%�t=�8W���<�m�H�
�$Y�x0:Q*��<�p����St$�������£��AO�ǎU�PƂ:G@,�(��e���:Xs-��� ��&0?��&8�i�[��!� .�~�:[�_��w����:j)H�e[1��#��h��>m(��ˊ5�F��+W�=9bM�/�&�ȝ�H���j�^�����
5;p�k��_�����f��+�=�~�ul���|~��A���5��v�-0F���J�1l���Aq@o@�;i�*�c��.�>��9a�a`������g\ �3��Q�h)�ؙ�QDP�T5�3�x4����f[��{#��F��߱��O}ꀞ�-}2�A
�4��<Z��'�!N�(c��['lg��InO��J+��3��*xXH&��:\���7W��a���ڰ�q��d�??3(^~
�CQ`�ϟ��3-Ƴ�y�v�>Rp?j"���r%`��eC!��^�뻯ݮ��E����.z���_s��k�^��_s�EIף����=��ьf���V#o8'��M�6f�5��Y:"��G�FG��I������0�o��/y��:�:�&����s�Y��YdV��:,�
��U��}����˃"ik�m����]�"/���L}[
Z.3����w�	n[z>��n�ח9�3�0n��s(]V���0%�?8���
zF�ε?�>�I��Iz\,;^�_gfLS�����{3&�v��wk��SN"�<���_��`�T�@o�e���A^�p���i�ׂ�-22�%�8�-���G�j�I5 �*z�R̛k�u�l�*޷��!�)�����T��Ǖ�yvDN�#g͸2>=:݈oq�-����X,���ҸqBOH�����zb�/Ix��N#�v+Jv�aYw� Q�W֒�\�^�Ωɚ�o���'X��E�r�NJ��I{�|�^e6r�Xʛϡ���χ����y.�"�1Vx0`o�0�{���u�G��Z��_�p��]Fhz̿NVT]ҷa��R[�bZ��8!�qYWr�c�;��(i��Pq<I�o�_S�y��4R���O���Ŭ�ع��&SWM(���Η𞘬�F�'��5�CU�]��NѢ;EQ��;��4ʅ]���U��j�;ύQ�'�A�{# ]I���E�:����h�Gxh<�=W
�-إ�y�R"��T9V`<���4'��X��tWV?���B�-1��<�SK��,�RY�H�f��'��+x���$)�A`����)*�
{T$!��M:	�I+
���_Q���,�^ev���N[�c�(b�*D#����y��!$�	a*��k�eY�GC�d�t��}��|܏��X$ZHa,���,�~��D&�N�0��L�BFC�{̀j�>�j��3ē��q�V�[M:�@2ԧ�-q��{��Ҿm�I�F1�����3�.�1|�cy�>aq	_��2��y�D��$��"!��zT:�(w���0�RS�R���b���t%n�+1E�$�Ĩ�E)r��h�Cl+%*t>�W�,�,�^&��e���C%U=�"��F�X�<�Bт���݀�~:#7��B��vK�q27 �vz-�իl8'ж��\�И1Zi�9z����iE��Ad��c�ޏ!K�S��.j�ӓ�;:k$+�k&i�T>�IJ�};��d.�R%<yd���d�yiղp��Ul��ѫr/�]ݩ��x�:1���<��b�,Ĵ\F3�a���Dr��t�^����Q�E#�|�14�h͈�s�z$���x�?@�ɀ�_!�TLwd�5+�h|��e�Ŭ�
�:��Q�~���цx�:���]�?)������`
�y!C筲Q�Bِψ�gV�Y"�T��g �q'0
mCa(b��2�@[$#̧R�!c
����B*ye�q�QҨP���Ba�)�Z.	&���D�hl2 ���~UMud�ӻ�ă�/�*�18�،��Z.�s���HLq���\	�%���v:K��T���G�������	�,��>�]�Fm^�7��4CD5�颲Ni�<�{H����њ�ŧ˖�ʯ�=DU/}�+��ܴk��������0���t�Sk�y��aYp-�`�S���K~>L5�5�N��Z.��n�/��τ�Ѓ�h=�5�r�
(���>�A�C�B-1=�yiѯ.�d��[<�Q��{W��	U���3/��N���N�ڙ�+�~Ԧ�_uz��$��۞h�zc��7��e�q�̓�(Q%����<�����W�
��G���[�]x
�]�OK쇍��Đ���`�5ᇨ��H���t�l�\�#l�����T*Y8�-�/*�L����E�$���RRɵ۷��UWG�T�6</�'�c~�pc|�hԐ�d8��5ّ5��t�����Rk�唢E�#:�8c��ʾ��=�~��lSM=J��"]I��c�����IK�DD�5B�l��8���
��E9����|�5��eB�rWt)���z�]X�G�nj��bV�fT�Ոb��3��I�U��(��U@ޚ�X(?d���iB>��4��l8|
�8��{@C�Q�EkO��JO��R�B��:��OA?Y6{���Q�b���%�a�� �텮Jb�����I�2E�aFjI[�K���v����${�����Iw�J��.�Ċn�L�f��D��d4Y*7ˆ�ޖv
Z*�=�ՅU3�pbs(%b"�ź��F�7���޿����U�4;n�R�N��-e!��%��%#�V$�T/BTM�U�&��DH*k+RԱ-��t"�W�����$��NYUˎ�dY��=�?���bgS$�(�����7��`1�>9�(T�zA�4���-	�
A�|�.���H��+/�W�9��<f��p���p�{�yѽ�ڭ֏NN���?���&ę�)�6�ydL˜�q0:�F���g�x�J%�垠h�]T{FO9����hG�v\�j�ҡ�65q������E�.�KL˾���&U_�%Y,f�Y#|�Q'϶��3k�
,��F�M�h�_-�3�]���E��6���:m���z|���l�՟��~��po��j��i��K�$Ĉ���|�8v�((�moL��v��S� �ް����*�Du�Y�$�Y�j���s�;���U������֥d�8�K�89c�
*�����дf��k®�pN�#����g5j,��,�HJ�ӕ�ɲ�X��~D����5@���G�?V���#ݶ�!�ԓ�� �Nv��4�%���g���� u
�Yo%���i}w�AP1#�5���F
�_Hd���.=+���6G��[������c�(�b5�?7�>LoC�t�|�rE}�mF�*�1HSB���J�Q3i y��}Ӟ�:ܴ�U��8~����}Y�I�4�dT�e_ܻwi/�>�F6齙k��O�F�|-r{'B,��2g��z�kX��Y����`��A��	vY�9�k��!qr+i�>�Ф��ޥOV�;N~Ȏ%c�C�y��T%�h[���*�$Bϣ;��4]w�M��;�{+'ܯ$"�w

1dIV]��n3nm�=�@<����Ds�0�#l�г��KvM�"��C:%`��n��&��$��h�!�?��e<x��9BZ(���eC*5���G5�F�!���v!����_�|�K�SV,�;�p�"VWy��j�{)=���>wv,�&��Aυ����$��G�=}����)~x
O���Y���kPQ}��`�/ٌ>nM#�#��#q;�ܧ���Ãڒ@L��͸��c�'a㸫o{�3>�Y�p��>�۽�{��Y1�b�װ�-�<߭t*�7���l�[�W�@�$U�'�^��/��4%�"�W��H~�Hr�BD�}�@PBVK�ȑɔFb6d�/?�(��^�k�@?B��<Bk��"�i�&2�c���
m�%�֬P*tD������2���]۹ͷX���T`G"u�H��J�z=�0|1n���|��~s�/4���v0��x�V��9�:_��^��Ύ��J��:}�4�+�b�B�a�Zө����U�L`��
�U���3�N�*0�KQU�*K�a��%>������q@6�J����n���k.m��%�?躢$U��dU���?T����_��ޯ#gBQ>sN��[�V��xz(��s��ϋJMk�8(	�@?���A��5���p�p���z�Ң��^m�']��v�� U0��*���4p��4��!@�ui��7
�`֔=a�.���	���cѳё{��wFco�Q�%Uq�b�ݻX�tZR4��`����/ۃ~�hS�����c
�
h�a��\n>���^�����Ȩ�F�i�]�$|,PS텧t}�X��{�L-�k��)^ݠ��mS+@���Qy䋛��Y��O�L~��b��FCH!�.�CG��bN]ZY��%�1���?͗���:��ʽP�����<w;�),ΠTeb�)�
63Y�cn�L/X)6���U���ѕ�ev_�Ҵ�X"���p�Mk�VW/	`��*�Κ�˸���l'&�幎����d�����������E�^+D�-�����AW��0
~��ן�Q�Z�b������u[����.8�q=ZڬR��<;�
���p���C�Q\k�'�@S�����2m�'�!}��ew���+���O�1i�nޡr,`��d�DJ��h��<)Kn��RF��k�����qU}o�M���ؽ���h�"�F{ˊY����4���R�-��SA�$TR-�CD"����?h���EXR���Q*�$���DʡC
2��i��./���@�%T�����Ѐ�:C��<���6p��A���s�;p�WH���>G�t�
B�G�L�)|N"W]E۳��|�JW��������t�o^&��*��kAs��B�U��$�V��	�
���%�; ߆���:S�.��܎��An�ԇ4��ihV����t������5�y:di�f��lu��++� �d����0#0��Qʐ�X��A��t�.�Ŗ�Ȓ~���i��8�0���ȅT����n���P�6�N�=���J:"�)3s.���z��'�k�e����y�"�,[3D�
�{�o�5����I��*�FT
�d�f�N���<s��i�������Q�u�Gh'�u5@/T��v!��۝
>��S�z?��y�(_�#�5�����v�3��c�o��y���/�_��$`��T�T�$�ƎN�ǧ�O�ڣYԮ�'�X*U�L���h��q�D_r,âR��Fq*_�n��:U�j�t���U�Q�QF�EB,sqYB�?0v�/�c#�8�\����K�e?��o͡=��#���̿i&SHܝm�z�>��haj�i;�T���x�fI��z"+Y��1%�����rQK��7,dfK�1}�jZ��C�lZB�)!YBS�9�6�wԈ�\����q�*.�0U�M���Z5-:`�5E�i�)P�oF�F�À��
��>p�K*�:0)U%n��IP��1�i����8�@�Ō;��7�H��;��/FX��#�����E�w�u#��_)�qE�H�E�~\�����O%o����_��t�/H"�����Y��Ho�4�T�f;.=�~�LD�fQF����)`�^���ɪ����m:�~��4B�!�[���J��v��> ˿�����B��ZxRu�V��s�'�ZQx�.n��FR�߯�/Pt��]�"�wQו��a��/������`�g����l"��6d�1�\D�.�NjT&-n{}��=�����5
#[U�<:����i]�g�q}�o�:�_҆�F&W����W3�u/ �����SY�=y�]x���tC��(æ������i�G�cF�F/���BI���,U��zާ�l����$Y�gG?���U��8�-ن��RI�~[4OM����gGi�C�Hr�I)wc�$}
�9Y�n�t�dT]�f��E�
�K?�br��cV��0�����*���H3v��ՠ/���T�T������\,PG�������Ǧ����Q-�;]��l�0���?��$�'k��u�vہ�]�M綂�aQX���p^x��‡��g8J����T15:�	�i7�~ќ�N�H[�Ml�K�MN�U�2J�o��~��T�2��j��.D�A�CQ�hݤ��+�E	��2�S岄I�s!ē^�*UHT�8|��ؒ�����m���d\��	VE�,<~�&�X�M�13N��8ؤ�!�e��R�&�,?.Z�vø[�ڻ�f��Q�T����l�ф����mˢ�2��"�/b[��V1�EJ|sӓ��(��FU����o�*J��g�8�Xl3�DŽۅ��Y�u�k��y���p+^���!���w��z+L`x���Ri��X@��E[��{@U�å5z�|U��%m_4LU5% _Ule���夋u�ں�$�=EK�rTF���<8��"��C�U�kU���h)�J�?Nt�%C�Ơs0�dg�"�0˘Wl�<�_���=�:cm��X��*�j��P6D
�7l#aF��u��KB����hf�Kc$�"��p,Q�U�Y�˩J!����6xQ���T��Ѫ9��ˍ��i��i�$K�(k�t��頾/���k�~P2�C>E��稬�VkZb��)��L`М6҂���I��'c���1Ø��$��I�f�6�߬�/9�{��1͘1�)E�2�C�����ŗ}u�����=��퉡��y4/��'L%�x>�7V��vx�����hj�=3���-)-K�u��2���|9.\Rz�ivfF��R�iZo4k�:++���ؿڿ���$�9[�����G�h�n��DŽ�$�%}j�9&$��5����o���l�0��F�by�M�l����Z�Fsk���u�i/,����g	P$zP��ᡑT�61N<�Q�F*10����V��˷���6E�A��7���1��k�ˣ�]�n�u�jΠT tpw�\~\5�&_ڤD+
�D��r*ႏ�����M�I�E�J<d�V]p��C�O�e|�SN�S(t�������]��3���+�n�_(�*��*�x`�l8���C�7Hi�:%� &�碃Vp�m��ƠYn,��-p�@�mTB��xi>)E
YVM%*�#c	��mEB�o�i3����4t�SJ+�x":]��
,4��m��D�L���*ߜQEO�a��ւE���	�x��N�d��x2:
iiaF��/�-��63�QIl���ra��Q��A��h:(,��D\���ˋW�l���h$^J�$��r�{)���`����^qU\�nb���,�k6���RD[\o��x���	z���•iћ��>_6O3<�F���<z#�fg��HGѕ���:87�<�H���`JIQN�Q���������ƃ�����U��^z
�hY�fT�9���Q��'�΋TӼ����/;&J��r���yTlƲkЙRX���:~��{�?vc�D����� �1�/[e��R�
�$D{F�︽��T���M�3�o�7L���H0s�m\��w��)��:��s�F>%����0�/�X��~f.�q&�_D�~�Й��f�a�,۸��Ef*��R�3�������	��#��O�q���I
��K�DT�l��[�j�`?K�̜�+=ť�4-�X�Gj�	#p��1|��Dx�Dž}����E]�^���j���N�%�C��sE
���ա�|zw6���2�f��9v��{��٢�a�f׊ݻ�>u0g�+�h�����d�r��Ї���#�/Ā�L᮸�3� |5��V]�)E��gVUG�������s���"����N]��H��*��>�A����z��`�-n�o@Ȼ	�s�FI
��E:L���#�X��SC�3�-q���� JP���v����'�V[�ɪ
�Y�\��N�;�W�Gx0��I0���������~��.���89KT���� �����|���v`}1�\]��܌Br���;#�8J��V6p8��r��9�j��	�"[#G�-g�s�)qq��J����T�ޞi
aW�-%��dkT@�ƼB������mO|�	���l\�����'��w붟C�kwݼ�ĉ�7�M-k|ܲ�g� �ϝXa2������Țr�� Z�i�0u�b��M��1���lB�S3��V�x6{Q�!w�xa�m*y�PӔ2��"z9b�5=�HF�<y�x<���l������t�'=vtT�E����N�YS�)E�s���\��}�ƚ
��&S�6�d��C�Ǡ8�)6B7��r[B�a�Wp�	�=���J5��S>��
ܿr��ey���[�#S]H5��Z�Y�d@v��}˒-Y�o��bт������P9���J���*U9\1w�(T���o�9Ckf����e{��6��mє���X��0>�C�N
��/H<"��jg���
�~��
���
�@������>���g�R04���M��@��SnGՐ�(/�[��9�ūp�"`\
g�0s="����;�T.M�`,&�`Ao�,��f�w*l|9$��m��XY�9=�ٖ���ѣ�u��,���v��"�dF3"�;������/M�;�
�R:�8��r���B�`
�ԯښ�YoR��0�\�@Ϊ��Y��0��QM��E���섬-��G���	"�����#��&'�Ħ� �壊BHSKa�p�za�A���-ʼ}n�O�#��"��t�*�q����L,�>�}S�%	�v%����l�A��z(W�m��>��M�|K�R�kDL[�����!���_-�,/�����p2"T�_xh
'���9�(�˽����uH@���uX@,����D~�p�B��^-y�����eP+�Ӊ��Lo=Nef�(�I+v��&5+b+8F��#�6�~;���V��r�\N�(��Z�{'ȹ���X����XP̵�V7g�Ow�/Z����R�M�b%��Q�������~SLGϸ�
B��ђ3֖Z>1�4�
��H%���p&.�U�tRBޙk#�Z��.$�/>,�H�=m;7wg�$�q�I�`���qR:RB�7:�8���dYR�"}uf|��jf����Z��*N/9N��\gݰ��#o�|ʥ7f*�^#���L�(N[۬�Zp��rE��Z��E͝��Ψ�sf�f���I�{�Z���s�#<_Zs-�rݲ8u����/!xr�o��%�XpUFI���?�7����U��&J
,�j��I�GT$�ͷ����f\�H@d���2R�԰�m�Ls�E��mIWGt��[��ȮN�N�!���1͌	ϴs��hr�5j驫
'[�)�OTi�JзRI
�>��j�y���՛�x

���->u������]�D2�u��}o�h�3E�~�Й���|�t�V���BĹ��$���5?3��L����A��M�n̷*�z�oB;�ϷD%y��Ii
@s�%I��ٹ4��lE�Y5fF՜3	��1��MЭd�}��ּ���~4<Qk����T�a'��i���
T��� ��?;׻ۦ���ծ��tC�Z(f��E���X�f[�/\+�(ܹѳ
9����;aϠ&:
�YS^�H|.�1�s�@g����%�8]N�k�Y'����"K�%���u�	��6�RD%���s��Qڀd[-K����W��lqz�����[�]S�i��
��R�L��E���F.5��[�;�Ht�qšvH�ہ/�i���޿<A��_�
�X~��6;J��
�\���>)�"�/~��d�V�_�{mA����}������zN�ce�o
6�,��[6��}Y��QYt�p��B�.4�լ��}�c�g}B5%�o�>�t׺����Bo^�yb��+<����˪H%�e,����m�LA>�qP�C5��¢���� �^�����?K��032;^O*`[`�?ӿz��5����{�H��!&�"�$���dG.��4�\�\��ܜ�y�T�I�}�].�k�8���_\@��Tf1g&�L��g~��C��r�}^��}�����Q�"U�X%���BcO��R(a�A���t�j�'ܯ4���H�WjV��$��LYV��J��[yW���a���)i
��tє#ǿ]��>#")�E�_E�~+�����!Z
3����4[������w�4෸�f�J|���-DD,y�âH���,�O���y�)"c��<_Ңs���<�Kn���9�pt���l4EE��.���[�T��lܝ
��<�6›h��@����&wU�;c�'v�9U�8�����L����)���F�y��o���lmO-Z�Ϗ���>�\p��[c�BLu���J�SV��Ĩ�z�Փ��O_�$v�4���I���"�����'}ˈX��Eݼ�(�Rc�2�Y�nmeKV�2��~��L|n�5
�'([�I����)^����+���R��)���n���*��~��">s��ls
��4��d�7��J�M���.�
���_؊ą#2&b��;���g��k�vl<�cׄ������?��w`1�~J-D��T^�!��}J�Q��k�<���J��ƶ�[,�s�k{cĵh��mâ�Wf�-�3���*
�b�lO�S1��H3}<8�m�N�i��֞@�6VZYJU�-\Z�W�li13D�5�]]k(Or�VY��5q���w3J��W��Za�X��D�z�<7mG�ȧ�%(�N��#�h9����t1�Z��t0N�������'�z%��@�Te��Ob
�D[݃�����B�l��ވ�<(N�S�MU�T�oS�H�/	9�
�T��h�I ��u�?��_Yw�'�r���{N�{��}�W����֓�p��\�Ч�d�	�>|������u�5��nc���3�}ױ��Ge|M��_��S8��s�]���T�Ƒ|���4a�ʆ'�.x�����8�"L 6b�la�o?�� �&f��y��l��m���ų��K�������,Jqa9�����lj��c��h�-E�"H�tΞ����������O˲hY�,��?�~��:A5.ʳ����B.,�qC~	��z���B�6z��a��@"eƞ�jǼ�{ʢ=D���$�;N�ܱsbbgm_,������5ȹ�������On�2>b.ܰP(�G�z(���!��E��]`�Y/s����R0�Y=8d3���/���t��I�%;FW1���(��QZ�@mnkv��z��.����&jţJ2�HR�s����^�˯]���L���r`�`q[E�� ��<�[��?��疠g�K���:�����^W�L֞ޟrH%��jRUoSI7$Є�N'�����k�A%�U�a��T��P�k�D��G�I�t�g�A�T	�ymD�,-�.����2���+�aU!���؝�/:�]�ń�ҳ��:]^�1�z���Zi�V��4�ಟ��K�z
�1M��|��oZWϗ�����g��(k�P����O�@��^��iqKq���dv,���d����;f�}mVW,Ê�3�6��)M�1�Aѳɷ��MGڕ|0f+n���\�Q�^{_�ZE]u:F��Z�o�����E�Z�~��g�F>oD3z!�h�t:�
ټ>G�a�#[�A^�?`��y��
��&��3Y�o�.���O�sI��0���ggv�F���E���tt�VR�0A��ڠ�|��4��x��6�Ȁ�hZ�f�P�}�}����γo��h�k���]��B��B�L�/��4��!�D�3JоQi����6g���iA��B��{aNz�pj���Ca5� ���V����3?[��Ӵq��<���!M���h�%S�#Ks��H����d<�l��؋L��&"�l�^3���h��+�
���cz�ϸ�pQw��h��{�J/NK���dr|�"M/�c�X؉��h���S��ld"�d�`Ң��n>�N�Q��gӻgL��b{$Fo^�餳��C�lgy�a�ŕ3����x�v�� ʅ�)�g�\�o���}��cl��Y�0�=�֢љ�>�٫�o�	k:9�2����
 (�Ӹu���>�������-agδ��!B�Лި@��,~�	:Z�m�*
�D�ӄ$d�x�b���iq�����&x�}d��Z<3�k�:��L?�	Rq��{�^�A�D+��3Ù���7��z�_�~�ׅ�Hr��\�?c�+#�d�c���	���G�f���a簡-t��$D�V�K$|Z=������X��~U���Mt����ԴJ�EB�Lyr��{L�s��;�����~����%�N$bt���_�������G�ʑ��"N0�&h�Dv�~3V�%�'���S�)K{���!�E��	��=:ysF��pYh�4��9�-4t4>5Ī����>��dY��eK1�V��kr���EuD�dT�o���V��}yvAƚ�#2�(��.�N��V��x:��x�̎�$�����h���F��‡��s�8����`��׀lh�d

���ji��j�Q
֣�ԃ���A�,��%����4���c=	�?���xM.�ᙁh�����`wa��W�*�K����+��2��eŌ��N��N~��Z���<tg��]&�=8��!�f�??�ڐG�X0NB��48�5D�ͻH�H�Zoh`%hM�
���?�휑�E�����R4L��e{�[%i��䍜�/;���KE8D�޲�a���\��qvZ�d�]�Bb�4��p����`
�`�(U댘��Z���PFx������˫E"�ܔ�ŔH�}�U�o�^ջ�j(!����g��ٖ��3�/.���
]sI5�쟩.�]n�YF3�9�L�b�
 ��<�^4!C%���Q��2Z�Q/ћP�Y�����PH��c�(mv�!=��a��R��eK���/f�;o}ͫR�H�%&��<b�j�f��1�g��Ͼ��Z���-)��JگW��t2Oo����\�Cr]l���	�6��y�������5=Z�<�;M��	�Xs��<�*��ž�$ա�f�8!zu���3-}��]dHH`�n�����:0#k�P�K��]�>�v˖ g���	3�@�B���@��(p�^�
7*��<�vB
�pC�Jh$+�!G��U��֛�5b�~T�l�ʤ�]0E;��q��f[�&�8��kc��˽�
V��BZ�˵B�H�������0MM��f�	�!�$��шk�M��,�҂<==�?�l��c�3����R,ُe{Y�n��F�8v�d���Ç'3�5�U�TC�̈�D���22���EX$���a'�Ylن 3�������U�Vį���ۈǍ�5dV���%���s�_-�S80���)?^��N��n���?\��&�^Y��v;��>L���5����qL��K��=���̌��O�N��iT`��v��:U�á�t���Z*��H�M��J1(��Wl��L��'�ڢA��!������I�v�A��~gUX��p��R�ס����>�y�C,F3��p��1�!�9�X�
�Ɛ�,�v��3��twA4}�\¿D����V"ݭ�IbV�l/O&RZkT�W4��.*L]8oh�,*
+�.ف��i�č��;�&�^�8��T%�Y�-�Ƅ�x���B���(CN䔈,�j\&I�����
�D�,k�*
hjQ���%M��G�d��R{���IY��oG
s۷�DǞ� ]f�۸=��.��W�R:���D�piU���`�w�g��M�3���x�
��~x鷘!D����E��TLnBi�)>�k�@�OOi-%��R�t�I���D���#MZAKk��Z��iy��5G'"XND*ɒq�RR]��$�zJ�z�2�
�ӯ�~�~!�$�0��ɻ;	��*x�ߌ��/���<*��\�.��Y��4�^V~Q�o�ok/*K%�9�9��ܞ&%&\��i��s�:��ط��QG���8�Kpe*7�׻P(��:��c�7(�<9�R�6���"��'KO�~�TxK��QBR��e��!J���47E��A��y�{�ʾ�͵�ZS$�@���u~+!� ����}9���N,$)n���U}ۜ���q#'��ڛ,2�
�d�7�w'�|�+��N�rW0��+��� f��)xW�X{a�/�	�8�����{J��>�'��&�$S�"��1Ս}�r����tў���5�/�iV�*$eQ2%[ѵNε��y�c�e����b���
�(��N�
�6q������R�.�B6Z�Mq��tqJv�qѻz��;?��k?��_�((I����V�$`Жgx�3B�yP �x%�NJtZ�=2_�C��"t���iuz߭��P�KK9����#݅܊�~����l��u�/w-���U��Wm߿�ݻ�W�;�v��j��R)۽$,��%�W۵�%ȕ��}��}�^g��1�E��U���D̕���m5%z����s�mV΋�ғ�>҈�zj�m�ζn2.�1j�P�u�� ���!�(Z��OE��pWƐ�C�!���r���N��(�y^��ɪ<��}��pڵ�Z��)�`�q�T�-����I��-EU�M0�CΪ�@��v�K����K�W�EY�S�.9t�mW���b��s,;�2�wH+s9ɳy|���q�ƓM�JG�g�Kn���%�x|��Gń�e	��IlK�+���.���R��Ҿ.����]���q\�dEj/d	w�}����k����_+�Z�2�X†��*�U�6��?��"x����Ψ3N/|����DGdG���/����O�y�w~��9WK�^,��x�R1�qd�\'�T ��~�f����ɾ5��W`�
��1*�]�6����z�.��!a{���6�gW݈$F��k��g�j�1[��2#�N$ډ��֯0�&�:�'�Du*��3v;��n����%Ǒ�_�j�#�3��ǡ��@����Y6��xh�I�~Y7_3y�54��Z�@;/ӝ.D���&:�.�1ɓ"�1KS%@ı;�H^=Sӏ�5f�>��3���z������{���kg�T��3�E�?���P"�l1�xXcF����3[�7{J����~p�!����-6ARف����Q�I����a�l}�f�@E��3"�h1yv���#�ݛ�JD�4���+�]?���Ql1	=�˸�s��:K~IHU���.��V+�^v�Nwe������9T�+	��Tȕ5|nzV��+�R�����F��Wf6�u��Y�,���xIH�ºKYe���?�P�H��G��3,AG�9@��A�X���&�=0��@-�,!:�:t�Y�8L�4�
6ʍ�Z&�7q���H�j�3c�b��$w��r�P[�$��"�Ӧ��h\�<�	d{7h$�a�8�Fi����'RS�ݔ�?�f����Y���x;�c�q_�(�}��^1�a}V�ܷE{W+�С
5dy��@�̋9��
(p���m�l�*ǣ�5����O�;j���>���޻R�$J%��umv�D�M�L��b�^:�&Œ����8I�_��V��?�5�d:`�	�)�e��lF"_0�~=��	
g5zw[Q�?�vؽMѾwt���L/�vܙJ�2HWc�084�Ik-��Hu�Z�L��io�Vv����^F����Jz��MZn<u@���짵U1�O�2c�ė�EH~�1��ݾ��s�6�rF� �͵|��v|� �M{?|ML��!̂;�y?J�,f�+�!^P?������Yn�-2'9�O5���Yh
��eEq2�̏X|	4���g>��s+#����Y�R��n�:����MA%[e�U�0T�[��?�z���ɠ�2��Z{fff���e�ހ��)�
c	�<�t�朤����d\�[�Ỳ��r�Ǟb@]*�T�f���&-`���XL��R圡 ��&uCSIT�74�O��j�aQ?k�D���-��}��5���|����=���9��&������̢M����g~���82	*���'�ē�3���*Ѣn$�{[ёI̕I�B'E�:T��Zk�$N�Nz���;�;w�"��Sİ����\�͝��:��	T�fQ�PɈbcbr�Q�zǶ)C5�=�9��uk˖��T2t��u��-��aX��
w
�	�c����q�벩
C�ڝE�7��sf��9 ��Й�5S(�������_3#'���B��H�:$U�Tv�[bV�2)��ɐ�'�8l����ۋm�V?����ػ�"1�.�ys X��<P��M��Y���-SǓ����t,�E[�l�-3++���)����.�?�2#BSЯ�`�g'�}��ZC�c��d��(Or���%�2���WZ+�|x����B�!�33���燖8���� O9���L�={��QE�K)�MS���'�R�&?_0�)��2=�+�h��vڷ
4�K,�� S�/�+��1��
��7�����x�jM�O�V��6�Q�p��N,uVz]��bo0���?�����ŗ�g�^�}�Ơ��3�7�m�1���{��t�L��6��C��fx�0:��
gs
��F���qZ�3���tͧz����~m�����_�3*�k�w�]�ο�q�N����R��R'�\�=k��s�=�U��"*��TV��׷gH����D�J���v�*(^��aƏ	�o�P~�B��0z޸?�w�Z�t��D�-�Z4���L$吱�b�Z<�&�ۉ�
�Qv�����y#g4����Ү;5ڔ��9��k�-�gR$2z(3����O��ίr#	�Zh�}?�εwF�Mp��gt�r1^�z��b vS
?#a�`�1���(��H0��{�YB�Rwi��=^�w��Z�i�rOl7���bh�
�q-��f�o�'�x�D���7���|�ƫ����Q���n �L�p{�y�M7��u76W�5�z����{�W������B��e�{�w3�0j'O�[!�Xf/�l��A�ɀn�K�������(�jHm��3�s
�z.MUMK+�\�RN�E���J��P����6�c�~40c�ւB1m����I�x����C�:��f�c���=U�xn�-~�_#kV�#�qY1�py����xq]��b���9	�0�0���K#W��|Jmӎ�V��?_���-C��v�"�@98��D�=�_g�B�=����^��xċ$���j~n{6���␠E�Ʈ;�5���4���%ʰsA+����j[,h`��	(P��C�V�G�5�|P{���sp
��w *�)��g�d��skqr�!,NS[n�}4@�B2ھ���"{
!�7S�xS|:%6N����[�߮�$�2��L���� �ά�Y9J'��g������2�hi�����*I�]}��뮪o'�Ze��ٟf��:�F�p�������~�g���(��֖����w.Mܻ��,}��EwQC�V	Z��w�L���=���?��E�尬���dֆ�������9�z��[�Q�z{�Nǟ��P�j�P�g2C��0@*@<�z#>A�e�A������h$�JD�z�U�H"���S�Zr�:ӥS�2��[X�K�/3Qh�-�0��}]�m�C��@af� �yq�绨��3�8������,tt17��+w����v$EՕ���T�A��YUE%Ҩ}����y#rH�ˑ�Sٵ�6��}��n�����Z�vwMLC��
�P+"�R�>��ڪ'�dO=�zӃ'�`.�"��ē�(���y\�fM�D!L�M2����}3�ܥ������	��ͣB�=!�a_%�&9���60�XC�K��������t��n'*��tOtnjj���瓛˝�Y��q�P��������p�q~���:y�F��Z���۪3���)<�47,
q*0�����Z��C37u���`D����U�Sf�<������Tm�a��+���f��V��i��i^Rt%%�e���v�g/�J[Y�I-�Y�Bm:O`�Aݹ��!��f>������I��".ʙt���<!�'$~��#6���	P����U�lF�X�䁖2A"�%њ��Ia�Hﮄ�X���b܂�-]P,�ف��6�lڣ��u�/��/H�%,wד�d,�o2-a;���~i	�-9�å��,��z
��{�eR��9%m������@�>�+��4����
��H�v6j�nG���%.�j��5F�8w
�OWQ�J�n^�3��[�(��g�n85�oG��NV�\` �S��rxt��	�;G'w���.{���5fC75Z�O�9P�wxlED�M&a!���C�)�#��������T�����Å���!��Y���Q=s�)�k���h�9��Yy-�dі���Ӌ���
�R��ck�/!j��g���Z�����C�ӕ�o�u����@������ς5����#�
��4��%��;����V,���D��|G�9䜢<��H���׿.V����_�g��wit<^����{׫���Y�YX�lP������\g�R5,��N�$c�ݔ���Ú8��[-=5$�X�+�+�Q;����FƧǭ�z�s/lFKm
�ҁ�peb�މ�p�$�D��O=�Qr�> ���8ya�E������x�c`d``�YZV�o󕁛�nt,�
�o���TƳ@.P��x�c`d``<���o��T�2`^�Qx�}WKn1��p�M�Yt��(Y��;��2�%<G��E��I�ĉJ�'jl�1�D����܁��t��;�L��.�y��X�5�Yv	.q~�{�U�֖�~�}��h�A���9t�������U����'�s��x^�P�bo7кh:7n�s"���9Wa�+�崰^ݿ�>fkkׅ�U}��Qr�9gѱ(:q͛b�a��0b��ޏ���"v~�Og�-T|#/��t!'8����$�w
��Xt��p(�����~�{�["��pF�{�W�'��I�$qo�k�$��8yj<h����E
?i��"J�����p	�e���ڌ8f�_˱A���7`Z�i|w3�GD���rMbn��7%F,ᛈ����/�W
���*n���Ơ�p>�N�&s<�����XgNk�޹�7��綏�q��ặ/��<1.�A��˚��[����[���g��al�j:�V}S�+�G�����+ʋ��:�����O���T�%=en�=c�3�F��.Pms\������\�b��I�Zs@����?����XW�W���To�ܛaܩͥ~Gꍌ���O�_��]��k>ܺ:�Q?S���\j�[˫���<1=����pW=�9j\H{��ܮX���|Ƙk��r���4P��7���|�u�������x��)�=�U_ߓ`������h��#��tn�綹x������c����jW:>��'�k�����}*�ǹQ�,֤�|�Z�k�w{=t���]�����x2���4�X��r������0�X7Aۯ{wfr���j|̾��������o����^/`\ԮK�oű����.o����RkQ~�<���8f5���׋��͜j���L�\Ö[�kȧ����z����n�[>��gփ��^�(��g���Ic�u��$=�?m��A<�R�S��cd}��:I�ՙ9V���upt�Eο#���4���>�w6�٬�Ԛ��&��Ǹhn#�f�}yPLi�蹏�Gë����C�\��1�3�S�>���k��s�����x�e�{����}wQt.��t>(�LL�L�j&FM�0��TS*I:����(�6Qh+�B�"��mڴ���v]�z��y�g�k����I����"�jP�"�J+�(W!����c�bKı9�'�BqDE��E�.�)`����Y�0�J���1�����GT�zTW[�z�܈Zxj
\'̄�'��m'�����4�O�]�X��<�8U�Ӝ9��=2�g���Z}|�F4��`)�h�J��Fx���Ƶ@��"�8�o�M�7���zs5�'��ٰ$��r@G�> ���#Z-�X�:�ϔC��3�w&�m�sMg�Ϣ7���j���N�vζ����@��<��m6��;��QN��-A~9��q6��ѩ6�v!��̀�h�X��]g�:��E]��ʮ�ݜ�D�K�*O�;�ù"z��W�� �Kݣ�8�����}}�KW?��'�|��q���o�����_��z]��2��+�V(�+���@�q��"{Ej�,�+Dv�{����>�s��0�}nn��Z�<0�xG�8���Ώ�y����)q�w	�W���h5��zs4��e����qj���3��	G��&�����dߝɴ_K�=���u4\��T��*ǩ�\/�i�Ms�np����6��t�3d>�ݚ��L��p�rg��\o�~-�2�]�Y&s�o��o���[ݿ���n��dqw��N�w�{������8���}��MX �{��B󼗾{i�O�ӳȹxz@>�Y�w1K�!����G|g���{���܉��g��et�C�'h}�yR.O�����)5O�x�
>W��+���g�{��*������p���j�ט�f�/�ϵ��ҺN�uz���2_��7�
8^q�_��k�o����u{�x�$�7����f:���-�o�E�-�U[տ#�w�y��m8�ѻ݌��{�|_��߁k����>P���?��#���|��<}����O��]��%���}���4|a>_�m7O��Iӗ����kk_�i���{ݳ���k�������3�}��V���~�{����G��Y�D�ϴ�_�~1�_dtHF��<,�_��7�w߅#r�C�?��kc$Q�`s$i�Hʕ�>���,?%�cr�@$�N���ARa&���H�+�#��6Db\I��
�+;S��*��,�U{��Uq��T�s#��w�e���&�Z-��	�@߉#9���]
���I�ݑ�\���_�Z�y�ǩ��2p�/�,��!ݍ�E�X��#i��d8ה�f�6W�BM�NπU`�%]���Q)�֞������6<����H�h�ZIۢH�ɺ��e�^��|6��?��s�e?�t��<��Ǔ3�w��;ɹӢH.�%��\���b{��w��eI$]y���%��x˛#�N{w��{��O/s��R\���{g$}�@v}��Gg?��e���@�����/���)�q���
�c�=��)�c��A{"l6W�wH#X�Pz��n
��$ý�s8����jo#e2Jf�̮������h�F��h�W�����1���X���]&�2zƫ������<�h��I�'�u�y^�n�;6E&��0ս�*��=o�s��0��2�av3qΒ��޴-��xn�9�͡�߉����ս�ͽ�M����&$w�'�w��� ����z,�s�����{����~\��_D�"�?�Ã��b�Ӵ�������R�<*�GwD򘾏ӾL����	z�pf9ާ��aM+�_i&ϸ����<�����Z~�}^��u/��,�z_�:�/����^��o��3}��W����k��F�7��>����μQ�f�6[������۾/[x��Vϭ�#�û���u;?�݁��y��i�a.;h�@���C��;e��;�	m�:�������~�"�/�MO���k:�,'{����k^����r����N����͏�?��'�?�wP.���!k����W�-;�����r��_�#M�H�ّ�+��|V��,���H+�߉�s#=.�Gz|����i�H�t�ÑV]i�^p$��jL���HkEzB&l�����T;���w{u�=yY�u���qJ5p�T}Oki}�
ZF�P���"m�w�Mq4��"mNw���H[��ʹV{"=#7���ZӟYK#m�tf�۶̋��/����g��/���Dz��H��<�@]��H/�Q����wx����+#�*��<u[i
y�#�.�>�8iO�^*��G�W�}x���"-�Y ��?�e��[+�]��
����~�9pg�E��7����ҙ!����0�~��b)�Q|��g	=W93Z�h���R3*��y��a��cy�K���9?~I�܍	|_#�k�83�I�'�m��fa�x�c`d``^��A�����|.�x���An�@���I%R!5E
BbX�&R�HnB�,���,ءV�r7�g,{ڨK�F�8`��CpN��_h�@J�x������p_�����+��F�A�]<�w���p��e�
j�p�N"�����5�qoWQv[�먻c�
ּ���3�U�g�"I�
>�;t{'��	>
�૪p��+�l����tj«��k�t�	WQq
��ww�7������a��)"�1��FC49�7+V�0G���#�Mr�F�ՍaS���y���{�=��-$Sr>;��#>rE@w� 
C}`���T��뷸�ǿ�W��<�w�K��;ū�^������������w�N��vga�Ef��E�����_�[&�n�%�y�H���(�)c8��̜R$���԰0������G���5���p�yx����dV'&9����f����`6�֘�IdY�GK��o���Xzz�
����&Y��>fW�EW����M���so:!K�.�Xx�mZ�������ᙅ;��vV�8��q;̤�zF��Zڹ�0;�C���������������:�}�i�ZRK]]��Ui����������W� ֤���-��=�1#�.6Ħ���~q�8R%�Ljc�q�xq	qIq)qiqqYq�8Q\N�$./� �(�$�,�"�*<q5quq���8E\S�*N��k�k�������3čč�M�M�����-�-ŭĭ�m�mř�v�,q���������������o�F��n�����^���>��~��c�Ph1S�X3��Td"�8(JaD%j�-��X�����A��!��a�����Q���1��Xq�8O�/'/� �(�$.��ē�S�S�����3�3ųij�s�s������ŋċ�K�K�����+�+ūī�k�k������śě�[�[�����;�;ŻĻ�{�{����Ňć�G�G�����'�'ŧħ�g�g������N_______��������????????����������������R�T�%۲#��'�r �r$��ܔ[r��/��Gʣ���y�<N//!/)/%/-/#/+O�'��ɓ������ΑW�W�W������<Y^C�"�)O������[;Q^K^[^G^W^O^_�@�P�!o$o,o"o*o&o.o!o)o%o-o#o+ϔ��gɳ�������]�]�����=�=���}�}��/�2���r"�2��< g2���d.yP�Ҭ��v��d-��\�yX>@>P>H>X>D>T>L>|�+!)%-#ϑ�������q���	��I�y��H>Y>E>U>M>]>C>S>K>[>G>W>O>_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_~@~P~H~X~D~T~L~\~B~R~J~Z~F~V~N~^~A~Q~I~Y~E~U~M~]~C~S~K~[~G~W~O~_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G���H�$"E-jS��ԣ>
hH#Z�
ڤ-�G��:�����:�����tI�]�.C���D��D��+��Jte�
]�<�]�N�k�)tM:�N���Ztm�]��Gק�
�������t�)݌nN��[ҭ��t���t&ݎ΢��t�#݉�Lw������t�'݋�M������Ә
Iӄ�QLhF	��QN��UT�6��-�0=�H��C��0z8=�I��G�c�z,�K���8z<=��HO��B���LO�������z&=��Mϡ�����z!��^L/�������
z%��^M�������z#���Lo�������z'���M����� }�>L�������	�$}�>M���������"}��L_�������
�&}��Mߡ�����!��~L?��������%��~M��������#���L��������'���M����5%�T��j��ꨮꩾ���u��6Ֆڧ��#ԑ�(u�:F��SǫK�K�K�K�˨˪ԉ�r�$uyuuEu%ueuuU婫�����5�)��Tu�:]]K][]G]W]O]����ꌵ}�F���&��f�����V���6��Lu;u�:[�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_�j�*�&j�"�j���L�PU���T���\RuX=@=P=H=X=D=T=L=\=B=R=J=Z=F����U��������Փ��Bu�z�z�z�z�z�z�h���x�_Vq����A�h��V��J��/Umt�&q�v��K�r�euX�M�
"�ZU�j3p�zER�a#�qV�^��u��I����O(ȱ�<խ Ƀ�*s?�<K ��l�R�seY���x~R){�$�}�^XDy�M;O�T��F�z�\�e���3��/U�T�Q�<�u��ZEgU;�S]�j�g�'a;��$�>Ty���Qշ�<���s��K�:1�Y�ˁSJ�|������B�Z:y]���g��ڎC���ԟ�~��!3]���oR؛J�0�F�҅7����/��ćU�Zw)�"���Ǧa��3�K�˗���QZ���!�q���bFKŮ`���q$zh�s��]_*�e�`��^���A�M�F�enL�ǥ��������'ڇv�\�y���*u[*�,�yZ�ژ}�P�����85�'��O෥&��=���=:b�����l��̖a
~���/���%���<'���d��/MS;&�w딺�k�M�򢈳� ������xy��^�E�ƕC�l�,s��BT�n�<����"?��N�v��+�hѮ(�N�e�`h��9X���Ce��7�&!��P�Q�$��2a?��қ��9<�Yce�:Ċ^�gy�[n�������)���ޛ�N�|���Rg��73�� �z�2֓�7�y��i1.T6c�����(�+�X�
�И<.��uۙF��c�N�o� ��x�����iԫ�%��x�1|;����Y�o'If��]'�Y�`�ىv��!�Qf��˪��3V���ζu�Pxrޚ�mF��c�J��R'���F��9�
�4`��r�u뮩�m�Ƹ����d�X��S��g�n�:���`“a���uٍ/rq��-%x�z��ū#������q�n�&ح������`��/��n�0��u�`�W�<Ntv���鼪eR\ۚ�c2Juԙ"�
d��8GP�s.�,pi�Jf����D�+u�,�i�:����>+|�7F��P1�
V�e`jx�	ʸ���c'��صaQ>����1O�!��+:��.Ai���C��Ա���Q���K Z��#.6f�u������l�6�)/�D8�,h h&6^�+n��-�>�/��
w�IN������n�\�A�N{F�b��.���2��_��d�A�#lJ7\b;��~7ƾi��c���|�o� ��"�훌V��tZ���^_@X5)�d�H]8p7��d�`��G"��:Si�gfT�q=�k"��~�W�;��Nα�
�^��~��FuU!C/1g�%u��K�b}Z�a��S��bZ����?O����
�P���p0H���'�8֡XU%�'���yg�"��0�˰o%ČN6�Yf�6��S�
�f�ջq��܉�>�)m�&�]"����*�6x6�w"�~^.:L#qa�$���W��;b�7w$o�9�tܞ����j��YK�����^���>D͑W�
>����]0#��8`2"�q1ދ�踬M4�e�A�D�2<�oH����ԯ�)�%����8v[0�FIntțț���3�X�vJ`�F��Y�Dq1���hp�
Y˰�"�`K+]�{�HkV#��ȭp�.�43S͹tcEf���Mb�]��w'x�
�i�L�Vdo{��3]��n��%L	W���V�d��:�=��6y�/�c���o�;j��	)xۡ��k��m,���h�봨#�ю!��L���c&���Xo�:�*,�{�-�2�)m��C�F�ץ�ԘV�:��hW�z;Zϒ4N}G��3�3Al�Rf`�$>�T�.2���;��)�!���Af���h�wUk�]�B���8��=�eG4i��^��|Y�\�,3���Ӎ� v"D
�������#Z�-�X��ˆ��2�B��TR�����������3H�9ѷ��4�-qѳ�B-‰Y��:F{���vl�H�)���rQ0�Ðk����y�C��nb��Tw�Оܬ@R����؁�[���{�e�ٿ:�\��:f�
+�A�Q�ybYm�aO�)§�a��Ǚ���l�e4��g�|΅�#f3'�qy�m4�e�.г8i���;����yQD��*qf���Y�6u�dGu�a�y?m�`c<����,��ؘ�QD�wE��[���,s�;�E����S���9�F��a�2�?�XN���w�a
jH��ɩU��2�[�altC�޴6��t=��]{��éua�m9#��n+�O���Z�}G�ݙ���n�*�-@��U˒�>�N�{�]=`�Ge5>k��L��?���Wl<�&�s@l��aáǎ>��ġJ�pw˘�=�q��;�w��r
'f�E������`�u���w
A���&y����4O&VDL�^���w��C� 1��q��<DN�
�X��fg"���4֦;�~�4���_���r�C
@C�Y�\��F��q]��:cb/��iC
3��{1�G�
>:��̽��XA�
�8.�RK�w�H��
��'G���]��V�1��	��tl�ۣ��1�pH�5Ύ������Is�ŎY0q��]f���j;��Lo�M�8ӷ�'�:���:8_&3Pr3Z*�y��1�3��*̷�K�Qni��Uų�js�Pm–M"6���W1*�Q�r
�L��~O�/?���x<γhG��F�=]�B���ޜ��
Tad��={���|�I�%�n9}ܠ=K8֗���4*Ӵ̯+��;5"�� �:��ݪ��&�P^�U�zD���>7�eND�>�7��b�v ��?m��Md���qbyc��ݻ�17�9�yg��<eڝ�l��|0:�����8��"�.�M���y������	�E#��u��s����`���9*ټt���o����t& ����|ڝ���:-:v_�NQB8F�g�V��އ�A^p�m�c ]��Jۋ6v$wy;�)��#�����
��m��b�x7f}acE�؀@wO� �5�5~K�>7�F��cˠ�J?�S#��׈�V	+��[��L��S����$i�os�!� �s�z�L Q+�`�Y����;hP�c�娍=�n1�E~��Q�4e��N���
.YV�9�w����uA���E��+���sC�ǽ|[��p̫�QР�D�m���;��E3y�鮸"� B*�� �A(�V ^_���;hSO-��\
�Q+�^l��?�l?�fTX��(G4�����Y�n��i;h�%�4�>'�ASݳ��E�m�����7[�5���v�~L��n6�R�}�p;W�����S0��K�þ��(���!�ۋ��	�Fq�����~gZ�eZ�7��:�P�;�g�0��֍����b[+2�J��ؑjG���
�P�}+rs���C�{��M��Y}����x�/bt5�����D�̪���.��d�n�V⧹%���F}{���^��ˇI=�r%ō��O`�.��,���d4�Oz�Ƥ��f�,�p�R���ԜrQ����@!���uZ�J�����|=.&(��4���,B�lÈy}��'N5@��n�����.��v
�^���g�_m2�آE��I��N�1�`м�)J�b���b��)�u���r�]S�Lm�#�e3�A;ʑ�eˠ$J��1qى�K~"W7����h�
pE�qds�Q��̳���m��1gk��ʐ>��pTK�U�2d�M���&S�A'p_��״O��~7�kC�ɭ����+ۍDZҳd���9��,�y6p�l���R��.\W�~���P�S�
jZ03�V�'7[��*�ۣń��ɔ?D���Ix6FK:�ˆ(;�B��Qk�Gj���g�jpwu�2�m,?�5z�~�X:�%�g��oO������惢e@˯�ܒM�,��O֙�E�	Ƙ�����Ь� \�#&ѭ����9��
ߐC��"�x�:�u�y�G�4�Sh���%ʟ���46i�v�6Le&��e�
s#������2{m��e��O�4��K� ���e��ʮ�e���q�ȱ����?�E�Os� </��1��)v��ø��R��x%o�5tгX�Ha���B��,$�V˶��6��|ω��_O9���)̧mx+�t�������	kd�<sm�l#U�u"B@�ZS�C����kճˈ|��nص���D�˘�\T�����D�b;�}�۵�#z�L�K�3L�џs�uJ� �`�r�!ǯi�,��C��m#�c�{^:��
`�ۥ��,7V\r,X�l�1���ݻ��%g�5Y��X�v�����;��tCpP�Eյ��jx7ix!��f�>�Z��1EE�J�R�H��S`s��J������ncu ���m����~k�h��x1�-��?�%q��%j���ݿ!��;�\��(-��6ߝW8o���[���4����QP���R�3`W3��f��O��-�b�͟� ��L/&��
ݷY�?����.�"����foo�
�l��~����n�v� P�b̟����u���W=l���ю���,?N{�D���R�1���8�B���:�,�:�x@���X)��D&�g��:�-㡤~��_��9���v�9/1
�v�'U�cp�<ڀo��1�,$K�q�-k؅���K���Ke��Kz:�E��̻t}�a…sQ�3jG�r�<�).֛L�L�*�_%*�PĆ��{��k�6M֭=�mv�¸Ǝ�$%�1assets/webfonts/fa-solid-900.woff2000064400000221154151336065400012656 0ustar00wOF2"l
�p"IyX?FFTM`�

����:6$�$�, �%�_[�@���o��+�m�+��nz΄;��(:L#<(�nc�DԔcg�����+Y���_�}�$M[��
�*N�B�Y%�RIU
S��L֑�k=����xZ0�f�ps���|�썈����̂����V�^�j�\щ�4�޻il�7��֚�BdD��n��Z�Y͊��b��n�������8���}ۉc�kE�5H����{��FDfoJ��c���KɓhŌ�7�3O�)�0mD��ؿ���:w�}�u{%�D%*1AT
�I��cs�8m�?�c%�#�H���
��K+v9MH�	E�π�h��VW<*�=B�ٞ�c�1���)�}b��ñ�µ��|�������@�a6E�.��~�ܿ�m�@�Ye�qB	&����[o��k6`c�1z�A�>��#���QR���P��(��D�3�<�1����>�!~n�ވ�o�fި=��2i�o��ٔrV+Ϟ�'F��'���~>��
��\�K(4�y�0��OL7�B:1��]�ՓӢ�5�.�ňua</����4`��`�5�vM9k1[�42���NE_�����e:��(%9�.K��ݤ;$�$��OE�iG���1ۘ��/�+[�%꽀�_���Jm���4Q�qP�>4��hgZ�;�%`}��;��94J̘b��n-�?�\����%�Y�@Q�Fb����-�w�2\�(��`c<�����a�e��2ۜX�k����I���u�Up΁����2օv�^j��x���h���p����yo_O�n��D
(��^�{���dW*�*`x���De�h֭�B��KW9�ߚ5�C�HR�n�4]���� H����嘃d����sj�K�N7yh�0$<0!p!m6��q,6��ڞs�e
�1i�hl����ZU��U��_U�5�K�ɶ:8�� ��E2���:�p���
0Ȓߚ �e%�t���æ�7���%ύ�v,�&L!T��Hx�@{�`p���4��Y�ҷ�`1u8S�/������O��3��[k��b<�OIs�T���$�%�խ��I�l��7�p�7�=⇪bկ_`U�@E�@PAJ@PAZ@�EP
B�M�v/�I�읕��y���A1�2!�jѡG��	!�n�<�'{<9�6�S���=�ḇ{>�BU��P�X������ $!�B!�!�QH��X��(��E�Z{T�!��(�0�ϧ��D�M�U&�tq�}Kz���͚b����M:J{c����`�
+�䯮��\�e�g��T7��DMR�y4G���{I��z�������,e)%��8�\�o�L�̽G�C�RH ������?zx����,
V�"$�MvS��������-��Hq# �8�*�oB�Pd���>~��;n1���*�{àv��ID�v���=�x�5���<yJ,���C����ʩ/�z��U�;p�_$�{i�W���Q���r�i
��;�C���x㗗DP/;LC_��M�́�A��Ӝ�ob���e�L��P�˭����l�Wl���G��[7Q�3��g_�eլ�~���qޯ��?\!�'�)H@�y�=.�$'jV�L�~~����?Uz�/�G.W��ܛ��ɭ�.��ǥZk���~K	���\q���⼛���� [e�]nҝ�h��Λ^��]�� N������c���Yq�	'�NL/,�m����=�������������o��������Ƿa��}��x�I3A�(t�@���{ ����*��醃�t&[��:��;	����Vk
z�{�_0���s�m��x�����uM�]�7�m5}��H�֠�#]�6bւ���X)M&�bV�X�:C��;��S�Ҙ��,x��HA���v��>Sn:�X}�Ğ��n^f,�2���E���*r���$#ŖSڽ~^o�+������k?�2Ec����x)��;}u�ᘲNͼeב�3��>t�r������n^>�|^v} U��������x�D8a��H�?��y��H�8R�`�ڷu�ڦ��"K�0�=�\/磮�4�TE�xE /x�#�8a�KX�E�o9�n�G�k��H���s��֑����S3�x9}�;o�Q��_��)KbWyJ��\�64U���1?}��v��y�9�e�,M��q�컸h�0�JY���w��Π�?��.ƣZ!ʤ���[�g�����Z*
�����8�M'�Q��j�*�L*���ŤY��b�]۷���+{��Ѡ�˄|�͢�a1h�V!���<*�Fy�r�}���C�^_�c>?Kd�o�nF���z����"+��M�'Q:!G�XQ�^|.��w��>�s_ԛt3��D7	��eN1l�	R�$GI��f0,�ψ�GBl��QR��/0�X��+��6����k��;��i��T�^��=�@)?�]���@\���~[^�g$R��@�+IO�ib���
��L#�]�$��	���5����:�����-��0����8�j�����N��W�M��a�RL�b#�����Ӻ*��d��N�I��%N�|��I6Ws�/1��J̢NL��~ۧ+%߿M1g_�XМ%��E�J]p�D��`X�u���Ѹ�`O�mڰT�z�?��(�S�`�!je�<,Za,joto��+����e
���YG$O;_�\�'��Z��i��j��=)�)�-|�H~m�YT[�)��M�^6O�ږ5OK�1�u��wu-���m���+��[pţ���1l!kc���a��>:`�d?��[uˬVoa!�Yg��X�tM���Na1+�A�, ����^��`벎��L�a$I�mʵO�0i��h?Z�v�3̉X,�;��(�ޏ㽕r�7*y	�7|�op�\���&d���WK\p�v�B��'H�wt��(7���n�H{�Z�lQ�P�6�~yrv�3�(@T��3��P���Wv�8�����5�6��*H%[�������E��V3�$��~�xo+��
��.�	z,3�%j3�3�]2ya�E-�� G��N�}=�?nW������b�@��Z��*��a
�h�o|��맣��V e���w>��ƻP`�sOI����z�{4��D2�Zz�R�`ܔ%�Js��� ��*��D�
�K�b�NE��!Jب�=i���vх�i��ʊ1Z�6��5سC�i���[M+��mX��ld� �I!�'���y�����O�5S���M�L|� �GU$�+B׽L/��xV*~��;DG4��	?ƈk��n�v�$�Mp�0�?Q�j��/\���[�Ż�)>)����~�~UJ��C��R�&n�f��xA>S\Cb�؎�).5��RH#�푣2n�\<����?��khS�8������p@����Z�h��Pb�L�&/��%���Ҟ����_�:�z��d���(8�ݭLjJ�;q�i��VJ%�ն���Q��Y�1���b&`S����I\%Ɍ`�C�c�����g�g��[�Č�”��Ն2Bت�CCg�O:��i��ݪ��TCj\z	�{�|�Ģ���m|Ф"�,�̈Ո�'.�h�8E|�q5��ѡVN�S���E	��N�2@���#-���_ܭ����}W
�^�C�IU�y�#�`�hDN 7���<:��j{T3�@��G}�k#��-m�m�q͕4�h �9���3T4��ޢ�YyT_����.�6�_Y��4���N�H�ͨ/5	U/�ګ��O�I
"����b�Cr�>7�{V��Et�YK����l� �<Y�2��;�C�����4��',�A��:猈G�|Ҷֺ��W��&�I�d���zFK�B��@�t�n�����_���HS�N/P���[q��P�9�FИ&C�=Qy�������e/�S�\���JD�h��ђ���ap�7�K��]3ņ�Q�z"4��+i%e5���	cҎ*��A�b0�^A�|��w*�̚��aj�e�����Z����x!�����|�0��uU#KS�G(��3U���ts�n��+s	�r��K��,ǖ�U�(�w1�S��$�h,��xR?���;H&�O�U\����<L�Jx�ʉ��;y|�DO�_�@JS�o��"����%[��8��o��J����rX�E�6��%8+3���.�C��I�=��]�/+e#`�?���e��y��Ω�,Q��=��9�/ee��Ʊ��E ��/dY��Y�x���B��@T;����E�9��d“��?��f��G��V\�ڨ�������Ha��}�<5�נ�����iކ�'�YV\Dl�В�r>�(N@F�7�r����֩"���ï�a����VJU鶐��4]}��U���r<���E:S3MR8oQ���i���{[��a��T�FQ
u���G?�F|�\�a�یouK�����<�hH�1�(�����$�^�8� DRG��:�_�1��u���1�RGS��VV�'�G�q�*�S����4)�h@,�%�s��i@�#š�V�u�(�9J��q>=NZ��f̽��4��AVp�T�Y�YO]�I��P�`M[+�:bIx^Y�ō����mDa(�u!s~U��D�w�x�*ᑭL�����z�J@�9V�8p)�#��`e��U��j�V��V�8�iY���hj����U�-�d������h��4�?�@��.j��4����8�;Ip�H&�f,z�!�zb3�1������KE�`N�eKt���i-ö0��J��N$[��9|p
�D��|Q��c������̛�	)>>��x�n��Wɥ�d�<|aleO]_1G�Ш7aZ	d�ݛ�"y�5<OVi��E$f����|�5�F٠�bP� �=E��q�=9�1�P�����W+MO�K�gBP-����G2RҒx��
�˨��K���_yon�Y"2
ޱC�ɹx(�×���e��%���4}�?9!���"<v`�<9�8�M�N�����\.�����E�
�J�N�2���V��߫���l�(J!���i��ԑl��h�$�h
)Nw��a�+4G1�y7Hg�=�v܊͈��[��V9���t$w��蓁�la���`��<h�B������^�-J�|��wJ^�o��\e�~�m���ז�*���d.�F���*������2hF���=K��ߊ>`}I��7.�FҤ����E�u~��n�+jf�G�gF#/p�^�B��$��-���t
���\����h@�P+���E~�w�V?�S�G+�O]vڦ�{x���/t��O�{���c�81m�\*�u�
(g|�H��G_�j�w��� �a���I�$��('�[|e���4�fZ��2���1l�	��<-�-!T����|	�
�0�Tyi=T���Y���f�6ñ�<�C?�i,��
[ȓqٟ3��b�V
xc�]-ޔe"Ǽ���S�&�Ƣ袥@��j�j���5�QsC�3�-�ě��ej��Ec��J+��������I�6W��иs�L����(��I鍯!�H�
�a�>oy�Kb��Z"n��x(�/%���*�b�<g��F=\^>@,*o�y"��=�>�Y��q\̣':����'Q��2���7��#��u��$���;���'81Kx�b�}uA9�<}�u��}�ŸtU��, �cؐD\��Injmi���ô�N�`h0C��,h��2e!=��T�B��eS��@�B0��
�qz�jK���o˞6�����
��
�k�a�͋��ղ΂:�J ���h����$��8�~��u�H��:���Dn�|V��a
���-�}�;���?i6�(����ZH��Z����6G5�L��"q��o�q"�~�u��
E~[��� �~�I��}s���;|���8��WѠg^UJ�wE)
Z/�U�.����Pe�c��a����8�(J�=�+�i��$��a)_1V�	s�W�J*|��@������7>�T4����,>��qC�23O�`ȖWO R�c�#���0_Rmx�C��j!wϓ�4c��]��)̾��?-����K��'U��<��(�����#�a�w�Ƙk�.ޜQ��h�\��KSxN�� ���US �͕n���!�T���Gu�����T���b2Z"w����GmLE�/�W¿ ���$���c�kI�1�GLջf��8@��r�t1��ek����AZ�I��x�v�2r�#�� B�Ȯ������;���,<�?>D�\z��l�Z@���f��>"2*o���_`H��Z['3�}Ss���5ߋ��|�������Gc�ϵ����Hc
����f�ϑ4��jB��N��q-�<�v:�9ݧ�X��-�醜��C����@�� 4�#��HB9�00;fJy�#%)�ioa<p�y�#��iLt \��v�a�!�ށ*��O���JAWXu�"�"(yp!/N�A�{UA1m�j.C�!#��l9�r�𖻱�)�ZP��T�LG�9
6�H�`9T�2��d>;Q�:3*�]+�'�[��@#9T�-���������byaekc�4�o�Y��Ma&��RB�ĉoHL�]C������� &Gw�Vj�V�b�Xn:�g�!�%����f��0�u,�Q��O
�Ɂ��>CCשcO��?v`�b1itT�FB�*��x�a$���1�•�����͛�O�-
��x�Z��w�:#��<ׅ/L8#�˕YTb-i��ߑ��|A(6��[��Y��0rPG+�,	��`�u6 ]w	E�Y��6aD�!)�6�Ycaf��յo&$�4d�m5�{k��#n���j������7�B��c��4�qh�X�8�ˤ��G��Ȏ��oc.�PTM$.^R'����c�
��OĠ�/܂��!["��mqsD��E�g���wUCױ	���B�^�q��Eb2&�RJI�C�� V0��ݼD�<�F���Q
.���R���b��(��3�SSi�̣1�\[�ӥu���0Q�~)3��Xs'�L7�qQ�~�T�̤�ƹHf�I�[ӹ[���%5]����I���XX�����-��guI�_�J����s����T!�0-&.��Ьx��T7R��rbrV�0Ѩ	z�m��}\��0�\R��g�5s��5V�)�����2��%95ȇůlk%��Q����Y��D-���X��w�>%���8���O�Wz,<�X7*w�0֍HC��t!V~

�5#h�nQ�!�Sd�RFk!�+*�)ă��L��o��L��p�VW�k4f`"�p�πa��AP��S��i_�j�bW�`=�K�/H��39���r�k�U�e���6I��yVϻ�7�
�rҴ#T�TI@U���t�ȕ��^p�t�"R�l�y�F�-=,�rCb��%��4�����2�M�=�T^�}*������aı}�ڱ�ƫ�*�%#@�!NB��.ϵ�=�:��P+�5�B��ӄBC�}HɎ����vD~4>�4*GP4(nsR���΅}	q�N���~�bH��8�f�S�T!:!lҚە�B���;Y!�|����\�nQ�`V�6���4�m��@���x�����^"�ZEC�I֏�@����zz;ۻ��ȝ��÷o-~�ż�pvf3�i&Hb���&"Ze7�m�2A�
��B\7�0v#c��o��U���ayf��Z�LK��B)�j'XH�c����Ŗ�@�<���K�D��j����vUd�K�&���y'�N��]�IY�w:�t�s'��'�)Lg?R}�/��Nr��S�黎}�/>�f��c�+�������!	���M�3螽���X�L
ê����ëH�]7�_������M\���(��)*�1$����~wpM�py��K�ѥd�/&�&�\Rc_*C�T�ѻ>��=��)�+g>�*�-�����o埣	޵��Xڗ#COR;�#Mh#��i�k,Oh�H����*ޣ�;[H��Un4���Q|ת����_�T�y�]ϩ�L��C�]��V앏���S�X8r�fɘC0�苏��w5���e쩆h��u1��@�`�P׽��vԲ/X2Ħ�H!0�-_�~�B�=I�r0��p�cՀ��<�D��;ʾYQ��x��P�Ӡ���Z�CJ!
Ռ�y1�(�bѢ0�?��M���8��������[e1�!#)t�f܄��~����Yռ0-x�[��	ز�v��,�i�bN�>��J��p��\�q�Ҙ�e(��T�FE��� �.�~�y�d�aQ�Uè���X�_���j&��c��2��2?:�R�l$�d���&�������̥.��OP�P̟����&���\��2QH�<D�Ozs�n[�5��6�m�?ѩ�Ӧ���_S��5����zX`���ZAU��:p`�9=0�`��Pgž�?S%hv�q	Y&1o�]��]�3�Y�]G���Ƴ�c��$�[���Ԧo�٨o��N����Z�JCv��rT�~��vE�/�_�������Cz�ڍ�v���~�v�^>���bN�{.�n�b^��sP�0ċD(CX�‰��A2��R�B��!�Y�����.k�ª��ܔti75������K�;wd�b�Ӕ՜4D'䞣����Yw����m�
8��^\��:��[;�qBe����k@?m5������Ì���]�2�y�^=�{p~T�Yž`����5¼#�on�lv�R�/�Bv���S�x����p�D���F��EH��<���\�)�H���
`���50�L	��Z��谥�as��������1��v ���}!�vv�[W�v�LI��gh\�Z�m�"\�'$��+̟�չ�빘�,�"�n���4��|s�j1�߲�a��J��ci`G�%Վ1lD�G��	ƫ_���S9�@�]�)�N��;���&�"w��l�Q�/����Ph5�d>�oW���ܻ/6h=��#z֖�3��ռ�Z�>�n���N��W�H�h�ڼ.F�'̔X��<O��=G�ǨO�p�iR]�Ք�DupK�V^��]5�&�t(Kղ��vv�qz�|�^�,��qg����+IȈ!-��|�!r�TA�=�4eR(�����E����1$��t�S3����"�H���c�;i�g�Yv�$tE�3]2o����J�
�Rޡ�L�
�If���<�Z5/�c�Y��������)԰��?T�ק܀��#�ݽ���J�Y���s����WB��L����*��m�~�@
���۲r�D;�5�^$�c宦����T�[�q*o�2h�}�����?XIy`��-?�U*ݟ��!�a��:)so�E�'�֎#E�]6?A�����k�V$�V#k;��Ў��h}uK]c�M���Mg�9�N���)Q�)j�3b��,6Uh2�YҐ��3�ǏVö2��!��
�^4Ο&���:�vBIn�9lJ�l�F|}�������p�|Q���K��uR���'�t՜n��n[��a��2G�B��pi;�8��gviB�F*�#�n7=Hj��Ѯ�-��z��g�Z����b��v�HLS63W�W5s@!%���6��\���5D���I�����
{!%ےS Ju�U���VK:��K�n��72�|�4��Z����r���I֯��:t���^I�=� �����N�Ѡ�f"=���$�d!0���bP�H��z�Wtz��Su�#��tI����ul?�c`'B���J�f�h�"0HM����N�k��)����w(��w\%�0�&���{b�)���l�`[�
�o�ߞ][o�D�]r�o�z�0��3
N�2��I&�����#���&���Խ��x�
�K��9fс��L>�Z������7$e@6��?" ��b�{���5:[N>�t)��Z-�ZZ����z�Ji{^��.� �6WV�u�傣�3�!i+������G��r����@��O\<h�R�|�"1���;E��*�`ȥ[g���6Ξ��3���t�jQr	��!��~��6c%=E����Q�?�I��%:I���&^
�EVc�P't���Q����R��@mJ�1�<}����z(���M���L��&��S�k1bC������m��~N�8���6ⓗ''"JO���]��y{5�}��^r�ԍ=�Z^	x�9Z�B�T��^��J܅��'�� ><����1:�8�VSIo([�o%��'(�P�d�D�(L��J2�6��<������~dKL2�X�$�qYk4�>1�X�����L�T�Ҥ�
�Uھ(�Q��z��~���KC�#r@�����b��z���<!���ݎ�x�d��I�ZA8cy��n�[MQ
Y���h0��Gka�p)�bK!�����w=��Y�#��ۃ{�di)[&��M;?tU�W��nR��[��^r�}P,R}��.�����zG�Y�^u�<��z[~/�#���:�=y�r]��(U�����0��'>��8p�rk�YM�Awjʔ)ntevn��[�v=k%Xb����b{­��?���ߖ�����m����3�Y��}'2~|8�̎�G
//�N�J�7B�}L���о��8���<���v�3�`��ݛ��0%�0y"�%F�H�*@�+3�xs�=fW�$9A@�Ǿ�0Fa[ʧ�Y-OUJu�"x����\��Uh�4[-�Ze�\L�}v�Ah�va&�JRG��x
̡c1��:B��qgP�Ս�_N�A��i�j%�E|D�	�C�X���˛
�1)��8XvB���0��&eH���N@��߻�Y�`���L������_�h�)gFf�+���B�QI؛�` ?�����=���/�qx�bxVX1o�/��da������FdX	d�G<��f�1���Uڴ�g��f�۟mj���һl*���Y�B�n�q�s����Z�v~|c��73&U����*����9�i�qfH��g뾶����7V��xB)/*��*}=2t(>�cq�ʕ�!5•)�{� YZGX�y��5��	��a�)�7.zN�%�|����������1�&\܆���_�op����zJ����]�1�/�!Oֽ���yF߯#���[<k�R-�4�K��<.�+�
S���-���,>.�����1"�\��$/�aZB+�J71
]����}gR��#|�h��f�ؖi�����%hL�H��ޚ�L��+��Wش��WHա��L����p��r��g��M]#�	C��`�Ӏ�co}4ӣ��^�;��b��Na�
A
����(�O-	�r���-@�G7Pc�Fރu+�N*�2�6.��#�E��NbWD��\
�Ԑ�d ��݇��,`j��E�f�vP ��
R��f����]�$�+���tnׄe4a���˶��xI��<G����n�f�n�-Q��:��}	񳋤�/�\�,��'���h�N⹛L)"M���&	U�L���-�I�4�e�$�D7�T���=̶'^��ݢ�*�,�M�d�z����c���)�/~���_V��ion��	�I�mג�C?=9r�_�Ĉ���bj/5|�n4�]��Z��L��gw���'L�o�8�U��hCi����v�/Teۊ�m��+,/��~����yr��H亸?�a�0�4[����
B<N��zC_1Q"�.>��c�IY)�p�8`Ql���Lr�"4��0j�L��c�6���'P�Z]��$(V=8m͔O�.l���bz<���|o��6��W�J���������w�p�c_+���3���'���Z5������zh2���-��k�
]O��/�����l�G��ͯ�2�.w���v!�����Mh���J+�8'�,Ol'K~�n��SS�#5�o�i�A��0��h������b�h�&qbV�id����u)�.���u�܎���qz��WI�XhT8��̶�:�t�Зh���D��oK����s��w�O��*&�C��S�'+a�반�<]�8��M����B*9;YfOJŌ�Q��5S�e�˽j��?�r�HV ¥&�����!"����J��x�-�+��\�=���rH����
��v��ٹ5�f��d�9S��[��N�_錨�E(��1Ŕm�8�N���~3{:��h�~d��cX�^&Vo1�w$�ɠ��(,�0O>���.`W�%�l���c�7����R�g*�f�)�=&�lFb�X���>c�bn�]z��|XYE�o���d�ߐ#w+�,��D��/W8��t��Qiy"���[ݦ�M�\�N�8��� �9~=��p]/�DQ��[��_7�hp�t3W��n�Ъ��j�VK8y�e*`��O��v�%ɣ}�Q��#�t٣���_�!E���
6�h�gm�ƈ)B��RD-�Q���?��Ov�J���+Ȗ�n�(���{�-�<����f���[R¥Z�g�
�t�HI��G��P�!r�8Y1�Sұ���#Xmv쟞(XA{�6��bp�pTv8|�g⚨�s�0��)psx�p��[�$���%�P\�"��$Ĉ蕆8Rw`�V"��#��m��W��<ti�����9���N-� ��Y͝�Q��[X���\�c5)��v��l�����8�T���F0��E�"�N�C@�O�uf�X�0�|2���5:e��Rm�w�@�1I�1��Eg�r'��M�B=&����n~ύ��p6Yn�b)����'n�%�:c����Ԉ4�I�Z"�^��<�3��|��k�PW⺲d_�f���@JOH�����[����CD�!�S�_�r`��F����k��}H���b������T[�B--+5x��L��ivZ�_�߬�b��(�@�y�oZ&��L����������ڧ~�96��m�=��K�tF�f�Y�Ze�7��,Q�ߧe�%��I�k9
f\�Ak��@��k�e2����)Q$c|��dK�W�Q����d�x�zDM�)�b�R<"���
(����.CǁBn�BGɓ��kJ������h�� �ײ;�
�#=Oݫl��P�>s�fߒm��r;��J2�My��;��#�*�`T�=	�8�Z�����!�6�f=����Hд��
�h��"�K��;�+��f�q����m��.�e8j�q!��@b�
ϥXS䳞��ⶩbv6s����'t�)�ŴŦ�tW�����osi���s��T����'�5�F��+0Rx�9J՞�qn�@]��y"�x�<�¾f�^��+�I���������{�����f[�B�e&O�X��$�":�Ֆ�>`M�n���e�s�MH��<F�:g�Gx�|#9�^��ȉ%�G]�:�]0�/��v��
���~\��$c�8CF����WkZ���y&3���=��QN1������v<���X�z&�����&���g��í��թ5�@u2Q�3=���^z?�6et�e��go���$�."��L�i���.�V�~���T��&`s��vI�+��l���bV��UҪ��2�6"0Q�3YE
T(l}��/bv����ϣ���
'��`�7�D���F�-��N(�[��:]GH���F;-(>�'q�g"�97�T��
�U�؋l�Nm��'��퐬�]�3�tJ�	��;Ts_��c�;��4�0��A3���X�C�q��nc�d�N���	8�UQ�b`J[nU��}�1��c�9޷�n~�0��>�JQ��쇉WI�g�r��ѯ���UL-�$�a�|�dTG`|�G�P7�����ά�����ҳ�����;��(nO�����eZ�.�kM���U��&�yI!&�w��H����=]4�z$@��E�žO�*�Qݽw� �9��"
vm�����(V�Ó<G�3a1*=6���?[��4�Tg��&���.���B��E}4@Ƙe'cDѐ��0vf����%2� �dFkJ~D�
lEs�hK���
A�&U���'Bx����T�1�z��gs�te��lԴI4e�D�e�֒��pOy�1���1�;�@�r���q�.2|~q����9kZN�J�ZI�w1J�@�'h>XfE|!p����N;2�u��1����LWa1�sV�)�$���&�}	p���h?8Ǖ��b�F	h������1�*����q�ǽc$Eet�`7�`a�aoOoù�<���g��;GmIφܝ�������Ȋ1DvY��37%�˴hÐ.YbE`(c��2�AnLz�肗�Z7��׺�UKq>���5r�1������Od1�ʀ˹�2r$�����ri�N2�ɬ|��@�U��#
,)O��U��-X/"͢���3֬�L1���kV3m4ʹ�8� Qi<ul�u��Ñ���A��˕4�9����oNj+�	Q�7�ML=�8���4��ϸ�j�*���������W�n�	�
+������)Q��F&����(��v�W�8ފ5V��Y/6Y����i^�߽VI�2U.y���D��6�|���	O6v.��WO�_y��rj�J�e���	�{�쇟����c��֢�C�7v�(��K�#�y�x�z|f�k9*VHM�6�lS�)bJ�4>n�;j�E��Ov�4�#��զ�H\UGj�V�gЖ��b����G�A��B;\���!�:&-A�k=�<�{��0h'
QF����ʻaQ
;��c�o_�Ӷ���BLp�]�Ƙ�[3�	~G���!o��k<�-x�ҵ!�dKI[�%;;����q�����K��s㈀������A嵳�kM׊�I�	mkR�(-�5�e�a@��[>�g,_�s�OH��S_�0n~59���ƿ\u�}�:��\�zN��a��P��}��F��֑a������/���{�@�\]�=�1a�s-��fuhq��BmL$ӂZߏ�k�U2���2���
u�ׅ[��\t�ɘX�
5G�q�T@m�.������(�g�;c�C�ߔ�{_�:��/
�������~E?�~cf�N�_mj���
�Au����v�4d����j�1 C��<���'
rf<�������:M�B��"�{<�c&K�"�!���s��XV�Ĝ
^T�d��ҕ�k�,�!���Òxپ�F���_���/�i�/t�
��f���j}���(U&�m.�b0�G���R��ւx!�Z��^Ho��ң[�1�I>r�hX��$0���Z��.��M6ů9�^^*�Jͭld�<6-�>O�m��+����d}���4���XJ\�1'�hU��U�^ڲ���wLe���V9���z.y�4����Q�ZrF�ւ�sy�.���*)H����u��(Qe^�Őҏ�t�9��1y\��J'�ęs�o
0�$��]�e���-#�
v�(��!��HR3���C���X�?M,L��e���\�=q�7r��lլ�����\@�J�8�Q��0w�Aj�����(�:
	JK�65s��ӿu�ֺ��S��ّ�T�
���gl��n�g���{�*��;�5���U�e�Na�8�|�%�':��#
�����n�a�A��jR��:�PV5V\��E
?X��1��3��O:�ğ:'�U��|�*.�	�#7����ilV�%�iב��8qa��n�]3I_� �����¼A�N�
`��ALq���+ioD���3c��T2wx��(RCeV[\B_��4_�%�U�
�2���dBVy_&8��E!P�`h*~�LQ��.���I�s����sیpM�Z�㌣�!X^��\x><<6�+�]�,Ϝ<`8#�x�3�O�uy�0�l�J�n	A>��~�0tN���0C���@���OGv��u�1�43��9�}���ހxE&�/����>G�Z5����w��#��;�� �����m�Iiu����o��ljn%����iݐ�e"b����k3��.������(�M��[!=!��&����[�v̄y������c��աm�*e��D���kF+�G��[��H��^��KU�7��*��a9�����"���`r��܍]tkl��a�@�Äռ(�
�#�'�0H�.LY�;bJ�O�������`�U�l֞�:��PW��I�]�ٳP����:�~�F�縕�0\�[�P�_������v&�]�tG� &S�����V�`H���� �ivE�]2�be,��{O��\�Ϯ�,���_�����TMq��<���(��>����ٿ?�.�5�H�����͙n�3?C.��t�D��S��"U��v	�\-��{�1>�^�NUH	G��]�y�Z@����C���I�ͫ5x��'�r�g���-h�d	C���6,C�������q���)({+ي�8�S��p`%�ZƓ�V�)M�F"��O'�M.,����7�����.�]��W@O�D��!�r���kSK����:@��nIt���v����y\�t�A�FojP�US����9A��h����X���ٙN����o��Q�5�G�N��T=(��:�z�wϞ~�-���ZX;M*��kGM
����=�4�o�)����*�����f�t�>b��I��n����r&��3Nw�f��H�$,w�F`/��*VI#tه�M�4��Z�t�z�������#G%��K�:M}�s�<����5p�X��B�C@�N��`�:s�z�$�a���]c�Aȧ2��=��,���`,�C_��BO[�GL�M0T�+:�&
����3�p�p����T+���e�~n�, �/7s��#��n'�<��,�K��ɺs��7,�-�7�F/���#fwR�D-�3]�e�B~��;ϔ�skp��pg���2�r��[�R�(�w	��:�$��'L��CE��O�3�i��/d��uL�R|Ҕ�c��~�G�s����^3p�]x�n�M�%����ɳ��}�P�O��̷C��?4�0���/H� �O��m����K�:�5X�*KE0oܼ�C�wI!�f]�j��'H��L�uS��)I�s�]k�U�8��]e�3XS@Q�5~�HBpv���$�-�6�.�C�/�"�iD�S%&Bn]�QV��ܢ���WO���G�	��������s�z���r]#�����"���6�V{
�%2��-&#]$���/Dl9[�&���=�صL!݌�wRGZ%a�Љ�C7V�Ϟ�89E=�$rJjLI�c��v8��0���z\lgI���.�	�q�ؔ�>�m���-�ahC3
�k��(�NQr82���B�������g�h}�v�P��r=�}u��Vq�?��^�{��2�G9��[(,�#��q{�C�B�W�]$T�~���c��+%������婀�fh-��d�(��6Տ�3��<�e�G�3Gp;�r�
�CL�P�?�pچ%wp��;��;�y�����Lgnl�g��s�f֨I�z�Z��=��;�p��IvU�㥤z��g$6}���R�6�:�ܧ�%k:H(�|vNOy�֕}��u�3�L�A��L�AI�����-R�*��˜�ywT=�%2G��Bhx�MP��ܗ`-(+zN���Ӭ��mD�)а����6sD��$��E����UB��Z�P,ޜw�Gd��!<�\�5?{ea���EL߹yn(��C�9/��'%�tb�ҡ4$��I��w��d.G`�"�F���1R�%旛�2�u7��J�C��u�)m
�0��5`�'�ߙ���6�f_����,Z�@sf ,Cl{�e��b](�5�46���JuU��l������9�d ;.q,������%��g=1���� c$���nE�}�j�g��v�/S�aY��T�!"b��\�6l�s�؏�`��|��lV�1�(��pi�hsE��s��Ǹxbb�}�j!��@��6�б��-{��
�]����T�/A���U��{5�����ˆW��	B�,��	6_:�5�k�U��fJ1��2�$�0��	A���
ߴ�W(W-C���X����Q�~�����V:�x3Q�H����{y#����O�nj�`����Z39C��VD��\z�0d�2��U��v��!��;
kk�1�7��%Dے4���F����{@(�$�K@v?�X"Ȑ�"1�E2>���o$���&c�y��$��C������s�2J5s��H]�߀􄠷4���6ރ���	�5�:u�@6v8�U�?�R=�o��x����t=F�ΐZp��1$T��>޲��2�w;R�u����+k?kHO�lMy\*A�0��O��y�L
K����2�_��s̙�4V3�Ul^I�ҡ�㥺�:Y�r [��i����/WU׳ߜ�U�J���-ٟ�Et�=+��~.UE	b,ϣϊ(i��T>&�b&��jn�+��bBAD����K%�(P=����"8�b���T�"\�q��&��J�F�}�d�WOͨ�ST�dV9�U�� �~�5֒�!5�gҬ��=��Re�ݸ���
���#��4N�e5_�JI�1�M��^\ ��ؿ^����D�n�)[}˭03t�M~�Ur�5�r;Ƕ孚N�1As&CbрoHCt<�'�v��>CA��,�~,MQ;�j�I���h1\���?9ҩ.jɕ+1�H�t�89�B4�U���ٰa�`���������m�:���K��2���������WM��O������m>#W3\bf���m��qEɣaWg,1��≱�
�g�:��c��a�1D��/��a5�gu�9��Õ��*¡�����)E;	~��r'Bt���ղ=|_[��ҕ�-�\� ��{�K"?TP-�q�2-܁ڃf�F�y�Կ��O���w��M��L��g�J��?IP�'t���ue��u'3 �0n���u=ā�Z��������L�}��]�3J�)J^��� ���M�u�M}fAJ�5dy�6��[�!�Wj_t#�� ^j�I�r$K��ձ]��bnN&��:�@PXA\��d %������:[L/�R��N���QO@�0����&F��Ǵ��/�m�B̖1eKU�� �$�L�~뽝�o�4i8L��ݔ�K��-t/���E0j�|s�<��9����<ɞ������jVİ
�5C��)U�	��jO�nfE��=�6z�r$Z����<�z�t���Y�S:��\�/���������<���_|Gi
��7�U&��: M�"�m���%�V���4u�}�6���`	��ǭ��]jY�k�է���
�6'�3v����5)
���
FzS��'F�7SQT�8g(�5���F�b�O�Ҳ�5~�nz�80WL^R��u�D�[����/��i��J�)�V����R�ulPa��0	w1p��U�^�w�c�� �V�pxO�m0��ͻ�����Za�.Zi�
��V���!��LT��l7�Cى�4���C�~dZQi���*�N@f�y�{��D7\skRtJ��.��>S@�
���08�u)�ϰ��ra�:"��x?�fn�Jm�L�f��
�l���������n�1��}d�庋�8��J����٧�s�P�e�g9��$���h���Jz8.}�dg���js�B?���r`��<�t]��H�����YWx�
����Z�m��~��v�a,#��3�m�.�<��U�Ȱ�qA�lC��i���ڦe֣4�k?܇��§��M�r�;�$��
f���f�I�缾�ժ�X�5�(�g���5mU}��	���T7�GkƘ�㙃q-�8��nZ%U��M���U
������Q=B"�,�u`����U��{\cV	�u�
W7ɘ��x�0�2��{���uWe"�萎ҷy�۴��M�jp	�	�Ȍ]�dLV�~Q��LB~~�=#2����|���~���|������$g�Z�}(j��W�G�GxWJ�̐wf����f�-y{�56HO�2_VÝ�)5T��2��"-�
�j�Χ�Θ��=l�S������yv��_�Zl��:��OW���빜[��@%4F�V��G�q����aݮ���?����sz��Qm2���q��\�)�:l���}Q
�?��J]u��!�K��d�<�0P��榎���4&)Ğ���̠�+ѸY�yL��Z��F$�eZ(��i.��vIZ��"��m/?;77-3�S���!Iƈ7�
��SX�uD�;���uy׎u����)%�Ҥ2�r�X�Y+`�$F�9�u<�Gk�/r����$G������L��iA�5pX�H19��P\�ct#�.�<���83lD��ki��,��`j�@��+Cv	iT���&�����XL�I�hX5xoψA͋k�
q�?��3FV�{�\̐�B�Y��b�yVö�G���Dd{��k���EÖ�`��~C��f�a�S�գS猗3�+>E�:`6�b<���U�zκ)QD()fI�$�E���1�nb��V�r���%��D$2��S��<�3Em�ؿ~l��댎��?V��=t��O]�vN$��B��]�NL�g���sp�G�Uk�о;gX��5�0�--��EGy�I�ٰto�I/�Avk:A�
U�!j��yjӑP'Q��E����Q��t?���X�z.R
��kJ�����i\k�C�Q4rF���N�AMl�J��^����f@��ƚ��g)1J�aM��6�[b����D���`R����7?>[KU���T��w�e}+N�*��-G��9���w�)_���J�������h
+ɋ(4l�r��}5�A�(V��l����B��j���L��n�N��[�dq��>��Mb �Ey;͘�=��D�;����9Ty.dXgu�x45����JL\GR�rL7eT�'����R��Qͭ�/������1weas�K�b�"X�J�i�m]'v��H*�T^J��_��)�s�ܷ�\rݲlaC8��-�4�dX�_8
�1�X2g����+�R�}�!I]�??���ç���`]����3/���φ�^&K�����U��,]��;�lw/�ۍ���9݌ù'��{a�[i�2��ϳ�?��J�4��b��F,�T�ڧ��#�-�蔒�Lc���jWĘt2�g'ݴS��v�������ޕ=��'$���>��N�U^-�ʗ�n��Kd��������պ�g��Hk.|�z��w��Y<��H��9٬E�J�$�K����.�X�W=�Y\�[9������V�5�$qؓ?8�y�l`�-���H�T����2yqR�V7`��<�Pڊ׎_܁`��W�6𦐣�>k��������4�D���N�X��'��k��φ�K��F�|��y�7�d���,�3��K&�v�v�z�1�Ak種��?�����&zl�Y87f�v
�c��D��&]�C砷%g��s}��p�T��{X�ή��!
�H�Ϟu
JDy�)_(1�27m�Ϸ�U.ʣ)>ڼ�P�suح*��ߜt��~��k����b�h�5��f�~R̦�6�s|9�
|D��j{�U�{@�dp\b�"O���L)U'��c�yWۥH
��e�\�Ċ�WD%R��*����,2r�cƓ���A�,'�
��	c-�S�%�?�*�.���ڦ&�hہ����.
\��s�eF���aa�4�����'��ۑ$�bq�%Ez�H%C����T灘�6�u{A_��nM?�/Z�WV:V�e�&ͮ:Ѿ���ەX��|Dz���
qֶF��� �0:@�aE���h�����i)�4��S3��3����2�A~?#_K�8�>��_������-�-#5r�P��P��J	HL������Mr�b�"����0�H���@�M�c}�!��:�Δp=?ڙ�5%T��>��O��i��h�Z�s�G38P��ͯ3/�΃�Z�s��BlRڶi3�Q��f���Ю�To��QS���J���s�`#�J���gNQ����:|ȶM�B�UK�v��>f1M��]��
6|�v��Zk��y�w�ч�%!���x�w�/�����DSD�(��%L;�8�N!�GX&��D�f�kq���&�׬*�.��aF��9m:ф�uv�j0sS����s��L~0}CbR7$��&Œ�~��A���!�#�Ɯ�_LQˎE�RH:�\�;4�Tmk��n���<;�E�`�w�T�_Y�
�ޕ��o~y��8�f��tdUw�/�AKs6r�?��j��Y���Q�s]	�Rz(9�
�^�`^Fە+�6u@�\-�C�%�광�uD��Ӊ��a	bt%v�9ȪH֥d�7N�r6K��e��o	u�߯�cSh�Y�����dn��L�ߍ�\p'7�?��ϴ-��OK��5̲�܋Eɥ�(�Y�/j��¡��I��M��/��<Qg���K�匣��8gqqVY�L����h�-�Z41yct�¹��k㱛��)�ސ [+Ⱦ���%	O*8O��P���n^����HS�; =�7m�6]I�{
x�o��#�9�署��Ϙ.J��cdFA��q@U4��N��03*��;L���)dN�*RD�eDm�I<�:����=As9����r���d��Q������_�Sᕸ-^�V8wI�`nAw�4Pٌ*����ZVm)"5�&-�(i���u0�d�zS����	FBq����H�v��5����}cz�,���«��۬�J���L_%Eg�=̛����\|�
�\;BL󪌅��g@)f�my��V͔�k�:�u��V���Mrf�Qf�O�~q�/��s���&�^��x`8�
���#��9V�{�ư��p�
��j�����4W��ea~Q��܎�����G�o9��y�A����@;�AS�p�UgY��׈�2��u��tD-2B�V�^7���A_��2�I��<BebG�c*��?���z_˙�

ߌ�G���{������Q
IJ��[�L"=��!C����_�t{z��ۚ����t±������7u�9��
�t������'T_v%s�YG,���|d6ڦZ�?1P�(H�������a��r�U�fM�N��2+���-�i��J�w��X�މТS��nh����� ��hÉ�lM5i%�)���׉hAC��V	�u"��ʬ����2�n(/,^�.	�\��m��F��ji��¤�Ye/�8��C�뵾��f��i�ƒb�I���ܐ����m@Eo�xGT��iUͽ&&�e��V6~��$�T�9:lm�Osb4�+1����x��7�<�mx�J}�ȑC,e�w��'-��ŐEQ!��M��x�[�J&��P���j4@&t:���\�S�Ev�u�.khp�3��+i�_���)�8�0�$
��i(a�a/�h�+���LLU�7��DH�Dd�K �����!n(M�g:s��Yl�.V5~�@'��hC~sq&r�
�coI�Qb�R������g�-��H����E�4B�
�Pd�jb,�CȨ
��dF���POG020�L7q��B�dI��%/1�DDؠ�F��P�J"jc���t��4�@L;0h��/n�Q�iԶ�K!�xs,LJ�~%ti�F�GP�*cɥ�B�4ThHNF*S�Qm�CH��Ĝ,�y��rT�J�gݜ��w�]���W��r�?�sQ�"w�T��n�cQ:H��T�?-�X�Zl`�U/_�����%I�ʖC/i8'���@9��.ؒ
<��ηrVS�f�WD
�!����l��˗����N�Ƥ!}Ծ�s�BHc*�"4%��^Q8�%'����cý�0��ˤ�?鏻U�͹�yH��.@�y��چ���#�qU#"�k1*=�,�f�H@a2�Hxa4`Κ .����R�,���J,�R�K�����[��A������2�iz��D+A"�Z��h�*�@ם����]t��#h��ʽ	.!�]�X�iS�5�G�&�ĸ����b�T���V��[�Nm���*b�H��oԎ"uq`�=k3�c�KF��iIO���<�V}���! �I%�����؋�����$�5�I�k�?�HkYY0	���bf�)O��v#�%
@����h�c�FQ*ϰ�=ox�j֎��i!�a��K�Η�BNK�&-�I�ڳ�V�t��H�ʃz��4i�6���Tq[&42Ҽ���#��*��e��W����-L#�p�kDxJW����\�M�G�Z.ho��w��yENf:|6�q��M�Bޏh8d3<5DX�f�%0c��;#C�DWw{goO�:$�4���o�G�i%0��q<B��{��3Rs�Z��)��'�.#��Y[���j�b��ѭ�P�i��W�����؁��ؿP��cљ)D_Z(+^���v�
�\&�3�t��u�3ʢv��+�M��-'۪Ό���)�V!=_��c��L�@���L�r.�jӕ���g%.8:�k����
�c��`��`r������Dzs6���Y����4�������}4>K�&��������晖2C+�x�{.>��kK`6�'�!AґQf�r����>���Iʧ�BaСB�K�Z]��<���z�w��e�b�m�>M����N��0S\̊�E����+>0��/t�̅I���n4���{�b�ӦNX5#�rܼ�w��߬<�J��4��+4jm$2ڀbi?@��x9�sC�⢱�sf�Td��V@�nL��
Y�6��v��6%;O�Z�Q��0�a�D0G|�P���o=|=:���#�вj��0K
�ଟf��
�_�8�t�� `�H�A��P���6��#�>x���f0�� ��8⹈!ȕ��J5��Ɋ�J0à;�U2(4ce�S���q�\��0"�e��A`i��/W��������6���2Mpb_��Tw(9�ܺԽX�mV�
�k��PII�&{�J�	jkI\\���Գ�/Ru���/�����l�,��y�N�v�2ؿ�U�U
�3I%8��O��5x��&�)Pc^��|Bµ(�ӫ'^�ü
�!���>C�������Ob]�d."Ϫ�����,*�6:��ho�I�J
N=a���Я��6&�ty�l��r���c�LG���eh�"�ۛ���K�W��<V�Z8�b>��'$����VO2{�8��� ���ߖ���=|��v��� K_��@��Z.}I���7�5�ZrJ~�lW�Ӊ7��TXr�����f�~�[�\� 9����^kk�Tɘ����~́K��\��A/�
v�^5�'���w��ep�$Q�j47]<��dEEʞY��?a�w)�ME���<G����Քp%���%šڥ�Ow�N&Ol��J�@5-THj�c��8�=M�؄{3n��Ռ���r��
���j��ǝF�^��,oNCc�QR-�n&�.{�Ћ�l;q�-i���L!�A�\�N��6�a��4w��+���S����Q'�����`uǶ^�r'S�3��ѱ���c�EЧ|��M�
�r�����į6�R���94�_ h��q�U�4��iq�J�Ƣ�x�ރ��)�pyB�B|��w퓓��Z\RT��:�ˢ�(�ŏ����n�9�L	���r�]�抙}�x�#x~o20xֳ5��,�_G�Q��};��|/2��<�Ŧb����,MQ���)H�+>�I����"�Eb��'��x�1��x!k_����,V��h���_1���Y�Y�ԯP���!����I����ijߨԓ���,eD�us��=G(�.�-z��b����\�AH<WF���)q'Q@t�ނ lZzB���F[	�9k�,���8J�����Xy����l�� �Ɗ"�Ub��J�8�,N.^E̔c�`�:���'h6,���44�
bw�t��
�����tm���Qǹ�ifM���uN���S��4���-].:h�3p!��Z&�<�^z�\#v��C�5�m?<PSk�2�ǚ��6ަ����9�#�'���4�<ZĔ�M+�a�nɆGM�Ҩa�S����9���ƣ�Gf��c�R��S�ANh�Ps�}?Q�XP��a�.?"����*Z�=�Y�c�<3�S����E�/1qŐ]��x����2�cI����n��@L���|��gr���g�Yԛ��>�"��� ��ε ��k7c4�U�5<����Ru��z�Vm#�Ӹ&OmD�J�A�z��*��%�Y�Q�2�_�V'iF|?�{`�_ݾ�(�3��@!
���v�
�0ߒ�G�-������n����|W�f�fU�g��y�i�ط���B��
�S�_��I{r��8�E�űc�B��Lj��e�X�1u���l�i%�k����V4�۩74��\Fj�
�<Q=CW��4	~ޤZ��~�.}^�-�/q0Ȣ�Z^X�C�Re��}e(���j�0�ف†������)({��_������h5AP�x���F)p9��9--��4gͅ#m�F�y��%��5��+'d����ٜ��\�3���_��wy�I�LJQ9���F4	��^)����g?I�η�[b�?j4��h"�\1�����-i���b������&�y_qu��8�K������|�w����g������Pm
Yf�H����(Ҭ��1��G�U�'��{�$������eq��1��~�B��;]�Ж��÷e��������p{��E�����AKى��J�����#�5�M�Eo�Zٓ��{�)���wc�z��ݏ����@$�F��D��X���c�? 52m1�11�8�«��J�0��H�7���boKn�C>9)�@FBz�o�y�\t�P�4�(0)���H��������ijSp�śユ��>�QUOu�"�����
Q��w�D?�wuͧ9Bme#�Xe49��aW�	; q�A��t��NE�J���v6�q�+#��J6u�&o�7����s�?J��j_E��aY��e����,�E2���0��Z/�d��8��l�O�E�J.M(a�t��
�Q�f�w�ʓ��)��N�@�c����V3U�u�va?���6;�`�-�k�wj!g��w�'& �[k��<T%���)�|���.�7�Ʋ����\Ir�6)@:����I������N{mm�_��H՜�Y/�:��Ib���$T7��ȁ3��X��T��MD�����2�&��$g�Ƅr���r���S�)�,sP�֡hnZ��
�4�N��e?N4�����D�p]�G���CT�WÎ	]�VAyL�����go7���kQ�y�eF�d��)"h>�[��i�a�+y�V��0��_��FA��q�	�bf��3J�t���Ł�nk^ ���0�[Uֱz��X\"�~�������w�kZ
�"��a �~�NV�G2�++<�r��ښ�-*[u�Ԍ��U�u��?�^�Zk��q�ZS����)_�	]	y���ݖ��&�,��a@�e�0[2��S���7�I!�'g
{TفFlX��B	%+�i��ۣ1��Z���Č޾=N���@��&cST���96���Y��SO�sh��ضa]���F�g��͜�W��K9�l���DY�f�K����=����=��j(O�̻������+9�Ʀ�+%���i#~��\��ء��Dy*I�������l��J���0`��1��!6�"�P؈-��N�|�L!5?)�3V
���Am��$�MFIc�>�X�$w:�GA*��k�k��kd⡿�;�
D	Qo�Hb\Le#nX|���R�#�KU�k���g;i�Z������~p�:�y�#	��hl��ع�Ƶi�Gm�۷�]�^�Lj�Ƒ�r����-p���>���f�y� �Pbb(��/�d@	�]W����݃ø;�kG��}t�{g�][����x��}^�K�':��娵}iY���4��7�KEx�?)����h��F�BpFA�
�!�V �a#hC��M.�EMO!]�ʅ؂���;��S�W�…;��`勺�~��e7,Z�ک�Svgg�kިR�p(�Ⱥ�7��І�b��HJ2��������B��J�U8��Sa���,^�^Y���
SSq6\�N\�ܼ�ٙ�U\^[uxʒ��R(�|�؍ׂ��ZO�YR)���Ö뱤ҳ��e�V���xctXY�a�2k���vl<� 'D
b��q|+>�,��&,���Y���n��uf�|ʸ���IcᎺȤ�m�.���
�n56{
<��t�P��M��f?���O�=e���'�\���=>W({=�id������W`3BRm�U���%/q0��Ԗ�c
��
mLi�c��p��|x��%'��?�±9\��n(��N=#�U�ݺb�*�@��(���q�!�}�T����*�M��_6�/���;�-�	��~�uA��^	u�1Ż'��;��Љ~����qo���.L�*!��`}��y��:�k,M�%'�%`'��fM��l��L��HCb?�6��mf��
�4�L���	)�AM��K��t���V�w�(����a�[>�Yr���V�ӛ"]�E��4�H�{qH��e��s�;���A�"����1v�*lP����^엜�8���	Zѩ��F���*�S���˼yW��0o�͗��.ԠITP�~��D���>�LE�`�O����'i���1�إK�^���a���ôS+���[�G|����gτ3T���$P�J�g��C�h>e�O=����*2�$���"̋*H� ����F���*u�:����R%TDDY7���9�YT����n���{��}�d��
A!>v�]O�P�i�n�P{��v�^��R��.��#u���y�
�|���)��B�{�KW�|�# �5)�?8\S�K~���G�c����#��'�?���N�/X�ɇ���2�7�A l�Z<���2|�N�OPKpM1ؙط`��/�� ��F$�iC$Z�^�gX�����x� 76.��f}��p��ˑ�/��q����5ڞI~�˿퀱�DKh_��N��(�=�APMOJ����,��L��L�:�Tr��,��'F�/�묄"߸�-��#���V�=Q�}T�^��R��[���8����Xv�0:2�Ԡ{ˌq�MRM'-�~�c�<cҿa6p��6-m3��:��
~ʨq���;��y5��dp6�!!���㔜a���c#C~j���I��xd���M�1uj��P�:�1��8E�f��JkJ���ϫ&���47��XUhb"�6���f{�h�Q�#�����@�ͦ[?b@<�0�п�6�a���
��:|q� hڝ�>t���l;�35:��V�tl�%�x1�6,��u�����c��Fz�&�{?�@W77j���4�g��<hZ7�KÔ��Z2�j�=ϏZX�S��O�0n��8�2"w��ȓ�'Z4�-nէN��6�
c[�
�,�N�jf���3�{��uA�2i�Bg:��!#�g~�ߕ��o�L|+Õu�fh�9^d�#G��;޿f�^�/���>`�f�)m�`I�����c���4�D�v�Qĕo���E_d�?���$7����O)1
B�H@�l��������"23#�x�>��TQA�o%�'�I�q�{�!@
��昔�C�)��d�Ѽ{�K+)09s�t�aE��]���hUA�E��_b����tf����48l
p�?C���kC5s��;A/)V�)���a���^��t�R�'��%�Nt�Jn�0����-������3���'V<�$�n��:2{���b�5x17��N1�u1���iR|RT3�样���2�is,���n͢�H7�w|�N�a������
G�d��B&��m8g�e�}}T�8�otӲH�RcV�W�Wq��~�O�m{�-.�����#1ɂ-d��	���Ơ�?.�׽��=��(
ٞ��t���E���6�'9�
�i������0òB[�Y�F��CFI2�
��VV�C�Y�s����K>��7{���2X`Xg-N�l�:�h>̨orr8�Bm8���ah1����Ga�0^v@�tL��x�5���B�k��~5Jbs!�_�^�疃�ed
�^�Sb�|��'���6^v����,����=�z��{7�.75h��w�,���n�:�L�@˹��=$��DS!�-�~�]1�&賱br� ��±x��.Lɼ|u�:u���a�bT����V�KJ�6��`��T�������ܣn��k�V���W�j�ܥo�6�C����{���	���@�m�!�;-�����Wq�q�<2F�����p:ʶي!�Ĕ��Ƹ�9�՘�Sh�A]U+����@}B�EѤ�٧�6Y���+�Ѣ�~�6��	b��1��Y�l��M�cs�f�m�`I-T򏂂�}y ����7�|�O>��K��ֵC?�Q~z���>󏃄�)�k��N�ݩb�@4�E�\K�,I�b����2`���(!E�h*��U�9Hi���^���.� �}h'H��*h-j��i�!�a�����~,�E�>m�i�1�4�]��� p�6[*��,;Y*'���r�I�,�m˖���P�1Ta�Ė8/Y`�f��>lN���&��#�d�dü��])�>|��y4Z|1"��mnj򪔹6y/8�}[�}��W�כH��uyy�o �oM�ī�ח��_��;�k��K�{]yy�
�?V��	�ڧ
eD�d�
�Ζ�i��ءO�qnJ�C��6R�ʤ���h�����[����Y�Rs��8���7�[���#g3h���dh~�1\	=�@}��wB�7���,�|?/��x��H�*4��"��(t��5��yF�H�
 ��L혘G��OQ3��1� S�H	�y��G11�Z���+�|�+ؾ��y#\��m�)�VWQn���ܑ-܈���5�K��j=2}b�^ֳ�ܖ�v�	q��T��:aʔ���V�FS�7L����e��飬�]�_��$���xϾְ�z���o�g˞=-��
�&�x��Bn�$-M�\O���^Ih
	Z��÷!�s�p�cn�{���zo;�\B��ฑ|9��L���$$E60�2�)�����4G�FޚNh#(n<.��9�wS��&4�m[�h�?��Q׌ޘ�P���֚`0`�?O��N�b���E��(�50�
؜����	&/��&�̞j8h� ��ή[�$h�ʭnԜ���.!ßH=�3b�f�u�~��W�QϬ�o�&(o����+W�����M����g�<����^���l����Yq�������P���M�e֝ ���C�p�Sp|]��5�=��ѐ���XXi8�}���u��'t���%��c&���T^^�}��Jo��
��7�ֆ��q��Z�X���y�ϕF��}�n�j�N���/}�̃�r���9&�y�Úg�����%�%���@��Qҹ��l�r�Y_sӣh�2��8r�5�L��^�h��|���fT����c2�{���2�c��d�!�6,'�Q{� a�ø{kh�>��4NQ8��&���zS�X�� �(�W�����t��[K�J��Y�R_��+{!+e�1��-I�.Rr�Y��r*+�4X��F�jIi���g�{�>�@��D�*�LN���K��I��o��7��[��hWr��ks���P�(|���Q<}�C�:��	
�(F;Y�Y}��9��"w�Qx� ��
��
D�䜕ec�=pVVV*�Ό���Gwy�2Jx��G둊�H��’A=�,�]�D�jRb�o��T��(����l��D�Cy2�
8�Ů*!�n~bްV;�_ռa�͟Hj�ۮ�H:}�N��釛N[��s�,S��n��>�������Y�O������8�f�dMpj���%wș��J`D`��n:�
m�:�0��P�ް�|R�G��t�wkKRKc��ʔ;�?�r�0F���iu_��Vw�>�s2c?)13��Ҷ��˗�� �o�[Rl$�Պ'��s���;��n��{�����W���X�v;쇏�
|�X������R��*�⌗���clJ�Oa�u�G�~����J����
��ʆ�)�Ţ'ԫ�� פ���ۅ���o4�WDa
]ND1����h�VB����)�Z~����q�u�h^�C��Ɔs�
�L�QȘ��k�t��hTT~�	T8D5��d��̘�?Q�m|����}��ӫ����xqvL>7�|��8R��
��Gc��O^��=$�3�����rgn��&�	��n���L�s/>6973���>1�����!���{=7�l�\
�^�_|3��I�9�=�Y{{ng��x4��Z���m�4�Aq���m�ԩnAwn.=Oܩ<�Ĝ4(�#�*w�<<�WO�+/c�ܬ��Z�P��<@)/�#�X�K7 
)��1����b�k=�'�P��n��e��:��ȑr+M|U�m2�N�f�q~FN�Ĭ{��ml���'iU���b�¿'��$�eO����2�%�Qzo��Dd�G2#��
���v�̂�%���,�ܜ"�{����A3ם%�Fـ�TUt�-I�n7��*�4Æ�Re�2�(p6�u*�6{N3�V*�m�����Ҙ6���#Y�9��WQl���N'x�7(�-96�F�1(䔃p�/z��I�0`T˕��K6(qt�D��.�#?�q�껣�J6��2*�&�'	ǚ7d�-���@�r����/�DQs����|�@�1��}f1�Y���%:����I^�c�#�{jz�n�'~U�"#l��L !����s��ת8
v�骗&�HL�d&듑���+<�-����`>�f_�[�F��}�+�4V����}�w;�.n6�fF��zX6.5$\��ń�a���O;Nbg��z,�"J���{�~���&�K��_z����ϧ��^���,�u
S��^o+KM�����)��{�_�7?�cp����V��L�Y/Vz�q3X���K���?U0���T��U,�t������%1�U�ª`�j��u@�Z�+t	�ֵQ�L���jDi?,Mp\�y�r\'i�8Q���0�r��Չ%�'C�+e��^P4�`����s0&�����?{�M��ϙ� %+�>��bS��PB�Բm�Γ�"��Š�I~�P�AV�'Y�G* (&Ƴ�Jnx���U��Y
���\����ha��:v��n� ^yx�ka;�㲦.9��i�����_�
̗�/�%�b;Li�l��%�Ǐ\#��kS���9�	r������ZxXG˶_��fTӤ��jwi�˘�h�!�����$�W��&G��;�
֮��vT r��NA/G�)�%��ߤ���5���I�rq��[f�l�P��}��%���� }���V����ޗ2��h�k�h�M�f�xx5�[��:��N�Avd��/X��[��]%N����6驋��)�
PѾ��8]�bD���g�c��N��W���ۉ����bP!�r�G��g�?�l]�$�-Z�
��Z�(���~��~m��,C�={�ϳ�m�d:�c/,��;\��=�G��/z�Ӿ��V����S(*U,g,hۢF��}@�g�����q����HC��M�ͯv�*4���?鸎��}ƹ��T�xL���>�*%����?�0�%g�%[�)�ݾ��"�dqE�I
xݖ��s�h��>�I��z]xՄz��_B��|2LQ1�\�񭷃�3C��4��v,���-߸[�������oLu���l0�7�}O�˕�ʌƘr��ώ��\�gCa�fr�.2��5w��ܻ;�f��޺�nOa
yl�X
h���7�Z�h}udH����������S!�� �^;�i���䪣>� S}���yaɯBْ�_�t�Z\��j/��-SG���4n���s���mu_��+����;_�%�$�.��C�~��v��B��K��T3�w�iW��?`6J�-(��\:w؃u9�i�dF�I��"}S\Kl���ҩ�

C
{�tK&v9r���\n�eO"=&�p7��I�H��*�S��Õ�0���̊��%'�AL�*ÛZIO��G��~~r$��~���4/�9���3�*�t��q�[��&���	��V����͜�׼�b�s��+:��
�1�eL>6>����m?A1{��Р��C̭'��6���#��H��g��Pj�G��q��dN�"���җ�	:jI�<�4OA���f2%]۶I*�:��
j��!�+N9���/�5ye$�YR�Z
��	�U����@eb&fqNFL~'�����
G3�	+�o�;�c}4C�.��PF�;�\!��?�X�s9�%�Z8E�`3� �2T/�ɨ"Ѥ.���|��5��]•�\���o�Ŧ��/>�^
���lΔ���܆���������.��Q�}�5"E[~���u;���*Uy݂nI������2�OQ��K��T�IQ~^ٺw5[~��u��m/rl�����ݼ�{�J�v2�!�%���p,,�?d@\s�3�A%:����Ѻ��I�����X�H����T8NN�J��'�⎯�~bzʊ�~:�=ҹC�ġ׮S4�#>3���q��h��*�V����D�6-2��	$��_i��Ղ�)���66��)��a}�����UXj��s���}�J�ʕ�J2�|��M��]L)��><�v�6��&�m�JiA1\~Z��!�����;l�~;r(���#+�,nmU*�Z4��^I�ʦU�ll���h�����9)�H|’��Y�'��sR���RG4�G�_gDp����B��1����X��)�T]�i�$�.5]{kAG�Ďb�!1K��_y�����h���*�R
�n�-��h��t]&�zW�Ykf�q6�'��p���{�>����
-=�Eː��_���A�br��Y��Ojhp����V�a��'^t?�'X��&:+iB�OK���/�!$b�!�&��Wn�̠���9��-ǽ�L��et�����[����f�I
G�{,Gl<�ڎij���t}O�J�('�����F$WT��k�_`VI!����0UjX��,P	kDZS�b�PU0[0ΰF:��ɢ���?E�?�$���-W�)��ɋ�r[7_��nC�Y.�qÃ��~-��/ԵI���I�D~��h�%?Dz�s"�È�����y��'��/-өy)_�e­k�v ��-����i�,��a�k�!�C��d�:{�ךj�$���) ��^蝉w��$[i��LW7B���+S.SL����p�h"1^��/��b%��D�6�p��yZ;�n�|,ǙM�B�{�8_
Ə�_4�O��O����䐿�J����2�ѷ�b�F�����#�	�!�-�WFP�<U�٦�8���J]_���t��a?�Ç�ZZwG�D);x�4���n�A�H<(
��6hy$���ĔH�q�cd
us>�|��)�YS�(Gj�5�/(�
�x�����%��	�9�'�mڄ��(�Ea��;��*����d]��`��f�+�x����]��gɆc�%��K5g־“�9��Po�ģ������:0��%N��S���U1��p��B�~�T[=���a��x�#��)` �~?O��[�]=9T\�\69��:�\���|r��ط��?tr����ֲ�Rk+��P?C�kJ��O�~~y}XůQ��JV�Lb���Ͻ��r�hkD��)G#^��}�x�jM@8D
�F��G��Aw�S�'��O��(*��K��p������я~C�3�/�$�ih�j��d�����fO��P����uOX��"��b�^Oa�/?��YI.`�aD����18$\����4<:��������KX�C�"0�j+��)�q	>�4��H�{��婜���{y�z�J3R�6�6�P���{OY|Ց(ٶ�R�]�BD̗��0�G��?K$���%JWO�֫j�G��!�r*+���6�B����JU9=����p� c�
t-��3���d�nl7�� >��n��`\��|`�ț�S��@�u uG�EF<~J��)?0ۋ#�ps�3�!ܿ�}��2(Z��a�W"��2�ϝA�:a�_ۄԺ��e�lG��sO���x��BA8HD�԰H�6�jqy��)c���ޚ¹E;����-\s�⇭d�a�<�_b������	�r"/��۟(&�붨��d�(E>�򍔉C3�jU���T�7[ف�;�U@� �酸�\uu.R��:(��Ř	�"֊F��7ˎ��d�
s�:�N��%�o�6s���ܻ�{>�X3�D&�,�H糘|�d�lB	�DŽ����	�6y��=����\�k�܄��%�D��ψb ��R��f��6w-�6���{�5{ZQ.���p�)}$=��U�{���%����i��tnly��/jerT�˝�Qe����r�ٳ^�ʣN��7��*�pl�����\�!w}��:&��W��n{x.n�0�¬BQ�~aD��m��7��Ni�k�,����'[{�qw���-��w�/��.	�������LY�^34��U�|9���࿏�0>1�K�z�Wxe���|\>�X���/�K�x���!C]��b�ES�}�2)�{2��E[��i���D���ԇ��7or��~�>{�{���?��[�EHn��@n��8]m���ą5�u�;��>�e%i���ףۉVb{�u~��zC��~liV�}�Ӛ$&�I{�O�L��~���"@�z/�<��bK�fۛ��T�$ED�t�/p�r�4^n����|�9���Zr�[ȹ�g�MC
������a�S)�b�I�p��^���~y�<C_1q��q�S��-l��H�h�Gb�x�<�U�]|��(畑QQ�3�B����]Y6kq�s����S	���姕Jj"�'�O�	{���6u����~�Wy�z]��*�pc���ry[M�3�DŽN���
ʰPs�X�R�)p��4�J��RS���a�K�ޛuG����V���z)7�0~YN �	�Ȅ��W��R%�<�SĿ�Έ1�<WL�9Ӛ�'��rC/�J�t���R����m�QU�����l��i=��
d
�4�>[��0�GU���l�a�k6Y=#�)2F�N�B
׫�h��D��	ȊXF9�d% �v_��A%G��a��%X/��0z?���yM_�)Ut�+��P�k=�u��{(^���Ey��m�c��SGT-6���PLvozi�f����e3��{�\�Ƀ���s�ꌍ3L��#���t��h�]�\i/�F5c�fqY���&Jl��7a%9��H֕�}��3�w*�T�1��������2�e�L;F>���>5y��.�BU���d�6���׌�X6jn7C��W]��N��m�b����Y�\��M� ���5ɂ���;���K�J����>�*ˈ�D$�#j%F�4 $��	��q�d
�G�G�@��F+(f�0(b[�Zv7(fX�:Һ6�z��,�W�eͯp�������J	=��5���\�_Ə7o�X���s�`��3��a��i�V{Xa[�gN�.���I�QQ`��Oc1`m��I�rr��Y��ng���4�:/��(PA@����=�miny���៬���Ͼ��ɫXI�``k%�[Ao&���֎F�����x��
�⸔��r��:�q�p�^KG�0m�Ad��i�;-R�
0���Q\]!ݼ�j5�h��}�$�G��Z����?�<����ѴyƟc��ϩ�yH-:˽{���B�ݯ�Kge0A���e=1�j��蜳L�v��]،����Z�2�HhV�9��c�

�����CK���'M;�Z���z\$�G��5�z��~v���Dc}f�W �\��b��}�|Aꋻf�o��g��o�r�o6��n����.�D�iB�o�F vЁp�z��
ujN�]���5��p���!SB(ׅ��`�Ъ���)��f��&fކ*���i����I�8^�������u:}Q�0�9�"�eq�32._ݼ�Ҷl��.gd���S��(F��C�Z���v`ȱ�)������
�P�?��T��𲬗rM� �6��?�I�J�V��Df��s}�j��8��J�R%yĴ��\�a��Է�pK�TO�[مî��N�QUn}��eX�'g_�ӿy�Bh#<}J�&�N��
t���i�5�C[�������P<���G�Q|s����F=%u��ju2`�'���5EΥp~��q��/ �
o�-��e��
f`�i��"-M���yi5U�G�~x�*=Mŋ~^K��Iȿ�}
/�
L�ju���A�^�?s��vovpJ=����XR.���!����!�N�g_�>]G%E�h�������|1C3X���ث��9��D1�����M�ph�ڏ��]�8{ϓ��I%�͉�2%nQ�����nP��E�>�c�	/��^�J�L�_�H��K�������}1C�nJ>���S����n
އ�ڝ�Ϣd.�8f��/�C�`�9W�q�����k����Ny���6�8��J@�'�F%���/;�[P�睷��o�.PW	�wJ�?рݴ��N區���^~�&lÉ�ofHI�:���}���f�2\�	����S�o��]}�Ν��s��\�Sج}��M�/9�����#u&�|Hq��;�v���
#�Ʃ��kn�xxH
��Ӎ�Z�����'�7��(�HTZ���0J|��KB���z��s��6�\h'����?'U_��Zdj���!��[�]:��W��s·�Յ����Y?�,B�Y!��5ѷ�"���rK#��̛)�k�x�2^cƍlGq>OI���l
AFhΤ���u�C��t�-�J��Î�DQa����'�(���‰�5��*�O�t��	��<8��L�ʯ)�@�U�&f*{ٺ��ng_�)�B�����Η(5A�x������1��%�LS5�G�<���A"�t`�E���gk7�п&O��U0{�m7�/���$0{<��q��-��`p�cP�B�[�-�qi�Q��7�Cgq�t�~k���H�)�#�����?
��$\���kD�9`��pNR�Ϫ���(���:�0���SnJ����	�S7���T��Nu�^�~�Eӗ����9��u��[���2H�%&���׎�K-�1T@����9����G-vsw4�χJ̎����C�K�"��V���yk��O�ӳ��?�+�����C�|�H7c�>SΡ��.qRDz�-'����Q4#ZD~���I��_�;����Q 2;JA��2��W��
<z�Ͷ�Eq���֪�IP�F�9���S�`�Z���Nj�"�=,F�,"��F<S}���c�G#��mf��H�0cp��KS��:OTI'��4	���>E���CY�a����w���rd�} 6���m�M�z� pqut�lr��L��+h)�|K��{�9�ac㵦��&Cu�9�&Żq
f��#Wn`}�&�R�͖�c^��٥�"�k9>b�:��7/�_!ޣ��T�b��-�.�����ܗ↚� 7
J��Pb�}��L��N�������
E9�u�7@и��V�����ڇ]ҋ	�W_XCD9{�;:�й��f��nw�H3���w&w}�Q����C�uvdut��X�����j�Չ�N�r�Q�/������'����ƻ���<#L�96������O�<����{=~��@����=u1�>����!� �c�M�W[�o��}��:�V4��A��0H�y�ؗ�H
\I^��	�¶��HS��lB�b���ye ��`B��JЧ~t��᯶!(�6�5"�1 q˦�
1t�=,f_����(O�W�N��/;{�V�t�􎆻�*R�����ڤô��H5�Q��������wiN�V�/�M�z��ڷ;�HK�(�Z�g=Z4�8(d�0�yas.�ܧ�t�®���D�(���N�G�P�Aߐ�]j@�VF�b�]g�8���wW����!�‡��q�����1�S������:槮��8�*�d��,u�n�@�3�)�{؆���Y>��ߛW �Bi��P��$hQjK�W��A�z�rP^<h��7+��'�����Du4��OL$�@�z/O�����`,�Y�����d�k�+�k"/1�G�]C���,�z�w������mt��UЮP�����Cܚ�LMH��"J�r��P�J�w�����}Z�[��ҟw��2��:e�cG밻Ք��h_��YA�OK;�>�٥�/F4+���MFEe�ϳ$u(|��,��y:@g���n��չE;���~{��Sj/����4����#F�`�yzO�hW�Ć��H�kD���i�_��
;��ܨ�9�s�r��Lx����R.J��U�v7�s�_�x��[Ő
:�;J[�2��W�R���q�Â�i��N�!A�X��U��,��5p�XK׬���4F8�����c�D�͞\�e�A2p����H2��e�
UX���n&���)�?v;{���:�9
�{|kœ�3G�Fg!�61���צP$���j[7(��E}O��%�]}�������1e��,M�3�r���6��	���u�ɷ��z)H
/�&s�eCH�P��q�9W��^C��ޝ�ؓ�{��t�|L�_���M?�ϚQn�t��X,�?+�`�l������?F�_*�ْ�UES������]\7?<�Vv���P�ǘ]<��Zc5�E��U͕�����9޳�y�&_�n�bC�@3����ȗ&-2�QP��B\��'2�1��/���C��ק5������k�J��J���n}�#�)�Ѫ���Z�uf������7���P"�G�4l�f���%���@f3{�j�R�e�*�`XS;���
K�Dyb���zTl5{D�C"����E~h55�:~��?+�(Hɞ�i��@v�¡D��r(0�d�&���P�F�Z�s@0҈�oI�
�ꔧ�1ͦ�f�in�/>㨵4�����I~�j.]E'u~!r��3�&��_:?���hC7x�G��*s�{uGҵ� jx}�;//�liq�B�awkW���;��~m��v���<
�������앷6��s)0��������
�g�g������O��g~Ϝ"[��0s��]���*ؿ���
gfe*5U��k˦d�ELn��vIYU�LmF��@�m�T��j�Պ���=ɾM�"��<Ic0��m��N��W�_��y5U����y�ǹJhaEAK����I�O���|pSݶӪ��3�ߠ�j
)����|~@��RO����IZև�r��S���,m#�X�l��n�e?a��"��M�5��#U[���5+�^���w�P_얃`����OL�,L�0�G�D���2�<r������5z��澑�±,��"rC���*
��"
#��O_�9����c��,��A��#�s}��m�g)��{�CP�����	��2q�5���c���}�cI�$F�xP�� w�ZD����O������g�aD������Ik|��ww#t���s ��@��,��K*�؈��H��K���e]�Y/�I�|[@mq�c�ĭJZ�8:=1uQ:��Ų�_߃�ټ������颧i(�7�l��f��9��@G��w���:�Z�i�$�m*k^W<&�@"ⳳ��[o2�(�7]�<.�}��FP�V]c�%��4R�3-������� qп�,�n�AbJ�:�G���cǰ����U�s��x��9�ey+����*j./�̳�M��r�O��?�8!/��|�B!�裧���]�잟�c���L������a��2C���A�g�͖��A�`r|��j&���Y�Lu������tA[��|�38���dm��BQ�[����l{3)x<�=�@E ^:�6����/΢�psjv���5w0��"�Ϧ�8f��Y:U��q�9�?���'�l�����i��X����S�̵�E�����z��Z�;q9E�k�w�x9��W���7c�r�ʋ΁�����*�긎���V��1q
�lj�/x2��~�̧�F��Z%ܥ��Q�t7�/�K$��(��oH�
��*��@B/���h(&)%������^K�~33= q�G)�C~B�M�ci�7h�xl`���h�K�d-�L��2Hb�z�O�Kl'/��+�t@�L�Ϲ����)Y𲩨w׍/��P4qEIw��X|v��d�����'��-�#�hdZ��EN�Em���y�MidI=i�#������%.����X;N��c��aP��]��V�vx+'��G�8�dcG�Pr���ik�@���48�v���_���#��IuQ=�$�Tf�D�Τ�J��5;�WT���<��/�����B���}�����1-�y>�5݈Wy��i&>_fQ��ќLv��i����v�3:��j.4h �����,�Ea%'�X@C���e��V�ؘ|lxL��P^�����rf��=�pѰ�]�72��p��tr8���q2���ܕ��t��i�a���q�ܜ��g�Q��ϊ�g�[WY������3|�nJh`�5�ml�@HTCC[���ݡ�����
ц{ꂂt�
�x�R5�0���߼���{xta��Y���Xb��Ç�s���x���>uP�ߥ�U�n��h�?C�L�)���M�uk���(��BA(}5八�ox�u;�ȅ�裙�F�P�
������ds�t78�	j}��ᑌ۬ �$�Z�y�}�L��>�n}��q<�U ���W�;HQE{����x̄��V�ɉu0�/�Dr�mʔ������6��~(���V�z�q�\Fݲ��r�?(
*��{
��$���|�?J���Zۡ�'`��:S8׋A� :C��ųD��\xF���i��i�q�QHN�3F��O���ܬ�
sw@�����ۡ�a����bP�|H�� f�����7A�h8�`%s+8/��_s4*�?����q�2q!]\[J��L�ɿ&��!}Ze�[멊�p,�{l��V�,!�w���e�U8��S��$�(��J��n7Uf�x���~�y�]�����q��:34��d|`�}�i���ndK�+ۂ�:�J�D�v�6�8�B�y�{�#K�ig�`�����*�@�<�/C1Q���n_fIy\�]��/O82�σ�>���U�>o3��ߍ3��e�2�t4�K������6�L�V��o#
�˄�ZP�B��tM"��n �X4y2Z� ���p7B�-����*�/YA���+������,��r4lͧ��%�g'r��먌����U�b�`B.���>�+ÔQ�vlӦ���RԚ��h=ʤ��:�"�U�K�����!�}J�3�Jo.ϣ����TO/ł\o%~�ԧdQ`ӱXϭM�����l,K8��,�'�R隸����������.����@��	��1>�}���=-����D�H'�h�ϩC73���|u88�W���Rv�|��8��d�bUƓU����ȷ{�Ha����ˆxݨ���
�v;�k"��i�:]:ՊV��=|s;�>�G��Y�ǯ� ~(!�j�'�?��+���)"�ඈ�� �)�m�]��+5�hu�w8�%�/�6�l�,,��:��Xj?!�3��iQ�X���5����U�����>݅'+N��%��Y�*��e5w��@����l�!��U@NGT&�4�)4si�}qV3rr�Ow�
`k�w�y�B�]wQ�ky�+���Kv����"(��l3�����'��fP#�p�j�X�̯Z��ڙ���֍ԍ@�o�k�d���Zy�q�1���������:m����E*s.
����K�������y�u���XmfQo��]�6�C�����V̩~$��!r�K�I���4	�N��^�������9���W��K�q���j���>��ط ��W�
=����/�M�Q�%��y�C��s;�,O�U�X�X�؇q�|i����!�_�q�\��oH)x��� @�,��=^��}���7ox��n3�kϢK�[ì33*m�ː1q¶߲�U�t��5a}I�N��f������:tҰ/�I�����$F,]�����3tO�Z�@���0-e��6_\�.MPY�8��Q�N�l�H�C\mï��Q��'�;�%GW�����B)�;��
�K��5Mr�<�jj@M�NJXyY=� ��D��i/���$��6M�T@�GW�y��G��A��p�P�n��b\Ǧ��2Z��S�VP#s�^�3<�MŚQ1S#CNU��H��fTo�+���ϲ%qS�5���X����@�}'}R�Y�x��)%kB�@�]��	�O8z�P'��e�稓�b�I/��Qa��xPY*lۦSZ�[O8�3s�_r�=P9q��}�R(h!U_>�:rV�
I���>��
�ҏ��h��Ei	:Nʇ�n��v>�JP�z�WY�����Q�gX�yS����2 ��H��r��;������ �y�<b<x^41a=���qw�:���nkWL!!�:L��br`���|�ב�v|�ȣ��p�kG��iU/����).;ç~Vl4����Ŧ>��?9�(�VY}��@f�bvᮜ��WY0z�v��'eWk(M��
H�t���SFǿ�9�|vB��$!ǟ/s]׵l=妨��p�B�N��;I�g�X1��E�V�f�V\6%�w��mu��N�<�ΰQdt<z�1��V �*���.����獟2��Fݩ�
�	��t��H;�5k~��g�vQ/��L�L��uq��Q��w��Ǡ�\����Fhc���xL7�T�}NW�AC�.Ayy&��B
��ݫө@p��5Qyj�qq ��h���g�w�o�*~��dfx睎�΁f�&�n��W�I���W����j��k#�85R�uT������Ô�g�B�㓵�Z5^�nTmun��
+:�,�s�f]��Z����aHTѕ1����u�;���"����7�4$/�S�e��?��N|
M$���PWMZK-2�W��q�s,Q�4=8����������Cr?'jru�:�&�6��C��QmW�?��պ�ϲ���)��f�Y֮��֪��ՁIB��6����1m�e|RQF�wE�PƗϻ:������oD� �tV�=�߿�
l�1�-��W��^��X%����5���'��SmP�σ8��wg�zFn.�^����2��:���5*���T����Hm-���ke׍��uo�Cq�͘��*�ͣI�_�p��!��������	6*'Ȋ(7���"T	#��;��U�>��I?xP
�`j$n*um�ޗ��\���@����WE8���c�*v���.Fؑ�N"ɉ_��)���'__u/��w#W]'�w�L�;�j,v�mm�����K4D��y(�,:�}t��飴��В��b*�z�2�?�r�\�/�|rl�d�*S��Z�ff^J |�R�X�hj�k|~f��.X���7�NL���E��g],�N��~�C���2���4!uB�L���]y��x����D
�1���i����;��$�H5�"G� ˤ��f�ԃ�;R�V7~�����D��TcB��,����]5am'�K7'?����Òs�^t�ztm���|׌~�W`]�%�HɊ�V�̣NJm���5�vt����{����L&��*�-���R&���d܋ +A��D����[C���^��\��lw�����1ᷲ>rǯ��h�²;�4<�Q�:��ø��}L�ʠ��"JPPUՒ��9�EWN���.w�ʞ`�Z�A]�ccՒ�� ʢ�+)heL��.K�i���:Zd���T`�B�y�r����cm�aiє���O�l���zL��:Γ��
���y�Wؿ�v�KA��!��8hq�=��`Fs����2������l| ��
W]�qZ	�e׹���Ϛ�	��s�v�K�����H�}Є�6
t����M:qa��9��J,���'Ud�s�ʳ�#�,��������OaP��8I�^P�4�>���ܖ����Z��r��ۇ�jV0��Ym�Ӂ��B�<MW�(J�M!��r����VĹh~u[���3?%�Ex*X�L�q�*��=̛� Ҽˊ��@��Y�E�O�Z�b�q���X'^�ʼ�_X��J)^Ù�bMq_�\���ʋ�D��k�}Y��eb��!�� �f�=۪�Ռ'	�ֽ����2����~��zg���)�����п���������N�B@�d"�S�)?�%�4D�6���R$)5
zi��-;1�P�g��
��hP|��>�㿃&�hϪ��W#$Cq��o�`��'e�1V�
~_Tz7�tg�\PQ
;?2��=��w�W_8YG��G���Y?Ky���A���m��>r�S.���;M�L y�o�zP�eŤ~M�Z-�������I�>����'{���K۴��~+زC��i���'�pw�������$�>\d9�)��0�%���g���Ց%U�e$ty� ��D(����=��� ]+M`P)�c)7�4�V&	<�r�\�U�3�;ه�����l�T��$偹1l�����t�u�8
�EV��G����q:Z�/w���V����*{k��C��_K��H�(Bs*����_�I�S����,&ެ���(۩Q�x#~��wus�����ݮR�[تn���>���٬j��E��ޝ:%�����ˏ��C��脞ÍL�����
3H�5��Wdf8H5�8�Ą�6wR���\]?��t�gr�V��=�NO$a��)a�a�����cg}녵�AB�)-#�t�$E�e�JJ~4��8�Tz�M��C�v���^鑇��]�18%&��~��B= �c�{�,�����gD}��b�
Ҭ(()1)�]�Qf��X�zH���2���**G�)��U����u*��׉��ѓ6ˆ+�ٗ�L?�w��1��
YLnC��ﴸ�X���Շ5�j�/$=�&�������>L:ϧѢr@X�$�7�~/��J�/X��vOr�EE��ʤ��b~g5�z�]e��|�-�5p:i���=?�9��/��&�eFzs�2$1�;Q���3fDkMߘx*����E'k�؉L�*c��
�<E"���ZMX�/�T9!�C��{�Wԧ����(�		���Ԁ��&//�6���.5$L�d��5t����Dr&��z8-���.#4l}��R��!�g��
-'�@��d�T%�~��J�̨��	�����[��>�3fRut;ї�{Nwٗ�N�uK/=~	�S�-zq�O��KnQ����|~�4���tP�������%]z�\�l���:�����5B��:��k���]~��>��-��S��"-�9�����j�"Մ�Q�Q��BZ�� �8I�$N�5�'8	��O��g .[#����R���W���5�#�7̯�Z�DÕ�{ľ���є:\���T0e�F��+�A�:�fz�j��V�U�?޳�dɤ�
�ق�r�o� �@����PM��s\�<
�ĜVO���
༸L�3��IZ��)"oZ��Č�S�ڸm��(4�/�+*��$�2ʠm�㤾���w�`%ik�^RW��b��Q5S٪F�Mܹ�����մ���3�h���X�!�AAnTh���Z�>�y������~�Z�Z����D[�B�Ej=����W�s�4�ۙ{K64�����=�7\�q�,3�4_����QX��j���� |E��Xҙ;ѷ��[f����l1�$gE�g���u��H�����O^��F�q��?ة"�fD�I����6�-*s�V)�$y�]��DD��A�o��r=�*Q��K�F&x0�k�_�\���*�*�n�5��ы�'8&��5��?Vb`����\A�p�*=9>��㤃q�5a��e����r%�'���[ӽ<�J���E�c"���Oܫ�–��8�J�r�S6��[%^ǃ��4�t��2?YP\�P�B�	K�x��h��4s�8�L79�|U�z��OI��l�_��D�7��)6����[����J��G)�A$���
�A?`k.���H�}e��鏊݇Tޯ<�.~�a��@d^ٺ4
�d������l��[�'3ΟԎ>�e<( ���Ы�{���PgQ)���*��ϙ;�7b���P}��rI��~�;J*�����L�,�d
>z��m��vdP��'�$�o���3�M�NuQ2����JxB�u4F���ӎ*TBm�?=�s��0M���KhN;{+�p�18�}g9���uJG��D~>�q�ݑ~���3�3i�[�� YǕ��	���]�ލ�f�	��.�5�yzG�W�;E�o���.:�Y[��N�#x�]�l��hd�z�b�Kg�>�ӄ�j����Ce.�P>����~A���I�
�S��͉�x��Ex�
�_4��U0�2��I#��
T'�VD���g�BF
^,��$����wx*�◁Z"�w��Ύ�$�d+�ۚ$�]�ۘ&�oE���K�l�ld1��Y�I|�}ɞ����#4њЂ4˕e�g������^�1��r�e	�B�̉�}��_��|ECK�VOj5�kVs=����#�0Qd%L�ծs�C���ڃb��V����XHf�0>��Ebt��Z���U�T/��J`ʽ|�SƤI�f�E팩 �3�<$p�\u~d��<L�u�ьB,j1"�9��w�+�4�?
�d�Kx�cM�aIQ�a�,�"��|yd|��r����-�e�{�U�����U�dk	ش���k�1��j�amڼ)��7�9���@UMB�(@���(�i. �fW_E>_�|��>cF)���uf0�V7��"��A����*�����[������Zd��a���榦~�~�
r�A��@�$�0h$�2<T���_T�\�uy��
���//	3�a1�A��=]��}|�_��%\d�Y�JDsUe��S�Ra)J��F�U���(i/��H�����LpGF5E&�L`�H����Gƕb��U�ak���vc�A#��h�჆	8�7>	�����l0*s���<z������/���{;s5�]�ߟ
����."S�԰y� ����	���������~�`$���J�
�[��w�].�&�b[�)uG�r|%ϼtI�lx��X6�f�(���sO��er
_��*��\��j!�^⓼.bW����W��t��q�)�%г�T�B\��5�ռ��Պ`1�N���K�j�5�"��c�'�j\�}Pw���Ӗ�f�������:�>�z�z��u��՜��skj�����_ mZQ�����)e��7�|g�[~�[9s������ݠ
r���GΊ4_Ga��>�����lgT��ּ�,�A����c\1�t�ck��w��gY�_�}b�8���2ߔ��-�".�\�p��|`�_��q�J��E�=nlʇ��7B�i"�xc���Z���f/��l(�W�	�]�ڳu��t9�W�^���W�U�"LyMN
� ��IA�E�=X���>�P��z3�J�?ڬ'n��=vFl���o"���h��������Ѱ}�X*�g���Ň��H�p�x�؜����r�L�9o�^
�Hz30���'b�Jz��|�Y�53�A�Jq�X��u�hϲ����g��F�d�6A��$���Ʀ�Q�ƞ23
��v�/)��<Z�`LV�Q�ݯRRlw"��R�����Kf������R̥�X��� >���*e���ׅoK��	�O�m����J����D*7���ˀWڜ���U�����>b� s�0�3J(�	�butqKK0D�P菉���:Ŏ�z�~,���X��K%!r�����JmCf����M�"S�s����P�yk }�G�#}��D`�F�k��D1�T��6z��-���k���5�<t�����R;׾c��J���\[����c^5k����ɥ銲q�[��Ou�Gxs�Wf���'�'�o�ȵ!�"r?��}�,,8���Tq&Ҵ����
�H,�M��
_���3zF��|u����:߲�d��KEr�Y��W7��HY�qg���5-߾�;�J%�B_�g�Ť�FF�eu�Y�TS�:Ew�!Y��w�ڧ0��>nA�)��/�[uLt|%8�%z�W���2���M�d�e�O���gt�.)l��e{Sz��Ưc�ϛM�ꊀ�(��ݲ���!����	Ţp3iV���c�$�&��9r���[����um���F�Oc8_� Ilyԛ9��I�����2��hKȇ�Ȭ�zt��z��Y�n��%rw�C^�gٹ�\�!����C}�-J�j]�fj�I8O�¡^�5D�<i���1����9�m���ryz��ф�r��2Vœ���+2Upȿ)Ck�V��\�t����Bs��MQ��}Z���L#���
����	��F�d�̌����+7��r�����%F�?Dɼ�B��N�ЇVQ�4�a�Qk
-�����8l��9��b��t{M.�	���~���D�D%����t�!7�u/��J�:Gs����X{����b�SqA�(:w����~����q��^���R��3�30��W!�WR�Xs%��*6�z“tq��������
V��@'��)ΨzAp[/�9��%P\� Pœ�~�B6�>��a	�o[�h�[��_��6�X:랺K�p(3��v![q�cc��ᦦY���lN�!�L�k.�ҷn��wBw���H���|��/Ux�~޺�VZ.��H�z�i�L�v�W��ĵ�=C��01w]�G<HI C*�z<အv�|��U2-R<�`柦R0)��e��hu���t0k$&D��:�y�Cxc���q>Q�7��1�8�4F"=&�'y�T��ȗ��G�=�XZ8���:�#��b]`���8`JzrZ�T�I�$���?7>GY�����%q�i���6/���%]v������[X)Ǒ������+1�f�O�u�,�]�6߮1(�Ҁ�q=��,����f��@��T�V�B�:� �2.K�!T���n�����f�o�`
���:�ObWC�֔}��m�EH��<�!��n�>���#%6Ô���~F!(�LdV��`#�$8��˅�������ˤ
�����(#~���V��f�"SFK�0f��I=����C����곓�EI�����,�O���Tw�U���KCM�k%%���a��g�B"i���m^�?J((<���@Pi�p�D��(��)�.�H�I$u����&	:���d	�J>A;��P�X<=���Q��8
�c�kMx�gXE ��f1�츬��	:��=��\Q%T�D�/P��\!�B���5��Z����$ҧ��Dz��D��C��~c�*���FF�_��N�0y;$�r`����"���E���yH����4�붜�q2�-��܃pyq6�ʇY��L������U��{wf{ڽz���t���$=T�T�{�zg=��g��X����7�x�77Va��g����ì�������?�&��z/��Gp6-����N ����q�!̨T>��Vܛ��Œ��k���R_����fykWK�.V�����~�b�?��VZ�]��Ti���@n!6����|ha��Ip����Í�������E	�K��1��O���dwK��[��VO��V�}��󭉕ǀ)t�]���t�I&գ�&�g��nF}�"��(^N[N'-�gQO��UL:�%|8���:-W��	8tg�
�&�C���?�9�C��s
��y��w����(G��Bj5�m�棶��4.��xdZ��,��Dp��k�.�a�(�=�Q�C.��ְ��QP�H�Va'8�7�"0�ݯ�'S)�<�p�]�7��y3�M�����x?1����݀�4,3�S�z��T���ua�F�ZtU]~���v`^�%:���AWj���/�	p'n\��:�G���R��p�8�5J�1܌�hlE����&���5	��`�ހwy{%��6�x+x����������6yǶi����%�;MG81�+7���Oq(ӳ�G�E��̭S�)R`��]����JEObU�,�,bKD����h��h�'�2
ܵ�!`��q�EzvGΪ[X��i(��*��7y�'c�a$��<��P5����V�fPO�\�L"�8�W�o�!!\�1g�S<R��D|� �`
1>[J�G&\O� x%e[]�O�~�9�t?�Oa��@sH)p�嬔s��l�}��jy��o�I��sUvX/�����Ƚ���hS�wƄ2�-�I#駺w��vWލaN���+�^v����7ژ\��FX��4&G�͢G�Og�'��(���}�b��y�;��􍁧�ͺ���*Y����QB�*;�P��%��s��1֝�T-x1�����P�e�l
��-<��*�WZ����X�XO���OT�X�Vy�׶��9Qؿ���[������jB��J��m-v��L�w���Y���LKs:=�0��m����ow:KK}������>�Z]?��~�m��|��ٛK'����~�5�2/���3���%R�a��'���E[3t��G�_��>�_x�p!&�L�O��18h4����v����Z��2A��p�w`?�##}`���v_�j�-���]�^B!���7������O	�\�5!�������>q]5��t��C�{l�R�ˎvW��xiJm!�&�E�^�N�q��{)�~y0�x���L���|(N7i�)�ܱlT7����&yqr��.-���:��k'���Mz�_���1�x�}�_�I<vuK����%�z]^��2c�n��A���\��#Ld�|�3^uury5s˸�Y�3�fOyŒ�ög6��.�oמ��V/�W�5�°m�
�@^>R*�?qetVр(��7W����46�C�ɾv��Ҽ�FD��G<0����z�nI�!I�x��̲?���`���p:Y���L��}R�䘶��C�~LN1�A�=��K�����%����� ?�:���}G�>HPr�D�����Et\�Ž�����`1
~�˨
A��Xh~�~�oڭEK7�r��n*����_�a7W,0Gw�ب
�u�ѥ��
�Z����xI7��_f�i���9-̹P1�:[r9������5
���O����.�}�Z}�dɿv��x���#�Ҥ�K�
c���
�K|a{�M\�8�&�b����nP�5
�e9>=N��f���%Z����w�z)k�t-vآ��P[
��s�~!��Vqa�o�t�+�h}���wo��T���F{L�'47'%�3{���t���;a�O�ǝ������^��d�˒q(��t������5U��Z#�	E�?E��OW��xs��6זG�Ό�x��p
����r����A��lXy�N�6���I��S�H�����뇏�	��A��r�:��^�����]J���i2��M(��d�ǀ,�Y9�Ka����j�|kT��NAa�
i��e������4�P0Hfnߙ���o�B��PZZ��m]�K�j��z�bJ_%�5z���ﯳ-Җ�m��C,�f�#��x��Tt+��x�^K^ݻD���X�~�q���>�0�O�^��/�(4��m�S��~���9ĵG��ދ?u�m��w�
�1?
ꏌxR	,��7<5�6;��r9�3&d������3�]�����/�($¡6�����)!��+�_EP�����M����*)W�[q�th\�c���e���qIh[J����閒 j�u�JA��憉�Q�н�J?�$B��)��g~�r�����D��6�H\�.��:ڄ�N��.��R|���|W ���C�x�<B���������򶃴���j���Ki�&[�ɫ���e�mlr��W��n&�pi�%O�O��ۂ�yճ�I�=�p�y�8q�z]��y%l��cW��]��Q埬�^�D\��2�4*�֙<��y�r�V6�?��S���=�Ak|�(,JT]��g�b1���)��X�Y:�,/;�-��U"�
�5բ�`mgW�\���ಀ�=�͟ڌ2�'��&0q��I�Xl<�y*�p��	p����Şd~�6c�|��-��2�]�p�\/���{C~B
��	Н����x��fe>�3���=�i��l��*t�߽{�yE�VX��/���\���U�%�C���7�8/��S�'P��V����S�ba�i�Njڟ("��@;�.X�8#p�vy0���\+{��l+w8|��r����:�	��b���@��6�dDR�x+��qU.g��+��}�����2<:3�� -��橪6e�V��@��v��{�$���4k_n������䪮�^�9��f^p��z6��NDNν����w�y����s�s/��ـ��J����Z3��W_�/]i��0!-l�/[�;Kl"����u�u�3Cr9
��'��Y���{�:�}��R���̚օ��y7��R˶����c\k/]
K�����x1OO�f�!��'Uqj�(���WAR��(���A�Т�&�����:2D��6��ي�?�z�M��I��[�Te�fsn�����m� 1G"�(\�`4\sXtC$��}�=V���B��)%�^λnA��(�y/K�=nroW�J�Ԛd�{l������(��=p<�+���o\��ʐ�yz5%��(D�n�?��A��z�ӗr�pKJl�r���b�#��>�V
v����l�?�������������E���0o�n��*�/�������#b�m�9�W(E,�_���L�s��w�������u�J�*|���pE#JT�W�
�(��j��0P3/'��ߙ�֬MGݼi��g���sZ3a`vL�R����}��(�k�O4 Y�S�V�;h�Q�
Zю�]ґt�&Su�x����(uPl�E�vལRύ䓝x�|�{*>^�j�nT8�u������"���l~�o_��E�9)8Z^t�׊�-�M՚E�U\[��Ȯ��V��EaP
���@��|�c	��W����Y�):P��l#�,$�R�n��z~�^��8��~��l�>h��\��,)VP�_߇�",:�`��i�6��&]���đ��%��1�h���o����A*�z2M�e��>�*ø9u��L�3Y�'3c�C�>.�d�ӤDmYf
EhÃ,�Λm)Woí��m]�}mj�X�H���{���ۿ�����4��Epdr����q�r�Q��5������-�O�x��	/��]��@��+���A-�E���#p�1?o9Ġ6%5RN�
�������^�ޔ��f��w[���E&�f�� 12M7�қ�5�|������8�B���G��Z2���'P�D?Y�x�P�(���K�䉝(���K��?P��W�P���q�I4�����m�y�G�<`�Ϲ7�
a
��I!��t�]�(=��`���(F�� �:���ƞ���"Sk<�~���KW������� a(s���F���.r�6>�{�٭$�VC���4�S�Ԫ��h��B7���҄H�'+i��?����O��g�����gg�ʍj��<�O�n��.�T���1tyzzn&	�,��›��ű�^r�Gv&pѐ�N4(H�׫����}�5ߞe<�x�I�1䘢H|��M���O�Lf��������O:�79��RR��_p��[�Mk��m�������7x�S�MK��)��d����MD����(D��.���Q}}Fc�o4`���J<m~d|�A���ˠBџ�(����^.%Pݕ�f��T����\�b��Db�|����%s^G8�b|d$	��KU���G���Ҳ����A���-��-[0u���FSV�L�.UJ�F�g(O���N$�ѿ�Vd�C�D�J���CUx��x��<�����̼<o��_���:N�9>m��$�ϥ�.���:�=
٢�Tt[i�nEd��Y�I��`[)u1��i���$]�e’�^��'��7A���n�;���&ƍ��H��5��X�i�h���&��.���vIz��^����L�w\v�/�`E��mg��b�

�@k���Z,��N?
k�sY�2s���R'%��l�o��wo��=s��������6��:�4��[�[A57o2L/�׷��\�]�����/�>�܈�c�3����z�-��_mI�Aƛ�����7������A;�B�sY:7��?g��a8�V���*Ga*�p˼��-e�W�e�%b����<c�13I���B�#;�mSZ��R=.#�}�S��'�������������ޢ�6�����#9R�<���W�s�������Gr:��m�6�R�E���!%w�V�HI��$�g��n"ʺf�-�	�?��)1����_�UY:��! 5�t�����G�z���b�
{,b�hb\O`ZHp:���K�=��sD�'/+��IE�����I���r��0��Y�Ca_��#h�Γh.�.���Ѻ��3gn��ѡ%�+1=��")���G4�� j�j�N��Ʉ���Ğ���f	$1�l�U�@xgv@��6��F�
�������t�w��rכDz���HͷG�|��I��k�>��qR�l� ㇵk�r�3���tK0a��΁W�#M�=%��,6\�6U,ޥ�[R���e�e<Y�s�꿮��`�a҂/�Z�7{�-�(<���|6Os��/H����)ϷS8�Kd<9�mSt�o��>j�٤b�yp��9� Ǖ���f߂�.j�uTOe
����7�R,��7���[sN�����||���4�PV��D��\Fx�	�D�>c�6m�
!�t٪�.n(H25T5�M�w�"�3�ê\60+���H�!a<�<ݝ8�C�k_����;=m`���Mk�Y\k�*��&}ɸ�f����L�rܒ����[�[���;j�\�#A�M� ��d�V7��GV�(�s�N�|�"�!?9�@$��p��I�ƃk*�2y}i�EkVg̿#���m��l��Y��X���7����I8Sp'c~�����SP`��/^���U�����P�ž
,&Fa�w��q�0�ƪ�ϑ%��`�;��(`��4|TSC�=��,&�h���IF��n���68GQ|Xh;���!x�7<��M�����n�\݆��"?M��(�'JU��EO�D(:~_7�3�Y%��w��o�!C}}O�5�Ѧ�#t�y}h��QVC���f1O�Fe(4��n#�Δ6�~�E�m����X��Sr5O2ȳ'���m���}�9,��(��o��|�u�?� e%%câ�Z_�B��Vb)�� k:�G'�H��IU[s8S�'o	ܒN{*'g��@=$�V��e0[ �Zz$Z���+���툖+@Z���*�]?��
v�O.�H��Ƌ���c�YV�׹[�����ǜ��䗡�?�+
�j��1�G7��[���u��,�ΣzuO�E���o�q�\a��Oc���r��,��o��)��1'��“1�"�NO�C����$��{��3�)��x���<W�dq�Z��3FI~E�Fӛ`A�H�zq(j"�m��'����@l*P ���ÑAsX�a3���̃Hs�ΐRD�E��(�֔�,��g&��o��JUBͣ�0�����#����B���V���qؾf�]�����lY��~8cs��YA*����Cj�^���(�+�dԷ^��j�W��A,8��/K���e���J�1T���k�6�i�I<�fߍq*{�IU�.������֍B��u�I�6��nBd%i3����,�鴈���|����#5/Xr��2��Z2N3l�Y�5�h�K�J�dV�������9�#+�@Z�+����#�?��#��]��8b�\x�C���d�j�
�b8��Xx�ZO����`=5�r}@RMH(����0+�Ԡ0T�Kr�bz�
�
�m������&fS�XF~yA��<;��,��X���l_�'}�{��k��Ο�f�M=y���f�M���p8#�Ň����`+���
�X[�q�������!�O8���4��g�mhgqK}֖2�0*��9�c}XhM��)X��k�ي�A|p"'��}3.mG�ǏWWF4���>�������\SęƧ����\d%F�V�9C֒���#!b�ڗzA�����W�W'u�9�]ܯ	`O�/ij��:�_=!76��%��3C�Պ�PD��Dυ����+%Qӎ�|�G�w���ƴ�$�ݟ�h�È��u����}b
x�Y�Jy�u����"*���8��$�QY��cx�����moy�7cK���`Y�Ό��W��
	��́[K'I��q�@r\D��J_"��E�8�,NUC{��;�;�#rB�7�e���y�G%#��Mi`���U���h�۱xW�o��l���_<��}���R+D��J�)��_�)��ӥ������\�AP����f�h�blIQ��0���颢9������Ɣ ����Ut�-`|V" �.2�3>d��;��N�U��`%wh�o�`��b.�o#��:A�8���<�0H�>n��nS������G��ػ���?:�M��Sg�����.,��A�����֗U�fћ�=/�'@����T:U�����j_���M��R��@���#��OQ{mt���
T�k�e?!�6�ș�UAD�Y�Ӟ\�����,�x��ݼ�e!"�\V���6��W�W��ѻcI�b������t�+F��Mů�����a|���:l��x��[I(���`�2�Z��<�0o�9E�%s��mT,FP������bD�0����0&ea�q�H�W_�l�,y5Ꝧv�1�*|
G�����M��Q��p~f;Ϻ��-i��6��ۿ滳v1��Q�[i(A�r.D����Ơ)�z8>��5�
�KM�҂�c"�<wRCe�`���ޣ����.w<��KY�\�*�)��@����������gǼ�U��q������.�`#���D��f{��5��y��x���@�19����<� �M�	O��$��,R��Z����L�R�*�X-]
-Z��J풉P���@EEA�d��f�fAz�f�x�o܄*yL%���;��+��*}|y
EGio���@Tp��ډX�Qwu�Ml�x��Q�<�h�K�Xm@d�E(����5�fL����E����`���i�*���33��VF�m��*�IJ�5ٷ�@|�D��6ԇ�7%�^�w/�'�p��%��;��+_�7�i�,�܊��t��1��E������	��g�^����V��kZ��$���չgyܕ[p�W���S�`��7L���g4�!k�,w'd��YV���V�+�D椵�-RR�����m��Z��9�qZn�*�]�2�9�rm���h.�l���-KK�&�.W���f/��&�FN�4���g��aa���B������uU�+.ܽ�<<��_���������w&<}�|�*CU������0�Kȭ�����������m�0�d���V��6����C�Th�1��S$g�]wl5��Q��(?��jF�qg�O>�aUBURݒe�x�	O�L$dMә�yo*�fݝ��l���U��{�,�ٻ��.�0{1��(:z�Mz3���o�9ʕwbD^x��r�T+p�Z������`O_y���Z1��zb"��w>���a�����ǵ0�}�K�s��*�O�7>I��q�W�V�1�.�]�[�'�OG�x���*�D�]ՠ�]Y������!1%��G��"
_���z�*gQ&
�dt^e,E�k�����"Gъؤ��(mιi�_�I������z�e\ӎ������I�H�@�޴I"�…c,<�IK����l�9���ݠ�ե
Ņ��S[�\���exF9��H���F�<��M�K��IA��@�E��	���s�AS��E��3��l�����+}����H~����c�]�A�DrA��րC�⑸���`r�׾w窓���R1HO�: �DR�O�N�ġpr�	�	���߇vn�=GVը��r��`���w![�IZ��w���w�}q�p�9mop�,x�<�O���Ƃc�y��$I9\���4^}_�G%9�o��6 b<��`z���^|���,`��A�O����K,����
�9�Id�V�e����M��^?�VRJ�%�Sl�=�N�P�����אHc�0e��x�l�1����h1QN����?:���_�>�tp�	���5��Lyޏ��f�B�<�\�5:�g֓'nYƦ��!Mx�����}�R�OT���x}ݸL�����c�^�Us���:�47���FM��	�o><V�4�/<
�
��N�ھ���س��[�0C��2��6m,���ݏ�ݔI�S2�3T1�_UE��nXkLgZ^g�U���c	[)�[A��g��R�-ԊG��⩿���Z�D���p8��al�RC���NJ�W��x�V��;<H:y�=��7%�6�ߗE<�ܕ\�8��@+�W�ͳ^�D��1���l܊�l���a>w��E٤Jʺŕ�4��fjay~c�i鄳�5����g��N�\��Ux����H�#��O�.�
��*�]@C��\e&'|Μ�L�6��r`~$;�׼��g�8;�g5΅!-�
��i��g*���Z�t�q���3a��	rmc�s�t%PDL�s�w~�p��u�͔ι�7>�/�YA����%�������;�^��J�8<T�;
����EƗ!�t�A��*����4��5����p�Lvhl�����m�m5{~"-O$t�#�~���s���n���:��eN��`:��w��]e������]T���~K�n���T8k����."�u��d�����O�u�}CП��W�U/�*.L�D*,[����0���#k����%A	�U,��̑t�Ii�C�Q+�D�<����<�[}luRZ�!t+�r�I-�}�N��B�d�cT��$H����c��{��y��Ҭ�,�11햇F�Q�r�Gix�E���u�aN�eB�Ku�[�T�#|�_$�r�!U"��z{�o����k�/���:�<�Wx;�z��B�[��#(԰�3q�~��Ihk�Y�ڶԊ5��bB7ޒ��1����Z	�٦E؊(����7;i7����u��_ޔ��Q-ј�ʻ���⫍�����C�k�.W����Hd�㫧�I
�Rl�>�.�Ý�~��s�v�~�/��ɸ��+��vO;C��
���m��i���p�������911�N�����g�66��\H���y��A9`L~�y��갸bB�5a����)f$$"�(4�%�ؘ+!JR�D3X�^��Q�K;V��N�k�x����T>�L����LGչ�wJY��$�D�뢷�-�f~:�~1
%3��X(@����ϳ��;]���s���2�O)����_�NOVo<�D$�דmc��-��>�U�ț9���N�S�<���4ɕ����}�?�Ti�)�=*��D���ɓ�%ʴ5_JQ7��@�4}b��/��/�y���9�����P���P(���
�U��2�$���n_X^���;N��� '2�sPl,����S��U�9���󗳌�QW
�����!�.:
Eg���)�����48t�g{���4�)�ɭ�Эd�w�!2���ʶh�K��(�هP��;Yivv����d��WKd
[4e2��O��TV^~ޚB����Զ�^��.���*�,��b�!�D�>R�n�O�R��
�$�A��1�KJ_�n����QFlDi�0��}�l��Ɲ�6��<DŽ'ٕZ��M�W�q����7����÷�X���Ċq��R����ݭ���:�I�/<�m�{N�&/z9�mT��1e�I>��7�Mh�#�Õz�T���-�|b~�[�n�[���+M`��Ǒ7���nI
)'�T#qg?+��s��6A�Vk�M�Kx����Ao���t��畗0K�ŞyuGG��><{��DŽ,a��劫wRds��y[%-��X+<��J�<�d�v 0y����xb�ן��D��+���"}Ёm�]�
/È5M\d��|cn������w�T%���$��ۣ���a������a�A�PMjz�_nb��i]�����gF����ۓwG�%N
�f�}���~а�6��ǘ��e�G���K�_�uY���k=&�:{]�G�^5-|;��D"WeU�*J��9�:N�2—	�`�7ܣΌpW��Y���v��QP����L����Ĉ_O`м&��K�4���G3޴͢���a��f���V����F��F�H�%��fcNj����is��������X�Ц_,&:�2�sC��`p����H�����=��ȿ���_9�sD)��`���Ѓ�'��<�hn������m/|�
�⠉��g�艾_tU4�0䨹��l0�vGZ�gwM8Hqے����}�-�f-�qƀ��n��j]��0{x��$�3]�TMe
%B*�ȘZ��ή(D�w�6��{={�p;��bt���7�wػ
�Mil4���[��Vf�ר������ow~B1C�tbH;�8��^��ꢳX���w��1U��C(���1�Hм[����t�6Z����u)?��j�����&)����Do���R�����Q��\�.Ԁ���D<����0Z�ض)������E�W����lY�*�%�&Ej�~��Vi]��e�����M�K�V�c���m�g����R<L�,���=F�B�b�	��	;3p�\4)|Tan�Ǿ$�Y������嘔X����<&]���_��yU��&��q<{cs� ����ֵ�6n�x,���*�U �e���ω9-YG���H��"�����,��\�,����%�;��dƐ��T���ZY$V�n51���@o�y(gb�WԂi�ʉ�}���W�{�B���f�]L)_3��d37��T~�\�'���mVkq��V���]q37����l��<W�$�z�^Nz��(���QsVH�)�pʙ�R�\=���5Q�I�d�AӰ�Oe���P`�_*�y��Q��ڛˆ��A^æ��)���x�Az�gb�a����n0{��M���x�JGՙ�Xm[+h��J�����l2\G����:�NU"��6��eT�b�ؙm/M�u&�"���~&��υW?_�j��Tͪ��4Ί͙�IJ���y�zo��M���x�8��db
y/hV�_x����	�c��-�q�&��D��7�(�SX)�!ڿ�k9�BVj��Rɛ.��ٳ���u�Mc��o���.����IC�Ѩ,<��0��q��8M��"����eiB��M��eA�K��۠%��7E��g��,H*(��7���X1i�� �As�4���8���nB��r��q��/��C�?�Du��(+,ԭY]V�`M���z8���S�&t}�`��8��iZ`}���i�=L
]1����M��>ˋ�l��-t
�!�/$O���46=����,Wpy�LMv���n�q�m-x�KG���u��E-E+��@����]c^��|D��@�R�,Ӽ�N\2��U��Ŋ�*�
��vy�4�N���2;�n��Zrfݗm�Y=Zm���4��Z6�)�+�
Qs�D�MH�}
O�H		�k'ɡ�^A��gs�r߳���	�n�\l�^����9��.�+o��i��̀`��4c5�Eݧ
��z�P ����!&g��!���؈��X�d�O���&��ì���V����bu�T+J��6��Nj�k���3/���I��RQۨ���O6K��7B�E,<�/a����o޼�@b�>B7���eW�(L�� ��h�[)j뒵�)����K�Ѧ\��Q9C���Zm0���$���)�vyF�K����>a�7���D/���0+�'J�=����`$6}#a%D�C��))�&J��;0�L+�
�P��^D��Ճ��ͳ��h|��O��.ݳfQ��>@w��D��P��%7�'�λ�`;�!�����v-u'DWy�b�lw��bx���Xlt9.	�H���8���	��$1Bk���kJˌ�ߋ�Û�&���5yP�GĠ=�����N�Y�h�U=
������)�	`����(@�+
�%��N����RS+*!��S�d��ҟ6_j<��C��'���_�W���W��{.=�؄yY3�[�`�U�ʢj���Mt���)ptvp���Gܠ�O��#(U���n��X�>q80��|Cv��2�Wv���vV���mle^B����n�x���3߾�\7��b���Qr���������M*��PP�	�0u��
��:��{K�6e91��{5�f����t��	ئ:2}G���˺���T0�f�*����cP�
�5�h��e��:_�g>�M`�V"��w�
�ӟ2�=Fw3S�Ԋ�pC5CC��`OxT2��n�3���l�:�m��q�$��w�>?]_�6W@|�D$=�ݩ�	!��v�'(_����F�t�k4W"v�V�i,���V�ԝ�v:O��N�?�m< !��G���2}t$e��nd�#R��3�
*aƑ�t
,%�t����;vq���z�QXw����+o#(����`K�x�t���i��Q�׵�W�НOr����b��[d>���ɕ��;�9w��E��cX��Նܰ_�]����&5�;���>�ap��p�`���c�xG�X��ծ��Z�cPӊV�
<:f��A�M#&mHr��
�=՘�}�})�L�/Q$�@�y@&j:�/��S=�Ume`����@�1:�6�4>��`y�f;z\@�P�K��9�d��ӗ*�,�Ȫ�q�/�S��o�7��ޮc^`y�=��q�[�%�Z�iefpW8�6����j�n����*�}h�]��Q�Vd��z������(Y��,C�̕���f9B;�"�!�vs=������g�������㆒̤���
0����1�yO��6���SC�ю��k��=FGS�xged �i�[����2D����;���2Ŕ�L�'���F�ڒ���F`�)T�F���<�
;���Z�Bg��P}�J�fw3:�Q`���ha����e��E��܊XT0rz���x����N���f�D�ϣ8g�����5��`�f�;2�za[�4�U��p+q5
�!�y�Wt:X�����6Z5�ʿ�o
���zȲGp� ��/��C;�m��}���7�_G����m����헣���w���4���Y�(
u~�F;�,�eaJ�l�{,3o,ѵ���B���0L����8�}�����٨�?��w�v>~n��'"g�ו�mJt�{��CÒ���2�NM����vI��5ka^��%4�4���zs���</T�V����YھIx2Z��d��L_X?6i����WۊL~����~���i�l����ń!����I�y��̶�/RJ���jr/И!�0�YMk���`Y��
"��\���,%R?�7$�=��[��̱�Z�Bݢޫ�!����[�l�u��b�&��)�+�f�g������粃9}'S�q��{�JD���Q���S�#_2�1aĀ7���
q?v��K��p��n�B�����y%R����c�2p:u�(1?���4]�s�e�+�s���hb�DV�7r�r���5hi?���M���λC���6�m3�]mdM"v)����`�~�%�[��l���_�2��
�R�i���Ӫc%F,?9�u�9��}�#�Ip,9�m��q��Lh<�;�#3VķǤ�c���rJ���v��̭�9��!�9<V��G�
��";T�$n�T�5�E�#GO"|�����X`[T�J��
�f�6�X��ٸ�g�P� #���c�E��}�n�8Q]�$w���j�y��9�)��ųg�d�q0�&<M�>ڀP*/̡�n�ȴ����UM�~"�{��E�@ˊj��x*�~�{��\Q���z��+=��f�Xt�T'$��N6��@Y�u����[Z�K�s��[@�e80��)�w�{�k�EdLS�3P2S���coހY�hx�a\+`!y�b�w��C%?��)T��iGgW⫊��|�
�?�N�q�o+����vS^<ɇ���V�����?���~�Ug�'�67�SkWWE:�G�)p`Q
��1�v�г)���D�ձﮰ��2�����:
����J�B�X��
�	�`0��`18�!��	�d��&��Ŕ�;o`��4��鿐�<}5�u׸�9?��	�F���)���H�2�V��a9���GF��&9=��sy`-�""�(��=H���!�!N;zf���.��lC;Z�����Y�Y�^s��7��E�cnl���X=Z���S�2D�E7�Vk�Ի�1Ka�n��O�80��0�y�� ��đK�K+�n�z �!�V�W��3⛏����gY":�	�ݫ�l�=�L�
��ml"��|��(�M�k�<'�uŎ0O.�L�Ж���sH�3k�_���^T.��w[��t�j�B08���…��lckgOQ�U�
Ӳ��0��4ˋ�����q��uۏ��!P��N��`qx�D�Pi�Q�d�9\_ �%R�\�T�5Z��`4�-V����������9;��g�`�p��h��xA�dE�tôl�� ��$����a��e���n
gqx��ىH"O���&������B�X"��J�Z���
F��b��Nbsm5�,ݏ�c񧼑��`�8�xq�y�%Id
�Fg0Yl��Eb�T&�R��huz��d���j�;�.����!P�D�1X�@$�)T��d�9\_ �%R�\�T�5Z��`4�-#��������������O��� 0
�#�(4���$2�J�3�,6����"�D*�+�*�F���&��j�;�.�n,�#LQ�U�
Ӳ��0��4ˋ�����q��uۏ�X�\[-��"�
�4DI&W(U�Z��՝t�ǃ'T%YQ5�0-�q=?�8I��(��i���ӱi^�m?��~ޯ�!��H:��'Id
�Fg0Yl��Eb�T&W(Uj�V�7Mf��fw89����{xz}��!A1� )�a9^%YQ5�0-�q=?�8I��(��i�~�yY��8/���A�dE�tôl�� ��$����a��e���%�Z�R�\�T����$��_���n�����$2�J�3�,6����"�D*�+�*�F���&��j�;��0v{���A0�b8AR4�r� J��j�aZ��z~Fq�fyQVu�v�0N�n�q:_������3B0�b8AR4�r� J��j�"<�DUp�%N�[�oA�9;=>k�P�}�4]��+`A"�U�9甚� ���A:�K��Sgи�O�x^-�M�z
� 'Y�ޤ1�����n���6�P��yD�Қp��h�P�¤�q>J�N7�65�l�K��q�
�9�j�.{o_�������
l�0�Z:�v.��O�_��@F'�*�6����/��
�H�$g���O���ռFT���I���U-nitT(KIK{��XSbkڞl��
�P�ҡI�傚H�\�Tj�J�ŏ�AYJ�s������Ri���ԕ�
D�3ͬ�:�0��kRK����9^�{�TQ�0��<RA>Y��
m�~�퉂�ɻ��Bm�U�Ћ�*���n>�Y5���Y�W�%tkw�$����r��"��_�8������݇p��`Gd��^Z��/X��.i���QjMAFZ۝�tJ�w{�!3��I�r��j�Q��V�
�k�8����m%�nW�g/�[<
�!@�c�|֏�G?���($+ER��7۱�Iv�[��b�<=
 ����Cؐ�=iO|m�}p������\�ĞP�~�Ȳ>�[�~sݵ��F2p%zyT7K*P��'�6K�3��\��jn�ֈ�5*�ϩ҅7���0D;f��y�z}s����mRθ
{���\a��1yWu�}t3]��yU^�oڞ^�� �D'���b��~Hw��g�ƛr����/nz�
;[X�}�B9��Ѱ���n�$�E���R�N�Q��$�V�z�O�j2���#{j�aO6���H�C"鍀��� �A}���a@���=��=��60�T픺[��B=�v�o�{M��_K��a&f����G:ʽ��sn�k��/����{O�@��4	��(Gb̍8А���|_��^L#U��<�����Μxo�x����sBW���
�z�m+T�9�ϟL"O�+�����`V%�����v���L���i���,���߼hg��)�g4��B�:�EF
J�/F颱eNU��ݎ;��Tr)��4�2cvu�A�C�B�P�k���<����{~�QŖZK(�>9�N�Q}lv%��ȟ��|�5s��Pڣ�F(놥0/p��ϵ�('̻��{~�>}�$��?0e��4���<0Sc�<nhn܅;*��7ݸc�����6��� �~��t�=�4��`7l{�{$s�(��0�S�FP��'F�u���)���I\���Fz%g�B���|��@��oJ�"��+jsc
V�Z¸�n���d\�{$�0/����!��prh��Yz�8���6�����I����"s
�H�#.�U�I�j�X�޶�|�u�,.��(�D�qx���7W�4
2��̜{��U���Z�V�)�؀��ma�ma�ta�QH�"n�Ѓ�%&R�1���FǪ�'ĭ_�E)��Z*�8N�)��:Hr�<�qM�l���4�����n+�f�	K���3H�)WBs�|j���O��*d�ā��D���̨ L1��8>��=9�����d8#����HƔkfRmAy����F�+�T7fh��Mܢ�^3Ì��9��S!D��`�T�'�� �e9W;�]��T�� ��i�"��N�Q�w���G�	+����&�Lɡ�y`�LC%M�Z��0,�i���F�d��"i��WD�d٤bK�Et���%�1Úf�N#�x��_uY�cؤ�;��|��s@t��9©&W���E�ەN</�
$��rÇc��9�ٌ�p�ם�3�f�LlY�@�'UǙ8|1�vPN��T�_�R�:.L9��Ԥ��$�*ĉ˸_���Ql�	X"�Z�W!�l��ZP���i*�"�;-��gڃ�*����H胸���#D�.�ɎgE�Q2��ϝg��X���y_K��_%-�|H�m]8xT{\q(p��#�!���{JR�
�L5��:`��+W}���5e�,�{���{��6�Hx����U��osݪoc
�\��\ɨ�[������S��t�~�9�;�X���PF���K"5�l�<��*`����\E�s�t�+�,��?�Y�lЮ��0fX��y�
�(mn7�!G���$0���-O�j�m���q_|S��c��' ��x�;��z��|i�[�x�˩S�MbojXL0����GD��bU�P�o�|�O~'}ρ�c���U�Ҋ9�->���Of(�9;	R�����[����(a\��������](���k"~q��ǺR�Kw�82���&���h��N!$�:
s2����"s��q�t%)$1��L��
7����_��
ΐ<�[�T=3�o1�6��/�
*�\���:�k9���h+Q�I7��B���%jőf�>r>\��k�������F���j9��P�E���2�Ӌ��Q�S8�tA����{��Q:���.u�U�+�i�0;;I���Xj{́��/��oXL�ّl��tqa�����o��ѨQ�i�U�<u���h����3����1������N#(��9K��k�x��6���]�4�A
y�BRR��*l�Pi�u`�g��~/��m��c`��ې�=
�2��~���F�K�mk�-��8\"mO6��U�0��H`	�f{��!���~�)�B��JD�<��Sd�Qu[�Up�����)�%0��o��-E�I+q��Vobm��U�å��*gRnT��n�z_?ԧ����B�#���7��eR�*���%}�m{>1k׉��4�J����u�@�y�0p�@�'0s����'K°������uE��Qs���?�ś~`Dݱ����@�����2��Y�~��Ol�U��T�.�)Us�?�3�}kb
Ow��?�
3*x(FOö��'lB� �/nB�9�(ux:33�^`��kб"PZ�%�Ǵz<���(w����ֹ%��"���sj&s4�\�>x9Z��%�K��f�DҒ���ѩ���[��Qf\�V���^�wÔ�b��$�{˞h:��e��*u��U��it�(X7����zj��L��,�h��b�,�\�'�CL�Q���=�rdڭ�����2�j�K��AwC���ܷh&��N�����7@Ƀ�T9�t!�t�z��QM�h�͂!n��G=H�xwa�_�qW�L؍Jzj�
�6�`t���㱊\	m�M�i��I�}�0Q2@�!��e�'};L���=���
���>Y`��t���ֹG*�d�[6
'wf��՝{(����Ut��+�	W/�-�q��8�pA?�A�c�8Z�l��(�ohx!p���܀y.�t؞T���n>b[�b(T�4Y`�$����
A��W�=Zge1�h�F��7����(vJr��8�H]��[D��l��2e&Y��	�E�	L���f.�S4@��£.�@�(�h��
���R%)�P�j�����8H���G�<���yKB���m�w�D���z+"#�w�F0+q�O�h���$Ћt#&hV>���Uz��4��F�^L���5a:3�ap\R��P��J�\��R�Q%���Y?�W,<� �p��/����ь�Gu�2,�M����tn�e�Xz�+�m�����b�\ơ�.U�z%��>���H�@��g����ƾ9֚i���cg�jİ�&���
�f�G9k��7���	P��y6	?tr�F���fV�`BO������bk�v�͇!�?>U��n���}�+��@د�U?P���2p�sr�Z���I��=��/����p�!�3���~-��ڄsnm/�r���z��ׂ��9�6�}�2�~ׇ�_uQ��W�
�@��s�#�V�Spg�%���x<OJ0`�m(�'V�6����/H�
b��W��(8j�rr�	����Q-�un�hպ��yY��?ul�0�k�����#:m�TX'�Ar������܈�����7�'�F���֭�5퉣3�Z�Y�fydIP���ޜ�!]ҿ�������)����e�l�ı�&%秘C��Z���L�d.�L�E$���*"�ט��P�O)kH,�j�8L6%���J'�ʝ�p}�Hܐ�F2:�`�uo\�F�<��~�n�}b�4*2E%�%�mC�V���Pm-�1Y�5':����g��#�|
0��q���?6�?��0�w�IVUFXe�8��,��Q\�+���Q���+�Ɣ����
�1����y�tRO�}�'�r`qξ�������tf�%�DW⍤;]BL|k)��	�$KL�sK��G'C�'�!�Uv�	O��&(r�8v�����[����\J�2#�#�mH�4p�˕1�!���圌��@P��A���q�txB�L�)��,k���o���vá3F�`��+p ��j.W�H-��ؕK�F=���������C���02yj�)�v'Nɲmnny�����`8�S"�2?�B&C�{�.Xk�P�07)��>�1��r�H2k�\<6�8.by�E?�hX� P*�=O�assets/webfonts/fa-brands-400.woff2000064400000214660151336065400013014 0ustar00wOF2�
�XWIyX?FFTM`�j
��$��I6$��D ��[S�qDq�t��x݆�yjfk�0#z�D�Pd4�8�o�����N��3��o�(hfjB�T��4F�(�慵� �N���h�0��Ch�Y딽\��<^Sc�F�`�85ѥuɯ�m�����"B��@��T�,Q���p>"�D�6ڮE�38���1<�l�r��o�*I�8A�SY4��[6pϸʲ���ED���JK+Բ���y��?���\rYl����O��{_aS�{�F����}����>�/bM\
������I��hP��ހ�\9%p�$���
��Ϊ��]��rȈ)�c$xp��{D�Q�'������Y2�}��Ҿ�6�(�%2��D�R�?P:P��R��A��R*
ݚ@Uh�D��O��?`�&nL�:i
p�jh�b�;t���v7�
�r6��w�w���Iܱ���]�$@�
Q<$�$��F�ZV�xi�
m�րB
1���{�>��А��ʒ$T��t�
������\3�9O�!$u���w��~.KWRI.9�����r��)И\�w�-\�Es�~���,�o��r/�$�T5�><��Cϡ���]Z����vG(n0M�M�U@`l�`�@�ڃ�Bqö����h��
3�AUU���g�Er|
��KM��:����[U�����A�rxO��<!�7jq<��',6�8W��
$���Sp�� Y1��L�M+�|c��d�I��ٴ﫤�Uv&�˖i�˶��%[���{
?�tڝ��{l8"�h>�}�վ;�ݶw
�LY2�3l� ؓðg*�Yl�˾�
��c7<D��0�������pE�VP)�J�����QIk(��p���D��f����ْt��m����߮�V@���$����U��%���o�gS��_���\�!��(���}���@I(Y(�P���i��5�����~�OyC �R�!HyF�'I�$��nC�B��v��6�ڢ�2�՜�CM���R�r���P����_g��Aߕ��a�2v�廫�u`�B��]�uXQ�w��#���) ��\�~P
�A)(iJo*�fL���h�/)O���S`k�}���䯝H8�gw�7{�R��m�i�	""�H��[��_�v��P����J��u��A���W���	��m�����e�]�w��ԥ�����v�*�e��+�"��<�=�hg�MB"�0��J ?+[4����r����Ff߾�\]��ϡ���xF[|�n
����	�s3]m��?�q˖�@��l����'�u��#�p��d
43�.`dt,\Jfly�`Ş�'��`�� #�7�jGY��%�5Lm;�j۾��4�ΐ�̼�m�-Y�b�M�vH?����z~�I�^’�����l���|��������_���~����oԝ�6]q׷��}(��;�3.�Q�G�q��p����?aŇ�I��SM=M��3$�fr�1k�Y��	!��t$Ը#�ƍ�SXI���>=�l���+j���`*!#���q:)^:]>6j�>��bz�3ʿ"�[|>��[�}�e+��7v��)�?�~|��J��C�6�5�S�D�yr�q�A3>���ك{
YiI.�M����ӟ��>�Qڭ�!��cߖiڦ*�<��т���p?�/�g���檸<�g�*{�������C���^v7��]ȶ��l5;���e�2_0����&��c�ϐ�@�=����Oߢo����q���c�c>�~"�����?|JAL��R
 I�|�~%�/�gz
�̨��P��ф�]n��b�b�\����bEm8�o/ݓ}�S�nyabg�>�7:+�O�㏼D�|/�K<��<�9�V�]�H���?�	��A�LV�1��~�4ql�벛-a�z$g�ˑ��D���hi����P���ϥg�V���#��ma�	�I�Wf�C@���ؽ���z�t��|T��L�S�il
hܩ�J�Ҧt���^�D��8<��8�\�������h�Z
��uh�LU�o=���.a�Z�i�}E�Jb!1�
�4b��$�}ږͱ!�i�M�p��a�7���ր���"�(�����=�DVV�M��چr3��uYv0.�l=(ʰ
k%�{�[D��|жc�ZS��̈́��G@6�W�8޲�y�
f��%+W����x��l�c��m;�ԓ8:TY"�"v��rN#�&��YV[���1vS�Z"k��l�K�h��L��z�	Yk����x��X��~!��cބ�U"�V�z��	���J�TC%�
bů|֯F"QHQ�/��޶h�� q��Њ�wl7�Cv��U�y��f��	` â���UU�E���ﰅ��ѝlo���|��V�[U��5Mm7H�V��d�'+�$&{���2˺I�T�I���VcI\ �	
ڹy�U������ε�kjtgˡsw]��I�1��K$�H4F�[��@|��(D	vOj�V�X�Q
k�6ӫv�ȶ��\��\#��<�p���Pr�T�T`1�j�*.}g������{2;�7�T"e��
�1p�l2�(�r��@�#����s6�g�]��p߭�~�ߜ�H�n�D�4@�;��$�=����+��~)�z������v�1y!Y�~���(�2"J�Nv66�\��I���S�m���$~{u�a���;}�Z2l���<m�l�FG�w#�뒽h�aߓ��P.~���������,,I�=�8�4�~���>�S�� $�6�D�(��IG���.��I��A��"WʥC7τ��+�D��{�,�l�;�v���קc�9���,�<����1|--A�Ղ�*�ۭ�wֻ��x�>���#�=[��d��u(�ز���`�Ѻ\Y��y�k[Ǽ�W�r�l�\K�n�	@P!� �.���7n�i�N��*QZ'�P��U�2g�����j�ǀR��I�3G�:��.6;'�ZN^ؿ�E$Z��&2%�r�` �q�ʛ5���m����z����k��bO��d�,k��&b��W�A���UN�˔q��[��;�Ptba��(C�/�,i�	�a�l�-���P4e����K_��>~��G5gUB��<��x�*���t���H�S{�ՏZ�w%0�u�b���G�S�V��Cͧ��:�I듞5�v�O�G'b�E�|��>Qq����쏂�9]������S=�*�;)VVlnh�N��E[���z�ٿ�Y4n2��S�w�R�N�>ʤ�}�6����$I_\%Be��	Y.��H(}��{��f31�T+eF����R�r�;����M��-�3����CS��}f��@�}֖�7MW=ĩ��8�)�U��+n@O���Q��ht��^g�
�nO��sB��2�ř�Y	��4�.{-�JꕶC�{⣌Ex}��~`������6�kR��B�A~��!a����F
���<���hf-�E�60�Y��̉�u��\�Z�"nzʐVP�U(9i���!g�D�D�%��b�l��*R�!��`zEu��m��Hg������Ae�Bm6��s&�aZ'P�$	��-���
+��i��h��[��w��|;�|����%��|��,�����)P����u�v;���H>cdw8�G}W���t�ٕ��MU�(���cۨ~B>j�f�"�61p
Q��J���T�`)�9�ŨO}����*�Ü�A�(���b�/\w��X�4�o��T3	�~u��f���Ü����GHJ�KQ`�)Qv��Le���A�@�k4�N�HH���C���et�2J5o�L��j}�"���t�|㝯��~29���<�ن�-uB8]��bߝ��6
a�ps��k��W�5���{����K�&�����������~@僢:��'����vb����v��Z�i���&��;jܫ�O�Fh�@Ǻ�t�Jز|�!N��N~O���(q$閊dZ��X6,�n<�u6W�]��{�Ugq�Ȧ���nI���٧�3��j��bR�-���Ə=��,V��զy�72����AD��;h�h�6���o�
2L�^�C���C/
N����\釞����N�Vy��nQ���^��;;7�x���檧X+
��W�i�'��V�DK��T�ހ��������n,�9�}�.��9Л��d����}�ۙ4+��j�w�pw����D$���6V����� �.	�Ŀ�s̐��79���	�6��[n߄�ixz�}���5����=2����F6�����x8��.�.T�м�# @�S��;L�H�ɖ\Lծb�Ke�1+|��qM���d(���?�U�p����}��	We;���B��њ5%X�.aX���h	�GȻ)ҡՂ�n^�8�@,Հ�R1E�'E�Č�޲b�םq�h�6w�z��%uŶG�F�=���4�u�Y^ :^b�qj�<��E%�ܼDp�T����/�I���Z,���� V>�7�Vr< �L	V>��b��L�-���H���G��Hr�7sX�%�Td�G�k�S���ūB�'$��u�R��� ~��V83�2K�0
�Nrj�7��05�>�N��ë_��ŠZ}62ұ���e����v���}2�'���Z�!��Rb{��'k��t�Q%^��aP�{T=?콍�Rm��J��F�0B�91��Z�E�XP�$L�uM��2�6���-N�؜V,�υc
O�"��#x�E�|�ÒE&
�-�n6x���i��7�'��L�����V�������_��`�[M_����0��A%�Η�}���b�/A���F��I�;���(�@|��������>��ǝ��G����Uh4�$I����o�W�Po��FE�p����3;�n\�7��[��'���!6��{m��W;�4!�7�������v��� �������s��+�+���%����n�8������;?�p����#�ɟ�R&�5t�p������m|t}lx;��j�/Ų�N`oM���)[�r&*��S�a��J(`g���A/��F3FHO���RR��.�h.\�?��k�c,ȗ|{&k@�|�JE3�T�{�=0&�"g[V���
�7>�$��0�V�?p�M��/����3�1�]ZR{�3�f���.a)�dCE���\�9���w��{R��?3L%��M!�73k��V�	�6�G#h/$�7R�v�6�u�B�nbpn����j�S$,5u4nb������R��B`��:�=+�1E���}�|6]�����w�db
;��c�Sl�V��/�^��5�U	��%H��E�*� �����,HQ��'��qƌ�{-3���h~��I(�l@	z8		z�}�\� L	�ɺ�͌�&t]6UȽ9	��aI�&�X&B��A:�3S�^�J	��ɣ���))�ɱ��0��:O�M{����%H�h;6��מ��=���/�8�iS��}ŕ'�).�/�ɉsqVDi���6���k}��<2�1�c�YO�$�r��޳�}��~v&��f�RC�%���!;�MQ�/1ܿ�r�D�HpJ�ʪЪ�x���|�o���� .-o���L>/b�b?�����,���b�aOꝧ��v���>y�"{}. ;]�e�y�_O]�`���v^ݶ��`�:D����w.�K�ڤ��	A�2؇8�Y"�7��J��T�e}H�u$q�����l��b�p[H��־�|�Sﵩ�E�"�us��l�S������#J����p���z;~�tm�\&��;
�ݤ��n)�K[�Ňq�BUM�����$��Ϗ[nB�F�,Χ5(Usb"�&��ˋ���xҾ�o�_e��q Pk�\�:����Q��H����&;�|���q͞{��넊m�R�5�Z�6���?��	@�)��	$�&��wq�:"�bV$}\�2���Hk\��l���^��_�U+���ys���>ȁ��9+�J%��0�n��=gj���W��(H��oo��nw����?�-d�w.o^Tle�f�O��c�/�~rr�W��3 }?��F�I~��C�g�d�p���=K�ޮ������<������V���b��ߙ	��[����4Nݏ���nk�
���F#�.��{�h�p���ލ#0x�LxG�6,=�c[ņ��:٣O��F��tt4Z$b?����g�_�7��ƛ���S;�����<ds���+�
���7��	g1�js���	}��_u_s�8�c��<�-���»�'�V��aF�����ο���`⃁�BG���Uk�s����1��ѥn�
���`ddq'�J�Ǎ�U�����!P��N%̘�;}jh�@�T ���Oz�Ø3wW���?
F��V�,��h+܃Ɏ[1Z�.Aq���%"�^ِ2�y|�diBE�skP��qN�$->.�2��J�L
;�^��R�=�i���,J�/g:��d�]�ʏ&P��?�9
�'8M|<n�sg\�]v�/]^�$���e��-������fAZ�~Mt!)�j~�5�0���t\���{�x�i}�lY�����>3$1}����o����̿R���'����.�"ݥK�,7�v6��dh���]�(1�2pOT�����9��!���֑�}�,H�x!�F��c�~��%V(q�W���H�O����ʂm�f�陡�;�%�ukH��D;�;�c�9(��Gr���9n6�w5�[�t����Xck���v��#Nk�eb�*"�ߦ\Tv��]a�.U��ʜCr
��x�DEXv���>�C���PX��D��o�zY��~/�5G�-�'�S�[4c��80V�s'����R]��������������e�S�ܡ)D���m���_v��yT�.���Ƙ616�s+G�����.��!�-t��������@�Kn�� XQ��@.�x�I8��Hs@��iGTj���D���!-|(��eP�����4��;��)r�/���W�h3���_Zg��r#=�BT��b���.�jd�	�>���(Q�)��,L�4�$��H(4������3"�6������5~�/&>��Y�E:�FR�RV.X��w�Nh-��Ù�f!�3X��@�����ho�|���L�4�`�p�s԰�Q1^�T"�%�C>�
��^@4�3��i,!IEa��	-^��j3��9`�~�A��-�'���
���9p�lF�
��g���B�9q2(�c�SlH#�sh��VE&pm*��7$p�[?�!�}J*R
zһH/��+��Q����A2-4�u���������g�Gkp2�N��i�f����B�V�r�>p��a�����خZ6�M��z3�`���3�$Pr]616˘z'	LmE]�R�f̩�(��֖8.n��ƙ�<��H\ʲ�z�د�;�D�ѝ�Z[������:=�o<8^�'����$1*������|б�@a��|��0�F��ugY�{��V�$>\��*|�i�xj�]a�)��X��߃*�~�)��o�D�S��z���1P�P�i`S�T62�tu3��˿X -i��+`Ųe�����}39
�Yt�%�R�����O_�I�+���ۉ���hT��Ք�������uj��?$�{���\�;�
:���-�1C��v�b�
A�7��e����؊I?������G�d�.��j�����4�����x�Q�bie'�o�Z|���~�i
+A�N-K����H2q�U:�ı���[3����=#���Iţ��ڰ�wQb�)�ic8�%�՞�N���ˏ��MOt���ʽ������u�TWv�Ƴ_ߺOx�K��V�ER�wW׿��]����Tў|�k��9�|i���]b���y�r��9��{�lZљꌏHH��d�]���3rF��DZ^X/���/�OnU���>UR���3��K�jU
�.2�Fd}Wm��'Jҩ�C�![r�3g*&gfX�[�~Ph*!Չ�
��_�ȝ���
��g>���2VjF����=�l�T��+�A�J,m:��^wN;��4)Y����3�Q�%IQ��B@�a�Փx����O��t�"%_ �0�y�ׯ�&�������k��2�A�K_�kcT���-� ���C��=}����XB�_gYX��� �6s
�xNΧ¼�CGt���}\�(���a:$���g�%qC���p��lG�Ybf���0�ag��дp*+���e&+&�x=Ԧ4�17�hv"�Q=�W���[ɴ�V���P��+针<)
��U�<�p
%�Ti��I]��ɨ�ʽ�>�/XEc�B��[�"�m���{k�qp�qb��[pn^��T?�y{<�[$-1ܮB���(n"�d��C�Ԑ�/'��C9�A-)���Ÿ4�z�GZ����i����?�"w�d�:S�^ë����+�/�����S�(A7'{���^ȟ~�W\�z �q��E����G��
�����Nj�`d��h�|�	����v]u�Qw��F���fh=��}���X�l/�ln���Cs��$
W���R5"l�}Җ�C��n2��Ki�dQ}D�dL��닶�T���FRHx�����!ֺ�8��_!�O���W��#��>�M������ǯ3�?s?��/���x�ãz��y�P{�ѕ-B��xx���Y�/h����}8�.Vܕ3H�3���8�˪:�V�hd�e��DD��ҰZm^����l5��Q-�
=����%Љ�5|��ɭ���w�)��vQz�Tn;��8I�s7�Q
	�RR����c8L�4�g�]sئ�e�`P�k]�N>�I�	���v��$K-���4��b��(rl�z�
�n3TR�W��ϡ���%�v���}'({�w��B�:T����[����Ew`�Zˠ��)���滮�o5'�Sm��a��$o|�$�>#l�z�!~8|#;))��2L�闂�<#���[,mp�<������	?Iٍ�q�����/��#��L;B�� ���m%%��eٳ�q�t@?=��{��O��E@�'�?����8$�:��E=�?���;	w���^�����\��om���9������o&(��(��	(�v=ɹ�{3�.����.�
��J�EZH�*�<k���D5�+������:ϥF�UT9�HO؈�qdF%e)��r(����z���$JN�����5R�Yn��Y�5I�~���luuXC�l�l�y�Q2p�f��O�Ћq��W:�!��h��!�w�éA�
g;��(Z����O��U����7_o8��L��D0<�T�5�j�1���4��S��ZN'�?P�j������Y��j���v���£������r.J��b���Ɋb���dzw�q��h)wk�?��xo�'|@Ĝ�B�K�����,�<�V�6��@J��A2
��܃G��+���*6���1Қj�8+8�X$��;��b|�vҗ2��DN�ꈰ:s.��'{_�l��M����e�mأ�^(�X�v����2+w&�r��Pkn1`Մ2��-Qd�쾚�-�l4'���`��2:����X�-��H�p����8;A)��	O��G�5�D�1,��
������ڶ��=l4i��c{Q�&��U��;Ǐz7����P�J����29�{aM���I=6u�͜���8:6%���(|&�)�*F���-��.�XÍ~����]��jM�#0eJ>���$M��SjH~��p
s�]��@�1vA�5\SC��h�^��o�i7�RO+��Y��w;�`<���Y��ҙ��>r�Q��:}8k���O>� >z �Pm�nk
�ܹdž�u��AB΂�\���`:�1�L�^I����\]+�בc��/s�`)��j�B�#|�g#�$F-��gw�1�?zb�;G͘
�3�u�)	Gn��'߶
���&Ns0�z0��pyyi
����ի7�c9�Q�N����,��%��Q���^��^�/_�ҟR+�`b�U�O723j��B-�f�N��Yp'Z��cG~NJѨ��=PU*�>���Ǖ�a�H�I�[H�_^2���u�~T��7�eKM���kb����+�N�k1否?}�>XB����>uv��ᣡ]I洏�gG�Õߨf��������LCÜ/��7uJ�mp"�������DIFP�—K�]DV��8�p��q�j�T�M�k�߄7aό�v�?�����Fy>W~8�pCK���z����
4�I�p4Б��h�m+�k3M�������$W)<���2�a�UIJ�8��/�	��d��|2�5�^��.P�lV�g�g-��cf���WG%��`�T��EQ����G��R���G���@X}X��\@9P�:a#��L�� �wY�C��\�B_�
mR�2Ps2���1�3KxC���YVN�����j��o��Vim��T}���a�:�!8���"���2���W�Owc��j�8�����Y3W�0�X����*uB���~p�&utNM*���2�%���l4�0��Pt>͊����"r��l��u;��o6�o9	�A��
J���*�\��x�S�ݻ�‡7�
�Z)�n�o�~h��Fl����g�-�X݃躀���A����)��3��3�ӎ���O��RI	�i󛛸���9K�D����_�����2�h&%����ۜ0�u�)�T���aL<��t�Y�|+{wv�t!Qʶ���?%sV�|%�o&SU����pP��>x�=���hp�
=�,]��g{�]ʜ��%���]���'����g�$�N�q�M^ڨ��Ԭ���
�h�!�N�L�Z�	@�ZT#�S�\CK�_c>�_�~̏8Β���
1�ƇC��(�A�6�>�ѣ���S�Ì��*�Y�vm%%�ŶL�L3Gщl����U��щ禗DK1��Ճ1�YD�%���A%���ND��?M_ǞD�CX�‚����UǮ3�'\۬\�ߢ�(��%d������6��<=
�'r�0�Lq^���H����k�J6|��ּ���zI�B�c��֌!�G�8��N�1���
�%�1��8ʕd��8�R�\��}RB��k����Te�1wx�)���q�^���b�Q�J�j��b��Y�x�i�q�A��0�N�H�����E]TaH�����xkD���Fz@uF��Se6�y~��z�56f=q��,_r��'�=lN����6�5�lqG�W�
�7�*�/��4�軅/��@��~�Y�˖����z��jD�+���Y��Q->�_��}��l� ���j��ü��jX���g�����E9��'��
w��'鵘S��o��D�Ꮠ�d��2�hta4��̹:�“���x�͜�"?���E~NH�/�S1�D!������嵭2��煜Z0����b}��I�^DE��H�,�J�u�*,W�#_�l�#��$��_tR8�̺;��O>��^{X�?"�g�cE����b�O�O����_����{]+6L�6�/����m���+Q-�E�9i��Lj���Jh/ճ��|2�$j	�Y��B�"�����7�K�C�vx�E*�^$R/�P�K�Žʙ�J+��Xps�)�jQ��Z$mG&Y$;asQ+0$�;��\�A_S�3����x�#�.��,DZ\sE�A�A�_�.l"o]�<��‰��sѵ�q�!��a���Yo�M�Fڣ;�r��b�s!y��_SGG�#ut�s�Y����H�O�B�X��� ,� �0�2���P�`���6�����$[_A��O�g(�n���j�
�ο~݈A}Z�OT�O�͑�J9rz�t[6�(�;�n��|k}����
�6��)|�f�4���T臝���d��NG��$'Y�M��%���x������z6���%�(Ŵ):y�U0	 c��J���7��p�|a���L6l"�
���h`h��]ҢΜD$�n5!��ɚ���`?�F"J��0��Sӹ�~���9Y5m����H��6]e9��7����sJ4rRQ��֦�Zj����P\���a*�
�_�J��H�0�+!��y/w�z`�R/�4f�9z޴FJ�c��/N�� ;���[�W�~�������
Q
9��r��ؼбR��P���:j�f�)�P�N�>�P�oy�*ҡ�YR����⾅FiJ*��<�������h)A�����ܪ�RӸ������;�*�*�(�$ecpE�R�t�)�TP!xJȅA�pD��7��M�o���\�2���Pv�[�&�X�S�4���ç&b�K/����	��x|��_���dv+�uC��d\�aoU����w�6C��s�~�Į����i�|��_��;}BX����M�{�6'������/,�h��G�UN�$i��	�
�dށ߽wF�'bVQ�~ȡ�"���ivjh�����x�w��&�~0��Ii�g��4d,p26��@�����0���/6�J�3���n�}<=�j��Hšc��GZk��oG���4�.�!tQ)q�R��!�]Hx�s'�H�N��q��V
œ�D�ĆUk���GB>��c��Z8ó�����������<�O��K�a���٭E�3l������za$����	���
���u�@���J��F���G�R�q�7\;��py�j��x^�W=�wysfWq�ףb3�[��fʷ��԰�}��i�J�D�3�
�����zy|#U#�YGN��4��#�����p��&0?ݖ�b���+���Y�ҿXor�e�0Ǵ�P�J)��*[6N���.t�2��~5-�_7��yp����'w��']�o��ed�<9���}W�J��"+���&��(�w]~��5]�ZFJ�{��U�#��)��Ù��ϜT#�W��͑��r�~��8/�	�y��έo���87]_+�<�a���H��J�Gy�Y��L?�Ӈ��Z��Uz
k���2��g��Q�"~�jӜ�^?��JYqT��;�K�b>�a
�(���Ȼ�h*X��)��E��j�Bk�Q��:�5��*��L���s��Ү���"<�)��L;]D�,��A�)(��^.[�j���d�5��j��|VDָ�c���c�H�6'���$/ќU(����bU	�x�y�vq�s��?/צ1�O9�7.#N��J�R�8�*lm��6Jah��Ք
C���a��w�h������:�bn~�Eev*��S��%h���)%�⠠8D,�1)�"7P���TSC�&�H*8*�34kr�3�e��BP���}ⵑ���N�B\8�i1�z:���FS4 
&;�ܛD��@2D���"	y��9�Z�Y�J	�iB��.g�Gw�@n�aRg�(&�E!<��ǂmT��- l�*��@��2�Q�'��z�+�~�����ڳ���h�h��~!Eo��_�U(wr+�%Ϧ�M�Tՠ;�zg���5)��F�t��*@�nb�oח����-�d����e�l�p^��Q�f�)����I�o��a���(7�^홿�`�D������+9վ�1�`w��D	j�O��wQ��Ez�E2}t[7*�q�1`������(P"��`D���"�.�%�{qu�1�Wm!��<���q�s�G�����38Q(��`�î\� ��="<)�ůtj�v[1\0��.\��ɵ��Uh�w��b~��CͿ4���ys���ŃCs��b�{G��~�xq0s���o�K��iB�s�$�=t��1a0�>���L+�-BRb�m�2;�o��
~xi�����H*��5�PJ1�Rt#�C<ݵ��ťq'�q�/nI��Rm�KUe?
rd�In��!K��9��
}p�o���Z)��X�K��&�}nt:�Hf������R-y/94[m��B�S��آ�
ǣ�5�K����Ȩ���:��S	&kb.y��%U�3f_���l-�=��3��yFώ��&��G	"T�uz�V�/�z���H�D)��2�Y�F���UΞv����Hg�I���m�����#����C@�hq=	�5�zP��%@�Iܩ���M�($��+�<2��;'r0|Lʄ�4:�\��2.��'�…�0$�8�����@������0��]���c|G����{܄�x�X\Wڼ�-?��V7��Pv�B�.'�"��@*��rt�>�����0��>��ܬt9�%;'+յ�����մJLʄ]���R*��l�sco�&3�E$�͔��R��}�ʨ���0���eS�EZ��2ʕHF�)n�`��S��:�?@�9e$���E�b�sZM��uF���?8
~����]����S`��ڙo�]�кc-B���R���`������J(]$�L�~A�d�tnr����r�7��|���])�/�ɃQxI��|�ˣ0yM ��=���vz��*��؝�k�ymc�Lt�m{�������p޳�	]�Hu>5K=Ȅ��^�Ƨ_���w��u䳣�D,��ث6a<<�Ç��!T�
�.�v:ς��
���J���@{Z{�8t:�
*M�����8ċ��
2�4�@]u8(�a�/���䦥d8�t���������?W�MzӫO�)	��A�#j�՚��vJ0�>&!i�+'�NB�J�|.�sL�@FYǬx������D;U�HG�g�<� Ib�;�6
c��D����R�|_}�"�e��wĉ��O"[���%4X���3��D-����jq��g=�k���2�BV���DX*.�bӤru�Y�P�^K�L�I"���%�Z-:����R�xl�7��X/٪S�$�W��U�?o�s���UT"����b�r�;<���/3�')�Hx�•�BHU�/@і�Ӏ��S����(Rh�9A	�p��y���q�,�� �z_������X$ �D(n�(�(�*��@7��֬������S����8FX~�4���f�g<S�v�kdW�)��AH
�G�\A��
rJ2%��AJ��a%Nu�<|�G�
E>�XR�A������o�-�@	ܻb�ґ���J6�]=�� h�4?��e���
wU;�L-�IN�Z�JYmj �H�PrO���@���h#mJҾ$b���f��U
�-P4*�
0Ĥ��r��f=_9䏄ńիB�y�!Y'&ݧ"Պ�q��]4�U��/%��*
K�4W����t9]��$���Z�t,�r��īB���)Q�&7ul'���K�z��67�R�$���.��8�U	h���X�r��v��n��}k2��M�������CHs�5���x{X�z��3(/��ɺɚfY��lPP�U��с�k-ɥ�:�%��*�K'�oY�g|��a�ߦ��]�x\T��B�8���U�$�L摡Ƀ[�I�|��Y*@+�*��s�=��v���4��X��<`���l�E&4�àթ�֙��]�JBTY2�oU����+��te��2Y�Ԩ6�dahu��C���4���4Q~����
혰h(����Q�$áӫXs�E�|ig�zÓI�ʪ����5�|�4���A��wP�q�&�Kŵ��=�X��l�1D���KT�vNb��n;(�)n�p���&K彖�����G��.���ɣ�K}�<�8�V_�Q=\�]�����6�3��c�zi���^��?sjڵ\]]��c�<���b4cK���X��w3��u�A��Y.���E_{_5"]����i�$�-�d��58m�^�~6�l=���dS��0D?�C�����b49���?0�t8�9����5M�5!8VrZ����)aB��Q�-��<� 8�;�6��%`A�s���޽�^�$n~n�l8�x`(���1��N�t�N���IWi��/�; ���r�J��-�Ww��P6"Dc}8����kD�l�;k�uQI�y[5��s�F^�u
_<�QzU��l�Y��f�ch������$�W͸����	E@>^c�ź�B��is�{�r�c���q�
Ycŋ޳Y�r	��� �2ܐ왘]0�ΰ�ibvEw�j�/J��ǭ3�k?o�yRz@լ����C��v�VcxnyxՓt�g�{��0��.g
[y���[3{9#���ts7,��caFa��3�ʒ��u\xR����_Y(�A	D�
hl�S�j*���=k��y��Ȱ}��l3���o��$صi����	�D���]�ۥ�•�� �@����2�]x6��/��zs�����1Ϡ�b�K�)�1Jdo�ğ��%,��@����Z-�J?l)O{�j��)��e���cy�H{��_�=��������k6w�,�ͽR�0���R��	'(�v��m}
aL�D��x%W���߹an���Yy�A��l��N�(�j�蠭
���9��8n�Q��R�탎E�Z]�p�PF�����? _��gN[il��
͊[�қ�s
_��02	6J���/FR��N�
]}�|M����sd��XJTG8�[�5���t����!\�zT�5�#!o8�n�R���*-_�OڒnR ���o_��DX�TG�f�]F��x�V���c�� s��ٻ}'�Y�}��RL�W���3��{�g1vn�k�/YR���4�\�ᓬ`�ey�~^;:%*03%���>n���xf�j���hto���|؜�-
+O4�2~���3Y�%���<�Nw�J���/���N6�{~|��@E��z���>�V�n�RS	E�S�NN��0����}�EQ»�p��)7�9(��00M=Sx��W��/�,������w��P�5ӳ�V�W*�.�"8vt�Ph?5���Vk�	/�X�7SU\K��4M�^�T-@t�8�/�Ds�Y����`��Ż�P��ﶶ��i^�|����I�s��+�D�-�\��yv��09^&��4��se|���iS��z����������˺9*D���EZ����H�%������<T��� Pk�j�����Ҁ���)?,[�e�����Ojc�j���i�`F�D�IH�**V@�׸S𛼻 y�^����Z`�c��E~e�9�2ʎp.\�P�ož
"�r�`e��c#]��26]g�Y�����~x�^ͷ��v�F�k'�}ؽ|��������i�(�|��~�'��vt}-�z��Vy��GY%�d��!&��lp�
�ݭה�ڬ��^�E}Wf�>])���|p:,����f!L}�Y���k�������lp����<U|%/Z)�ɔ@#sW�*Ru��t�
MMK����E��RSo��%�4�h��<NW'�Wt%F�����8�}'��1~�5��O�|���/��No���8˪����U=;���<8�F�ѽ~�:Sy�w8QV�T��4:�2�mv�Am
�:0��u��>�W)+�fu\di�Xp�d֒��l���$n�A�x<u��fǛ���t0bMU�������P\�,ര�>���$p~<J�+
��ķCG���\2!����E�;X��h�M�8i��U�P�c��pcL��ð�9ut�c��&�G_���q8�/� :�*��|Y�;1�0�v�U\���=\���[[媳GUkk���*��-��"-7y���6	k6\||q�h�ܬ�'װ����Nǁ��I�$C�T�(B�Uo��{щ��n�bߣ{�<oT���hU��V��ع�V�I}�Щ��]���M�&E|�����?�B[�y;���
��i��|)���o�G��aox�$��8���,���!�3P�\E��/��8
-�s��I�����.��c2Ҍ�v�i����>�+w�~�RJ������D��5c5��,+�	3��)�v���]�df�v3a�6�ؾ�.���ߠo��=�枰�?����I	����]!+F��c����*\EUZ�d�pU
l��9��Y��� �%]��*�a���vb�������A�q\Hrg.�?�8%Kε>�X�l9�)�O���G·�ӗ
_��b��7�ՠwne����ށp{ό�"k��j%�z����z��f�ͫ��WK��h��”-ɐ��4;��%�M�d�g��c�R&2~�e�d�)���#��*	*�	�Rȵx���:K��i**ٝ�g݌M��]�(!��y8��7y�_���G����U>p�a�$��zj%KQ�Ւ-����]�&}ir��R��<��v'���iϞ���3�����`�J��׏�!P"j?���u�UkU�>���P�'�7Nf�l��H�@|�xT;���a�=e.Vq7��{�[JT�� -<��I�GM%��S��4����M�;[nFt����@Qi��P��n��7>׍7�5��f��m��F�
�+T��Kpe[�Ww����͜x��^���'|�s�T��mf���w9�Xc�����~�\���*�<�7�KP+<����V@^Jo���WzqD'����R�<Y���}�a�S���1��2A�*�[���6(^`�H�"�R�%z`�C�$�do}��'��q��y�QG���p���럻�爇��|�_ŘZƎܭ&&�&4�!�@��傽��
��ș�i���<��eb8��������f��֬�.�n.Q�w��1k���r�5�wq���U��q���X���c�e�?"4��t�
���	6ӑ2��</UO�	��$l�4��C��RT�c�v�;���R�M��1n�Š0'Ts�E 
��ۅQʎ�%TEOt��2��s�#�3�2�S���`v��&�����e�R�@��N�,Ͱ7m��:�2*��-?bӢa)�$IHZ�.F�9�b��+,��X�?���fX�&���]۟=ȏ�1��JG�f���\�7����z���$�p�{g��{�<F�9�
v8`�B^�<"�HH�J�aW���g�E��B�gC�B3G�-�����!GC���G�2�9ҭ�Ʊ�Q�(��	�/_C1T�(I�w��9Y0'���_C$�Y�8Z����rp�_kP4n@F����A�V�E�_�Q9�/f&Cz_�ZR
�~��xM�(�=��ohIT��%bkI
�E�Lb��-��'�Hl��_����q��Y�c���t���Bq�M���_>5ʏs��-�(��=��`�,��#Ϧ�bAKKP|w�8���t�q�?`����i�Y{���2�*@k�7����h�"��J��i���N�T�Tf^4�z��K����7;�
��Ū��I�6�*<E6��T*��ww�l���N�❠͢=՟��J��C^\΂R�Q ޝnN����ԇ��ų��si^�L<��kdɐ���9g�_�?t
�@�������`���j�<E8ia�������j�㘚�<�ir«~Oӭ��Z�S)eLhV�Q#�W���Q�<ʯM��q����%N᠋�h�kQx�{�
�+�͍�~	��8���JƧ�	�@q n���	��r	H��M��J��V\U
t��A�J�kA�^�>��˲�M?zV�&�*��YknR�e�mw���i�Ͳ6L>�`k
��LE���,�q�zR�
��:p?��P��בֿ)�d�C�]b���k�T� �3�شk��(�Nq=Y���dj�:d��Xi���6k�>ON���Y:cRD)�G�C�TÁc<ē��!L�ȭ{H [��va���>:>c0A}�x$�/N���N^�+���h��+߮h^�-�
�~-	�e��z�?�[�g��X3�=�u�ۺ
)�5�G�H�q���T�Z�8���-Ox��V.rS�t
f<B%���ǂ5
��켖ʴ3��;[!{�Cʹ��qnJ�j���z�Y�����TḝO�`+�.��N��8�S)�#�w���e�n��*�gg m�0��<_�(r]��:�	0�������IZٕ Q��Z���ReT
��2KIG�1@��c�m�Ƿ��L"�p��y�3���.э%�oOQ�7�zC=�,�MF�@������!6��Qx��r�SFi 3�;������zz�#���kuu�r}2п��5��&�X�Nkԡ-��J��aT�z�
�ߣv��㺭l��N��A��I�H�L#
��N��-˹�w7��g��Ue[71��Y����o���J�U3WZ��|w �對1q�F|�J|.Sa��9p4=���x�1��dO�wZ͉֨�������tA�0�z�?;���h�m���
�I<ƀy��$SLiM���o)4\YI��g媔2|�MWBQ�r�ϷB��N�����!gg�o�U�~��#wbt���#�緺^�C�D.�'D���GȄ��8���b��C�-�0<��cN��W0��J�P������X�8lȹ��l�R�iul�'	@�2�L�[�'���0��"�{/�H��
�O\�
�U6׮`��]Og�g��P�KD^��E���h��&U`��P9Yᦞ�g���N�hP٘��~�`h��=�]�=�2���;)gJC����� ZU/G\����_3���r���Ѣ�KW�j��t�ڇS���k�{Y�'%Î�����R�桟��}���̧�4�	̯b��oy�����%�Za�ay�oI� Q�ĵj�����j֢\~g	%��X�6�ԅ?�J��"�R�p�0��)FCV$7�:�������i�&�ٿy:�Y,�s�I?Hѩڊ�:�@��R-�-=�� h1!e�9\l�-�~o��I3Eg=�$����C2�I�֘Bט�K�N��C��|���#����_��a{yn����Q�G+pv�dn���9Q\����'����*�Q�6�\��{Ns��`�F�<�1�|��ݝ �{��^�Ds���i�{��_��iC���9�<���Khm_�]�
/br��e������_��n�J�{8�Vm������㧻Of��|���R����L
*��o������e��"�%_cw��VU����Y1l�f�1�R��/��)Z�Ò��K�'E�+'���iZ���3�Š���Y 9
�w����Z(<���� ��0�y��~�Z�~A&v����	����;�j'L%7R�8�N}��7{�\�
N9�pg3�Ҍ�}Wg/*Te_Q����y"\KUpU����	�dM��r��4,��k��r��.��tp>j�&)�ٰ�q�dQ��n�ߺ��	�Ђ�07{��W��V��c���|���ɘu��EW�o�u�UR�*�i/@� M�6�/�Bȧ��U���x8�;F��G��CI�+���ʂ�퐯�&��+?б|��K�'$,���E�T�f�����,1g�6�t̆���-�oa��7�[},v���Ψ��	���[7�@��`��܄����w�r�[ݴc�E��_�o:� 3!zb�1D��	"���Yڒ+6M]G�T�i�o2���`�Y8����-�fn�O+)9۸�E���2�aAv��3��������Z%�߽�|Vd�#�&Vu��́��e�ٰ�73�J���i�Q�W�+?�f��"�)�]QL�N:z�g;d�?�#�9J�A��2���=|n
�ް8^T_v熂D5Uua��/�W��,�G��\����	�n�]፶.=���LS[������-���������B8q�ɺ�h��X���e���?�
�~m�(h�N����1%t�x���͐m�E[�����>��"}fF8ܪ���U��Z�l�@��}-i*jX����ޙ�m��a���hN���ſ	V
�]#]')����<�Ǭ��mc^.IX�>����BWǎ�Z����~��@亨ȼ�
����y�$�z6��-�����Hí�"&������Ϭ%��+�ҟDL(eE˟)|dR�)�����Tp}�����/�f��ą�s�֥n\1�֪޾y�GYY6x����c�?��U�<Bߕ߁�]8�c[�����f�p�ъ����3�)ș�Ss%�q���F��srmDܵ�w�9�Y�ul����nE�GW�o�[��v����^9q7{,���� �̊��Ml�A� �HŢ�-��c��¥��Y���~Œd"��<�&>���s�v�䧻T�`���nd�]�P��,m�a�
6�%@�m���7n;b��a�I��v��L����dc���u��?YYm6������OO��hyOsܿ�^�9M��7Ν�g4@���kW�<����s�?]�dj��?~��I�Z�
�$�M��)G�r��`0uH��7�
$�sxVrF�d(�U	n#h��HC&�̟�c��M�J$���G+�EJX9�*�Xy�Y�O�
\x�]�z0Z�2˨�et�)�&�:�J�	�j�ER)�20�6ۓ}Y��
�g4�B��}�
�!Ɍ�0a[7l�I���6����,��=?��$�4��	`��?y=Z������a�@6�$�sɰ�=����\���:�-+��m��k*��ao_듭���Ҽd�<�@�%V���f	��"�ȏ�!aO���9U�-�C�Ӳ]�gE֍��e6e}BkZ,lI�(h����f^\pK�6�2\���05B�8�ܩ\���\�b���Y�1iȪM����S���V䤋�
�5h!��!.�Y�/_�`![��Gt�cr�-��)OT�d%��e >5eZ,��q�}\/z���ʏy�2���.�%J&Jci��4�B�D)��9�.zB�Z<�$q���p����rV��ҷ�¦0��MQ�8��
�9�N�8�h�^��ڠ
1Wc�G�Aȕ�3�WPm�Uc���4&͏Ъ�
�p�F=@gM'�Z ��AQ�A^�ĺ�# ]pҨ�
�5�w���v�,lZ8gw,���
�U�����إ������>��5Fc�0?=ӟ�ѭ;���“��i�&�ƥ���r) m�;����0�vf��>�4/��B
|!�s�te��K/���g����ߟ[~ż�-��18n�E/9֒����������@SO�׊`n(س�A��19JH�,j�h@Ӑ�h����\�lJ���3a�Ͱ��H^t��x�]�'�y��?Ɵ�:j�
gn�d;W�†���/7�8��k�s���Bi��5���i��x�`��)ד��]���ő�/�b\��%c����1��*4}��_5-�����.��˹YUw#�)禌qUY=7��ѢE2����`��õH�'@��f��W[��j/�eQ��:������Qj����l�%�4��Y����,)�n�[)U�[�N��~m�#�I�
�c�(P3n3\���$k`;q3�t�̉M�����Ǩ�ᄏ�Q:�А�v���M1Ȗ{/����*��5M�����A�+�8u�!?���wST$r:.y	�]Ǝr��4J(*���6h�_/�����j�8�ɔ�q��
�m�����_��>��������S��/-|�\3'7O]nci�A'ym(z��<�#	{�Vw{Ng8hS��Ȉ#6�hfU�Ҭ��ϻ����P�n�p4KT��X�d�G���qB��H��_sH���.N����tR��%��Ǭ��l	���-峐y��S�{�-�jFN�R�r�Jt�`��e���N��q�m�~���~�Lø�LW��\�0a4z��;G��S����ذ��8P0�OqL1�3�g/�uS�N�$L�q�ϷgF��:����ݶh���;W��ډ>ۓ�&���Q6P����)|�g�����2L�٫D#Ï��OO�\�����7�~l=_ARG����0md�΋ W��
�d�t.�"��%��e����5�G5���k�Ƣ~�ɲ�h)W�Vo|JX�>YYi4��1��q>�^ �����	�	s>٭s�T���P�G|�����[5��p`��/�@�5�� �X"n�z(i\��:	��Ɩ���T�2����
�H������:�,J�'ɼ��@�O�����5�#��6��>�D��<G�/h.Ђ��*�i+��Ʒ��)�-��[pR��װS��I��{�W™<&"�0�!��d�P�:*��*)��+zkM�Ԡ�I.Si]��*3Е�|A&�k�Q�?�yꬌ-�]�����/*�4�ǐ���ݬi7�Y��h�fy�Ǯq�n�r��+����<�9ql4k�����������N����e�����S
���H�;�P�Q\*=��ΏDv�n��#[���!��,e6�=W#psd���>W+=�Y��6��?�ڠ��|^��o^!J6�c=��	�fR�<5�U�E�t���dC+vQ���E�@V�3���N���np���b����%�g��ܽ��Xg,��V����f(9�8�AU;�oJx)��"/22�s��&�/��5kQtƢ���Z�L���h Ɇ'�xD�S�o�l�
^�5��Q1��a#$���w��-�oܪ:!�+yUF�k~9@�~��Bo������8c�1a�ı~���ǘ�KK�J`߅�Q}��)�W.;�� �K�:я�����(w|3\9w�"(�;ê�-�/&u.�����n�Ī��pn x���I�%N�/��Y�-���:q�T$�R��Ś1S��Tڰb
Ff0,`�����"�Xf���&����� o媐��aخ�/`��&�?4�N0~��i"@ڢ�P�2-8s���S[s�!�ɴ���cTQ(Rx�Ĩ���]�3Ms^��
���H��-��Ti�:�ȉO�inϏ����Ib�ɇ������:��5�L��Y�	��[�	r%"D'�L���G`$��I�a=J��bCn�B�Q�é�����sl���E�=0֢��i���^�l�d��t&��U�+�h�8���:]M��ë�OS�yT5��ל��n�yIU� h�R��qC;{��]M�
$N[�lӎ}Ұ�@�1AT���.O(*8��J�(�D��z�b���)�����@*�4�h�ЂŊ`����@_��(��	?[1g�i��|��o�.�V��1�hւ�^juyB�k�0����Q�"�mC�\��Qd[�Ζ���f�����<
���tSoH*��`�L�1)�.Y�T�������<������pj\��~�_�VI�|���K�K8-3���.���U�)ۋM��������r%:�Cu*��%�.0w\�Q@'F\�
=OƱ;�0��&n����fY���iG	/`�#[�#�e���Ø�'��f�p
	%�s�j�V��T�}6X*@��p&3�-�I��bΌ@3~���1���	�H�H�ҴR���M�ǔo���Z�"�FnAu, �	—�?W�5�S%Ľ�F��r=ʗ�6�W�~T�U�!W^<�i�r��+�pt�	ݑ�g���a(�XqD(m�b��W}������Bd�T��Z)0�����1��r�u���\�,7��HIk%c鐭�|`,z�:�Wh�R	x�t��S� �C��� :N
�9��4�'P�6L�t�|���(Q�O���U�AxݗƵ|I���0$������4Q/6������WW��փL��^*���D�+��A�,�` x��avlDƽS���9����}��Tuj �M
�m�
Ys��;?��x���uW��S�C�8<7)��j��7�,L���ɂ�WsĶ� v8$zo���]3�8TiM'`���'���CԼ*�8mI�q����Q��9�CGeJcL?�"n�X�+f#��gVR�j�P[��L�`(�E�aK�n��T:����$���°8�!�Ő:i�#�R3�g�!7;`���Zh�П@���L�ָ�1�����`*l��������J0���'#���`e)�N�pc�W�C�p�>@�&yo��*����)•-��]v��̹�(8�!Sӯ�S�Px�;�hٙ�R����+����Q������7��OCT��ig�[�*=^��h�#S:V�D,�#�U�r�����d�G[E;�'M���v�}z���ƺZ7Z��s���k�E+P�3��2tXpvV�
M�k�p�}��+�O�Ws��	��ܿ�\b/�#�t��g��R�g�V��s;�칹T+K2��Qg�
��-�F�?ԋ����]�&��j��CU;>� k�mux5|��7���x!�6�7swX��o�M�ɾCu~y�ȭו``0�R�;1��rL��ʥO���k�ҝ�"�r&����rUNr��b5ۚ�]�G��U��4o'�ƒ�-=J��q�7�.�֚|��y�’���X�H'Uͦ���N���*���Y_�CX�H�@����"d	'e�n~z��C�'�?�̪4#Hג���l�1|4|��@��Z�6���fJ�Pp��3�.�~��4�i1��sC(}�������a��A�d��+n�
AkXu�e�Z����
�=��u�M3j��YUi�k�I�[���N^U�#Z�������	*�!���;�uvd������O}c��)M��04�~��pPQ�Y�8ǹ�+��)�9Ԭ�B͈79�aJxa�ҹŸ-n��@Z�$wh�
~�ۛ�Sw��L�)F�k����u�C]N�d��?��8��4 <)�h[Xo��H�~��:�����n�im��N�r#;�{'�a�$�|�>5f��;�<�I㕼��Dpٕw�8\8J�k���|y�����ۈ]A'�y�"�p%a�ԊW<��@?�ĉ4���暑B��dI���XCtf�y���[�LKx�d���p�J��5��3D�(�s��C�!�X^ߺ���:}��O���}W8[�e)q3�iu%��_��H���|����"�-�8J�plh@��Ę��{�@�����P�կ�'&���i�a���]�X��1��dF+��~Q1��u���/��V��cԏǖ3�����������^NL���DOɫz �A��$x��):)d�t�$�/\�W��k��a�R��qXe>7�M��t���Oh�tR\���M�u�S�+������[Z�2��Ͱ���D�XWjCp�>
�*.&�]*� Oc#'>���j�:���m�q,�է7���"�bJIt�Q$3p��c��wĭ��Q|g��b�@P,-ۼ³7�n�w7W��l}��N��BT�ɤ"��C;_��[Xp�;{��2A2�֦��)�!�#�D�����Ĉ��NА�P�jYc41��")F�E���d���B)v�BA�]���d6)Ճ0��
ޞ�E���/��6JU�!0&iX�(V[-H�_樨j��.�a�
�e��|�ĕ��qԆG�|�G)��:�#[��jG��7�Xݶ��(�	�� �;�'׷w7���E/�Z�.��u0����4�E|E�	[��l:(�Ф�����G���k�"�OF�SЦ:R�2yw�do��|VX��lfO���`�t�<��eTQ��TOk7�|�����w&t�c	@#��3�\�Ձw���K�/]]+�;;��q)�tb�b�ԣ���£+/�N.Wa�(]=p�gDQԕ{-.U��N�a4p�C��޽������C���q���!4QZ7�w#!�4hU�]G�o�L�-��ӯ5� �:$e�ŕ���:b���^Rև��6���YNS�=�7�/+���IV�=x|��.XL/�.�B)������;�@����)���9�>/C���R1��p��x�B2�hLu�G$�0�c�A���^N��x�&�4��Tj�Ѓn#z�2�0��tN�/���Ƿ��dnɨ��tB�Ֆ�C��%�?���0?|᭠��O��+��Rw��,6��d�X���;oM�%bǩ�냃e��zA��1^>��r��IT�Q&J��7���	�J���x�\��Cziq'U�.��;h�iA���5'��F�A�"�����y�eH��*�;�VX7c���g��bb��G�^��������,�d�'����h9=#���XaH�����0M�!��z<���J$�U�֤�eD�/�$n�F/���5�f�m��^ԇ|��.��?|�[v�~>8:y&�6��Y(�l�!��Jvg�P��	5�n���bWJ�1X�A�v-�e2 Q�4~-�ظ���(S�ŕ��m���d"rzc���c���7�����t��O�~~�R�v�%�h� 2��:˷���,��
�jb�D�XZ���vUL��K�NM�����ѵZ����N�L*G�������m��bEg#ҝ���H��"4�CP�B�n����Y�,5oW���+A����*��[f�N����'���_^j�����E��Y�#�Ƹ��H�}YE��r�Њ}�h���>lz����
�ھ�<&�U�!h=k�#․�kc翤�iMf�/N9E�?̇���j��s�����(���]�k�eɎ�����gT��}�i�6�&5��\��0H=n0(��m���<WS� �gxStU�ٹ>Y^P��Z�ɊYbp�O!���
Vj�#�H�7�QT��FMo<߱�#(ȸ��ǹ/��o
����qx��Q��	�YeZC�ϗ����*�o���J����*�ETQا�O4u�0��2(T|�#��/�坒i��㗖FL{���M������P���vP-�P�0i$������3ɇ^�@u��N�9��b<�qd�|�Hk��G��X𹛐$�G�*A��`$I��IN
I��>Oͻ�*���Yץ�6��65�ot5�*��{�� �ORBO�"��}�t2CO�kX��U��7-��mB�	U�F��0��33`�[`;�`"d��>q������V���V�1�/L�z�A�O{5�L$,|�l\BP
�[4.���P�1�(�[7�L(�I7�Eグ��`��Sz\j���j,0�<�ZA�$���{�~X:�s��u���P��[�}O���g=�'�{./_���i
L&��5&rX�����_���l=a!�o6[�p�qp�W-��-���ޅˏ�M�n�`:��+��n�����B���H0�Ό�Hɲ���?KQ�+xS�z��ޢv=!���Cawp}�.ע��C�\����u�h�:��+�jCY��-Hl4xr����I����c�>TeTQ�4f�@z���2b{������k��;H��hρ]:	�V�4��~�:�2��)��;�.�I� �&����L�=e��z��H��'����j�r8��E�x;�o���z痛M���������^�Ajb�Ȋ��~�&�l��z�"�z��A&�~�oR�ϑk$R�Z���eH`��k�.�Φ�0|NecX9����Xi��
����M/�-�Z�D�؁�86ƩX
ؿ�?���LU��+�"蠭{w�>�täǍ�F����f#�O��@��-~�?F�v��R���.6B��G��'�Ӽ��U�Hp,��ĝ��;<!�B���_(GS��^���T�Py(?���+>߄Y����{�~��K�C:�i�j��h��KRN���Ŭ� y�n���������/`8�1Qej\�*�$��DO�g�zN3��ƻ�)"XCH��t�q�2���e7%9}f��'��G��4�����*fG��u���~����J w` qN�}4@��7��7�`���q�o�k�t�_Ϥh|��؜E�\��R��1��_�c2(�K
�&%W�s�b
�=j!Ա�f#ٓKqK>���/^Kλg!8���C�
��_q��NmkKe�E�t����+$�iX��Nē
_�,�<P�UY��
J/��k4o��?����47OJ?<@�
4qr`:$�*��
��d`zI���Ql�Nx:�`f�?�ˈD�[]>����F@���I�Ǵ�6���t�	�,�����6���6��4�ӓ��X~RcaEn��Ll0'y����q\�W�c�C��:��
��1���ܪ{˲m��(���L�<p	NW�TV°=G��0H�tT�{�	��
}�IJ0➱��4L� G��Z��"JP�yv3̀ea=��0.�Kv,g�8lH���%�x�Za����w�T�3|�Lp���F�N���O[�K�����όE��l��3%�%�U;�f����?��+��PzF�)�|���;=�g(:�b';'=B,Y��\���Q�/D:�l����)��X�^Kp_sgN�B]����{I��C�+̯=|T�Us���`����G�z���81C�ۉgV/��X{v<�D"#�:�I���_�ZqRz!-��M���4#-3k� M藺8uQ��BN��؋�n邵^���ӌe�+��hž�Բ1b�s�s�OQ䖡i�7?�+�	r'2**����Z��M
s���7�%� ��3�g�ɡ����  OVRʃ�.ae�"�J��g�-�yC=��
��`t���?-���NZ����.M��� �(Ně��B;���~��ziPhH����2��v7`q�ɩ�4�UdqK�69��5�d�_�%H����bun���f���c����?����=�/F��ӷ3h�e�g��'j�������S��30���b0~�R���cf�AZ�
�J{�7f����VLV_�丯���aZ�X�-�<yH}p����}T�+�%�(�D�1p�Éʔ&��b�l�j/�3���9��-p2l1�,�X�T�w,�I<F�O����}w;��/h~���=�z�l��H���X�<#�(g�8�6R%�ߕxߌ�а�0o��yALh�Se)��q�Fp��mm�b�=�=<zTc���P� �ANUc1S����q$�F���#�N|��I�^�A�S���h4D�mi��f��)A�"�MQ~�Hpx,��!`�S`X��q��5�h���$�R�}dd;�A��Ɉ�;i�sR�G�}Ҥ/���ݒ��o=/zn��d��uZO�M.�<�d��ZL�U�=�d6���YQsnœt�*b�L:.�k/���1�-���Ki��hw�<��s{0t?��8�V��.���u��!Q=�=(l�h�ϫgc��ޭ��/��H���~�e\d}]}�u�J��Z�;���l)%䇀�ݙI�$���F�Ó5�=C�!	��/|Ռ�P(��,=c��Ժ�^"V�3���f�
�@:�%B���CQ�a�����$�y�2����9����d�gh����q�}&�אe���a�.��D�_O?B *~bK6עL�+OLl�q�y�̽[�I���v��l���~2�z���7&�=,�zɔ��:���Rg2�R�'��RNb.��r7��u����W�N�SFy.���`��ls_X\<,�އ�����KMy ͙"r���W��tNu߸ 3�Au�UO£�������O�(.�����V~�
��}�F�\�b�ko{�p��Œ�M��u��k����5dh�%��|<���b���E>�K�����#Zȕ�����b�â�CCMIM6-�p`!��O��^��y
{|��Ȣ���[n��H����Z�UEf��
��z�B�F�h�i��%�7�`���cc�ќ�S�J�S��…�1�mJeiB��ͪ�����S�&�v���¥���R�4a��9]/��f�F�L嚗b���	7���V~��I���t�{nΈ2d���4A9ib��,�Ib$2(��tkXc<P��s�V1�d}�t�1�z��� �uS�����$�f6/Y��0�R��)�%���(�Q
Y��<ڿM�8�ό�#`�)
%a.3�}�3@TQ�����g�\�777gWEZ�⻾��"0��K(s�S(�fen�h���"�)E�e�E��S�(5<P|"�͂
���"��"$��k�6����g�J2/��uֺ��Ѕ,ʮ�l	�|j�a�ƹ��Iq[�dFұ&�c�82��Ș/�V��]�Դm������D��I�Sߺ��}yo�ϸ�u��p��
�r�����4ʧ�r<���|tpK�+@Ljn
�'1{^Κue���$Rm�����Ԛ@C��E�s�ƍa��QhUl\0��1���[�ۖ���S����x͝�M��zJ�bK&�x���굊G��D��u���G�7�)�T[V�M�]({M�S���J�GYT�'��X����U����7����Т�&�b+[���n��������:.O�����~w����┽�Ƿg����!�wC&�+�ʕͻ��5���-�����s���"h=��Ќ�B�KF�c�,yfhq��+�����rӏ�X���Z�&����	W��ca�H&�)z{�^|�n��fC.���a&��)ӀG�':c� �яe�g\x�`ԏ����?&�-�p_��j�P�k
���w�cf���e?0��f~��B������iV���N�ujZ��V4.�1�Q���cQY~��$�5���mѓ1�ޯ>\���̰��$�Ux�:M�R��bw:C�1�/D�8'�8���*s�CC:<�PF����9ȸ8�
��p�����5�>*�U����v���23����gh��7��Q%��f��N"�J�П�7_��^Jp�B��d�ō�R�I�.C�? yU�,%��p}��%��R�I��B��1�o�g@�BW��f\�T"Q��
OB�DP�mx�Qq��`��2"�GTԙ���;JǍ��bN*�˓�{{儀�����'6��j�b�Zǔ8hϪ�?�t�C��B�7��8I�Zp9.���v�l��xs'6���%��~�9q.0�FOk/!C�/�9����Ngb��Q��tr�����'�,:�kC��^�p��AGrV��د���?+�Y�eQ�Y�>g4ݖ�ܒLm�"�o"�\4�5�&�I��VT��
�C���
�V�Rkժ]"ˍF�o��Tyل�RmL&�P,a�Ѕ%�Щ�I�h.�2��w�u��fmf��R�Rή��	Ǐ�"�'��d���f
P.�IonN�
���~���
魾���b�k`��J��v��*�J"��C�R�y�<ƹ���Ƽ�]W3i|��
�`c�BЪM�|�=X%|�5#"+C�J�ߙ1��-sEY�����£�C�I�[���n�9�TOC��D�{F
D����/	%��u�!!����d��B#���SL�1P�>��k��_G,6�R��w��EO܄X�[�52N�R�^/
F�ȩ��v��c6���*n�/f":QjGF`y�u��{���su�z���qe�fE����(�N��.�Lv���*���2|�1�`�TH"^��*M��A���<��"jʘ�E��8�T�QTDT���'m�rJ�U6� �A8@����
�0��ח��7M��MG���L�Vz��=%:D-2��f[���#e�)5lj���X�|�JYk�j�N�8l6�Vi\c��R�Q�#���7]��>�+���t�ơ��6�[���hqOO�xc�s~�����=�[�Vb�T�c�4�����!�]��vO�4�$�
ԯ�{��P5��L)_O�.� �WV�_m��+�@�wEXV˰��
�G�q��d�a�
J����4��GqQ�Q�%BJ�X��2�i�T��2��QR���5�d����Rަ�_(�n H�e��f[��VMRT�HC1dezv2-y����O����o��̟RJ�"1�p(���1�މ�8ѬJ����+�y�l�wi�r�Q�m&�Yo�K^$w�����^���)F.&,�"y
��Ke��<�A��C���)n�.�$�hc-���)ɓ�х��h�E
�����G	3ڠΪ�	�A���H��c:��=�*
�}.q��#�����i����i��3ԺO��R�9Ht%�.v�9�E���5yg�=*��niF���a[[!U:��*,����aK�Zm���ط���iC�+�1��`�A�f�>��7u��tk����&Ϩo��XhU��ɳ8G#U��.>r�h��la��+�B]A�q�X�?%��f�X�Մ��Z�:�9����~��_����%��*�����/��-6�5��~`w��XL�;�5�}�����u�F)�e��s).����#�s�
�!� �`[D�,���#
v�9t����p)���˓��������Z۽�V��<�A���8'u��sL���\���6s�TR{=Dl��
1LyDڪ#�FNc~HV�Ð���ˠ���}�1�P�,�09�-q�e#����n�FrX)B9��/K]^�7.���
k�X�E�ǘԣ*�� ϳ�Cq���s��"���\�3�L��RxA
z��j���
�²�_J�8��=n�
ͬ��F3ul�^�<L�N�Y�!A�m�arqp��
�1�f��>qd�z��J����cJ�Y,W �S�?���g�XhL����F��7"�8�N���DJ=��GL�O�7ݻN'z��&����������%��"�h����Ӡ܃pK���;�z���c]nf�/��M�&<Vն��`Ws����*��
e �v�gFEc�-/;$į'�K��($���<"�0$�g�����D���4"���:..a���CW�%U(�X�DA��,b&e�?����Pܻ���E�h���Ҁ
�f\
�]e�f|�\P�Fa�mZ�w/��g�o-fn�|
<��^�Fx�K7d�yuF5�.���w���<Ҹa��E��Ȱ�Zm�����(�DN!�`_D6��U�@�8�xD��b�DX�$� QS1�*��ݧ���R1*����
ԚE�G!��^	��m�@EeQ&��C#�ʽI���$WF6�m��5�}�ma	cJ�NԎ1���!}����.9@�551�HXc�^V
9�$��IS����Q�����u�ل8�)3�H��t�³��%��@l���I��$��M����ů����z�����tw�p'fK�M/+��]/jhLխ^['Z)e{�_�m?m�n�AWgJ�z$���~E֚e⃠�Ay��?�l�CC�{�O�yT�#{{#�ȧ�ݰx��~�9�#'M�|.�\ R��7o�����z_��Gm�L�,]ZY�O_�2����|'�j-*�2��a;��59���rы�(��hP�91 �F�!:		���X�6�)�~�������1���e����c��{���!�mț��=#��ӆ��q�����A��~�8�$������X⧆Pg�hƉt��|��×|�-$E����KT.Lؚ+\xY'�u>#s�=(\I�,�d�����
�{!;�+�H?&>�FԱ�Rb����솎�H���=|2���wl<�:�FVE��z�$>a���Ԯ�*,���V�٨�6N�,/���]�5�g��R\<��^'�=
��(oO�U�-޽cؽ�x������38�� r�P�A�m(�w����e��D�$��p�@bUv��n9�`6v�l�Qs��V����pVu9wP�J�ϚFg�b��n����3��Ó�9�����r�)��L������B��G������5� fJ��x��@��
o��z.<J���C]����y�R����3���{�/u�m��Fб,�N��<JV�g\1�\��ȢR�G�R��-��Έ�TtF�y(�ς^L�ų�m�Ɖ��}(qzF7�#��zpt�_�%���js�fI�f幃p>Ix^;�ߌ?R��Ac���2�˒�Hħ�L��o ����p8ً��T� X7�k��z�E(�rq�K}��rl��b�ɿ��\��_ꉔYˁh�xX�g4#F��j�هzK�}��`>_u�$ w=ӏ�K���6y#;�[�|a��P��j�쭌6)���aǵh��giV���e�ׯic�
h�+e4�������C+Y2
St1���k�C���P�v�J��
�k�6ʄ1~r�T�Pk��@�t�F.R�������X�!����:bU6�Wa<���RЏ�J�.�������ZĒl~����s�֖'4C*�)1a��C�f��
N��P�U
\���� L�[�g5(XW�+�q��`�	�]����l$!�ǣ���F3�m8��R�oW}�^è��|��ϟ������Յl�I �1�����n,(D�'㘹`-O�@�A�Q��
�Lvx*W�ݪ��-j^��2%�,�d�X��έ�A�E%�K�`�����io�B
MK��,{�2λW,����?��Ƀ���D]޽�l|>k
�1l1���p�-�#�9�(VW]�T΀�)G&O�Z�vA�����rMx��)�,߷�h����HL�κI��vk4}��%kXG��0j�����tS��8�"���s8�Y�3`���H�"z��m��
`m�`Y�@Y� �k`����mmu�G-RJ�!F���m{{ӟ�,��>!��֙�O�f'6�%����]�!fO|�K��#��J)�a��.ۇ���k���}c��Y�����L��l�����h�w�n�HmiIMk�t������UR�s���w���۹�s_YXp�X�싘��vˆx��HǏ4v|!� aS�����I;��c�=�	�����ugZ<����'�)w��[fzg�Gy��3�ާ�C_�ԟ��o2囵�j���W�1��@!�F�ؙe�'�j3R��"e�(3M�!��@E��t/���|�*7���OLa`}_�r���P��qqw����i�y$.��|Y�+gm��o���R_[�-8�r22..P��[��@M�f��St)|��_%�}���Dm�V����*��n��{˄MA��8崻�)w>��N�n�����W���/�yAO��u������\�)p|�8�m��s�k~�Xr��Y̱��Z{��c:��,�-�g���Hm�&4
�
����/�έ��z��� 1t�~������=Bc�逘=��!��B�B�xF�d��%�'	��#�<�I�&�&4������]�;;���c/}
����r��o@�HN5d��"fe�<�C(�������4
D�!ap�����>Cb6��0F�ePRa�'�m ٔ	�y���Sd�"2^$ؗɖO唦q��&X8t�(9lk�ߗ��Oz9��D�{΋�InY�;<��'��a@�b�j�W�B�Y
e���rd<@F��.�|Y��ߏ�9]�i|��<���T	�U,�bjߓ�"�څx�1̮,��th�L� �f"�0��?~�V�s�\��~�ى��pm�/���57��6J��Ս��V�mU��5���ʹͧ�
kn\�;u}� p����/jh74��}�}���7砀�N{�M���eJ��P����N�!K#�c��Hs��Ǧ�X#�qX1ֱ��Xǽ�[䥀�O�7>�,��/�<qwb�=��Cn&$$ʞ�7sFs̭	����U�����.K�Z-���*�з���Zv��X<�&�+����/�ާ�v�x�1/�iwf�4�w����A	΁C�5�8�HR��ﵧ����*��U)�~7��۪������i>����K��PK�=�{�C��5
���s��֌D���(�$�ϪM+
J}��]��f��(wjt1�/���Czo�e��dy��gM�/� �f�C@����O�zjK�ZA'o�ܕ7��.���h��p��K�&#��C���f4�ڇĬV�P"R��­
]p�YD�;!*��������S\U'��W΋���8�˅�r��޶tjE��=@���I���9���,�����E�&f�}�Ј��4�������9G�U�R[�Q9˜ې���G'w�O��I�w2;u�d�\��L��i:�BT������1Q��R������΃�����ܝOvub���t:Yh��v�rl}�j���+x�����INL-Qhv��"���&$����h9�Yp�s�7e¬���� �7�wŬ������NnWk.���2Z:C0.	�䝨��J�=�<'.��}�+J�*f���m�ЛF�D�>�x�V����~�jx,��l\��V��f�(��0Z83��v?�-��`]��X0sB��<��	����Q��.L��`0��57}��^-1�YP{�۞��	QїW>)�ewv�m١�������Č]��I�K��;�m/�qgo�W�p��Å|7o7~�����1��N�A��[����B�d��5\a,�!���')�ǜ1�f��1��b��q�n0ޠ�$c�ՉoB�?��I�h�t�F���U�Qʲsy�����440l�Mߝ��8���bS`b�V��\�x ϝl�2=P�^l����Tj\��zι�/��h���Gh�M�=����6�$�h�5�3>И�N�������/��Ú�)L]L�N������u�p~�|!�e������_s�n�Tqt���`uXtx�C�:>N��C;�Hj��m6/���{S�G�m(/�NU?�$�g��p��=�g`aT�8�j�ˆcv cn���±Z���v���obMr+��VQn�9���%����&ސ����1&�3��.*��8����Z	���<�U�T���bm�V01h��R&p�y"��o��C������'A[m���l
�<>(h�(�{�K����]:jiPP)*Cs>SR�7��(�Q���}w��J	<�笆k*׆�G���t������cǪO� �yt�b�>��[�f�I���IE�࿭}x�9X�6Q�������v�j�l/F������1��U�U�y���^�l���8{�4V_vo���y�?o„�m(���Մ�ݹ�%�:�lB�m�kTg�n��,�u��M�W!���_��dAK��/�ԅ�*,~<M��a�`�(
hT��s�8X�T��I4�q'?�3#��w�C�K���9�2��PmN���d�NC���t���ĸ�_o\%�i10��nDz;F]�=��+���t�׀�����ҥ�\�fU�f�R�h�t��c���jy?4�*9�@�)�/.�3��ƬZ��s/t�nb=��`FMj�N������m�B�ʙ��?r�ZS�0"�T�
��V��Ku�r�eƭ:�����(��1��O%a{���5,�;�"�<�tf*�ս�279�;��pl��c
�P!�`��zgSR�Wа�_:��giA}�E��t��|#A�3f!"���=�
�A�DR���X�G��`q��@)�ذR�"�i���F�חh���(�)�g�Gp�ۮ�
��ΒC��ɜ�}\�V6�"!^1��f�j�L<��T���kW?7�)!�, '�Xtí�/df�gC?�pe���s�w�̙�@˷��L�oJ)g�߿`W[�j��5%�[�NI��3"�]�Lnb��^yģ>o���p�Q�T����Η��Z��@@��3W^t�.<~�P&7 ����,Ǹ�x��.k��Yf'�g�u��oK>²��+���@�����6�ϵ,i�����Щ��6ka�AYm ��`�.�z��ia/�#S~��>� �XY����>{��i�?jQ�U��Yc�D���/:|o/�����J��6GD�@S�"z"��σ���s8�k�h��w
~��M2���AOӮֹ���Z���R�̲ɕ�:褤B��?X���RA<^gi�`g��J�� t[���Ř"���vE�rt}L��e��x��=��Q�1ZD$�C���IO�c1�6�ݨ�&?!iO9��ۿĶ̊h^ƵHY�['L�9S4!�~�ip�?	ĕ��^~��d�
SI��l7�;x�0괔���cSN��Y�i�K"w
�Pk���z^�T&ee2x�`�2�f���q�/�L�\7!,b��)��
�w�0%* �C��o������AC@s�"`�@<0Xh�Tȫ�C�H�I�^igu`T�
��#<������
�*�ʡKXi4�pR8�o�gL�<�L��OLR�#��B��.�-?%t'F m���>k-�� ����f�?0�Ǡ��SyH�ȟ E��p\ҳna	˚����Զ�Ĥ�Qi�1!�|ܙ��FB�&�u	���G�X�fܬفL������K�MhΉ���q����r|��h�ZlEn=�B����!�)1!<gW��C�p�|�,�zV�r���"�3 �e�>��B��y<���E�i��U�Ub����$x�9�_$���b���(u���c�
&ϓp���<Kы�-��
66��9A�?ٕ���<�����&�;e�?����nk[�޾��|A۔`K�Œj��e���oVJ�ߡg
a��
"L!隆	��K���%T<&J�]p`�Դ�q[P� X�>Y��BJ�=l)�O��)��N���hv6��.NM���+2}/݄��-w�:�
�J28�8r���54έ�w�!e�~�WN�ߙ�2�Q��}WuC�b�<S���2M1H�+>y��%�*�ocpN��AL'i �� p����$`�r�,"��	j�U�m�*0��)�2I��S�E?S�Ύ⟌��wv�TgH|:���L91;��>Ƌ����¡P�Q����f�N_�Nwl'�h�VC(�[�L<őL��B �d�s���jrU��H�ϾF�O�զ�FH.����E_~����5��N�ae�l�Sc��.�ּ�EXJ�_�<�ą����1� �j�2���ﱹ���G�c|pc4���A؞ȏĥ�}��M����N)�F6(0v/ԃ�e�����
8�xE�:�@0$��ʟ8;�r��0��)�	���7W<ڱ���1v���ig:,5�����;"ӱc�?6�O�㧥�Eg��)%�{1�q�N{��FmS=���l�Ф�]�f�Q�ORڮ��	���9��5����9���|�&��%t��RCJTŔ���\�[�`�~w��`kx�UzA��N�X����}�UG�-��44�:��.^ʘ����T[^I���H{���u�f����U�l1�E�yv�4��\�9���Ӻ�?]�r}���LM��5�nc�b躕�r��b�Ĕ�K��D.���+����[H{��Tbƞ���?z$�x�E+��A��V}���c&6�����=��aA�q�$�|e�Ik��Lo���%�H�jA2eA�bŷ��b~@���R�ԍ4�^#!���C:�-+�:fj�.����i!@oE�뎒�J�C�3�JF..�D�y�+�������.�������6��*�W�Ӽ���(|G�?�p�/?m%�i"�B���\9�-0����q�h�;$G��4����&iP�iY�䕷ֆi��ձ�]��w�6��E%OgQk�i��hƮ�v��(�+�Bd?ԋ���=�1rls�Az<Y&�Od���o�O��������]$�X����׬`����b��vRjc�����rt�[���)�4o��(
Ϟ�ڴ:4�	-�mX8�EW �AY6�^3�L�HtW���b
F�G����0vI�wQ��k����"]�V�Ba�`�h@!�r�Sؔ��vNa|噸��\��0~\LlD�6'!��y<�`��%����!y��Z��-o�mg{s%\(?!aZw&S&B�<@K3|Sh�m0���|�X\�BK1�_�9�_V��5��g�i4�+��ӊ�<���se��q�r��v�g��
�qEP�ߜ��%��O-�P�E�`b0�|��螠㚏�����gb}`�Ge�R�[r[�e_;wX���kT�S�J�1܉��4���b�
H�X�71LL}s��(\��'�W���l����`vf�����-߁�?�-�d���LQ54~���^����C�NgO����nJ��tP4�)����'�	���
�e�;�]�ֲ���fTW���S���b,���G
��+`�3�2u�w�w�_�~�f�~H��͍��Q{`g.�pS�֞ti�Sl��kTЫ���KH�YC�Ư-Y����vr(ߔeM��5~B&���K��EO�^%�<3��/�فQ/?Μ��NT��Р��T԰� .��w̺⵳4�wε�8)H��§�94:��B=%��侃��/:��r���U��"�81G5��)P��k�A��>.��1P����5�,�%a��p�c�����?1핏k�c���6�:Q�����TL#�-�<�r�T1|0^�@�f�͢��%j��׹h܀ \�x������vDז���`�Z�,�[�M�K=Ρ�+���j,ҹO%$�Li�U��]�l�L�}�|rN�"M����1��ѥK�:�GF�1Ѝߡ��g���0ta�Z/5��}����p�}��Ш߬3'F'$��I*�a	c�N.s��k�q.�VAx����Xr��������bsY�D_Kq����_���V5Ԃ]_I�X�y� ��Ƿ ��v�`͡I��Y}N�Qʰ�c!1��!@"Y��FoC�x|r�y��z5�Ô�������r�h�lf�1 Ā��]����Q�	V�D�g��z�׀"{��V'��_/3at��\����oXHX�e��{��pR=�*	~G'TxL�4#`�a[�9=���`��l��"g$��S-����"��'>D�Ի�Ҡd�+�:ڢ��C�?U�9E&K�s�_4�U'7���p}���;��5a4��$���.��Is���Ov�ܼ�7`�ӓ���A��kEǡ?���5w�/�.ӧ4�c��]�4Tt�x�"$����F���g��z�=�ra�[�fn>yI�r��u�U�b�Ń�<����$��]�P�i�:���@Ɲ&<nك-�j���V@�j�����`M,�MagfX���d@�qqp��n��ԐD3�%���3�>�
��%�>�N���]�6/�Yiſ��� pi"P��Q�ʔ�D��Q�A�n�����ӎ�
k�6�҇�n-۴Af�q`'y�L��I�-�4Qng��4
��O�t���$sA�<a������cL��{��ܳkG��+W'�Ń\^��7�"]}a�vHq�d�xv��w�.���iEt6�_���{Jj��4�Z�&<Y�����mغ��f�veD2����i�OZ��mȆ���8�ؒ1/J��{�wQ�e�}��d���x`=���gf(��K
ٌ�t�6�-��-S��)629A�W�R�ݣ�2���&��j'��H��f�Y���T򿝬70Q�J�R�m̞�F���sqǂH^��,J@˥T�ݛnn�*N�k�]��}�-X���L����>)�N��_�!�f=����ub��ۙ�[>�a�cXי���S�����¿�{c6Kv"Q�%�q9,3.P��4�gpQ���q�ˉמyۮ琵9�D��T�G�9�y��]˦4~q�&����"!(2�sz^a�M�L�&��S���FF�N�I5֛(�(̀�+q4�\��[ F�����n�t"��8���I	�]�G�2�3�pĩh0&�J4��q�[��D�8?5C��MT��p�ϕ���b�}��ր�x��X�V�FZ3�Q
�g���<�[�"��Un������Rx3r�g�*��	E�J̖q��>�Ђ�}0���`���b�0� �~�B��F:���m�]_y��-��9݆�K�<�F���L EA�e�ϗ�r@	�Y:]&2�����+��~Yv�Π�lHl�h
{jڠn��BQS��Ӗ��*>Lk"0Z�? �����WL|����턬�����:�Y��O
����}�#�o~H�n�.�M�Z��>
p�Q�;yJ@c���=_��M��
@E�{OM=��im�߅�5�:B�4�AR8�iC��z?�e�8]
���0�m2���*�´�	�",�f�%w��W
�?'���,��aB���
���%A�|x�fq���>+�B���oT�3�
��"��76�e,��^��tt���^��8e�wn���Bw��!�ۼ��#����qʢ��$�M�y/i��rhS�4	��S�Vu��KQ/
n����!��4M���?1��|ٺ6��g��6$aQ��b.���e�$6g%�[�q2��Dޠd��i�"�whb�e4 M+çL�����G�ŘU�/ڤ0A�ӯ~,��94��,c�KCr�=w�_Fϻ��D�p-���B��������\���/e�cg�߱2�o4�];�=�
u
�RR��C��X�A��2������:�I
�ɘ�7O�Q~7��'����}]s�>F�/������Vi��ůٱN�40�c��M��8��w����{�f�0E��oqX�=��MH+>;�e�E�+ZG��3�v�ž�5�f�Y��3����16H�G�YN�##�٫#Ł�^�{�G��J���o#�ƶ׵J�#H.)��Fv�_�����tʼn��B���d�L�����H&�����KC�M�ձyp�n��/�}�1���$�ua�}�.� �&�j+N��k������^t}���5���oj�Xf{{$͓�n2lJ�+�2�;�� x����Vw}��"�)�qr�&K�}��Ԑ;�$V�"�Q��x3u��8Fy%B(!|ٜ�C�sd��+t����)Jމ�x��.;���1��0/���p3��}F-T�r�o�͚k�Sqi|�X@��R����
:[����H'�8��%����I8:�F��&}Q����ۨ'3�=)��'�.��>]e����8M�`����2=%�� JfQ��١̃�D��gHl�JH.�m�.����H��-?�P�l�\��B�!S��*z��2!�8)�Eދ��萟z�UN�%�ԞfI���m��z%�<Mx+k+ȏY�����;k#@�/�f�Q�5�e-�/t��)
~�|M�b"hx��4a)E�;$���;��(��j���-X�V2wą���IB�K�k9~-�M-�v�A^�Z0g͂C7V��3�|�r=�Q�-B�!�|�ٹ���y��Ĉ�̓.K�Da�� �7Jf�ذ�
��X{�"��v�m�y�c
�LJ���f��@�'��`cB�O��j~��pV%'�ys��X���L40�B��A�: 0��d�(T&r��sbݴ�T7�M�K����iK�����^[���x<�����aj�~ԙ�3�Cx�/�M��r�$8Շ5P��j�D��A��9H�N�>:%�m�^����w���F�@W�7Urs����U)����C2�O���a!EE!a�W�i����wm@C�7/_ۈ��>��gN�����C!��Ҟم�9}�*�]fUQ���0kMl���Hk¨�9E�kq2'�/�S"ג��0�yp�-;�7�yL�Ձ��	uֈ����1�kR:<���*z�]+�}��	o0�H1=?��1��|rX�l�ݞ�����;G�e�,��܎�����l��]ڨ���L� �K��2��h]k&���_���Z��uH�A��'>��ܰ�|��zB�a��"d(���V
 aj̩�(f�z�|рj�D	�̃��E?�X5�Oۤ�"�@Q�X��v�峾%F����#@�/���\[4��I��z}��Q+v4�u
~Jm�Q�<q�J�;�1#P�8y�"�,�~��Y��~��=�=r�&��>cT���_��u�h�"�9�
�
�n�pd"�61���=��M'4���V��Й���b�zCYo��Y��c�G�є�‹�H�9	�#��"�o��w�Ƽ�a �8��Ҏ��ʃ��Sre�[؎Z>�"�$��,r�p��<e�%{� Je���b[���;|�J����i&[6�R�7K%v��'�?k��,~��ӭ*+�rzK	]:���'D�D�'F�~���#P����V؍��(5���
�q4M�b��`3۠�nIP����!�#2�w�p\0L�z���;]��X�Re��Z�8���4t�ٸ�L�f�,�L�d\`�0#���|�&���&�%�$1�sd�B9w=�2��dQ�&��DiL�}#�a�b�J��9�1�����l�P��v�	B�
�.���.�'e}kԻr��)t��{���v+�iaP� ҏ~q1�<�7��=#!�'#_Y����heI���������L7w��x��k�W��p����U�G
3d��l�F�p-�.*�LP�'�����5�ڃ����
gǐ	�>���S�M,*�]�?h��0��\�J�N�#F-F�f+�h��ϰ��n�����C7�>����$Rv�v0�6l��j�r��,R;�y��	W�3��j�WĤ�\�y�% ��H妨�l�����N��O�g�um�Ui�_����$�J}�c-�h��GN�/O���B%�4���R������=�c��c�l[\�ʕ�홵�f�Ov��e�3'�V6	'�(Tܘ�Rl���V�g�,�+DY�5O��i�� ����q�i�ٷ�r�߻���9�d�f��+9����9.wͪ��l�N���'c �Ra9y�'��kHS�b���tg�J��GQu)Ӽ����/�/꼕��������c�wΘ�U��2/49b؃�I9����#2Zu����^0+>:,�tPRc����%�B��O�0�nFIɌ⒙Ɨ�����
�ː�:�"��fۆ%�w�����jp=N���7[��Kv�]�Z�a�O0�}�.C�I�u�:G}�2��`|���y^!E#l��t�]��B�az:>��h_#3�]�z꙯>����G;�����:����m�?ck�W���.�{�0.�����t-^�I�2�]d����w���'�N�@��X�E6ൿOY��/��U���U�|*�;��(H�vC<^��`>N�K6~_;���h�9V�eN�����o����[Y�Y�留V�(6ڗ]�����+��kǪ�r�d����2��0o����?���>;�Mt������@�O��B_òX#��C]�ۦ�=���?3����p,�S�?�)�/�{����/>w~]��j�Lp�
�'����Q�ǒ����R�Q�t��`�_���-ݶ�*���Ⱦs�H\�(v�W9�7��=X7���ɏ�����q�9�R��Y��5�6��8<��Y�%�t��ʫ�Tʕpd���5m�!~�H'�h�B�`�ma
�m8Q�oT��B��
�xlJj�팝�TOR6%z ��:u��{�A��3�������U����(S���t����g�V_O}��>"�VW>6�&�|�ϥ��4�z�B��I��Ȯ���X�M����J�E�g�8���{�%<�A2w"�A�w{���)|�!7��V� ���o����Y޳��)�O�Q��1ʍ��b��=4�#^���y����陫Dӯ��8����~"'	�|;�2&@���v@�5C�0T_v�����O��
���v�dc+���]��	�H縏������|�-k-7���¶z)�r�A4��2$)�R^�,a�g
�W`�v�s�M���)W+�*uX�3�?�V}��h���e`���y�7�����Ex�oxz6�;,n!��Q0S8s�ۆC�G�`��i�׊��]���j|"��^c��{��F��\)��/��,LbŖ��������O�G6T	֖̆�w�){��$�	�X���J�W~�w�؎�[�jp��t���#aQI'"t�Z�ˠK��T!�֠dZ�{�;̀[VO'��nPI�,4@�;�� �b(�a�(�j��7��t%���k��<�m�Иsa�w@�87�פ�l��dv}/���(0/aJ~B�:!f��@
!�C�/�u��|V��ѣ|!&<aS�_qN�-YB�(�X�v�]~�����<J�Hkm��h��U˯�_�MLh �Xp8
|��${i6����~�y���ߏ����h��B�/	��4z���������B�)���	�XfM�i��^D�؎	uxA�;�z|�տ�0����,�Z晿�vL���ė'v�|�������c��2p߽���b�]�/?�[Q�6��d�Ԃ�	K&�8U����A�'=@l
���:����vJ2��k�@9ȉ��d�Ѹ��I�E����ݹK�����P�.�D�3�~�-6���B_U뉣�i�}a�`��_�֫a�-�#_	��q�
��jfݖ�fmcN��K�^�g/�!a�ףp��4A��t�-Jok��iᴉ��{�Uc������
�ڶ�
��%��:e��u:���m��bR����:�a�?�V�I�����<$����|�1{�ޒ�s�7���99²?8�����a�j�+U^R�)Y�9��\Z�X��G�ZLsh't(r�}���*Y��u�[ +d��@��
YYYj�gs�͵
�O���b�J�-�;\)�d�o1��}��+	��2�1�__�-���*o!ʾ�	=���Ȃ&�8jh�	�X���J^��gZ>R��04t���O�]|+x,DQ#"Q�h��Gn��������s�Adx�1�Ӡ ��~�B4��~�e�?%}{n{�.OTD?���"Jz���u==���U]L���\>g�$�'��R;*�ŀ��NƥVt�G�K��51��5svX6���}���ު]�0$���q
eS�>R4?��ə��z�#�z�ܣH�Q/�Q�j�K��ȴL��%ɤ4UyyS�4r�p�5]i^K���.�7�Nin����ӧ$R������X�;���Esfߜ�e�L�0���L�O	f�t%��u��Sb�*�N��`�Z~���,>�Jef!)��o�o!�����I�/8�.���E��""	9ݟ��B�$?}�JyrǚJ��[nV�.QV�WL��:m� w��*3�#ؗ⼝�P��oy�J��3�ۈ�^:1T�\Č���xJ��ǻ*�1RWl�U+���t�_�=VW�Cn~u�i|ͯ	o�ހ��#�.gmEt�X���wrMJƘ�i�䷔��������8Gm���65��c�����'뙍2&�7�҅����,`:`ir�����h�#��
x��AJx��E�XO�BV#h����Q�E������Pg�~�TF����23'dfL��`p���<aF�Ж:���0]�0s��jq-W}j���]�2|�g�8�3�b(�}��w��i�W��w�����`��{l��yh�d�X�Ə�EPX�|l�
T&�ޑ+��.��XO���f��&�l@�v٬
b�?��9"�./�uɉ�i	Z��f�pGs��za�bh������'��b���������[y��j��H�mM
´~X3��6Q�ƢM�5
p�@'����?5�4[�%v�B��������O���.��[�g��i��-��n�2㸫_��˪����t�L�,�0;e��+�$
������1N�T��wr��jZ��c�۩�4���s��l��)���8�1�d2a���vW��n�}�߽�V�^N��Q$�%�+�ؿ�v��ӳ�L�8Cu�?q��r���[�3¹C�B@�z�u�v�;V�=�aӫ$&.�P��Y
��H�4��m�̋̅�[�ft�mT9��/��琄���a��<�K�D(O+Q�B4EP/�:!�E��#��h̀�zw�wSJ�Z&E�cd��'���(Dy�\��n�]��lsS,�<M��9G �XM=�$�3�bcq�O�-k$h��?$���Z���(a�+�|l�a.��W�h��N�H��p*ZP8�3װ6�	e�7�ee�Av��쿁��9��ɢ��=g\|�H�T5f\�
�N]�]�]��y6�G���1k$��%�[�����h�1/��<��V�9
��GzEZ*�Q���,0��;�v����66�_|�W�E,H�A'5U�[Q����u�U�\��JJZc(]]��b���Y)E��86�r]���(|~a��k3ݾm��Ǯ��3*�#^�}!D�g?e�go��M���G?�5��
��Z�i�!��.-��o7��<p?�|�'W��:��G�D�W`�������un�ᖃm��x޵2s'�C�9�w�*ݓ��"չ?�8D˹CU�@C�� ���5��J��ѥ܅��#�sg����\�H��dG�Á�[c-�E������A���ʁJ�F
8�#��F���ei��\���4�����Km İ)�{
/3
��������w��|˸�9����,�vj���四W����=����?���9�<̈ZԺ7���69C��F�;�6 +/<�F��ξ�&.q���5�/ns�'�=X*`��b�`¢�-�V�v´�'�Z����*-͉i)u9S_��
���JR7�զ���hI]�4�%�^�����o��
������R[.�X��)��D+զG�L5�"�Nx���onu������b2x$��E'�mR~}��TE;a���ݨaS�ay\��wt˜�`B��j#EЉ�X��[,�O��*5��Z�<+f͢G�A�3\�
��)�+cr�1!3#^��y����(w���
ݰ\A���+�^��I�WY~���� ~A��,d��#+	M[��y�UQ@�,6�a��l
�z-�'|RL������h� �<a�jq{)��
�r?oOX	!�8OS$�����=�`�"�ߔ]Ȍ)	���&[氟l�p�w�j�K����bl��"�q|��]��]ec���"����,Ց������!	��pSͰ�ʙ#�R0#&,gj�
�˪�g����
i�M���~#����vv,��,�cq��6x�G���Y��5���W}ގU�w㘤!38��V_eޘ���0�C��u�
�I�T�8��
0�H�"�c��W3E",�Gr�
W��<����
�%�g�y����<�e��+ ������nN�V�#��X�jEٔt0�t�븝��21vJ켒�43]����h�u��r�@pA���sjvx��'k_Pj�����
�\��@ʭ�
����Lʭ�
�\O���I>�Dߢ�{�<����rD���/�	��qaO��#���	��d�W����Nr��+P}
�̿(g�(�n�Е�
����W>{q99�C�
� ��0��oވ=x0�>���y���hBnzoӵV:� 3B,�ߞ�F�qvg���Ry�,xB�o�Z$&������*�W&�CP~*i�����cw���.�44�lM*��r��)K	�<�&_�s$D����F���������68:k��:L�>v��ƽ�|�����Ċ�xGş�sЇ�|��?o��6�M�r��΃˒鍍X�$���˥��
&�����A�rl;2�,B�j�*�zS6��H6j�e�n=�K�{�=��YJ��l@K�/$�����h���>�Q�(t�<=��/�W�)l��ωc�՘��c�u��;�qb^%l�H��oϤ�h�$�M���xh�R�\"�ϒ�)��R=Y��[GZ����bZl�/�"뀂3}4�˅��1��]8l����f!���?V�̛HX,��X�$����*��A 
m��
�־�mO&U�0?q��5��ES1�����'A�6\�9��%�͉O��rB��<��9�+ ��<#P}9`�	��@u�ñ��W�K�c5�0"69�зz�M쎽Q��n�%9*5����i��;�}�c#�<�;޶e񏣴
`pc�L������E�C>B+�b.�^�g�UP�u�7���U�S�E���c�
	�ہ46�J��/,D��::A����3�}#TP߮g�҇p�ݎ������ɏF%L�NJ�Yl<
��\,�w;����TS04Xo�-k�&�ɞ�ܮȢA�FE0AQ�!Y&�&��@�>9�B��,'���L�I�˧̟w:�>�/��Dmg��1>ܚXp��ca9],	8�~Z`Zu�bZ�ee
�f�,lL��0�}�޺���DŽ�vU�+WY�����y�o5R���qh�ߜ����5�E�����
�)�S���'WGiR��^y�2s�g��]އK���r3�.�7��_��F2��GKr���[s_Uf�TO��z?�x����ثH[�;vZ����i�*]a�N��CmP۾��A�Ftt�,�:��_XiD�
��.[u�zJ�Q�eRPn^{����\6�Y��_1[&���8IF��_6�6�\��Tᢼ�G�B����o[��K������zݎseB��1Z�h�ߓv-V^���2$���ONXm�tE���
v��e�ڳW�f�U���vm`8�i��h��4෍G%�(*��{1�蟃č(z�I�
I�lz�܅��L������Z�P��D�O+ ����_�
�8�r�I��G���18TeDI3<53<�����C7���� !7��I.�y��;w��ن�۾p*i�ssD�'>�UC���k˷g�o�oqf_�4#s
S��
��d��$V�)^3a��t��!�l�1K������E�
����C�� �yz
y���:ʞ/ږ�&�ѐ�rp���n�
3}�����ƅ�V��ˁ�4��1gl/*�K
���-���%�9��إ�$5��֨>�#<�E�z�".yC�s'�.9S+��Mٝ�
M���Y�$���!4�����}	�����cn��y�捛&`>slfL�_0
��F-LZ��($������?�ɂ�?ݯQ}�̼7����X�8���
�5�.��Qa�G�\;T��>e�l�g8��1�P�$9($�O��4H�wn�t��y2� �?t�y"Ӣ2�Yd^��(�X�|��΀+zD�eu�j���36{7�RD��*�%��>��)8�f*�,E�>K�3{��0��l��|a��Z�V�?[@�i��U��W�[,n�%S���g�f�Tkpb�jN�|��TBQ�
(��mHK,�v�xhpU�8i�0tU��;%�0Q���(E�	��MjFf2�:���ΰ�6
�EcG�TR���9L���"�-7L_VP�Es8՗�"6������U��%�t?6��h.�н5���-����:���~u�j�RH��D�VZ?ϙ�Z�P����3�?�|�?a^JJC�bJ�����щ;V�:^��:n����+���<��:����l��q]���f\f^��kW�^�I�[T�C)�1�e�NF]s�vw��2��UCM��b�e���p]�1�?<>�J���Pס�ޯ��Dշ���Nh+��~
���\����T�mգT��=��})�]��\�.�)Q�e�m��9{��r6A�9�L�%�x���R-��\�P��RI[�EB��S2'�`Q�<X�N\��<�F�I(�+Rw����_�\
S)� ��W�%�bD|��Vj2,��^c�N�[$�o�h�5|�~�Fv�)�J�{H��{�Y�-�j�&Ka��5�����l���G���B1��x�,��W��ݵ�!]�:{���>2L%R�׭�x�5gz�w�Jdy�߿��<Fdgr.��k1�u�n�����&
��}'���-�ˁL��C�j%/�,6rZy��(L�#���*�b�UwҎ�������4�n����͢K�b�k�|X�֦c�����1��@��U�H�b�Br%���hUf����[���(�
?�Ɍ�'��X$�~N�8Q0Xi�#T<jKt3���֩g2!`K�!@k%���J:�u��2�2y��:���>`�.y��__��`l+�v�I\` ��o�3��U^:/8�G�y+s®�o>�azG'��Dc3�ًT�-vw��vM���^˷n��Yz�V����zz4��[���te���x9S����4
_#�1�'U!A�"ĕ��"=8י0'�f�8�`U'����.tE�"2��K�Tv6�F�w9�p�U*zdwD7��ŗ���9#0�/A}�N�*%��c��xΔ.g_��!1H�'�3P�x��W��E�Ӓͼ̙�T��*��������
qx��C}��]EX^���F�A�Kw����G��[���aB*i@S3K�	;<�(�F�^N\Ȃ�~/@�����0tHg��	������ŕ��дܘ@V9�6��� hT��G�K��X��ȧ�o@��]ęu��0qP���@AYb�@�~��C���x�����s�)�{��o"z��3YzB�S�᥀�;Ux���}�X�a��$�L]���3�r�] �݀
��k(�0QK��9�:��Ay�I�G���4�R�kL�������y�5��|�W�<G1�)Z��$BNo�䘎Q��&�_x"���Z�� J��S-����Ч�2���L��^�L��IT��E��Q�F(��(�z��3�}F'�t�./�G�)>�J�}E�e�.B��G��9��X��o�H�h33Y?s%���}ƥ��7v���,R�ܣs��MV��7����w�o:X��+����d
�9�9��kO���J��E^���b�����2xU�K90�L�`�9�*�;�CM��9>"n�8N� �K<܅�t��4s�N��{*��׃����7��EB��$l���`����]��?�qՉ9�X�.�_t�����-�}O�U�f�y���X5��dx�0IE��D�,c|�2g��-6�����4�R�n���/�[�ʋ���h��w��S�F��S�l�K=�"
�Ⱥ�ɵ7C�!�@ր�{8j����5�ŠP�#�R"}$�2�K��a0�7�L��`���Y�˶O�o�w�����3�_&1��9;Ð���<��j�a������=a}�5��:im��O��R�FiB����􇃧c����Lf�o�Qǡhb��SE�����T�C����1��FC�t㖝��m{4Z4�<���1����ז{�
i�H����|<����[�Е�6Ѧ����	��t~t�n��T�_x8�uEeӱ�'�Y�W���?��nۓ��v$�|��h�۾��C�!�Ҥ,��ԏUH(�.6i]�\�MK6E\���c��m�5�(1�:��R}��(��"�p%���$�>�����b�nRM��y���|���.2�4�&҂,��Z�SwF�-��4��l�c7Tj����=�
|;�a�o^5g�6�$C@�����dĠ!A����o�]��sY\�>i��r��=B=�]d������6��l�����r�A����ݯ]Kx�m�?�{��M<�詋hj6Rg�t��6�
��_�k��.�Yϳ9��ٖ�ς�_���E�ܫ��N��˜�ˆtui�7'3<�F;�sxnF��g���ǥA^V�W|��6�M�z��3���
���͡"AT����Ⱦu4��C��
^�s��������)y{nH��0��7N�Q�.�g��;��&_�T��7�u|���Tiu�~p�Zq8����1A�<���A����o��S�9�=�lL'1f�&���v��!��iК�V"Zg=zԢ��=Q/r�������+mݍ���T�R�vr[!��D*4F&�*����p~e��[v[��`�N;�䘓�����xϲ�3/h��i#�Ӱ��UvSNNOU��;y�c��I�˼uM�0�kÄe�\�18�H�/\l��q�9]6��q�l�DѾƫ�ŌN��f�[ǔ(֋�
�����&?DcL;�c�[&:�)̙)\JVb�r�8g
���ܿ��h�ݛۺ�IRQ����O<*v��0Qy��D���1�]NTp?�)P��އ�G�����z���.!���
��uc��/He;�k�-�
w1��(��w.ۅ�i���-'3x��H�$��kG�/����ژ-8{Z��9J�oo�k��
~E�R;�X�˷w�"ML&;��zL<����� ��Y�
���Z���[{B�����aVki��*�X%��lTM/y��������:E���
Kmi�UΜYIqh����{������E{)�DHs<3�B���4B1e��AUTN�w�N�*i�?z�>�ˉ	����
�x-��%��S[�o�+��wGӗ�!���#X���Ϧ��s�4T����[���6�(U2%,íP]��D�8�U����m��b�.��͝w�D߄5�"�Tf�6(
��P�ۄ�i��B6����J|�z�~E�K�ۥ+M��J�|Sd���j�g�[��gW��n頋�=W�-�Dwp7�6��zF
�eW5I�DI=_��e��Ԯ�V�.C�!F������4G�����濮ϧ�l�>}�DI]���Vk�1~k�2���H��~��O��:�d��n�z�ymXř��ED2K}!�.���tGRA������_7v�z/Ő�� [�q�7{k�9�O��ᬸU�ͧ�e:T����t��H��l��ZZő6�j�#�P_����Se��UrS0<���M���^�2��%�zKd��?�$�a1(�������4��X!���hN=�nXesm����>+j-\�d�G�QK�r��@,�gEL�7�7W����Z3bv��;sA�ܸ��Y���T[:*����HD��E�wi۵'������l�(���P'����ѫ��/ʳf��fq
��4��.Ț83kR�	|3�B}�����V�\H_|L�'�)�b1���#���Fs�
��xZ+'��:��wdx�j$Q�t>b�$Ԭ�{�<�&�����?0R��1[����Y�$,��!�tF��+�-�Q�d�ӡ`;
�Y�Y��Ċ��d��^�^�Ga�"�Z���������.�{tY��eU;›D|��Nݎ�t{�*/����i9��ʲx�w�T�]~��&�1���Q�U�:�6=�6����ї���T�T�& Mg�H���i�@��S$�y�%gvmߥo��=���p�E���z���:�G�han��G6�K�,�$`�w.��c��"���D����	��{���<�PH"4��%��7O=7���1u�����2��]x�ge�D3�ѣ�e},yB`�ln� R��ON65�+cq��ő�Ď�sCC{�$mB�u��b�zA�;�%��`���c�i��hS�� �+�q�M�]8'G(m�]T�H��[�q�N���zRp�R����/y�}m8�q@=F`�8fh�KpH�7��vj��f=on_�E�w�Dæs��$�NJ��pI�V+|V�KXms��R�|.)VI��r���8�����*�~��Rd(AJ�[�q�T������|G7)i(	l�I����{��^B[x���{�Pm?�K��f��T��1@�gjںtyЍ��{���"��OO_��k��}0
���>v,�E����/I5Ҙ�I�T�	�1d�:aN�4&��%$��x��vKF��3=u��&�2�G:PM�$`^��31�S�	�d$���	�|�]�7���!=��U,�
s!��j���b���RG&/�/6��_#����q�1��(��ٍY��%{$�O�Oy�Z�(��?E�����0�6�`ٛ�0���׆��T�v�⵹��Eqq�������6�m�R�f�$y�a�
���^�X��'}R�ka�[O��x��aU�X{���ދ�9���{�}H=�tbg_kM��r�D{2����=��=o�"nz�����!�ά�l��~�=�o
O��'iS��s�lw����34�̚!����zj3�z�
���)迴��y��'����uQ��_ZY���V���ﴷ��4�$��l�>p�2��^�']���q֣�ŋ���
E=M�^���(�(A�?��f�#-��z�J����|+f@��y�"�%]�y���YH�"�G�QQԤkcKE9��Ҩ��5�.Z��f��Eu�߂��U.ou�'&ܤ�bй��#qL��Ь*Ɏi�͵5��0��z��4�fsk�����5*�N�TB�t�D�V3��c.���b̲Yń�|H����b��^E�|���e�G�Eq��3	��F�G�w}k������B.S���o�F�.�ؘ@ܰ�8��q�K�xn2�Q0Ij��wߔߵ��V��z��`)u��hD��-���e��TQmd�"�B�iA���YB�ˆ��V麎�`�; TY��nR�b�)�0X�{�F�M���$�Uh���4�Ђ!Xm��dөyŎ�%�Y;؋���)����}�'݋o�\�;��g��{��,�i`���Um��;�`^�H\��e����?����lo�RǦJ��x08��1�D�-�c?!^/��NV�Ζ�$Y��h|~��]�`�AL�3�Wן�:Ӱ���z��C�M�7��^U��C�����^7w.LM���� �(��i�j�1�Duw���
��F̾��W���W+O 2}d[�[`T��=X��&�y�n��>�9��N��(����4�O������n�,�dnT&��;{�֪��G��;
´�:�<���cI(Ѐ4!F�l���hkr��W̭�F`~�w�տ�Ly��]�(K�.n�A~��j�)Ft(N
��I�� ��Q�ȸ����(��B`��2��5N�Or�q�uv&/Jg�&O?��o��NAύ���x�k'��U_�����؛��ڤH��S��E�.�'��}�[�O�S,?�j�e���w�C��Ӹ/V�G�I�r�c��4�*�$�X�����f��Z+Z}ɚ�UØ&9k�W�v�1$�I�J@x��z)�4���}H���/��UC��$�>���%�P�!�Β�h�؀ )��%���c�s�^�r���ɴm�\��D+��[�7�����b��uɥ�6��~4I�8�P�W�5q#�q��\�Y�w�wR�PC?ap*UE*]#m`����Pv��"oB�I���Θ�,��x+�D^C�\�Ql�7:�+�=�ZMM�0�`8����������!��9�9%�_0���y@^����Y�ݕͅo�H؇��x��ɘ��g�<��<\�}����ZfY��g]��Vk�&kVL̤�x�ٳeΗ�$%�v{��'ʖɢ��@������}�Z����T�jMX�|<:�<����wZpڵ"'�ɓ�]��R�y��r�:i��E�����!�- ״8?�^���d�z���ĉ��(J�ԞN^��rJw2%��4,I>iع�7�2�a݌�����SM���2���i�ɠ����{���[�l�Ιv�/
����`\��ܸ���T̞�ܸ���d�֮�d��::fڇ�tEAH���4;W�*Z�(�+C�g;�%�5	i���QV�,X�,�U�%���	]�l��)�6�ޏe"�hgG�Љȇ�Ǯ�W8�Ywr�~9��e~���>��n˶��nX�d亮�i�:+ϯ?�o�((=Wc$<Z&�MZ��j��3;C��l� �<�wA�����M�v���K��ޗ�0�ٳ��"�+�+^�k� 0�!Ü�'�b�$�s��7�u*�/@@h����.>|������jo�����99���lj�NY�*��=)4��U;rV�r���LJ
�,�P�;�4v_E��<l5�|�~��L��DMb�8��]R�1��H�y��q���0��e��ZtB@�
;m4��u�GN���:_w�Ŕ�\ѻ��T��U���y�^��|�R���?6������)����5�0�c�y	�
7Ρ�
n�5h�)�n:�d&��!��A�������?��fKYك'�{��^����G�.FsϤl�g{j'k�\!����H��!���H�(Ů����������@��U�"Iat���I&XT�j���V_�DZ���e�3Π�9���1��-[�rY���c���$x����˼E�&.
`|wH�0�^�2gG=@��4q������j5�@�*�44�u�B+5I7L�Mj94�*��\�!8��E�#��"�K^����k��N�5�"�ԡ���0d4��cup9{3���36�
�h�h����~���Ch�@֞���rO�?w�T�
ij�e�I�O
I�vT||m�F%�@9Y���#���d����Ւ����t����cvvw��襰�nƇ�iSp�`�<��"ab��d�#V�)Hr3pY�s���w4f�W�iuxrY���p�X���X�[[�y=\��E������2?��c�-Yr(�b�Y��tC�1�����Y��n�c9�&pf�4\�4���^�8\���~��w�w|��2��J�B!G*i,zr�&[M�"��p<��U�.Z#�44�<�����m<���9��$�`�x�]�sB�俊yVsĤIf�e�m���CUCp������ȵd&lK�k���6�ɺ�L��;��.[�e�!�A4��ԊW(�!����&�
��r���ʒ٢�,R��|�W�ٞ��f;�}��c���{�	���F2QP��敖q�Ӂߠp�63�6"JB�N#�;��Rh{z����ř�[z[W�~���r���*3��/��?�t93�ᜃ�i�$���n�D��E��
8�l��z��w�&���e=_��E�)R�
�p\ �p,���(�$�4����LC�&8���P8 ���tD���BX?���G��<50B�'Y16�[7m2pNdld��*jV�w=""><>�zd���~�_Y�_M�;*�zaNjd���c�5�E^>��R������İc�WI���
�u��:"�O�m/e�u`�Ϙ��Fs
8c6�L�2s��1N��};��%��T8-�t�&�H
Wh��1��ٛ
���+��ɜ��%�0/�(��hph�ܸQO]<V��룙>=��2�)kc���������%\��KJɝ
'ܛp��'��;?`KbW/�
_�K{��u��ZF��tc�G�s	ٮ����}�����:z��Hb=�����%+�ЃvyƬ���R]x�1��A$���`�v���w@�XB�~������o-��B�q��bٙ�}e�]2�_j��z��u8�cB18x���.�¢�I��›��5G�Y�J�T����BIZݖ�ˍ!�s�b��YR�P���!���q<�弓�վswA�N����`�T��Q��jz���[�PQ��
�ט�kp/,x�o�\-rG�?�����iHr}�J��lDJ�`ŐNJE��י�'1���x�ŕ�o��z;"���O~�
)�c�8�I��7��xԞ��'���5��}����՚G՘i?!ȯޝNO��̣H�������oe[�8��ګ�ǀ�pWf������k��{t:�QϾQ
!�qܮ�Ө��٤�R�%5R{ǃ6|��⬑ޖ��Z��h^OOck���6�����YS����=-Q
^��KnUOs�6
�C��߲\(��b�pܶ+шx�o��kvd��A�L5�F�I�T�21�����'��Ƕ�f ��cm�h�*�3�JC��
.� ��PP[0,�~1�/s,�����[��@�z���΁&�S��VT���D�dSW�Mi���/؇��#��h�VE��TH��#��u�8ȉ����Y�^����.�c�c!��MR��~�fNF��C�r�9��S ���Fd�ш;�b�����a�����SW )��$�q)Xϒ9o�814&��42Md�����3��_T��
	Y6+A�,1AE_��G��2��u�Q���B*�h�ogih��
�[w�1�'ns�zC���J\�k�����
p�S+�@�,D�Xҵ�W��Ä�Ɠ,���¦`1��X!��I�O`w۽�3�.����DąםlY�%�T}�<�ٗL="9�p���I�
6<<zl������.-hiZ\�G4�5���0G䡍Hb�D��J<T��r͂WV��Ț��K�QE*H�@��t\�����S�p؈�4�AhX�\��{�s&���B�ǿ����Vr���:��ELJ._���o��D"��L>�2�iQ/H�B-"Hd��P$i1*�I�X"��B�^��%_8@�I$JU��$Pc�F.q���|�$
s�NF1�BC&NkiBR?�|6��.u4%��\$�"y�#�D�r_�$@&}�i���p�C��k�N�\x�{`�����(��2��$$�c���L�<#4b�"�B����]��'۔���Qi D���x�Ȍ�#�)aI�����o�=ü凊��6^\���0�S?�5�����
�^?0&�4��+!}��E���УY��*ڢ�V��ɭ�h���:��h=繿D_U*fRY���R����,2��#�d�1[����d.7q�#�{;+�1Ɗ�U2��v�1��Ɗf�W�ھ|�Q}�O�OУm��5i+�k;$�$��˅H¢����	��f����
	�>�����e�I�g�BK��y�-��J�h
����~�(�ũs�0bB�]w�ۅ<��ɡP����?���#tIH��qm(�`��2��}����.
#儌��H(����z�82�6�XJʎ�4�ɜ����ﯥ�_�क��_�U���҂+��ʀX����:�^��%2k`�n�4J�C�8E��5>OTV����LU���_���n�xL��X7j�R�"BC�(�`��0�k%8]3�4|�G&ĕ�r}�V���rUkx5%��Q����p[�P�����b�a��4��>TJ��צ���3/X@��?�k���!���ǀ��{c���S�*�����[֗B�ZX�z�ld�ු�ލ��^~����Ap˜�-Wlr�`KBi�{�*3-j'a����Vw��	C ��v�jd���t'&�z"s� 7��7ǯ���_���t	�����V��	�Σ-d꿒�Cj�Z�ꅁ2���g��ۖ�[��m��:-]Y��N��D�WD��ř8�W�;Q�u����7�d	USk��ohX�{�\v��+��#Zbk�i�*r���:Z>J�%���sÖ�����6� !ά�͐���i/��0vv����h܌��vm"t#�ڸ	���ċ�������Z�����!T�]�[�q�R$ܪ�#��Z�b�YM��B)p�'T�N~_�#!~x*��jb����(��b)9��K���@N�?8���K�z$�����>�n��qa�`�Y�3B�G��^�Z LY�g#�4����0��"YYΛ�LN�=Q��y����))�����y͗B*oC�j71��hÀ�_��uK#WW�{�㘜v���hAt�=�&[�8���7%��Z�����'��hj}�T��؁U�-5̱ev��8c��$FV�����r0��ņ��Jdȱ�z�כ&[U��H�]���y`�[�T|����������/m@\DvD��>Anh�W���)63AVl�ql�5r�b6���U�˓ܣ����)8���ĺo-,�,D-]�\��!��kݣվU2�~I�Q�JS�j�} �3�N��\�
��o
>�]]���!��-8��Tp!��s/�V΁~_�=��r|-	�ף�z��h��G�z1�?��l�l;Ԩ7
�ԒPI�C�l!�E�yABQA�E�
 Q�{l�'�脬��/8_�|��t����$PM��Ô�b��7�dܵmz�V�oA��DY���j�U��p�j�(	Ǔ�H��XHN �j��*T��!�Ӭ5c�Y�UC
HPn�L[3,뭬Q�v�kA :G����͚�Z+)��m'�n�
z�ZRJ7�OJ}<Y|�ݠ���VR`��nT\�}EE�)SK-��h����,�S��1h4_��^l���o|z�%����خ�/��-����.��9̥.�M�B�
#5;duK�F�(<M�}U
���2��o��9	�t�Bs�����\�(-�i�̠��P�c3f��ju�7���Ebȃ,��C]��{�f`(+cC!�f6~��j��LK�1�WV�(ݤ�z�M,�qǦ�鄍�/�j>&��%{Xh�P��RB��
��+��˦3`�
�p�(��TWԸ�>H��4��@�n߉�[΍�)H��<ƀ��׹"H���'�b�ݐ��9��9���
1���%{9��kkwf{'��쵭�6��PI�yfL�b;g6�,�s���մx�
������un��	���kseⓓ����;�l�Dǯ�L*��)�O��CT����a~?���(��WJߓB�_#���x�W3�O	��r��ܗ�Z�h�_�DJ^�
R�-���}���+��qru�q*�TU��V
�5NϽSi����x�G�10dgz8K� ?�|j��g�LK$p��*��vprX�'��O�[r�%���p�DgŌo�����\V[�uI-�����0<�b f��� ,w�5���I]�OƼL
-�o�叟��_*Os��e����"�r���;'��]�]����"!V��
�9�`Z��[���ʝbV�*2n�����>ۼG~Y�eH�z�W8?��;�=�u�ž�lP����#?{h=�T��I�{�o�[�$�#6:����o�qL�x���
г�`w���6��y����xD�
���e��G`RAW{ (,��Ɛ�%�䆸f����Z��\^������sɀ�;����߬�2C�YL�h���s�z�r�ZRxkE�6@��7؛�_����,4H	8�z���0���#�����)�
ɛ�T�Kk��I�J,�oYRm���^ކ�T�;�|0���~1S����	�t`+m��/��`�
����sC�3�Y����5	�Â"�5���&�w2-4
���^��j	e�<� lzȃ����6x���x�f���C�����3�R�ߨ,���=�2$b$^�P(킄;���?z���+��1���3���8��K������ݺ�R��_�:uÆ+����1տ?P�9�O�C�_#�e((�H����}�@�-����ػ��en�T}go�Y�p���f�M�
=)B�o�C��(�n0Aӝ?-bv�X���2�}�w�qK�"�����v����O�.������3��3�;ڞkP�1*�J�0�f�`�u'Ԏ†`��f�
+�>2#�jt�B�u��4��rE0�(�x��?brmy���@�n����E�Л���Ή�CL�^�	��v��m��;�A��B�	8�R���eۇ ����ۺ�뤳�a��6MZ-bثu�+D.b�BC8z��O3�Ot>xէ�Xq�l�n}w�d��
�J%�5Y�7�����b艮�m-��z���z�-|�}�������w�ʫ�U^�@ٻH���E�T�������IZ�x<��X�xH��`f;��ݦ$e>ڲ��H�q`�nr��?z@��9�����ġ��C_���uP_�R7k�P������_pSC��R�f�b6Ra1��O!��m�o1���#�p!#�USH�вne�x�)�[�E,$(�X�á����R��q�X„�8��(+
u�{ܕ?g�,aq��=�WB�D"{��\�����!����&z|�uu]k�4Ke�qr^ރ[�ۥ�(B�QEh� \`ab%f���EK�1:���M�FG���G�E�-Y�:���I^�-��J�z'�9_L	U7�0K�B*��7�����E�����6e'_�Z�\�Y�,'"z^A��|�t��D�%�B�ɧP�S`��q`��6�Z��F��b�8vb^�S߆�xt��p._���=U��G�&�U��J��/B�k����z3O)��$pN�n��wbl*p.���u�GͧԜr��+لF����|����W����+^`eӱ�-UyUm����9;������S2�Y{5�鿪��P:Ek�ʄT�v�����-�ES�e�
��ky�(��&�=��Z�/���f�<�Ԛ��-�Ffr}��/�)�=
ϖ�7\��U?G�y:�&勌��2��ޝ��D���품�$<��Kz�ߪ��7l�$���~�"]t��j0�!5��.��i�e���~u����:풓Yjg�/G�&�j�iKԺ�%F(�;	�)q>!�]6I`�����#�2i���x�����~1��9[\�����%���u�x�*݂
l!X[������Z�MU3 ��zj! ��5��$C��Z�L�7D��b��/�ب�ڬg=�����CE�/�`x�5WB�=.d3`NC�`{��#���]s8UX��$�or��Q��{5��1�����)O>'h�X�Q�O���
�-��T�Ȕ�0oD'pp���2�z%2U�����.-��T� �H4�BJ���@��{��*�L�of��!=��Ft��*A�Gm�4�1��i�4S��j^
h(�}z[^_����o}��	�
V��@�B�q&�։�=g���a��_�Nk4�-p;䕉��!��>WrÈV�ە"	ƈIK�ݫ�PO�,�kl#E�T[��>=��Ef���� L-�nEK�:��,�U#z�BHi�9Y���
Ј6�r����
���;�H�/��ExʫD�0n3
��Yk�F�I�1�s���Љ֬D	�]w���N��&�w9q�T�	Z�سJ,�Q�=�Y3����i�4�[����a�i	`���� �E�V7B�� ��Oxb-��8˗��S���e&�C��Ly^���h�ߩ]_t-�)�6�~C�7]�F�>:����|ډ�JW��@{,�r<+����L1�r��2ع��5�1�#Ji$D�`�I�V	}
p$�n�e���[��û����t��rq*S)��>r��Ȋf~�긂��<�W��8=���sį����ά.���J�ƒh��Ә3���f��x'8x�R��^��P�n�]�nh�m��ݵ���*���*�K,wq�l�fj��IaLR����{�$y=��{4I�#�tF��1�����ծ�{���KaʢO�w����k�@��v�o�{�#m����X��d����v$�h�V�@��^�y|g��YR�����P<#�_���_��Tx�7�M��6fe(�$���㚘OPe(��^�ѭ��g�����_s���c���?���3-n�x�����'��;����+�lUܫ�\>�ͪ���J}VR,Qή��!���TJ�(��X��Ng劀R�m��8�a��93	��@���V����o��$�UM?[�)�>���
ί	�fڝ�Tq҈�rv�8��O�H>�0�ؖ&�,!���{>�J�r�4���%y�� ��i(�JkFIC\؊���d�22�^y.��{�����px]34IR~��\���r��{l���gd-]���dlU���Z��R��D�ÌمvR�VF�W\N���s��b�H��C�Î��OQS��L�uXy�@��>�E�G�c���
����H��3�Rs^����4tRq�_^o�X'#���M�m~xk����LD^��p������۟��O{��~${�r�X�;R5r����>ko�:}\���M���-�s(F�N;P�|\�!����S��rz/OT�b	��>EcXm��kTu��'bR<f�e�F�x���#Ѻxq���7k�r|>
c���Z���՜�E;9�+�oQ7���d�_cP��5��N>�|�ʛ�~O���4qĘ��u{n��@w��`��5�x�B^�{T�̉�>~���*���A��>`{����I�P���r�xiۭ�Q
g@��7`�=�`.�@���2,tk ��j,�Z��pst;y�=�,.�u�� �}��#-c� K`�H�=��6���@��2�wf �f��x3,ߍ�n�G0�c�b�@���Bľ+��kbi�c�R���P�-�0c��k�R�?�\|�x�ƴ��k�Ψb	��Q�Lc%zQ��x�
$��ؓ��Q�H�IlJ`"}5ef/�#��y�d�l�N��2gA*ڈ����9fC��,)A$�d����ql|�I�Y�tz�)�*`�~�Ȍ��_��϶��B}|kA{��JJ��*��`T	(oe�D�(`�� 5F�l�Ҙ��X$���Z)�	S9�``�1*�1���@X���t���y�)R�v`>�h�:Ţ+
��V#6K�ΡY�ֵ���--.w|@�B|Hݍ`A�(~��$
�1�pba��@FP?��nO�ͬ8^ �%R�\�T�5Z��`4�-V���t�=^�!A�z!H�fX�DIVTM7L�v\��(N�,/�J�/t�v�0N�n�q^��~?B0�b8AR4�r� J��j�aZ��z~Fq�fyQVu�v�`8O���b�Zo��=„2.����	�8I��(��im��4/��u?����_=���C(�x��������͋'�#�X<�L�3�\�������������������innimk��������@FP'H�fX�DIVTM7L�v\��(N�,/ʪnڮ�i^�m?��~��@FP'H�fX�DIVTM7L�v��C��>@�##�,����Q��c�u1�{Z!��
݉�6G��/��R0j9���eJg&2������L��:��o��__�L�#�36�ˤg
�<��YΧOH[�7�������=�Fi��}>҆���3��Ü��:��
�1g��f�_����8f9���0
K��8U���=D�#�6b��]�δ/x߼�d����q��U�,�"�\�`	�� �L�03�K��?}<�p�����=J$�5��塌9*UԨ������dG�.��@hN�DC�,O��ndjk����DovP]Ω�/����E�X���_�s��h��WRlr��M��*҆~�c'd�թ{��5{�N*ӵ�'9��R��P�����w1�M�5��	3Yj'(�v<66��pW��_��̔���\�|X�����e��l�(̘<���>��t��g�c��F���u�vݽ���G�&罖�����ԥ�]�S�
j�6C��)ӱߟW�}&}�:q��eMڋ"'P��G�L�٬��y��Y0��X��3*��9����J�Y�Pu� �����V��i�_a\9�BUV3q:A(嫆x��J!V��̊/9[QT�i.�������(� �?U��~�U�?��G�C�8qY؉z��+HO(��PZ���	+a�%��,��tw[>��$�c=��g˵�Js�~�]��ɖb�����bF��l�[��&��4����6CFy�2��>���iI����7W�KV���)��Gь�>�ì�#Y��g���ʉBc���{��3b�x'1�^�I���<!�G໡iW�=ϝ��^�S)	�'_����}h1}k�Џ��jӈ��	�h.��xׇ��{�7�Ay"��8����yS:�ƢW�����]�Y�Ś���k�ѕ�+g�k�M�x�pl���w�=	q��k\~.3��Յ&˂:{��P����q�Ď�$O�2r��|�c�6P��
Q���즽��c\�_dk�^�Ӑ���,]"۪�#�B%JB஖"ʂNa��$i=fe�
��^�O��Főͣ�"�H�rͤ�Y^F�<����yAI:r/So3}�
�M�.�ly(�†�P\�"�!��=˝<_?)�������)�����R�2��u��+����wЮ�٪x�y0�t|�q�cwo��^���|���5
7])�ts��A�q-ǻk ���4fl���cAv�:e���W�����sR1y���:�8�BF�n���{T7$c��6t�
��߱\�I��V��(�s�pE�AIɒT��¬��E�U�>,f��D�)Us�'0�s����n����S����Z��7)o�e�J��V��2���}\��hZ�⻓�)���͕�Qr�F�`k犰A}�%�e��g).J���� xG&y�R�Uk�gE��t��
���|Z���vuuk8Ԛ��v0�6 ��Q1S����SfD��Nݓ}�X4��-��r����Q�Lg����D��p�c����1��8Kt!��
�x���߱\��N��a��߭�h�<6�KK}F���4r���4uԶ�
>�p���/��Χʿ��E%$�,�=��把�n��5ܑ]�)Ks)��gȍ�,���\��El	*#�;6� 4��
�Ky�U�p����~�#�wU�ȳ/I�o�DDq?�Ý�W���w�^��(f��<GW�����P������0�\*�/U����cLe��I�������i�*I����S������z���E�\����(ߥe���
�wY�g_?�BƘ1����#��M[����*�3�2tPI+��@�0x��ތ޽W�_�8��*$�X�v��C8��v�l����e)�ԙnY��$����谛Y1���~>Ȫ�x��I���c~D#,NP�I�'��q1�%�o�޿�v�\hY=���J�W�&��C?@�Ey�C���4+��G���_��-��8¼��`�����ء�
�"���Q�U䄷TK���B��T�Cϒ٭��d$�\��w�������Q^����Qփ&tEl|���Ԛ��@assets/webfonts/fa-regular-400.woff2000064400000032430151336065400013175 0ustar00wOF25
�,4�IyX?FFTM`�Z
��D��Q6$�T�6 �U�+k5㘥x�3�(Jiv��?PC��]�@�KT�7�eU֬i�6�Ҧ#p.5]���8�C`ݍ�e
�[��ǽ�c�HR$�dط��¡@��n��X�}��P�1^Nw��NۧؿnI8ǐ��D��C��	O}���h��9X٫B��y�A�n��<���V\�-�Dq�\`Zi��Y9*�Ʃ-3��~Ӻ֕�v�ֶ��}u��5���<%�+.���'\!��*��Arߎr‰`���:%�>�/��6')�D8����3�	������TR�c8f`>�˩��6��NR�`LJ����\�����W�j�d[-ۖmJ	;.��#\�k��{���3������.�KW2�-ݥ�X@�҆gYӖ�Z�1??��Qr�%��hot�_�U3b�^*S�1��^�E���$��%���-ˌ��qa�z�03�0aCN{��D�
9��R*�}�^�\Ѧ���9S$�=�BWeG{������*"
�g�?d[�^�=AA��f�v�,�~�ɛ᎞�{�Aj�$PP�DD��@ �f,!�������Q�/@	9n'�,w��˝^Į�;��.��lf�A���2(��J�}���$��,�C^0! ؔ�"�iMGrY@
��c	-���>��nγ��\���ן��Yܒ6��	L7��mw�_x�-��{��xɥ�_a����
7�X_u������n��[/����<�o��sGwbg���@��8��M�_wТ��4�o�+�8���D�e��5nxl��m?���ظ�mڎ}Y��O)��7O�]<�ͻ����?[�d�;/7v���qf��/x�3����/.r�c\l��Z5�J��y��9��ٓeY��Y����q�4o%)�����s�L?.��w�ڞ�c�ww����E´V�D��x�a���d��&
�=T�5����vDc�%�Ci��<�b�88o�8�� !Ǒ�0�T�%���q���ع$Ə�P�Wr�]���2<�9bxM��Ŝq9RDb��|b�
�6�n'ָmK
��9a��&��x��tx/�(b�[�b��F��/q?4q�D�R�ݞ>h�����X�ګP�<�-�{�<�u ��ʂ����`�QT���+��뷵xE�q��
�`u��}Nc_�B��Z��RA�~���7io�����i~H��N�@��E5�:���y�@�
_�S�b��k9,��_��~�N����?�WP��sW-M�4p��c�cnώ?�+O%_ЦBz���J:!�����f��`�$��#��0��ؽ�,AӅL�6����d}b+Ɗ�kjFѮ��.!�+:%c�ÈP��$"��&$������#�{A�2I���hL�7b9�¼�\�j��n��������7�c����o�gì4��Qk�K��������2� f�F��
�А`ݣL�׈w�#�$���Fv쾴_�7�8L��MhY���	0��g%�*N� �Oi��0"g�l`�
��v��jJ���;�1F�F�?E�7A��걁)�X�	�3�5�	��j��7`���k�_�U_Wn/�F�`��D����5���@>��e)���-�8fdp�P�G����G�ViԎ�}��~��>R=z�����<8�
��i0��a7k5`���.oq
�S�w�zj&��9VB�C�VBMi��'�4!��B�H}Ɓ)
3E�Z���K�<��Z�7�ɸR�������m|��-Y��Z�\E�S��I�A�a�c�
���la�N,(yĭL� ~�Rե7��4WI`�r��eƭP�	!��I�Ԏ���^M�l| �0�4�n
�-���h�J�6H )�.dd2�|�W`�y����x����S�`��\I�"����Ա2�B!�����.n_R�x���e�����w�4��:S���—�ݻ7���K}�˗�7Ƀ㓺oz����wC��^�x!U����8}�b��\�t9�0�F�����/'��7�^9yW	0Ҽ,h��N�T3I�bBi:��~��z�Xԟ�%��kzo�W����I9�?�AXuߛ��r���SL@��c�\V��4�OO��;���y-t��lN!��!^`�*#*/���Ʃ!74����	m-m����tVe�%9�X���*"�'#�M�"��m%M��:Y��v�h:�����*Ĥ-�����3��^����=�K�a�h(bB�$w7���&��KMI�:pC�u�Gvh^~��)kiͭ�~R�~�^T^�L��$ްfq�[?H�	���*�����L�;A�|iG���B�$���	�V5P§�hЬqÔ���E_�/��ND��6�yڐ^���4m�-^��e�?��>��Jչ��hk�A�m�8����'`$[Y^u�J1H#`[ؕr���� �CQ`+n��A|mk�mN���n*D�t)H2��!-+�Ϣ����S������|�<��̂`�����x�Hk�@١��6C��\
�^�rן�"ç�ng��N�~xى��e�;3ۀ��3/��&���$����_U��yE��n�����}�~m�t+/+����<���~$����S8����������>�a�{Ͱ�����ځۊ���_�MjB�C�l쒡a�b�S�M�L4�7����chߦ����b��I�p�X�7^c������f�k49�3��7�CQj�+[�J��~�k�D��8���S���Pe�5<ED!�<�&g�66�[����2bD�3-p��!��T4�Z����qj~3�p6u6_~��"�3h�	�nK0���cXp����9u�J��EU4�*l��D�h�>ے��B�`/��ה��4q[x���,i-��ʱ��������sڡR��!JX�[*���I�kp���fEaYkK���6U(v���[� cn_*쳕���<b�rb�h8b�u��9{A'�����I7o�vO��υ��ɮ+Y��F	��w����(�3G��*�{Νw�g�/�j斕.�v�33O?�έg��{�������y`��ӛĵ+�t�Y��{Ɣ�4���:,�cj�.�|�#�K�˄a0�!����6\���#)Wn�L����r�z�^*+�U�uF��̾e�1N��kX�ӲK'w�<�� N�����j����2����&�h���B�C�2,�ޔ>�fڦ	���텃A�ф�-;��޻Ų�kڱi=!�>�ڱ�l�i�ʚV��f8�Ey�d�N�,�ڡ�����;5M�{�/��ء昳����֌��蓽ư��J��ԉr�`@��hC��r��S&a�%KQh�@��8!��/2�>�l�al%�����p���ax�ݲ6\�j>ڿjz�
�{+�W%%����ߎFi���hŽI0�\

��qEaKH`yՓx��Ь�S��wn~'n~]���I]r��ENL��7��
s�1ĝX9��Wk#
)�-���Z�`���_C$Q�g<�h`�H�L	�����4
�/j��+���C�zzǥ��X�>����G�%}�RYq��-]
��A	|�o�'�4�8Sx�e��k���x���Q"�C	:_���\/��4�Yq�O	�v;\3�(�f���?�6	m(.����2��!��4�͚���O����3!5�MkHI��Z�i�Z0[��#��w
�5K�Y�˹�"n��X����kk��H0f�&������}ȝw���׮?ɘw���{8m0�c�DB�f	V��j����\�-W��>`�~� ��ִ��	[1�V+NB�K�Z\�Z�լq��P����#�K���U����r�t�I�Y����{T@"č��N��-^\�����R���1�����Di�Y^����[�K;�ɂ?~J����+А&1L��N5%+Lt&���1����(+�kS�S\��Ӫ��i��
�4�d��1�������l
?D!DyZ��U��[1�M�MQI�f�d��mU��FF!�t56��!~$�Կ�On���G��$�n�
�G1�����̼G":�Y��=�����+����
�!��y7�M����T���~\��s>^Yj�Ҽ��ڗ6#��}���O�}k����u�P g�����E�+���(}n�ޙ�\�H_*{ji��x]�N��rۢ��X}����ŕ�
�9=$)#	�O��T�*�ޤ���܆��L����Ż|�c]�t��8}L#�f3�z�i>v����%�?ِ#�����ǵ��ucy������;X�t��ɹ쀄a�~o���͎��\	�5A�Q���ӻC���$l*.(���ʿn	g�"4�׎~-�>i�p����`?�/[�k�N��/N�R5�e\�&�O�)�ڥ�q��i��WG�e�|l=*�gW���]k>�
f��2�~V�|Xl�����>m4��X���ru���3r��c]���J�h�|�O>�~�6��6N�ŽS7*Q�=��ք��NX'�Pq�����������ֹ0�!&��+`Q�:@�~�+5�$��D��~�\�a�oQ��ܣc\
��]�	�_�V��R*
��K��"����W�K�yX�9�h��-�ղ�6�8����MÞN�C���,cE`+��=�a�.Q�2�3� ���<�C��U���2��T�J��P{�.ƹT�\�?�\���‘T-H�m%�R�د}_e��a�8��Ҭ�p�ui��I;���b��*R�g]��wwX��i�ſ�q�$�����!2@o~�y
�|=g�<��_6ɕ3!��^!�q��$L�q��$U+KΘ��c0�/�zUJ)K�����[�[uS)F^ҺW����D��ز�#��cO�Z�fr�j8�r�1"�v�^�{}aU�nY��K_U��\
�	"6���Ck8'V���G�7�=&�jw
�%h��a#g$ދ�;��Z:N�'X{˩�#sa��E�q��7�u�Eb1�'�vl��+��{g�]��w5��W���UotWI��—a����0rZ�b��c�p�e�L}������:�3nϹZ��#�����6��jD�����IB���	%��0*

���o��w��5Ea�����v+2O��UD{��qI�<�c6��?�O0�̠^t��[*;;M�l�$U��ᙲ�f�9���GLvۥ���8��4B�Ȝ�d���<�T��0ӆ�A�m(�p1D��#�3$��O�v2:Ь�q�I�Xo����Z=_�[$V7ΪS���#`��5�#[�� �/�qR[�M��~d�	3�Pm�`�ʆ�"�c_r$7 �U�5�4a�4�����l�,�Jm�k���Ȱ[�I?�7x�=
!�@ʜ���p�2&hkF�:Ȩ���o�2�zK�g�Tܶ���!�U�D��	X�N�b9ɴ&�
����i�7�o��	���M��F����B�zH?����닂��׳U�q'E����T���
Culr���#�
n�{#�wQ��<����-o��f���xc��A�g�V5Ō��̮���.s�iwx��"I��.�EbL������`��|�9�Mn;�|�Fw�F��r�
��l=�A6�g�����s��A�כ����A6�]��s����������2]���;�:^�>�'z��ϊ��y ��i����K���
kAНUm���g���gN��H�E��c̛�Վoj]���A�)M}��h�՞& �h����]�=:�t���mzS
&�=-��ot�L��s?���WA0�c�sAPR��"E���Ӂ���>8:7:�{r���pw,kGzC@��({�IOǾ!OC^�ļl�׮q{���ɶ}e�A�'w,Y��t��j�!]"8����h{n�.�nT�C�B����:��
���ބ��A�^{~ԂPk��@�0��tհ,U;��7��MS�.O4�@��_�j��(صې0����ނ��y_����ך�p�+�z��^{�јX?(C�C��xY��YuD����}b��K�y�5-^7%sL1?���]���w76��zV*&ua��-�eʼn	YSw���f�͌U7j�}�(G>0�c�@���$�c����q�k�ߡw��n���ʃs�����XŁ������R��56���#�<�}�BjV�خAMޯ����$�t�t�bB�='c����1J��}�C���X��=z4"��0K��6ಜ���Ju�oLQL�,m�Y.~����?K�"@h�<.#����SҲ�K~�s"���o���k��=�zf�Nn���y>���
�Oꥋ�c��V�����#�|��bE{�?�:5�{��p�ԁ�6[|59-r��AR�y����@0�E��ر�Ћ���R�$��.i�h����ﬦt�����bSN�L���pӪ�_�oy�2���r*��8��"@D��xJ��rUQP��G�H�t�t$�5"0����Z-�H5�_�p�u�8��AB���Pl��۴?��j}�g��pײ���?;��;	x
|�,."���ahע�Ę��h7�ZEBf��GE�ry��L��.����I����g����bC��}� t����g/�}�,�*�bIod���4`��LK�L��K0��{Ԁ������|)���Vg��6Z���5GGbHS8�����8w�����d�i�V�e0i�?P�P�b�1B`��C$5gO���?�.���0EF�����'��r��>k��K'�s�iR�]��Ϝ\t���C
 �As��$!��k�GSq�M9%�óA�v�
�9�&l1�4R@��������4R�#�ʋIj[NH&�]�Y�#䎘�!ɨ4���R��~X�U�Q�>!��yGC�é+m��w=ZA��
VC��Z��{P�\�
��]	�t|�Kl�Hv8�c?�PB�P���F�V�����ʂ�FIT���IJ
`�ډ�����e0�	�?@����D�b��+"�$�bB���Bp�h
���苔���+��4ob̩k��.25E���&�)��لBȑu!�q��rO�ML��鐠]_c�q�pt#
.w�Nz�l���3e1�V`[o��I�-�D�P��PyE	�����&/?[�=#��Y��U٠#ۖ����[֒�(�Weo�ܚG_��&�h�z��P����(��Bz�N�ӆo�j��f����6)�<$TwE@W3��dgP��o�hǰ���?���$/V�t�Q�;T�j���Ы�~Sj���΁�~�p=��<V�N�&��{�����C
���Y7u�uE��.�ti?�
�Oǻsdܘ�嚦_�}����۾�<������F�
1Y5Y�:�Ώ�2��9��ȇ�i����k�"KI����Rdhn�؟cw��Ml�6���K�^t�If*[+}�9�0%%u�(T0�8/��� {�?{B4����1����<�<+5c4���ۡ�8W��b���iA$��$"}r^�����#7xab-�]�i�bq
i��;29�ZA�� b:�nR��˿�&G}�I�:|�pO�e����=�I;[+������C:��;	���{̨%��L����=x�;h/���g��̓��z�{*��MK^4�ĸD~x�� %h>|�'��N�nZ�I-)�D(?il(��\X��IU���h�Y�z��3Դ��o䷬k��9Ѕ]�q�]݇JN�>�#�e�$�n|��$G9U�Y����[����Κ)��Y��̽"�"��~0.'�k�ˑ�@K�}V����5Ɔ��-���?A�$������n���7쟔ޭ4��Lz�_���go˔�Di}��,�D�����i_���T4��T���796^wOL͹�	*���n�s��������8���4�h_�
�B��b�D��h�1�U�9UiC�ai�*h$��%KO���ai��h[W�{����=�'�FT�|��	��K��U�(�o��9��պ3�h9�Q6f���(E7�xʱ��ߚ�O�=��FIPMޞ�,ŵ��׉t{��,B�J�����~
D�>v��H]fܕ�~�;�����²�ѷ�nD��u��ž�� �#�z)<W8�J��%�,���,/_�8�1�jE��l[9�w۟����1N�Qa���f9�eG��H�}�qLf���F�dݨ�C~Z��|���#�Sg�Z�!�U�
�\�7k�B�謭�Ť�G�
~�
�}bOl���k�_\8l���rR��k���f�2��L.KX&D�T��?����{K�4oXw�?C�vr���/KZ���q?�L��Ol�T}�!i���D�
�A=6Uv��r#�}uܸ*��$s���&�MR�[�0
�#��#�ۻIs��s�NB:ZC矝��۰���L���k �ށ�\U	�NRO#�tSY�;
�=;����E����U�9&�h�,Q�D�Xݭ�d`����)�Xݟ��UQ[��@{Dt���Q���ioq��}���i����l�?G'dA
^r�O�HL�Sb��7�@������K
���8ή鮱���� �@�����-��c��a��Ay~u��g�A<�΁�R�HWDtHjN�9�8��*0^:��_Rs>e�����&�v�Ry����&V�@�+~�Ƶ�vdQ@��Ѫ�~9�[��2O�j�����6�Ddž�j9+�KgI"�?�ㄅq8�X��)n
�$��tYKo�R(���j����<s��H�+ԗ���/�L�R�E�%<���KSW�s�W�㧵��g���=�����	g�Ai��ro�@|�H�y'h���^��D���W�f�$�/�9��dU��Y_�hk�]��+�)W�n�O�8�?5�/���W���+�;������se��b8^����O�+�u���w�y�F�3�b���?r=;�a�Ç�a���?�g�W��Ⱥ t T��ER�T�]�4�HԒZ�9�!�' PW� ��p��JRLй�{�����l|-�A���s%w!
`�Lg��z�ǂ�O�Ӗ���,�V�3O�tA[3�Ҍ�� ����;��bmr=��d)�2��8�&�D����^V��&V��^���s!Rp�QK[��I!�V��[��F4:�Xcʓ��fq�R�GD��b�m~����L��������ȹ�(�eh�C���m|��i>`E`ň�/"�&�b���h���E�a�@�4@v��:sv��כ�<
�YC�J�T�0�w��J�Ӕ�
Ë"���G��ޗ���B��L(6&ԅ��U���0u�Z�ј*B��_tDj�މ�@��#�‹��כb��VЊ�$I���}���z��z��aU��7��T6����9��Je�Ǒ��-���>�}�#�� K��$��m��;��czC`d���G��8�Kk�v4+��O.�/)��+�����j��E�#��J�����]&Gݻ�<�W��ǹV���ٽ�P�E�=��	 ԢA�쎊U]�B�R��ܱ�|���i~Xc����	�]+F7��|dh��e`�?Ka�VbI���>��z��)6���I�=���KUV;��
��k)���&�[���#�����wj-�˓Z®1ʨnVә�+/��#W�j�|����E�
��k�"��4�ʴ�����cc�S�)fjף*j��ݨ7�x*��;��qӼ��JD�Vj��y�_6�W��:<7�������/�L�6��D�F�Q�F�W���X�{ܷfp����J/֯�À����a����}�`�� 5�}n`"��>9%{f�~gW��|CsݭG�Ӿ9�.�ufx�f���0ɒd�n[-�;�	�Ox^�M�H���l��^�z��O��0�F��VR�-�;��~���O��kz�P��M��A�N��.��x�9D�t�G+�mU���a��,C��p�I��!H�<��shh����$1M>�2^�92Ϥ+�ɨd�a�4}��.ɴ�R��q<X
Ta��q�������U"_�F8�����L5AL6Qo~�����H��c-簟�?:�sz�$0�(R�����ű]�J�"�k!���%*�r�dw��[Qv��k�Θ/1�$��qC�d���͖����[@0X2G$��,�Y������Eq��nw\qE��rS]蓘�����cf>t�2]E��v�'�AM�,�E���6+ᯀJU�T��`jΨ�ʜCWti�{P?������#J�����]��r*Ss`������^��tR#Bhyu��SR�D�d//���4l���[���k�k��<{���pm��y��9��U�,!]�,�
f�7k�1��;��='<�wO�`�:n%Gq��t��PC�S�O�ug���m�A��љ�mǓ���2��ɉp��uy��}�cT+�f���>�N}�r�d
��Y�˳L�X�'9�yL�f��V�>iq��{�zOl��^�D�6�W��r�Uذ�!�D��)��Ƒ��rs8�vr���{���dòh��`hN1ߖ*a�;&5,�k���GJִ-O+x���$���(����0�?ʷ&S$浯*��=c-�u۞|
1d��Җ��[�}�bp�,�p����/,��2�|�7��g��)e�7˶��$�����4��Y�����'B~��f�.W_���⟚r�g��~~�����5���O�hF<��>�����z�����+��t�Xߏ7����8c�Nr>s����xM+��Qj7W�K�M]�S�_����z���Q������[�2�-^~^+�co�$%9տ��/3o�P<��t����X�<���t3zrYZ�(�Z$�ä��$�/�r����|m&��a�5���+��$���N&��ĺT?�\���-1	�Tl������I��Kd`�b�񠿰*r�>X���(�6�`��YW>����r�m���J ��Ko�?'���m+�Т;���6��p���0Y4s�V3�,�&��FQJ<�=9�֢��Ҟ�_\����[0�O����<~[��l}	��y���Um<��(3��[Kks����gƆ����������5��0u�M���|�@Q&q��e���w`�$���P�݁p�C_J��
n��1JW��M���<vC�b��j�<�EYu+��`<o&�j����{7��m��q�����U�A���m�3ӧG��q���D��rի��z�q�`��r�vx޷[,+=��&���u��ږ	5�
�f���<��(��KѼ��H��D� ��432/Ss�=��\W�z���ld�gi�(�2;~��e��z�vB���F����x����1��~��c�?��D�c?��s���M���kz/9.��Î��[='�̴0	CfT�&`���
g��8
�1Wߒ��B'��N��$ ϼ�迪�Y�Ҙ��d�:D4F�x��b��k8���JD2���_D���QO���_�Y�+��?f�E�nO�F���o�k�s�B	;Q�x����������e.��֓�+��۷ݜ�/��,�#\�O�N�W��4��DV����b2� K�:���h}�+���OC�������CB��>���rh��x
i]���>I�?EDy�z&���Z����{��;фrӽQ��/7����
�����ˠ_�x������i[2�=�� \'6h�ⶨـ7�?fǢm�X���	t���3?��6*�Y��h[l������8�d:����ü�뽢�>4I"�y�9:GB����`�rSڪ'��n<�<�#v&�tg��S9�&:��a�e�j�G�&��L�I,!
�Eipa���2x���8��|K)~��D��2�
QIVQa�j	*NM��JPD/QY
�T���C�)�~ƅ��.w�1�!�)�1�(%�\�ў���R�
�]�T��r��3T5T��7���sT��kC�i��Bx����O�9:p�B��:���R�Ĝ�^|1���7aJ?��]�z�e����/;�X�Pa'N���R^X�m����/+vxZf��y��U|6�"hF��Cn��&�	.vt��2���N��C}�l@���tLrn���)G��m[���غN�3^ %Zl;臺`W�n��B�h[e�*�`���LwD&ND:e�p�Y,7��'�2Γ����r8L�<��ڦ����=��Γ�؟��Yvk���{�Uq��9�j�}��B�L�Mj�ՠ��py�Ad�/��B��OB�*CUӥaZ��z�>?�ʸ�J�|Fq�fyQVu�v�0N�n�q^��~?C�08��,O zO�*-�3�,6����"�D*�+�*�j��Z�:�z��F�&�f����f������z�?�����tAkg�k��{�LVp�V�mXD����`�չRBs��3�>�ߟz��7�J���g���N���1Pɫ=zI	s=��u
��`}�n
8ml�.�=c�<y15�A�s�=B����Է/e\��j@+��;/����`�
�gd)8����4^���(V�O������E=�%�U���9av�-�A�z���%Q��j�}�,�,�:�0��H�n��e�V>7HA�J����kli�b�C���Z�H��5��=�4�@y��+a��E4��ax��o�\P5�\Р!3
��θk�H>��P��z�wdZ�?��M
�+k����bY��;�aU�ó�T�\i
�,��TZy}r��->Y%��\��=.�q��tc0�E@��5��6Of�6y��8CŅ7eP2j�N�/C��+���pD*�s�s�2�h���@3���,%A��;��[4�������¶'8f:�f�]K�-6<F0g�o�A..��ݑܜ����h�V�Ǫ`�����!6z�2<?�Zd�
�����]�_�zs��[y�0�&�xs1����}�] H���ĎU��C�����oǕ�E��p�"��7��ЙMu.�m��P'-��%'o��r�wA�r��0�W]%o
?�\�W�v�����F�i�0��3�-�|�+̟�L���I	sk��ǓSa��9��
��zB�VքP�D�5-J�}%�assets/webfonts/index.php000064400000000016151336065400011515 0ustar00<?php
//silentassets/webfonts/fa-brands-400.woff000064400000245124151336065400012731 0ustar00wOFFJT
�XIyXFFTM0�qqGDEFL*�OS/2lO`B�/cmap��j��gasp���glyf�0��$��p�head5�36��hhea5� $5�hmtx6���}loca8�DD�.<maxp;� 
Oname<�uu"post>$.���x�c```d�	�9`�c�U(}G/��x�c`a|�8�����ч1����Je�dha``b`ef�FHsMah���1���0�4ՀZ1.R
��kZx���mh�e��]�}=�<��:��M�u�����?(�:��n�a�$��=��X����RQ��<�9_� �e6����s_��KZW���O}�/�������q�t���r"v;�Y�ER=}�q"hK��~���_���V�NC)���\*�Ŵ��P1��
������j��S#]�{�4����=8��q>��3x>�"^�%�)o�W�~�㣜�k|�o�4Y&��HJ��B��v��o䐜�SrZ�H�4I�ܔ6�/�D�t	 x-��ら�����9�<�/�r�KW�j}H��uR7����a<���w��aC�����1�M�YeJM��`6��9h�&i.�+�����8~q�#�_��e=>������
*�e)���c7��	j�&�K��4~��39�z���c&/�q��ͼ���^>`=Ns3_Oy̑BY+[��d�$d�|-URg=~��4X��֣U~���C[�� #Ȳ��h�j�z�����X���l3���x���?=�%����@|���
�}�~�5X�{�+0�[�K܌�X�����������p<�\�}�;v�,��.�t�
��<��pn@��`"�c�m
oA>�y0F�p��ȅa�~����
�@/xz�K�'�_cALb��y���)�E]P��YuJիT��Q�j�*QEj����U�wۻ���x�^�7��ey�^��"n����q����e���t�ݓO���+���3�H�]i�?����A��t��x���	�%Gy&�����}˻�v��nY[WuWU�[Rw���[K/�EkABhan��@ !y�#��`���ƌ�x�=�1�����g~f>�T�?��ju7�y�[u�FFfF����!`A8�
z	='X² �n8>�����{�0���q�F�
���#�*��k���]E�>z�/����z���z�r�(�)�f)2mZ�3
�$��N���?p�_����؈t�U�ݖ�.E2��%��*-����:7��;��$�W�2�Q�x܈j7D/��+�^b��ܞݵ�?���k��)�PV�����gF
�*�\�?�P?�G^o��߬Q����,���.wK���s���g���p*QT	�njW3Q���v��F��܄�}���ǨE��z0S+Z�Y��ْ�[��P7傺]-�n���(<$<�3jɇ��
���:��l͵�=�J�IG�f2�h؍Vq�0�M�
�&m������m�Vs��MF��5l�o؄
y�ϼ����립{O�vu��c�"Әl+Nˮ��lE��"�S>ѲT�=��Q�D��X$XT��BE�EL���bJ�>�\�l�>��\�`Ud�EU<���.ZÒY
C��bE�f*�n�L	+�9���HB�(b*!HaD��49HR�73�E���X@O	sp���hV$�f���P5�s��I�"O,�P��.��rͼ|)��b��ffg���w�]S�r���J���2���,��(#Q*Me��*����S�U�6bT���S�oIِ,>?ZsKK��LSCO�zl�>��
>?v��Tw������!���f�m��ƒ@��B��t��
�舶�.�^��D!5X�l� EN>�B��`��dĈ25[4�jQ	�Q	wא�K!�P�~��Λ��D���ǯ
c)�}�l��RV�0S�L�Ԛ����$��Xzd��l`�jPQ���3S$�τ�!E>p��X�#/*��"5L�*	QD��z(#�f�:���ͣ��b��5�řa��e�rC4dEQ�f��r�Zh�@yzH��hBq���!}Qg�y�m??~�
�W��"|Q"+�#�+`d|Κ�k�twx��OVQ��R!�Ud��b�[(��D�{���E?|�L3�P�V���k���2>%����u��z��Z����Y�R��y�[�����vvY��۳k����*R�D�jS{���b�U�yU��Z�(�h�?�ɿ�Й�/��:��"^��?�A�'A{p���K�?�Ԣ��T�fϕi�hڨ��R�.4Jcټ%�F2$h5\��b�Q��u��&w�f������Quj��t�_ȹZ�WJ�,��
0� �+z��#^�ǧ��g�n>�-���m�Ix�ac�%
�ν������~Q,䜂S�e�|�5����"�\�-{8-�5���\��喷����tA���B^h	B��?�ȴ�0���
��H�Q�̠7衇��l����W��N%�\6�Jw�{�d�{�u�{����-V��}��[�����K��8���N��_�
}<�#���
^E\���>���T�+��i�ΞY�N�@j�R��45Q����1�����\u$��}�@�T�'�	�pD��)�D��+��n�ë�+X�82Zk�ȱ$.��*nBe)T�E����h�U��$S(X��L� ����g'g'���%�v�k�t0L��W�lf�Js��[cϋ�Ǜu?�yu�\��"����N��e�Q�Uŷ�Q6�1���H��l30󧮮7�f*�	D�[F1N��)$�^�V�}�h��+7-]�ie=�Zo�?��ߡ�o���%���Y�U"��TE�BI�,`�q��P�Bg�9�?������[�M�=��@�,��WM�y �����%�}AaI�Ek���?�����o������j۟u����abz����P�x�%��KG��G���`@��8=$�^o�A��d��@�A�l	���EP�P�
Wi���� ����Ƽr�*2�Б%��J�7����t�*�����Ez�M�i�W�+���`�lnll.!$�l3�G�C��U��n�^:v#�#�j*��Ab��<�(������9�Z���9�Jb����<��P&���6KHJZ�)ZҤ���9=��ɖ
"��S7��{�?���qIUNL99�_��F��n��J�l��s�G��Br}�'�5�<�ܣ�B�3�Vq�s]&�{���N����@~>uR���N��	��S鿿MW�����<?��?�_W.�a�g�C�-��-#�Խ'g��Px=@�9�)Y��I�Q���T8�2�5x]�gAX�_�_Q���B��B�K��9�Mp����P7�	�bm+q��
�7�s$?r�8~���~��c_�?
��
z;�'�%ZPf�����/<����
_+�#�8���[�/:�����7~��`�=��V����'��x.������oz�7�zK��{^F��XB��.Ap�l*+/�����Mi�}�n��%����
<��I��c&���K�1D%��zK���n�ظq�������Z�m����7v���6y�ZM�6f�c"�e9��8+�u�E�`�4�[i6�m��:�K�5^�5LK��D�R��V�5��6���
�R�|����R��l�"ڋ��OӞ;>���.4�����%$��47�ߡ�V� yA�>�~��zI/�ɞ�����z��o�<�L�����z~�����~?���G?�1
��P�J"i�Z���	�Y���Z@D����	��TQ=��z	*n�`",1��EG�/��e|u	��O�;@��k�P�h�,/��F4�@���B4���Ւ1�j�mY���T�X\U��CR1�Bg:zJ�ԉ�ް��-��|�C��nu��^�����&�u�]�v��6���P�/#��z݋L&"|�}J�tZAd�ђ�5󓗌�3���b�p�­����l��0w��o���
?�q�S>%����qT�S!Zޥ/U̎��j�|Q6�v�*���J���+~n��<�\�W8�Z�P[J�4�v��Q�;������DH�K_�ts�/��g��
��T�}����ՅeaS8,�|<��}�q3/�l8@V<� �WE�I
#>���h���4;�y�'��ꚣ���B��/�������kP�?��� �X��T��Ho��0Q�m���G�=�۶��f۟���ug�k��]�G�l�[4�y[�d�D�bl
|�1�R8]f��"�TA9���2�_��ۅ��O_G*�@0�V��Ї�ڀ��������q"�G�*h���P�H�Hy$x3M�6��9:u����R��O�pl{%�ȃgk�F��Hӄk��xjTN�S��<��5q���u���n���p�o��Cfo�u�ל�7y���%�L�B=G%���q��큲���|�_���bH{��u�fF]�0G�9���"g�\���)rh�σ6�7�T�0/[���$�a��a��ZS>P�lU�QŐ�^5��y@'|Y�2�SJ�!E�T�8gR��Ja�	EzH���NM�v�d���n�ж��ꪌ��(Q��L�����$[��DD���B%�����3.R��I�d(��IȈzYC��"j	�֦��`�5�TҢ��T�s�7R�u��:4�m��i�h/�%1yץ�%�[��R�Y�H@��6��(Z �2�n@q"��L��+4�J��^�0�`��x��˕-j�
�ىliB��{��MoE�e�5�,Pmu�%��۟���R��(I@#�K=f&��C�@.�-غ�[�g�>���j��J�RdZ�eQ��<)�+��3���k��N���H�0�J�V��`i��b�����X�ʈ�r>'���Ij[r@�����WqK��&�a�0$Vq�g$M�C:�o�0 a�h��S񉞥�R�(�_���n�M�k��祹*�����'�p����g��@Ϩ���k{��K�$.��f��j_�g��
�����*��y��Ji���n���aF��Wv�'|��r�e��y��y=�Ź�H�Lm�����>�I�psp�|��dO�L�� x�'��N����DΧ~of㤤9�#M�YOc:�6��#*��dղ��F�s���־gJ��zD�t<�ΧX`R&��v$Ec�r{BsMU�LdH5E�Lx��o�m�"z}p�Z*�-d�c���q$�p���f�.����U����Q��&�c�}���,д��)�:�h�s�BV�	E%��)RID_�T�Q�m&��`�,B�u�W0M�ۿ��ke��8l0MW"K�X��b���LuA�9o����F?���<�8H���0e��|zwT�r�Q�=akG5[�_��# ���C5�~�F�z�U�s䚶
W�>�>�$O�i�c�j�Uj�V10rn��n"\O��.QB�Uu�����1��� �5�4�i*�Z��S������F� �p��Gs\'��uđ5cl��*@�kuQjJ܅8a�c]�Y��8�Uq��(5�гD�_f�w}�������_�4첩�0#���=׫+
s�3�
k��І�L���D�C�iVmU����s���nT�kL_Q	�$|�q����x���>!���U�
�p
2�0�:�v��XKj.�xM��ôK�Y�!�L�LFωios�WB��A���f�	F�K4�j��6{��_9��+�"�%k�r$�:wo��v�>*�ao�xӦ
�\��&��TJ�a��*�[ԐRɏt$TR��n��ˋuU4���]��e���/΃����G{�n�z��91���`K�`��M��9Y�!"+��ʾB��rd�_?/(�u����&^�G.4鈻��wk}ix�����̚���$?W��k߀��G+{O�c���
G:�#�ҵVo��ć��O��!�y���,�"�����>7��*�ӵ��r��p��	�'�f�_%��gA0��!:ku�gL�|Ӣ��)z��i��4������"W�~@�fђ��	,@"����*MN�&3D��Lk��*����#�Lˠj�i�:D���o�B��k����Ü19��
��79�-�HF�'D�4��Л>
z�.؂�{5��Ț
82�ՠ1��nXDU�]�l3�]�B���ݾ=�'�ܾ�� ,�N�hg�����k°оD?�,-�aJѩP��"�Rd4�n�F���zƪ���gly��"�sW�	�f��XG��5$R�ЮL�^S�b�1rԳ�P͚�c[c�Ш�2�@Q����W
�p�P��.��t���F��"b��q��i�'�6_8o���!�#v�%���i|}�Y(x��|�Ph�g�<$f=�z�W0�.���~���K�?�"��y�+�T��+�0���r� �7&K��Z)S��������F�y-�쨖Jt`G\}l�q���w�2���z�p�f�22Rj�P����ك�qH����]YA�oBq�T�qnin���
�w����}��Q��w�3�35���0r8U|�}��L�"ˮ��>�����l�ts��u]� >��x���!��S)J,5�'A����IZ��a� {��>��=����w6J�خ�[�#ꔲPo.1t��}����)�쁜
`>}
�S�'�ZPL��2|	O�%��d�V�T���Y9�,���Y�g�G����d���I�ƫ���~�o��x�6��_���n
xA<��G�:���gnڻQ��`rbw���'/�n�={�Z�`wϩ(�YW�0�;t X*8.CN՜�w�<Q�5[I42$A�ZM��,B�
G�x#Lh.�j\��p�cD:�#�90M��0U�T�]g2L�b�$�u�e{�‡������'D���{bl��OZ�jY������Ňtʹ|�4�g�LYfr;��u�v9��B��>�.}Xe����o���Tucj�W?��G����QcF�Ʌ���
ٸ�R���ᨇPt�-%��M�[�,K�쓣��9ح��z��8��u	�æf�����f�k��P�d���{��/�ZX�j7b[�mA�N㼖�ʲ2��2�2��;/g9�k��]��EI
�G�05��)��Gs�xl�a�A����զW�UK]�.��_\�T-�.��?�}U����&K��UU�锧��w��w昪�YU�-O�q:wϡ��@��0R�FI�	sw,�+��uzc���8������k}h�{��Z��_mk����ɍ�/���\f�x��_*���g�s�^�!#}lfm�L�ƶ��Ә�^E1�n_�tDQ
B�K
w}���1�U�G�RM�X�"J�N����K/0���$���2ƀ3)J�p��=D��/)�#yXY�,Rr�dZ�9�i�K-�q��� N ���V�^꜍�z�n��G���*~��_�������:}�]?�(L�>=�i���{�O�'��b��TpS�q�yU*�x���#�]�,�A	����g0��t
�1��ǃ�4ʾq��6j�����ߜ*QB�����2��#�I�ӟ_�`��l%lʷԞ���A��g!
}��}/���q�6�/
/
_�ps��M����&�Y�%AR��5� �#P�LX0ˀ��c
:I)��5ik%��[��r�
^)WYC#C܎zm������5lqT!F���hXY*�#������D'�"S(C��iÌxy$��+��W'�}�l�L%�����gDؤ�t�hÝNO�n��J"�i)��x&@�[�Q�Qu�Ჟb��0�}˒�`z)�ְ:���aس��u]CT��\;l�ޗQ�k���:Rm�F���?*�� O��u�d�hʑ(2
�y�j� ��ΜʦAT�����N�l�
���+W�S3�S����b��&Ѽ"V��|�P"�U����l�Q��c�����Hb���*{^a��%�?�od�ϐ�y="X�D<����?����袒�##��8�Ґ3ȝ�<
�������Z�?K�X���
�1V1L�[�4��:�@�YPچ'V,mʐ`D�����n�AmVT,b
M�^��tu��֦�Ll2��'u��齭���>�؜��P3����Ka���.�m*�0��l���1ȓ�l�VWM5ʠ��
?
��6�1#�0b�����v�M�R�S��wIq/hc���5 �c%\��v�OKn3�@��29Aq&����S�[�{U�7d?���Mo�kQ&.��̴�4�ğ��8kf1��OۅP�u�ܾy���ц+q�7��MU+��i��l\��i�u�[��a�To8n�+xI�⅙^�z�b5��Fh�f8~��F�h�*z�
�$���5M�V�[4�=(h�_���{\�&a�s9�n���q�垢��9�Y<��I�U,�z�Z~�g��7���_5;P����zj}�Z�"O\-�Z�w���Ƌ�K�l�;�^�rm��ѩ���n���;�\�ɖv�+���iv��S@E�������6�#��Oԍ@�)2��[ô�\c[��%1gv�^���L��rS��#q
9�t!3�С�8�z�t��K������]]�v뇲�$��)���\����1����
S��Ɋ���YY�YJ�#�T���D�Q�UkdR��k�VJ�R�lq�X�z��`��@���	o����$:�^H&��Q�ɛ�<��V�0̊��W��^��kl�@˿�q��mW�2���
Zh����ɍ�<�7T/�@�ێ,�o���~�����q�Ca0�0�g	�ՌB�U���K�醌��F�ᾰ�x.��g�Mϑ��Ov4��D�`�[�Ơwyo!t�.��j��x��f9�?�/P�l�i��`r��X��ae�vq��^���`c�~��j�y?W��\��wb�w�Y�#l\`Cٖ�=s@��r88��̱��4U��0d�շ�Y��ڝ�u�k?7'ׁgn�u�����|b@ǀ�{
��bY4��s]����1$[ְ��C��9[rU�vy��x	���q��,4��A҂I��{h����G�i��iv���r3��s�Y�r��
�x�0�gѕ�"�y3�6�C��<(�> |D� �,�S�����مi��&�\Cij�;|��Q2�!g���^���0�ˌ��]�j9Rwı��#���n]�����QJ�r���(�sI�3�G����È1x�f)c"�e��ʕ�	΂���=M��Er���%��W;��U�L.�J����q��(v("�W�Lȁܗ��%d�2!ݱW���!e��7%i�a�F1�E�f��E,.,����.�뛒x�&!��݇����J�3�{���%&�`Wq��<�;C߷A��f+�R�����C�"�g�,�y@��7�x��O<1��?C�g�)����ĭi�J\j�C(Khc�>v���g�WM�Z~�QW�0��fʍ�d�=�R �,L��}�?�1hf�ʷ_y�{ӫޡ���a�ȇ�\fiql�mV_Ou��P*BP��o@�mq6�54,� JZ,��D�[C��ŒC���������o���c7����5=A�?��ge�ٝ������W4^�dT��G���
��0��r��J�����i8-�`��-��<L����(#Q��`��SCz�O��<\{��."�������\���P��?�©/�ZT�����r�];��DB�b0���6�F� *�Q�ˢQ����=�LZ��'_n�J&�2U�"�%c:�b�Qʭ[^KS�B�A2�R��d��mֽJd���⍈H�G&"O�J[�H�Z_�J�FVQ��M�.~�iY��^^m��j�׫yX�S<��f����_�U��;HA�*�z�tJ�*����$(x�4L�;o��㿊�@_��Y�#ߓ�XF���P�`UZC����{��PaB��3��J���՜�8��`PFx�L�HQ��A�E�3ӊ�0HF.!�d�ԱSE��P�P��z��/޾rGL���z^Հ�0,��(�[D�|"UDUS@�(+r�GURdg�*ėe{��
"��8�gq�41r��Sw�O�c�+����
�J�p��^�f�+`��#��ʸxb����&!T�;-�\c�0�AT��R�������I����Vnr�0��En	�����E�(����M%[U݉]͘���2�T�=�g-�\�eݝXVU�tӒkK�&P]����K�'�K�࣏��ǿ~�Γ��7̜id�����݊۷3�n����/�C��^�Sl���?r,���8��FR(��ǒ.�=�f4[�[Ğ��;�@��g�l�px]ӽo^1V,�̶?�!��;dC=���`ڕ~:�,����H�	
H;�Q3�a�S�Kq,��i�~,#�����9�k(�~�8�G���q?�� ���P��{_)_C���P�B���2����(�f��2]l#�F(�&|�؀�v�7�n��z���cN�`�}�S��%�5i�l8t<	����`����=߶�1���+,�ў�`C?���G��\�K�<t&	(KU�����D=�;�.]^=»'5DKA��߅k�~�G�^Ќ�]�|�:t
�x�oy��LI�H��W���ጋ-7��5՜)�c���0�Z@=�:��M�V|�2@^-`���к����J�sh>s�OXH�e�N>���3�L�Ϭu�@���k��(Zi��"RUG���i/��K�Eq�"`T�G�;�$5��sZq��Kۻ��z�Q
c�E^�p=���_���-P)t�j<���s_Egڀ�`~\n5G�E��os���/&�{{����$�+尺\���{o~����w^l�֘KT8e���>���U�jٻm޼��m)�������X6���fFX����2ԧ+u�8�oI�o��t��U��uTOn�B�T�5"沲�ʢuO�mӊ��!�d`��Ƙʪ⑭#[b��Y6��I RE�d�q��!����
E�\%{�7��#����/e��>���Rd��>��Rw�l�F���>�ݙ���֎w$d��q�	׊v�~z���*{�ޡ���{��ܧ� @�x��&�\�֦5l���x�e�	ӨHU���^'��teN�}�Ԗ��{o<��Fh������]���z�Ǫ<�	D�θ`�x��S���w���Q�	׿��ǿQ�#M׋%+tPk��N��hx@dʷxL#K
�U����qU��1��^�ޫ���,�W��M$*5۵ay�t@���=0��co�N�)�O������Mn�f�+p��([�d�5���N"����ɢ칮��U�g�S�(��w����k}�/��
UV�<�o�
�싩�x�<�갘�Iu�A��Io��m���,�܅�ډŻ�m�o����E���n����<A:��0�΢�AFg���vs�)�b�i�k�� a���і������`%
<���'o5E�.��L����Z����ݲoݡ�ī�>=A�.�SV�/W��3\R��r�D�=�*$'���*���ۯS
$���J5�S[F�T=�$�̓�Ȋ�g%d��v����.ϝ;���q�1��LH|�]Љ��C�9O�Qk�8�RlR4	���M��Ny�u|�*��R��2���l�r�I�-�-�5�����oFSP�D�l�@����*Z�.�Y��A��L�l1Q�n�~Y�KB�s��u����X~�^P�%�K�J�S0a����|���	�^��ϧ>��K�������A����S��̸�%]���AY��e��s��n/��Dz��;��o+g�+�J�u:�s�`w���Q��V�7�s�(�ֿ�82�y͝7=���	��Vbw�I�%�G�oQ���K Jb��[c�QN@�m`•Q2Zj���<���V\�Po��"�]Um��݀*��/l_�{�E��v�ȫ�'��~���2�d�^�A�.xu
����%�L2ԗ��ɦ$?~����ӑH��>�n��d1TeF�̺�s2�Q1�!�I�D ��?��uJj��1[��n�>$|ZxI���G�_	?�X��f�"�d�_�W�	��8N�T�
��?_�5�W�|�ן��_8?��??�-����]ү$�N\<Ƶ��"n�Ge|����$@�ī�8��K���9�-�Ad��^�;�����X�NZ��H�W�G!|GO�^n��B_�%�eB_P���\\���<4>��^��u��s�9 �V@kG�����6�����_�4�M�� ��'#t�ET"Y��4�'�?�����9d�ʖ�����,1�K��܎L�=QdKD��X7Y�='��jV!�ZR%YV�i0���	�4��r-�'�,)b�.��4"�Hx������#�|�"GQ�Ֆ�����k�?�<1����c���b��5DE���U��&��9�4��D�����%nIb���1G�H�-Y�T$2i�(z�$1Z�"S�Bd�R����eF�ȓ�<d�_u����v1��K��3���y�@�0��s��Q�.�A���;����ƓKÜ8�D=��u�I��=]vʿS(�cg�N�i�kB@s�'b)��5��iJ�7�ܥ��i�c�;l�F����bْ$KN-�#���C?�zaH��L�P(���r�
��\#w�]�47��jźI��1���#�f=Ш��0�}#:i�/��-�i�lO*
������Z�{���X��a�M�<v,Y��@�2�z�鹖9�����$Q&ʚ�:6#�ldm�S���>�t�H�1��t���O�	!���#L��g��
oG��rt��	�=�>RR@>����΂ﲑc��o���w�$,i��� �dt�8#u�KlTԨ��E���[P@`뵤tUY�c��?�z��r�����2��.�Vj���¿����Iq
S�H��� 斂�,��g�N��ĵ�$����)�J
wL�R��A7)�� �b`�@�k��n��$\�kr�n�aM:J�3B�$a�t�ְ7���rD/�!�2u�(�(��d���fc��n勚�r������=w�^�3�����jK�忣�6�y��?hg�_��2�|�矉t���IFԞ��#�T:Κ�
,k]�x&� �g�hKtJ�1��m��I�%��İ�:���ؖF��XQBY�KWa"1j���ZK"c|t�����P��d��ĺb��:T�
��T�QL��T�'WQy�Y!�f6�m��D�,�)�N���x�zt�㠌	�̀�$g��df��6����
á�떡,�EEvޭ����Ί)��%
��C�X�����v�C">�'�PE�V��%ZV�H���L<�)j � S���bFTFHS��?�i�6q��F�r���}">�4Pe��Ɇ�Q@�0D���F�S,*aU��6��W��b DT-���d�9�eA�������e�b���+�y>�cL
�4p�k���DŽ_>%|!���T�_�r���<�O?x����<����%����3�r����?ݝ.�
�x�qz1e��[EKx��B��B�[6z��
�u}QWmC����@�=SqQ(�.��km	وx��D$f��1�͹��!�!Xm�=�4L\�j(����ω���t�u��c�j��4�fC
]a�|U1,ŨJ��ǚ��_ �?T�^Ch�CV�������S�V��bE�~�X��>�6�W%��L������O�z�w���<o^c*4@��Uĺ�0=t����ܪ��F���V�3H�zA�v�q�7:hr,�y Tע�#<;�|�S�h�`j�k���պ����TWa�������|^w�3C=�7������|؎,fnqW����=A��[:�ԍ��gߔ���9���.k+�byl��v�@�gЪ)SjT�tDž	����@�,�gRA��Xe���q��z��VJ5M���Vz�T��N���R����R���
f���d'��$��qC�4ޠ��M3���Z�Z6^C����@�cwu}sw��E��ҷ`��KTeW�I�+3׳eq�pU��)��!��\��
�����	��n*�$�2�l㲃L��F�1�엩&K|᜽2Ӻ���TM�/8�*���)m��z���#+ŝ���ry�fJ3�h�Fݒ�MG9�HZ�:qQ�Q�\�N���ub�^���:Y*6�D�B}	��ٱ�7��i�Z{ʋsn�R�/x���8g6�E�
.���zTW��_Hf�����$sM��X���U�M_�H%(�*%Bt��9Is���m��KBQX��=���;ke�QP��=��[��nV�Uӈ�j���N�{�o�����o+n\�.����S��]�p�A�&��ҳ�o������e�<}l�|��Lҳ��I�?���s�%���%�ݳ‚��c�'p'�jgQZv�ㆃU���R�)�#P��i����f����4"���ҩː덠�6[�8�/HJ�Di�H+�k���jx�՗�Гˮ��R��	�t׎r���f5�kZ�E����vY��7����uUШ�#�²��^V�m�Uy����Le��t�֜��=C@&J�o���Z\4Cٍ�G��g���5fs���]OvmR|oې��T���u����%��Oj�$35Z�\U^6{B%PT'�Z�:1�i_�����X%��R7��b��D�L]��	x�
go8yoM<�7Z%�G���=y���s�{�3��හ��w��Px��N�'�g�
�
>!� |Q���U�����9�>ܘ��Z;���y8��ft�ސ�>��u��G��8>�q��r@s�~li���B�V�bܾ�J��G�[|�V%�b$-��3<H�|3@Ȁ��6x������>w��y�Pn�z��>"|]�]�)�	�RA}%�>D����;GW ����?>==��{"�қƝit�ͻ��~���뜷��ڃGo�KH'_To�=s%�����VV��������q�y�&��ͽ�FN��!W�N ����7�XO`�&�$)���u���Aԫ�&�_��+��7*T$��ܛ�h�T��o����B�+Wf�k6�Y���=v�)�{�m��F��+��<Jh�?DG�N_��@���^��7�@H�����wZv��r��U����`����pB�6^�9�yA�5��Ґ��{͠�ߚ�As���b�O����}�xcn��W�d�h�V���~��%�)��S�Y�{��05@�F�$�"�/9�G�;Oe��އμ��j&���{�u�N�홍7Sz�Ḝ�����\��;��7U?y�W�������s���e���?r5�n�p-��E��0�gSh��+�(n�&1/
����h�7�4����Ґb�NK[��YZ�(O�횜�a��V'&V�X���ݓ��������gk��|favv!^DG��������ى���N��b��m�	��`����vN׽���+0�O����qD�xv��B�WW��,^����Y7���������[1lE�yri�-۟Ph�)
+S�:Hr�'�jw��Qh�g��;��To��^}����o���u����{9��G��s��pPN'�~��+�	y��FRN���		H�5a$�A�xj?z$ڻ��
�> ���!�#�DŽ�A����9��	_^��N�D~-����Q�_�>��]��9�$�`���c�Rk��s��X&�.ꍬؠ�$���b�a��Su"oPM�ѸL~G��;��qz��`|v+)Y*�'K���$���P���e�|_���\3���ճ�#�]�O׶_֎��Z�K����f��jAV��W�����䢥�Λ5t���m���>������[2����!~�R����=�fkM�T�j�y@���US��!����z�g�۵�AQM�o����%��lY�n:��Ef�N��k�?��V�hn�Λo�����Gg���V��Շ5�ci�M�v�V{�B�Z��j�6�g��W��|��ɟB�@��ŗ�Ԋ/�����ګ�x'�ً��?���M�謥m��lA4��ۚ���Vz1����ۄ��k�:�A����隅��-Q�PM��&�4��
��vx��|v�[�'��Aqr�0W�6��v�V��w���l��2=]k5:����R�@���f��%7w�z��ng����a<3;]�WW�'�`&�v���6��Ԧg�kaqb��)�fhw��1a�A�W�iu'^�w�Y�"�
��4Ҽe�t�W��8mE���%nc���:�?��.����QfX_�c�A/�J.�e���g�r8Rh0�V����K5�ѧ���	-,�)���+^e�6B���l�;���D�Hί����}���n��.����B��(|5����G������r���#���P)=|�ԩ����/�]$�el�U$21��&�g"�ɲ��H}c�"U@�
'N=�/��[9��w�ba������{%L�A�
�ʹlH�	J�\�$�Ũ(�_'��9�D�F�塳��HLbtvnn��:s�ug��͹��G�?r6?D��;W�����p�K/m{�Ek�E�=����u|蕀/��
Z�$���Ϛ	�@]޼��wc���H�*egސ�;t�t���3R��GmJR���?������H$�$�p��n�P/�A��E;�#��aT����b_:'��I�ȟ|�zAȜ�>�M����/��ڶ�&�G�^�/�'�Z@�������$z}}}-]���,�_��rm�}HD�t'�4�1�F�a��T��fKF~	A&���4�����/�U2X�DY��nt��0o���0y�?��P��<�����@���ɰ)����eF<����$e�߰`����f<Z���i�
<�g�~k��L�;���b�{@��{uF�B��KF�
|��r"t�H��7�����i�<�<�����W3����*;������tעڀ��7�a9�E��E�r'���h�w��E%��2�Q���d�iSbk�s�\E�
>Csۖ-�U�F��+f�Z�Pl5�ُ�ٲ&K"�Z̓$�jy���Q�%����� W�5�Jj�e|(��E�m���ʀ�2�E�J�a9eʠX��*ɋb�ؒ�L�J�3k���h���A���E9��+D�"_�Q�o�tK�[9�q��+'UP�UQ�5�E1(�.��y�2&��]D�j2��%�v�QS	�H�'��<j��0��!�..��3��
:1�O>����IY۬6�^�W�����m����Hj��Ε����`�1}�h���k,B5����&΂4M*�c"c�,
QQ�eG��D�|��y>���"��JA�:�uI�#�V�5���XŌIf��9T��#G�:S��@�S��XɫU������	i�r�u#�@9H��M��2Чmɩ�P��>�S����g>�܌��eLD�ءM�u���](K�2���Uy�?I��U
�o0�/�3�d�!F�`��W(���g�v4D|�+`�b��4]U��^��B��gCOr½���T�x���x��
Ve��Q�H�������Y[uI-��?MAȔ`��~T��`�)�ra00�c���G��i,��O�Q�ƑT���)2�3LZڡ�F��|���CGZ��L]���
z��G�Y�i}�\�=q�_�5s�pDX����A�LgÅF��g�z䖜�4=a�Y��_���;��DyEq�
�
�tS��I
��K4����m
�N�>�����qy;{>>��C���Hq�l��Se������	����'�[Ez[ܠ4^Q���>��WC��^�+J>��r%�bn毟�k���2�z��G�A����f #
��c���bjl@-��!��O��<G�5�u'�ݟ���~�W��ZA	w{Qw�􁛣�m�>���e�F����h�z�iH2M�n�~���
�<~�T�%9�-Bܼ�S�>�Mz��pe�k��̗D�L�ŷ��?����}��Q���Y�h'�4�*�]�)���Ӡ+�\�)-�+1v�Q'�h���Y��:����%������WU/����^�������9sf�9�g��$�i�d�'���@&
5��"`T����UB� E��"
��JE����O��"g�Z�yϔ���}���m���kxQ{��P�a�@�c��C��6��z��[ϼ�<1qOi�^d|��Q�졇_~�U���{μ�[����Ls�f�����|����>�p���;�����Bj�@C�@�<���K��[�hE���{E�*�H-�3Z�uf�s?_Q}�S���(������͓;O�o~���.{ŃW}����C�%[�x�Qߘ��'z���5+����vߎ�-���W\v�Cc�+e�yϥJ�3�SI~�'��>z��G?:��Ϟ���_�3�<s3Lepj�G�ʞ�)����g9W�?�d�ɎG����{��Hr��c/>�Ne��ㄳ��;�daq���#�=v~*���}?e���v#׃>�>�S��x��$��7�!2���f��6�f�S����v��c���7�c�HE�b�γ~��7��$�w�P��m�Q1 6���_�(�Ϸ��꟬�=����w֯�����{�O��q�Z��(w�HB��s�n#M��ѓ�c'�hjijj��Fd�Z9�)(�3��a�e8�oYق_�o���s�v��`�����([��tz;��~����:�'&�^�{��C���~.�����	'�>I6�5�B�.�$4r�Qs�e���0�i��1�޻��nśG��b��4Jv��߬��p��sT9�N����0�jX�?�?�m��c��f��̺E��Pq7�=$�Ş�,As,�Y��
G��pm�>ؿ�m4���[�8g�qn`��qD�Kŭ8v"�sd���p��U����
f��)fI=�.����Dl�������+j8E&[S�4̶�7�u>��Z�j�t�?s��6��eET<U��Y
8�7ɦV�Mݾ������;r�k���KD
2��ƃX�}�K~ҍ�<u�ɴ������S���/;���Sմ�&g��kN=��׸���-O7<����\�@�׉r�r~��Eϒ7��� ժ�j-���ug�ɠrL��?�
��L)#5Xc��|�1�g[�<��z��lͳ��b��W��m&+TdiI�g��ZT�$��yRjK�*}�T4�
2a�p���Zoj2��B�&``�z��ͅ-���&1�`�?��L��+�7�$k�V�". �xd�=<�^�UQIv�(�d�~�Z"��G��F����ӟ��R��1����� ����#���0B��c8�G*�m���$�D���ǟ�����}�,��m �6�D_,zD`��'K��6}յ��Q*V�!׾�|F�%Ae�"�w'�E��;~��m�<�U!�L�,�>�#ou}�(:� ���0O$�'Ͻ��s�?`���өjj�O(���jZ4��2�&�#���'�=u�v�h�����G��\&nƵNgW�,U6^]�'#��Z9����iW��Ƅ�%X��<rŇ��ԏW�hM*�Z��zmy�W~��H>��^���'P 2k�H
�;���Q�#[��Ty���Y{�T��@pFc��(�g�>Wau4m�b��ar*ބ�G��Cg�Ex�v�� �o������P�����{��Q���(Ƃ��B0�:a�ؠՉGAC�C���1B+�XwI`D��q�J%!�Y)F�(8��ze�FxQE��^r>'���E43��� ��x��q�[����3�9m\�J����)�J��I�E��
�Q�7-Ü[%Z�5WIӢɈid/�qW
�Ùa��	�c]�3��g)pX��T�&N��6���1;i�Ւ�D)��*%"Q%0~1EZ�$M��bp�F�TAV��qT�Ӆ9���bF��Y��D�+���l �<2��/%P���n��:�����{̧�b�Ռ��B�Xf�+@�@^Y8�n�﯐��5�՞���g�!�i�2����ٴ��)����`n�iE�ᙷ�!��m�v�F�����!�3k�?��W\��|㙷���й���P�׾���o��Jj*�EV^�
��LM�"	
�����FS�"�H/)6�nLRD����?6���8��]���
v��\v�=�{=S�k���P��Nm��Y���9Rޱ��s��m����e�3��CW�.Mg[��X���0�~+7��-��,:ik�}lỶ�l)���@��"i$0a�[�ǖk��_��Y]��� �6����<�S�e�aT���Ҙ ��a������(��?�k˹����`˙Ⲯ�Fo�R��1*�*	�C��g�σ�Yd{o�8V
džn:�`|�J\?����ӫǴ
��T���e��i�9��A:Ȅ(	h>O��(,
���sY;F64�T�P��(@4�"��uU)��S>�N�y�iӖ�lYڿ(ʋ�qӕK��=;6��Bcfv���G�����~W���wQ�mk���_���F�y�h<W�%�DI�ESEA.:�4F��%[�j1[h�HVm#�i�ܼ��lڪ&��'���~����ΖiuȔ��12��)n�RS��?!r'�<�"���ZC)�A�3PX�I�乲	G�$)5Ϋ�$��Y@�S7B{�,�aq ����A�h�@M����b7~��qQ�K��2��y9�e�l	`��2�l��.��Һ�(�Mf�ug�F���\�~d�}M��C�Ѩ�����j�7Q�2��h��T�H
��L� jd5��Ī���o3��-�0C��ra&mK�&�QAղ���\ir�%>Y
� �XBPқHb$ O51w�&����T�b}&ɭ��w�E:�~���[����|�<�ȸQ���k-�#�_�n�\`qD^N\��ʁ�k��*Cm",Fj�H{N�
v��N��z�����ɶ攆�ֈ����=��q���d�@K�/-�,�#�WW�_]��
^��ѣϟ����6�
<y�/c7J�/���|ɐGf/�G�c�S�#�t��	��
i�8n�����'e&�j�l�˃1>9#�}��+�8�a��y�E" ''F*+��艚*�"��	�݌�lF��{��5��K�멟,���C&�ߤ�|^KW�U��Ypm�B~$�bj7��H�E�FZ1��<�T{	�\s�y�C��;�W�f\MX!���+���sE5-���uBF-�"g�P����Ǯ�^tֿ�v[�cG��?A���v0|�=��9ilj�mv�Z91�s���v˙^��(�+q��
-�V'�uKqcݻ7C$;�_�y��>ٟ��o���<�ݑ�
*&@�`1@��7��<1�K�8ʒ�[�"Y>vu1s�V}EV�5�/�tc��u�7��R,��ӟ�~t����'+s��@'tw�ԫ�����/ʹA#�\�;�)��h���Q�1w($Y���	�4{,�z������}�][�-;��gv�tjt��_����f�{��&��{��yWiϱ��c+�������8O�|=�F��ĥ3�G�Fnl<�߮xW���M�ǣ_�r��G��W_�|����c��–޹�$�K�H�:
���sp~���#�/��
�����S�A��a!�[4x�x��]���T�cRN���
]u��r$I.s �u�h�y���X�|��m��s�]�-���(��e��y+��͊(67��^�UQ\��ϱ�O�y
��H�B
z|�.��E$neԸ�d��ݍ����F-�1�v)���%B��N k��?�ld��*�r�V��n�����T!Ӕ%W2D�f���r��K�Ӷ���f�U�P�N|AX!�nn��pGjnf8�6M��%��u�j�	T+Э�ؕ�fM��a�˹�ej��r=)/���؈Е��Y]�+�w���۫?��U��R�V�@�������G��Qj2�6��&�X"hZ��g4v~�1�X�9�[��
 ����j��Z���m�)��p뵖�[�oSQL����o���HSB=,�-�&�0X���Z�ɺi� `F����kE���s�+ro�W��NN6MCt� �MV�H�e%�\�|�5j���1��T�{�L���h�
�U���T#В��!�f�	�e'�	�'��U��	�qB�A�g����T�����7�5r�'w*�O�h7��L�"�����[j��ç��P���\���01K��'�j��ZZe�?�c)0�Sӓ��k�ɷ�[e9�(��+LP�Aޠ))��Z��\�cb�9�O�ްQ+lmh��4!S�����\qn�b�0�1;���}�G�r�N���H8}t��>�;4j�j4���.�Ӌg��G�f��:�������z�ºY�!���`�}�����t�n�Sg�ţ�;�(��{�7�vc��B��s6ѯ�d����F��h�F>�՞���o�8��ŧ���w����SפΉ�������"<�~��l�_���y���o~�T�'��<l���ൢ*�I.�I�oM�ZR�I!�)	j�50���HZ�A fG��Ȗ�k���Re�ɛOn�H�o�����M��;�K/̗��t�4��nY[�Ֆ֎�nz6v�r��ݶi̱���.	��
y��K���ok�
�q`�
�I~bQ:�B�[���x�6/Ӑջ�l�[�er�����{�>H����>���Vͬ?���v�������Xk6�6�{���Kc>2�O��h#	�IW��FJ��)cm`�1V�I��Ӈ!`�˲��\\)7�~����;b��Q�v�m�d��e2��򖝝�t�nI������;M�=��<SrQ9w&�dJ����g)u+�NH
"q����aSNk���k�
��3z�P�ZK��B��4�}"s� ۉ�X�����.v�F�$J�t&"���#3������[+:�E.0�TD3�T{*`�Y%#�ɴ��LHy/����EN�*U�pP,�N؊��nLM�C��ͺl��ĺ@����XuـiLHv%|f(#�?�'u�8B������<�&�:1AG�~�B//�^���R܎R"��57j��NhRkJ�}�pb��XrD��#Su�����z;�	��6�"2�T�륒{D�?b�#1I�!ɭ,k��-��2C_!"�W
(�*Ί�������7k���"H�κ����{`�+f0ld�ʬ���4\�mv���-��DcML��e�Q=-^�V����h�#�9E	2s�F=
L!�뽷7�4O,U
:����{�Z'V���t��o�s�22��5��lO�)�v 8�>�,m_+,,L�s�6=��#��K-��z�V�->���˗��T�aovr�d�����2/m󫨩L��VZ=���(x	�
��a�㍺�&�!�V��3]��w�0-�i�:����V)*�:u���BZO�o؜.G���Ǔ���9/���ܞ,���#�W֫ĭU���3��	Un���2��Үl�7�c�V�雺T
D%�u.��s�E\�Cd�%$ cZMO�m�]�T-^�MA�\�m�Eˆ�N8��'-�Xи��?'(f�2эJ�+WSd)��+{���2Lq`���"
;6e2���3�2�χQ��2N}�����J�ezLP�s�4���ziC�Ү���Y��BSI�g��0fH��'ķ�*����C��H�>����ܦO����H����MZ�Abc�!��}�mwQ
` Ø��G���;�EN�l�q���������ײVF�N:OT�YW�H|���A��R��D�PIn~�PQ���Y*eDA&��}Iy*QtQ�T�@��?C!T�U�A�=љ�����2M�u[�9o�Œi�(Ӊ�g�P �K����[���kS�%m
���^hS�hS�d؝����iZ�\��%�D,��vE��fui����|Dpo����o�/��p%��%)?Ҷ.�N�x�a���l`������ǔ��Q�Lvu�� �wu�?f�B}�fz�PQJ�F%�6�=�]��ś�����.��K�ox�=n0Y.����5"�O�O�+�݀ݘ�0ۅ7���]xW[#���F�Bd��]n4�X��8�]��6�jhb��Y��n��U���We}K��fn�z��
�Y��m1$\aǪdl��l�#A�޷�����>��O����zꢵ<؍j��@�]޺sc?�?[�H4U]� �GZ��H�s��gI���x��|���[w�ͥ�w�ᆝ��5h߿V�2q�=VK��za2���ۖ
�z��͢V/����[��O����'��0=��ݟHgmG�T�ە��Y����k�c���̟,|�0����L/to]�ٜCӐK�'ͥ��۽��gֿnI$�s���G�@S�l��qx���J�5���/�~7�� ��&@\
d^d{��p�%��DA7[ш��'�@<�Õ;��EⓉz�xQ��8 ɤ��l\f��LF��5>���A#>$ϕk��	@	)O'(6����")���,m�jYUʪ�&˖�Y�.���b�W�]�x����-Mq3���4k0ʹ����bkVY�Y0[,��PR��I�5���ё4	}�FGw�K��ip�W*�N��FUu��w�r��M�V'/��a���k����ו��,���X���b"�9�U�b��m���V�M�9T�0zqb�bE/+ı�:�3�¶a
�YD���y�e��м˲*���2�}���r���d��sG����7O�ԟ�����r�.��◸S���?/�X4.P'����ڨ@�%Lf�|h̖�A�����K��Z�ƪ���QMצ�3�;�9�R�{����N�R�����Nu\����qa�x��?�B��
�1$o
��`�}�I�2a*R#��R��i(6ҝ�f��2�2#ϝ_�꠸�Wo��T���p��[�a"�Lp-��2�7�n+y-u0uy�h�$��3��S����h��W��A�����s��g�fB���]��H��*���H���x���.�
&�ƃ��s��=�6!�A42����8�M��%n�6�^.$B�IrDx%%'�L�uJj��	Y�d���������>��?��j�ޤ-<$^yu�H�4=-n#��U2	�eM�IA�PP�V�)M����$��Ȑ)5�iJZ3�>E������LH��&���B�W��ŧ;��M�e��'�wm��wČ����k�'�9B����Vn{0h������q���!"c˜K*��o]�.�V����D���L��^��^�g�I�����^o���ᆦ������5W�����^y��GOo�˚&mj�>x�𡃒����s��/��t�<�ʃ}�x�M�5d4�ǕN���/�e0I�Bf�$j���6Gݘm&#���m�U*x3N�DMҌt��~�p�nw4!HB
% �me�GwiA�M
$g���TJ`�Hv���&�t!�Ş��C���6,[��r�Z���h�?����t������RPhyZ�0� ��7�<�5҆)IJ�sp��w.��N᯵�B�DlD"V-��J�b�L�j;�g�`��X���M*h�x�%ʒ=NW��ۺF+�(tN5��
s�u󝓾,)�v��L���h�b|�D��%�iw���>�+�d}˛0N�~��eO����DC�O����0�/�k�_t�Q��w;q�o\9��o���I����Y�"�+/�~[oB��<�ֱH/��¸fL�)��5��0�>ϟaX��σ"����8sy�sy��*� a��;Xq�Yސ��ܢۢ�1X��u�@T�q^�$��̙�1[���cR���RB�_�O�u���ls��)��Ɋ����)O�p�d@��!�B��H���J5K5cQq%��%S1�A�2Yv8���D@7Nl�ka�H�`��Udk���)k��&Z�'������b8=O�|�K2�;& ��$�"3�D|��f��30hNH�B��d�V��.���g���j���`;�$�=_I���W��f�"!]��<�R�v�T�Q���Ǚ1��8ǙM�"���9�5G�6�$���2��A\���$�$g5�C_�\��r��Mt��(`Xȃ�j�3L8��aÓh��s���gO�iɆd7n�#�Y�,ɤ��w�J��/����ꁁXQ~���!��'�3�J��
��["5��Z�z�ϴy
�j��ڞ���_��Y�k��	x8b��Q�d�Ƅ^W��V�y�9(Q�1�t�{1L��u���t��	I��1��2�~� �p�HT#z��H��*���W�={v���+���\��On�뺪M�U��;�E����DsK�2�1����|j��M����O������}.G��cd��08^��3��C�P\$3��U��4��p4���@Âa8z���I���G��Y��Q�P�HUw��a��fK�|Y�;�IP��Va&3_�A�K���BH@�+F���R����m/�{xm��齙tD����>��}*���ʬV��4�N��߹\�;�
`�+��}�\{k6�5"IiT���)/��	u�f�d��i�k�n2�Ɉܑ�f��}+�`��\�`�fm���rZ�H�;� o��C;��������q���W��t�`Ìju-�rOmҳj�&�@@zA��1c�5��t16��3���zka��ɩ�.J |��S��L��j$�]��Z�6�#̊���l2l����C#YQ�l���23�dw���f�e���_��d�O����sѡD3B]	�=��.����A<�: ���T�e@M�V�<�!y�؊,��Y;y�vlE���վxxsk�o^:I�;�|t�M�d�ұ-�����q�VW[����
N�{2޷�TjC7m$�7b�*dRLrƹ4�����_{��O<	���k{ۼ��X�H�!�ww܉nS��;Υ�~
W|�q�q�57�x�f�G�;
�x���8�~��#���z[�6����;SM}:�Frs��*�j!6
T�u�~^&|�������8�sy;p�as��s�/����|��`&툇b�&��j��E��L��!W�IX+C�W
��:AY_��(;>���@�~�PCW�J,PPX�u��y6�ұ=QW���[
H/��;%P� ���ӂ�8bتU��)��rBqg6QSL��Vp�T�X2���N�h*L2�iY��*>�fMW��NRIUh�c ۅ�$��A)�I)-Q�Lp|]�	Ő
�� ߀քj�k�g����_�����_��������
�'�gQ����U�t@�/��=R��%�B���+QmM����ց�z�&��f:X�!0T䊜��s4��u�۩&���K�a]Z���K�-p�lQ���\����1�YhI���=��1���$��9������rAlW���E*�!�$	+F愛ma0�����
"�u^����|f�M��߇�_�jҡ(�Ms�̀��k���/]գ�)8���އ�������>I~	��$`��X��B�;xZ	c�"<���N�$�f��V�bU^�"FS���IK�M:S�@�:�V�U��?ݳ����o0$}�m�?;U,�Vl}��mvmV*MϿ���W�r}y�o�ֲ��r43g�%k��_����2	�P�*���Yw"�����`��^���t¹s�>M����ٹ���_���O�+������
��(��pE5x5�Q�pt�
)R�mn�#���V�,Q�{N�;x�`pn������{f?�)��Gl�#�O����x� �li�w�|��S�UA&i�!#����b2d����֢~�A�K�
6�$�T�`��Ch*�Z��	2	$9�)n_!��#�צ���U̓�y�ɸ|Q'ކ�f�V�>�f�$��S<틏�`��J��?�)�=ys���1����S�-�?��?@t���9i�}�H���;�ax�K�n�oX�Z�Ð
��y#ɥ PG]�����5R,�Ȋ��HOT��/U*����`�E`:��B�3�\��
�VIA髍����c����d0�qv�E�$��<��G^���@)LoE���ɠ�A��lU��Z�2���b�$es2�K���!���;���d���ne��,o���R��~�����g��EIC	�"�Ly����
�h�$��eI95�4
�\9��7�����m��98�1룟&������טƾ���֮N/�I��8�������<z\;H��#�S��x�c�j� �a��(�L�R��
b�����O�D��w;9��^��t��~� �A�*�YV(�[�B�yۭkk����[��Sa�H�'l�lL�ҵ+��ƬM�
��0,'+���8��4�k�a�ä�!�&Ak�S)6�e���W�}dƶ�<Mj��u�%au ���j��Pc�O�z:�8��ʂ�������X
Kd�	��ޕ�?�#J��x�RĈc� C-�M@&j���,y���ۅ@�ɂ�t��~6=K�*�SGS�S7�nN} ����S��̦#|xa)y-�l$����[E���z�$k"�~���p����Pt�t�iێZl6�u��� [���Q��Z&�‘,�|_I3�
�I�`+/��&쒞j�練j̗�%����7׿�y!�g+�6
���Ȣ�jH�V�M���tY��}BZ�$N(��S]��&Ķ3�D[`L1��=��6X���.i��\e���
���ZY]*�qiZ*H�fxl���R'-1Ӕ�̖<BٽG1�����BJX�E�J�lZ����	Ьx��Az���ч�z����s�	�9E�\�B.'�GsB �л�Ҽ��W6u��KdM�M��4U���m�T�9q��>芛o�+��a��G��z� �0��=8Kg��V�6Z�LI�H���-�T���XXCRiZ4(@X�h����9{���
V!��ͣ�$�����5�A�c:O�A��JzQs��u��:$)Ut-I:�b���8���H�劻|	3����8��8��*:Ӎ���+�:q�1|���TGyg�4\���U>/æa^��*��~�o&�U�Kk��S�1��#h�2W� �0��`k��YxYA�6
��cb��<�ؙpȷ�6\��ff��G��T�c�b���J!i��;�p�jςE��dD�����G����3���!C�ݗ�0�הz�O+0S���ʥ��|H�*��@��]�ץ~"�!�W�%~0ڊ���.�֢J�6(�y]�KRdžl��F=OX�\�Dr%5=H���6���ɑ�0;'qć���_�L���p����6f4�E��Xz�-�)���l��o;�M&m�
h]�`E
0q75	�%�	K[/��
�4*��~�� �Z�0^��)8��VM�5��e5v����l����W�
|�-!�Q�ӡ��zc��Tc���{�i����)QM��e�
��D.�jz�R�@�A�S>��c�/�W���=5��}q��#qq��Tr��~��p����=A-f(��ޛ�2��k�z%����L-�\�t��F����;{7�w�}G����k����r�C7W��G�]�5e���MNm)ka�2wED�ߵ���uݒ5ӝ��֨���x��y�}X�m����ԧ���Rc �0�Ւ �X�`zh����N=���d���/�s�pՠ�m�km���\�_�	+�|����';�����}��/
�tvw� ҩn<��t:���z��w�J���I���%���v���Z%����<Y:X��l��2C�V^
�|�P��Na�K?���djy��KgTg��������s����C�8�/L��_y9�4Y�<Ĝ'�+n,Df�io1Wu�.�����9�!�
Y��瑝vĉ�1�K�b��`id�A=�p`��1�<~:�pЬ5e����*���0Fo���D�T�€j����ӏ��֜�aJ�a���	haXf\����Jl}L�+Λ9���Ĩ�?F�
LV��Z�e9Lkğ�t&f�Lfd�a&BA�E9��6�m����k�^����J��>�7ҧ��07u��VT_�E��0�V��i��0�D��u[-��d��$���޸��}Ϗ$Y���]���y
��^0�~SbQFd��4G�"U�i(�B��|��N���%_�L7�	�M����=Ӌ��~�'��ƻ��7�h���A���3�V
Q�UA�̐b��t0��(Y7�b�6Qc�\�U_!2�{"�R����(@ˉU�D�h$�@(�%q�5�1��h�c�3�D��A"�9��0#"�!�_?��dub�]���*1]���sp��x.m��ί���jS�}[kM�}[r� ��ds#/b%u9r�o��3�xmQ�����i���kW[��갸(�/5
h&�%�^Cud�i~��\�l���A�tCn0
������<A
��E��9C������"�U��,fB��4O�y� �4Y�n0+�73�x*����0�fA@0/���G�RIE�9�f�0+ϪNa6dCI�գ��8���a��DS2(�C�)��?���ݟM��2� u�� ��QElj�Y@"��E"�d�ļTLf��O�6V���z3�DH��^Yr��_]f�x��g�k���#�h�^5���`�4��CU
u����tv:�V�Z�@ݾ�e[61�^���+�j���3+��$��}�e�!j�~��4�{��������n�U�T\��sU�L��S
����b̽$5b�Ѹ�uyM�Qo����u�������pG!�X!Si��^����~?�ݽ��Bf�.o"Ȩ�p>Kv��}A�D&����Ɍ�9��!~��rU��v:'���g�Ϧ�T	�� �iwð��e,�!�ҵ%DG<��9&�Dm��A+��q(>q�"����;sЩf�E�	��"n��E�2���3��Ԍ,��gЌe�Tʁ��+Wl��='*?��]w���!{P-����,)�jE�{�
���*�+IOZ��X�1U3�?���D+��g~�#
F܊V)��aΜ�i��qlV���]��˒{��u4S�}��V��0<�%d
�����d��Nd�G5C8�N2^�g��Z���3zuI�3Wg�^����	�3�������d��\��.�rz����Qj�#�Rz��Ș.LR�kس���j���$4��]5/�i�-���Q0tX3-I@p��|�/���;K~��[��1��ه�����ߦ�sg�{�y���=��;���䓜���J�->P	s4yF3+��DC�_�T཰��Uٷ0�= ߽G)�-��l��_T�)Xk��Ï�Z�)���S�;����\N�����E�
��XH�!�G�m�8���q��<l�H�<��2h��jJ�*����[#B�f[WA������k�y����㖦���� �0��Ã�{a�o�^�+���8zJK����<Uъ<N�&!A�L�G�������εww����V��͏�R�p�V������jf�Ǹ��{� 뎧nI=�z<�,Ȓ��^"�`<j�Z2��ٴ0/
K	�;O�o
yEy앹/V�A'���Z�uAk���-��Ey�,��a3�ޑ�A�����`4�ׇ]C�ݭ��X�����Ba�)�F2�2�/�/�a�˕��C�$]҉dD��\���HU>�T�QM�hzB�Tx���,(>1c<ˤ	8�#�R���� �=]rOt��*,�4�<YhV�`N��΋j_�g�l�
�`�xI�hE��mǏ)kZ^�ż��<���H��� �*�81�tSW��I�<���"�"��V�I��'¦�*G�;D�Cd@����O���_�m]�T���bQ�d���B�+$�m�Z����J���n`��Ɋ̲,�
��S�������.�	�D12e&�	Y0��vK�
G�-
z(�5��71LtzX�bƩS�n֐T�����[�	�k�m{%Q�fc��Q�� �A�#t�KF�Wz�i�R�����
�39;�	�X��V߳<�4uE.�:���p��?�Լ�SQ$aB�W��P��	�b�ex���\�/�jї�V�"��g���d��Jd�.9[{�{H�/�+�=���@��7\o�
hk�e�>�</̃}k�͵B�]+�%�a��Y^u���c�}7N*_&�x��vz���ӵ��9,L-/O���.�5���n�.�K�G�y"����}�N�ϥ�R�>D��n�h�#�5��q�1~��P���RM�7YB+�D^�����@U�c��ڀ?���h
��Q����د#RB,�%�`��
�!?�	�a�,��Ѱ�Y��h�h�I��6j�j9sЏ�Y)��r���ݍǹF�D!�*�)n���
�vnn*��ܸ���6��6ȡ��6h��2�<L`H���BV/������lċ�1�"=B�����L��GV��?:F	y9X��ZI���l���W)5(����*�&蚯Q/g��h#�ͪ�:��
� ���ęđ#��e�d z��ɤ�0*f=�ߤdf�t��az�J\f�iOb]�\C#q\Ɓ�2V�����0]!$����-�Q�_ǃ�`)p[��
@�(�OdϚPEtU��`���؅0�b�[�4�_/;��I̕�2�9�$bp��*Y_����a�`oy1R�*�h*@!f�ԧ��e��Hc��H����Ae۱u56?'�UM��Ť��n`~(+�8#��*z�2��eOؼTl���ea�hѽ�@�.����)�p�R%_��
����p֮�R2[�mw�x�d0FU����U�,���1cL������@֧��d�'��J����^�`=�6������-I�2c%����5,*�R� �7]��\�`
+�W�8p�UL
�I%��2����][A��50�I���d<E�'�;"s,�ƎB������ o��BP����H�P�zT�(H�%)NW�`�}1th�9XW�ȸF��-�]&.�;P����_� �6��R'��’<����"�*���Bz�B.E�~��R?�c��5k�8���U���n�'�}s�2#a骟�G�|���7��fv�,~��]YQ����*�����4�]|���(�|�7ϥ����̞K�gJ乧/�N�
�O��R�,%��^�G�G�QOn�XMtN�x/���i�
�0��j���i��Rla�/�� ��!M�W��^�Z��ZE�#�a��_eT�b_N3��Hs�ў^e�j�����
��5z�pZ"�P*���#�TA�Z-2��?v�������d}����Z�g9.�b�VE������.�T<ٲ��Щ
z��^��L�f�ݶ�w8���ѩ���zpu�o�>]][{͖�Y}�ᵛO����������m�лb�/Oop%��f*L5��N}�!#�7��n�_�F�oΓ9l�"��D�blѰH{(���t8�Y��M&m�Ld`a��6XI��X��J!9��z��Ů%��_��[��p���R}"�1+��+��+�mˬ�N�5�7ҮOSD'��__�ۥ���J�������K�(:�P_	,!�d���5�1(P���j�]7�!���zA�	t	L����O<q�w^}r�o�m���y=��x�����}�J~_`�1�gȳ�S"��Z�X�4qa�]��7��}�W?�iϵ�ӧ�%�7��c�MS����S��sߦg/����Nj�Z�<���3lTёP��xb(�
VH��x5.���k�k�m�춓�&�L%�}��k!����.lH��˟�fl���[�ly��Ҟ��w#��9rí�*'[zzSdi�� K��8?�"�Y@��ڋ�E�
��`�
��q2Ds�9)
�h��zpI�
�a�C� 	�ۇ�����#�ab��|�;��sUQ�*{r��XlOt���ί���Y�׺�dӡ�Zk��������\`�dž��D�}=�Ne2q���:Lp��Ƿ����웟�~G�g�uj��[�]�,C/��O��ي�:��-�a���0��%����B�2��W�5_ʬ@�W�M���q���v%?�
��鹚Q۱��f'�.k��E2ߖ?u	���V�Y�w_ɛn0�o�rQu,�IV�}PS��a��܍Q�������7��H��WRn�>C�5荙��ڇ�۹\�|zӇ>t��ݾJ�۵r������u+�׎�~A{��4���fR���b�����/�sӢ�ZR`$��h��s�P:?�,�d�`�b�e���b��#���į���:���J�lī���X��V�Ã�hoY�G��{�.��(ĝ�4�X��HQ,(�>^o�r�1j&��qkhd��
"k"UK�W
d3��p�Ϙ*�Ty��i�J��6�X�UE��	�����T:;��М`�$/G`���]��wu9]�x�4�B&�)�a}���T���S�	�0��HˆdK50-z����S<��VE&�d	m3����-$Pz�<�"ER��FH��DI�G�'D�NI�ޡZ��^�o�zW.ݚ�`�H2���`�t6��l�
�%�Ҙ�-��2�
y;10ؘ�L��Xu��	U	*���-�(�̨&�=�i_TeUfLa?�pnĴ10�l�C���9I��\��"~h�1
�ꡱ��7�����J1W�}͕V֖I���T���A�?�z�F��6K~I���e��[���A�����'ԹF}^]��:߾���N8�iއ^��и)�����6�%.��O�P���{́�����𬕫����ڳ�"^v�;�x�{�Q����`�.�����ū����]�������]��E�{��ۧ��C��;wmi����-�_�g9�P�ʡG�ݣ��,�����R	�Rrv��8{2�ů�jv����Y�D}6{����s5�z�|fn��9� #7c��/�s���t#&�=��B����y2��Q	��1ARoԋ{�}��D^�hAU��`j~�fb�"�~c^�*�]�
Q�Ц�5�(5C3lJ/��K��՚@�w�Bw�4�iq�U�@��TBԉ� �-��Y-��ن�lZ�����TL.#XU�<-��i}�^��A�������	�'a5h�0^��0ɝk#��MB9������:��m��1��5����<E;rmJ� i?�lW;�{���S�9%u�8E��7[�w7�ژV8�YdbF���V���v�"��X����0��?�^��Z�N��s�3�W?���pޅ���`���cB�ڏ~�I./�Z��lL��b�Ϗ߄'��e���(F�����9���4@��/ݔ|��z�'�!$V���4�$��7n��&�����0�=�	t���f2�iQ�=[��Do�Œ#EjE��P٬�.Z�
Ja43���b_�b���C�x�Hr�:�����K���m�ɝ�[�9�Dؘ>�&'�^1���%*��V�P2D���pl��s��AJ�����*J`�#��LIQ�$�$Ȓ��G���;��E�sA��5�Nn,�����/���?�����p��}��?�S*���Ag@K0�FCi��W�`sB�M�~�m�Y�j�f}���yT�r�}�M7,��U��{�Vȵ��x��Z�F�ع2~JS;�'^��K7l�H��OW���y?O��,�#��ԓ��}l����4.�_�cpϣ�<�?'����%�,������|R�C��y����]�1%!Z�t��q��z&���ucp��s�{��2ә'ضqcA7*����Â�&Izs�|�e��z�W��Әf�ORe�����e�J�[��l������v�*�b�aa�}eYפ™�wg�TK	�\YQ��4�OmYaF!����ܳs˙���r�z��ѧ�[D���v��,*�hj��HU�UI�u��,�_�"�g���IY3�!�#v�v@v�yK&;Μ:���Wm]i�u���$�^���Y'��?u��'����s�^�w�.N��8o�a��g$eA�}����ZX�E
9�n�ڽ<I���};ͳԠ�� �)3Sa�W�wV�_�+���+Q&�;&�����J.[�i�0�Pe;!A��딙���lP=ta���� ^~��7m�t��Y1���2q������ƽ�|6�N��FG�()9��m������������ZM�zޖ�{2�X{09��\��9U�Ծ/�wO�t��[Ow�4���h��d[�7IزlY^�
fG6���!,��̖�d!�?;N y7$�'@��$�C�.��$F���ꑅý7�}~i��������o�ޗ�f��SK�%��f��4��W�V�j:A��[��:Xo�ޯ��D���,�6�<˰+]1%�-J�W���ͬ0�g���)
�ý��WF�k�V6G�H�M�>��f�HcQƺ���=�_#�+��8v��]�*R���1��m�1���7��7�G�wWk阮9��3r�IR�B�ϧ�.q����'׾�����y�*�O�nN�����/��Ě���bJ�R֋�XH0&@�$�Z��/�z8x8}9�%*�
�`�΃Ks/���Ԣ�q�@�")$���Q�plb��>�6473H�B$6eQ05�f��A�5�kv1��V_	�SYc}q�_/ �Iʻ&�c�;Hgu�,����T�
K�rc�3�G�P�p�^㥣�*W(�*�(��= -� y)�|�˗���_a�䔬�
,�I]8�`,����3�+CI�����#&9zj1���U�9[c��Q�{���%�Y���ްFs���r��&�b��y�<X�12^��Vwd�z�K.� z�쟑�8��@�[0̲8���Q�evء��;��#��$�\��l:��i/
��qQȄKk���"��`I���7��ȁ�Ww��2��Ÿ�΅�_W';�e
�r����WVr䈴��ȃ��}���ٕ�!r���y�Cv��DA��!�]�;�~�l�l�P��2l.ϵ�Q4�VE�=��9�<�֠Z��������u�����̴U1�&&��$*��U�0��8�O�!И�ے��3����.g`%:aLm�����Ԭl�Nf�榋���K�*Y3�=��ߖL$8������b;�c!���!$�[U�m���ʂD7[[T
�F��&ŐP�+�40x��B��Q���
b������9����밮����HT�)E.b��NtF����=�'ᄰ����;!�ƭ��y��ֲ���u��k�Yb�lL�uw~�j�56T3���~ڀ{�[��=9`Hr�Au�I�I��yAs�l�f4-�+5���ð��@�S,���h���j�p8���l'ެ��('ɸ���2],v�C˷$�e��p�ɓ�rx�P��4�S�X��XCԈ�u	'M�N
_�r[�
J�hyھ�Be��*�d��p��p��!<��D+j�!�%C%�4:�!��L��0�����N�O17�rAx�X0�9�B�L��b�M���r���1��gpw��5�m��â��yb�BX���o��6Cx�N�
u�[��u�=�ޚ;M��؎��6��[����� vE�B��9�Q�@�K廠_<2
��D]b��s�ؗ�]��#D/tE���#q�#-��~?�p�]hu�N������5�n͑R���,�&.6����<ōev��4QQ�Z
����(�<��Ȑˁ,OZ��p�9/}��ڥ�p�~�/d��y '���ᶐ^�����d#B��	��tK�+��{�>�
&<�~��̅�i� ��jp{UMUM���*��ӳS)LJͰ�$P����_Ո�&�z�A�a��a��&�?y�`�8{`ܳ]���D��*s;Zt���Q�#��e 	�
s5,WC�	�1�mbY��3�j�&	2���y�H��=v#��t6��`��� S�SkCn#�F��ӣԦj�Ou�6\S�%6�p�*�-aS���XK
baqT%k��Gr�$�>������,b�u%?��߸�U�,
�%��G��@����|�ki��|�m��1|�i� <=�(��i�E�C�
:;�ħ���-k���j�o =/�M>*��q������Wh��s�I��r�n�^�V*��\�A�� �,�35LB?�Akq����=8j@%	��>�mP�xL�A��0O@o��!ѵ{5��U
��<�c���(�;*��MV���m,<k�pOM��T2��b�E8B�Y���k��܀��ك�����Q��+����t��q�{@�3r�����6\���D2O�i"Dېd��٤��wf�e_���4Z�z�SI`J9�m���Ǹo�F��K/'��g玅�Ӈ��l��u����_�v�Tq��m�[�|O����({�.磒@�y�Z�?ݪ/�A��QIpgi�_~:m�=�����uZ}،�Jn�Ƒ�Lk��vӲ�@����]�Q=�N|�~Q���Ai�7���Ǯ�H����Y�#�%M�m[͌.5gV^6Q��&w�c_9����}��e��G��@��l�X�l���6�wj{��Σ�����-���� �1U��n��D��U��B����kk��O/Z>��X>���{Ͼ���7�N}�Iz%
Pݬ1�W���A�0�����R���(�}���;�/?���1��� �wˌ&Z��;�2#��ȓt�I*�D�\�t@s<��n����Z5��襠h��>����N�iD�^�ղȄ�o����U�Os���\�u<�"B:c����jk�n�HՄr^��M���z�N�L�`|�-�<��g����+_R�D���W~�A�@�%'�m���O~�|��!����bC�X��Nrg9/*��eIײ�ɦ�L�Ee96V�2�ӷ�<,�1"A� M��ŧ+˯����ª��I�#�F`'O��|TȖ�n�&�e��x�$M����s�v�f��cy[$��R�[����q�mX���p
Φ����4��5�G�Hِc?"e�Yoy)Y%p�!b^Ɋ,�>%C�&�DG ��4K�X���l�X<BnX��-�'�!��O�`R���y�RY�.;�*4A�[�&8'
#}���4�,jϺW#$�ηOJ���y13��pA������3�Rͪ�o���sՈb���X�f���ʲ�� R	�\c��v���S��AP[���7�5�P"A�Jf"�Ѩ
��I��WZ�`}��XBH����ʡ�"��F�zZ�B�Q˜ixs5^vm�>e�&�YP�`�4��T�)���ܣ��n �ط��}�a��_��D��pPE.ZA�Ł���	�J#�!`�MAS��m�=�b��oE�g�������X#�'�7œ�N�D������c�q,�F�8A0�c>����b.L%�OX>�J��H��&[���k��h{`� ����L��t�T���2�(��g����$�M1 ��Іg��*�-e��b��E]��.��K�Ro&���jy�/����8U�fP�Þ/ƪ+x���ji�Ԓ���<��9C�h�?�6a�0�p�`g�~4	^��G)�KD�VƘ)2��`���!��FuYC&f�*R76=���A	�T���J�,�V��0��:U�ԁ(�Y�	��7R��&A�=���iD���䤝`W���p����`�u��5	����X���U��m��n�U-J
]04�P�ԩn��p�D+�V.�>>A��ps4��5Y*�ÑM�%�����߀��9���.��F�Ma�C�ƻj�.�Ԡ]�d�J]�V�|�(�@�$�XW{\�ѥ�������:?h=o��:���g�_�:���ޯ���_�����spv�����ǃ�o�&��`��Ŗg#.��i8��A�<�����VַǓ�.Xƶj�E2x5Qןߜ�<|�hܙo�]gr0�򀁓�Q+a��q׼I�1��63kv���a/J,��y�d��Is��:��f��OS�5��j�L�[���<0Ǣ�J�TD8E�;E���ۛg~�'KI�m4�bĈih�&��B�G��ߔ����+�֏���|�����ϟ�2(�gO���|��)eNٯ\/�?^����0{�b	9��,����"���Il8tam�c�cRi�u(�$m�%.]Y2��"��3	9*�q
:R�$�-X��͵��������g�ZHʓ��5J����E�ͳ�!n�����.%	X�t����H�*���6�@	e�:�焱z�{�
q�J��!��,����[0�a�QC�[,�V�R����Ej�����CS/��E˜Y�餋+��e����j�B�R��-��]�;�s�ox���V����V���`=/)�vQr�ˡ[v@����f^�cT���'���Q����k����N-�c�4F�1A���g��Y:u�"�U37v�Uӡ᦬�s�0ةuE������ߐ�8'r�7_�LA~�Ǣ�zx�Dc�4��$���4�,�w��&�=255�&�l<�š��~����"?�~�r��I�U�我��y�`�[r�K�p�p���<���0�Z{
-9O��v���N���G#=�x°=an�Y�L�����1lye?�[|�
�Vjej|�5�� �os�>�^�[���ݚ�鳯��p��i��:���&�0���t�-��y�S�8���W`?�����a��;xl�_@Ôw��AA/��uF�uB^G�0�LF�˃�'h����A�SnV^�X}1/�LG����uQe�-wvJ6F%9��ӯy���ur�x�&"��@����TT|
����y��Y�lT��X��?�{�Bs�/��MRmί��/_u�ܜ��7��Ff�TU�0v	������]kp�\��~np���C:�����Lؕ�X� ˞�ʔr��w�3�U� o&���p��yIN�E��c�/x��A���U_^�g
E�-Ϫ�WJ�n���֦�+z����˦Z��B�p��l��y�N� ��n��.�}.�]��.�8T}zm�u�e�#!�&e)A>m�\�y�e�uP�g�g��70�FtE�
�Q��P���;�I6���q�
�y^W�_�y�M�s��+���+�!Q�%�Am��ZuKyk8��v���,wN]��΢	�[�@>�:k5%'��%��Strx�L^9�T���Ɏs�`I�*C��M��Z�����LU��t�1a�L�
������q�?�$���������������C�[�<�u�+��u�ء��5�4J�	�p��^#�A�R���h<fi �]�<�.��O�}oư4�k�re�0u�Գ7�r�3AF�p'����xO�<O��l�K@�O�y��P�սT̾��_�����g��]�+��{cϠd��;��۪��Pۺ�Qœ��&��mc]��
{���tt��T�i�ѩ����H���E�X�r0�/{����s����P�u�=WUj���M��*W}rw��s�W�c���}��Nӝr�r��E��	]���,H�7u�O�v�O	w�㓯^���w��lEɼAj����}ӝkZS
��s�~��3�zG���Cb����y��_�z�������A��9�E2B�&+\�'O��LM��x�ب��r��YZ)����@�eɯ�G_N���z���}��w�B|*�`8�K���i�����"<�q�zx����SȚ���F�k��5�����S��
ߨ�{Ϩ��gC�u!���.9}W�����������v����w�ss|P�;<w�G���8��;ߩ��K�zCU���������;Mx�ٻN��~�L�b�U.%H��2T��C�����w��]�
j,�Ie�,`bfy����RM�8u�t�3�����ݿ7͙[fLs����[/�ff��g���33_7Z���h��yU�Ҋe��0�4�%;o|X�騇Ì�P���w�l��%��2�2�g3"�@�
�}u�t�Y���L�5.)�}��v���p���KT�q8x�#l��Ø�-eUy����[e~Y"c����S�.�������+$_��J]���K�e��;\"2h�Cm���X7uϡl���S�1�KIA�x������xa�f��[Zl
��-��f<3q-g���XYH'�:kZ�ۑ�>��_e��*��οR��+�jj�i�_��̺�K����U�im�g_�dL���ip^ȱ��M�I
��h��.�v2&�|3	ݒ��u8z��h4Hc��s�?~$/<m>�,�������s�O�{�q^N���2��$���ۯ\�\��!�T/C���	a�1S6�E1O��[�<S'�~d@\�
twjrv��>9���W�]\��f����m/�V�:�`y ��񂣙�H�����d	W�W��=ƞv��Z�C#�ۥ�e2;���x�9�y������N�P�����tB�1��0�3@G�6��8+�$�RY�v�s�j���L��F�qɶ{�r�rJ�U�<��+�VS������k�J�4���]^׆MΩݚ��s���<M�A�~�k��������q�� �b�S*� ��nX��-'2��%��1�J�U�0dɮ���m5&�N�ښ������5�y�߻.�+�M>F�0�\B�y�͙ �o�H��ڦc��z��X)�D�Ӊ"�W�pEa�������oȃ^��~������

n�yA�
�檤��ye���޳��##�~�;ä���CPA�!m��V7��I�����+ɮ$�P���}T��?��[�z���w%D�_�=4�2�>z�Ų���$9@��w]uܵ��i�4
��
h }���W�y��׾>g���<\$���/=�0V����U,��jv-�%~mٶ��i��̈��)�:�Tz�݈n��t!���ɺ��G�͎�˹��<!#���u�7�{�W�~`L�i"�hj�9�1(��Aե�����ub�&'�;u�
����2��y��gtPHj@1�8�X�v�nR�9�Hz�%K-{�)'4���;����t�",�q?�<�
��5�ٻ�ہ�,�٥u'��H%�,O��C��$�
bhjt84
8�7"z��h�7Bs�V�"�7���]����*w9r>���?�������ȷ�G8���+��JS���eM�&��� �4��&ü��;�r��1�t'���U/�����=��w>z���+�f�w����.��[rn㺫�1�ӕ����>���pו�N}��^���g������r9��FY�ۃ�r앇F؏�S���HD�%�)i��%�#X�KI��'Iٰ-Ϋ���+�����AYD�%z͈S'��H��ĕo�d6.$rW�n�"+�X�\	��,l���O�|��O$���}� 4Nx[ՓĨ$NT;$�p��F�2$S+��1K�{���'F|�Eϑ�)~�r��*�畏)���r��+�$��ח������Qְ;"p��#݇Ѷ_�X��EI'���dr��%ta��I3Y��,��>�z����d�n����#@|����,��b�KwIR�w��ۓ<�ݎ��N,�L� R��Ι'�W�W:��a`f�|��Z��.�T��Q�XٰSV)V�	7��D�u�)xz��(�;�"����Wk&��[�Ī�#�ʎ�{�T155��ܳI�K����oJ���;�XF)n��U�O�HPt��r�;l,��i^Be*���x�B�W�@C��dY�©jh��H5������д��p9^v�c���!c������<���3~��$-3�Y03�=�7�����a�]�U�t�p��"����j>א��i��*�bèV0=q����v��b��"`�iJT�9�$�.2
ՑQ#R�0��76��XL���
^NjST�`�k:�	���v�/�|\ɔ	�����<ڗ`bia�.�b�=�K� �㚌�nP��A����Uf���os�Y��mw�I�o��ujpdu~��A����7�����#��Az�`��̰[+��g"�y]]c����*y�YL�v
��2Z��:?h�m�EO������G	��p��2���e���=H�9�Pˆ�"��D�`�������;�c�Mu��T�o���T��Z�A_q\؈�9I�����W:�O�w:K�`l��O��🾕��85
Q����;sg�W�Q����@��%N6�I�*'�(��d$�CzKt���+�"]b�Y����Q��n;u(���<��������Fzgibb��unh�
�a;�p���7�Ʉ����^O�O5�������Jɝ��wnM���m;�9|���,V��a��L�.�T�0�z�=�
F���������?��؋+���=����g�&$���f��o��՟1ݸ���+�"��l�|40|R�]�g��?z]�U��<��bn5զ�$�T�ͣa���|�t.�	a�k!��0�{T��2W5�|�Q��;:�a%�d]��*���F�Ȃ�M�	�hQ0m�ٜ֙��5�`mp���A ���X�P���*L6����i_SYY��*��E��h�Mm��J{&VW^�ؒ6$���y�b��#��9�N*�s�ޛ��(_"�O����GA�:�ܕqꀇ�B�0��'WQ�iB7M�Ѫ7}��',�#�{�m��c���k#?>����n��Lea �\Ͳ����.\�[}�
4ێ-녶Yֈ�{��ncT[t����liT<5O��<���['��'�ߩ|j��Y������7�z`wF��7�[��.4g�,~�K:�u�A�Wc�}���u��4�e3�l/誳y՝ۯ\?��i}�#�m��NJ�$60]�]WA����؅".�7���ј��+�17�ѫ��˗ɷW��WW޺�<�9a!��Ţ�U�k�0�'6�4���ӏn<g㦟XvaHV
��l��l�{H��|0�Y�j��ν�k�N��-a���6.iV��TNa�W��O�8�>��Y�X~l�g�F	qg_�P�Ye�Ϙ���"A�B4x��j^'��ֳ���}��4�r���s�h^l��	�>�8�|�̤��z�a)�
c���[�D���$u��;�_�	�l���i� ��|��W�S�C��W�Ó���2��J�(WՌ�$,���Z���ZylRoM's�K/)g�+�tO�h�o�i�ug�J�VM+�j+lm��p��UN&C�H�y�s&ݟ�楻����/���Rt����Vio�2�2�uM�a��W�H�э���L��
�ޜ�9g�7�1C-KK��E�܌�t�`��ޙ�}�䡚�����!�4:3���OׇY�s;,SN��>Y��+�����j�6��b�?{m���6�-���^��Ecw{j]]��]��)s"�]�\���؀��]rNѱ��c��ik�u�g_����¥˸3y���F���&����5���_���xd��Y�ʋ9x/F����|��ڛ���|�knn|�9���q����9�3gg�G���q�ϟ�S�9�i/��vʟN���G/ku�:� ��"��f�R��F�E���g��4�3�����%�?�30c���/����!K���̘j���\�U���cR�-�;W�5C������ܛ��h�3ߘ3#�i����mR�d@y��y��4_���_�{�S-k�I�1gW�d}�]�$�(�/�bc�Y�BK����
GE+5*k#�u�\H 
��W}�Ac�9�u�ů�`�:?9$��̗Iѩ�%�7
�:s��奕�_�x�#kF����!�d����x$<��mR�#��Y'�]�1�����)�y��X����.���<����_g�[
�cDb
�F�bpM��yŌ�G5(�C�����AWsO��b��\��]\�^���w	],��C�\�}C��)�t��|�3���!Ώq���|F�x-�㜿S�K9�V9�]����[hrn��9�4�%e�"<k�a"'��'�l����d,��
���g)	zK��V�w|��lq̭��}SV��l���/sQ�|��	���i���l�A&p��}W�͘a������V���mjꝎ��6�dc&n%��|�|��%O�9��3��X��"���U�]�DŽ�*�1�V�$'�Xȉ�sH_0�:Sy�i,����}�h��f��P��)��[R1O�]�a�eYr��4�H5���2�.�X�0�$)6, �J�p( ]�*�kx82�h�ðL%z��n�9�п�i�����&��N��:ݮ�U��>#AL�B���঒�@.��9���=�&!1�����z�Wv�F��ڌ�W}�pޤ��})��Kc�Yξ�߬:�Pj������ШQ*
���2�1/P}�Dz3�����U��1N����[�ƐT����i=���u����]FLY��g�����a��)�֪����'�U��Ǹ	�-N��Exv-����]ߑ9o�d���z�(��a7��x�֮�|�)��]9
nzH�}7��"�]�˼_>����K2\����]v�v����ke���n�ny�Bi�\o̗�w��s�L'���+7A�*ʖ,�r<����M`u�@��w�r���Z�ʇ��1��.I�n���lD��uZ0���I{�
<��h�c��tQD�CeC�H,9�W���i�Ǭ�P%�ڒib����
Gh�,���S	���Z̈���%$-zn�Z�}���\�����ζ��y��5ð�8�mr���c/��Z�7����-y�`��l��i�A#�m}C_�]U*,b���W�=���%l�DcP���[�"�i����!�n�L��e���@>��i��]6t����~���ڴ�^zaicu�u8�c��h4u��JMCz+MSȰ��-���S����B7-���׫�-���Y�Lķo
hL�����j�G�;~	F��ֆ����G��&��W���&b�]��J�;�8v����{	�.��r��/��'��|F^���o��[Y>xp9�OE�2�����D��'��$�,"ӐO}��_����ǯ=��'��}m����mw?��Ę��b�0�65"��U(�R�P�R�SnP�(w*�Ŭk��E2Z�pc8Ɗ��#=v������{�@|�� �tǸ`���|׽���+��񂅯}���b7z-Wof�Jo�������n�y�_c��ݰ�ۿ���*�| r�ZX�h�K��9��Ӳ-�>��i-J��w�4[��.l���i�m���_F�o�@!�k�[<�Z�9mÏ�c�C5����_D~S��kv�W��.�#�0�HW�ad�]���h�d1�Aθ�-�~eCD�I�ȥC;\ƽe�V��O�u$N ���$�eǰ�j�Up��~¹�u
�|D��쫡��)�Jl1G�+mC����E�B�Z �uD�b�L��<�^�g����ޗ�v�Q�e��
æ��OӴds5���#~�OY�RZ�1���X���Q�3�]��o�𕆊�u�`:��<�����˔W)oPޮ�O�5b�
X�8�rX�5.��x�\61����2L��ُ}��Yʆ"�qP8h�d|'s:�װ4�1�>�^�|��:o�r�w�t�
!���hq�%;�%=h,:Ӓ�a���2���-$D���b-��װ���&�gu�ٶ�bՏ�(N���}HSK�q�EA��;�M[���Y�G�+��^��pհ�;1��&�(T5�c;�eϛ�p�m��|m7�++�w�7�~���8�'^�R;P�99z�F�_alh!X�J91��#�0*!!���3��	/-��0)�x�������0m�F<[��2�_��,��z9�
�j�[��N�� ��V�r�M/(��8���p0H�"��Z�wg����l�{7�z�AF.�T=x�*6����ewg\�XBˏ�S������M'_��r:����_�̞^�N2��(�B�6c�9X&I�f�$�M�4��2�Ť₦��L0���L[�;���0[�.mA��g���;���F�,/����;dW�����6Ȩ�t��[HLڰ)!���	=Y$��)Œ�;Ӱ
n��-�	C��%�w�6���g��`Ѹ��h�ab��g$ah��H�tb3�
vn7j�F4�H X��Qk�a=�٩9۟��5׀��q�%$���A����:�ܯ�S~y�)Z.�"��	����n�	i��b-V���)��x�U$E^�u�#�X~�l��f�;�l��j9���p |G���Y%55[���YJ>5V���'Q�D4�ᒘ������JƳȐ-��[�[��4
fV�gͨ���7	��LT���o�8	�4�GZWadL�d����=�a�y.,s���eV�`#-D�kbN���b9`���#C3M���ˮ�:��1��S���,8C��l�'�z�٨�w/�K$�����	�7��pr~��_!Ӯ@YU3��u��
��tel	��;*�r���MkQ!)��SX�0�4(V�Ẽَ���<�������~�Z{g��d�a�7G�R��3�L���}o���lہ�~���I��@��2��I����Q魛�^niИr��W���������|�1%�rVNӇaX�(�(�=����9�n���Dc������.�s��������Ki��ؼ��e�r'������2U�%:��(�a����@ؘN�
�X���+V�#�6�6�|�!�[���Ќ�P(��mk�9��Zd��#†F`��tq/�Xb�����a�#���KTS�E�?���c��������W��c�cJ@���$u	��(�d
[&y�8[�	�G����#}�����;q�p��-9,��J�����8��^8"0p�݀!Ֆi:�����m>�:�0��
Izu��N����Y���s]
QN�c6U�|�FL8>��q�ya� 
�3�9���~��7��\��a�t�X��l.�ͼ�[yf�����5��k���IC��Jr���<�
���2v��?�s�Ļr�D�KX�#�A��*M��0��aG�.jf������Ǒ
��$����J~s~l��P��7�vg�I�۞;�;�`��I����=eg\��8�_�i��A5h<Z�o3􊝰j�%vYal���t�l%���ȓ�-c�8��	,-�[�&8~]�x�N�Nzqw���._��G\
	�:����|K��*W.�2⼩����7ƣ�!��(�)�v�~�\Z�
����bK}���dͼ��dH�;�?��_}�hDi��y]�]���b�fAS5�N���2�I%޶��
���C�'� ����AXk��@V��u0�%�{Ӎ�0�|���ڭ{v-Yv{:�����ȿ�O)x~{�x�l��Oҏe54U�ql�3\�M�yM��}��3B�jcr.kv$�%�]�����j/qN����u_ �Ř������Vy��] 6�e�OO���VZۏ�Ƌ��x�R�O>|]�7<����=cq��co����Hh�X�$��m��YT�k`"�p��N8nm�1+F�:`uڎ5��xB���F��!�J����d�n�����Ӈ��<6�v��W��W:�]v���y⮬�}!�5��E����ǒ��]9vj�E��@��E����(k���jl�}��mʋ�7g/�`��a
�UG�-	J0.�ķ�<鉘��$�#����09���CA�#�߅DX̚�>�m����7�M~�R׎(-9$�|�*6[�'b�S܋<�*�GV��YQ5hW�j�V���<�T�jf]�^!N�%ͪ��љ�F����U��h�y$��W�L!4l�v����J��M�Z~5��o}ಸ(�:*�
�[�䦬��赈ڡ������(�?��I��Փ�`����s��b\Cd\������Sb�F	3�W:/=�� 0��X���.�Gd���(l��Ԙr��^�);�\�P�,θ-�o��oHi�H�M�4�c��	̀[&�Zj�rLյ]
̸��^Ru���VhE,�K�32#�5-�b:NU�=��,�'l�5�_�y�ZbY1��$�\BTU�0��"�Cc+.<:o%e��:ae����+�p�S_b~��6��uNYA�+Q!��J�
��(��s��5�,p%���`i��4	I�0%������i���vk�2ݫ3z�Tw�=��rӤ��;���ýg�ZL�$^T/���1
^���[�i6���ϑ�liW����)'<Խ�E�(څ>�D�_��,�0Ӥ����(m�«�W~�yv�7j��.��BK�3�@ܩ�����Y�#y#�iq/��v�B��Eg�/�q�H��]��9��=n�!� W�	$HT	S��*?Lə��mW� 58��;����H+��Ό�
�f��Sܛ��^1���
5	�p��F��U��b�^��F׋`	�?��/ja�8A���2��.̛�zȟ�2����ʇ��+_S~>N���.��Q�����ǴW�a<j�Hd/�NgE���X1|�(s�C��(�`���;2�݆;�C^O��}��Lے���@_��5ʋ`0
��ei��
�y�oy澰V��p{�#-d�[qŸ�]����5�"F�f�n����d4������֩N(���R��(
��ql�5�\����X�o��J�L�����
S_�#2�\���;�穌��\'��_�
)v�[����[��6A"a��Co�������:!c�l��|���e+?Ol	uL�?���\[2���^��X�%N2�����h�1e���F�	Ug4�_T�QiB(�Q���[~
�ۡ�%*ka�L=�"��"�C
Ϟp�K(1\�Rڂɔ��5�=P��E�x��
�~��|�0rs���G��3�,��%sb^
���<�ox:8;'��$e;�6CI�3���!�/>��EWX���M�`��m�uk�YU�2GU���C�kھU��Q�ݬ��6���B��Xߴ�t�b��3����3���>��hi)���[_��U.N��>5g��k��,_xaEv�\���U��V���.Vf��]���ǯ��kgd�7�B~AYK��rRyX%(ު�W�u��U��|SFad�����90�r���Zk�����9�K�̨��y0�B%thv���ϛSx�%/�+a�.��u$�h�H�8G��ݗe=�i��!��T:������_7?��N.�b����,�z9��xuL��܈��T3��KSX"m�q�����V�#�+8�mc��t�8?�u��p����-P�YVH])�ay.����	�M���o��Z�}�Fԛ�x���麦)ZS�/tŋ5�5��
��%�q}�������LׂV���B7�i�a]�d/�˝2��,���¸��2�6��X�:�&¼�4�ra�S�����i�ز��
��x��t�w����
�F�G��ÅJ�8�A�qE v�(9�L�oo�j�q̛d7��7nj�U���l�Y��1f7��
z���*���E!t{!	��
�a���HU�W�ij:c6�c�F=(�ۉ+|�ڇ.�/B��fؓ�mi��a� Y�e�/�Փ��}G���&��v��+_��+��bԕ�sU��L�]���A�3��0�%y��Kʈ���BB�I2����"ͭ��p�Qb?w&��i�R{���Ձ
w��UP���-���=�$J��1�y;*N�,����x�l��"��d���Ş3���f)I��Jɔ�eN����8��?�@��Ӯ)p'���<���N~�+_��O�j	�,N�oo�荼~���2��\�����4��b\$�acfC�Z�l�1Z���ؔ�t37��ޯ��q�'DE����:�/��7
؏�ͦ�d��h?⬺M+t���A�O�	�e�èSl�m����>L>�O*�Q�)��å�G��cG2���Q�`d6#� �#�����-�hŒ��[A�:#}Zn��Az�C�]�i���iO��JfK����^�X�v�K���3Y�sJ+4ɓ���J4��tR6��W�	4٥&�����:�4�"�h*��~<�o�`�#��i�v����i[<2��I�3�Gb�2\ke*\��M��{&�Z`�� ?,nj�MwM]5�����/C���VCUc�Nm=h�l�޾��",y���K����D%�U�(@�M�o����6� � �0�I3�7�[x�3W2i��R޾��W1F�
��7'�l��!")����qX�.Q���)��H6��
[
$��f0aK�*Q}��qX�4�5A`ieV�h�|l)9n���m���e�Y/���ڮ�w0��(N���oJS��y�c\��'�~�Yb��Yw�Ft+b� ~-K)��4L̈́+���s��:p���`�Lc���jΎ(A�zG�����~�~���0|�pɋA7$�gn��j8�f�+6�>Z��
E��D��}�SO}xa��p�}��9r�ĉ�S��;�s�g9�(���e݌�.�A�9烝N�ˍ�A�=��B���G���ۇ��}��$�'2����Vޗ�9<�`�
ಲ��Ǖς���=�
0ű��9�Q�ƈ�Kst_�^��3˥I�$�ш\c��7�koԣ��K��#���ﺣ=���G�bT��{�N#O#س5Q���Y�{g����Q���`v6���
'oy�*��4
ͷ+6\[ ��0\]w
#1
�:)-��E���uZGE`q�Xz�#�]�,G-�:���S�sRÍ� *��mn�'~7$~���#���^{���s��=��ݖ�e�����n����?7J�|a?���"��h��)�	5��0����X���w��De*�!��./M��%�#�y���4��ʋ�C�E�_*�V��|IvUz�Y�߂[��1ZQ�\�b�l������W7D봋|i#�`�����xF���9��Tˬ�@����_Jq(dȶ
7S,���"(>�u�ʄ������!L&�Nz��!I�A�¾Z�t�6�*f=��v����IG:�h���Y�N|�hp�b�Z�F�wc�%��ka��uB�0쀥{�ڦ���pl���a�rL�Q�K/�E�G�E��xlFN���'$� ���s���4�:
���A*��	����55AXH�%�1�cb�$�l���y�L!�����?ZA�c��'�S,��!�n,�d�n��h�y�o"��@�����J9��m��n��~&�pAm��iz��إ�i[/�N��H�_�8��CD3TUYC9
�%M��p$�`F�P�A����K�Y���ꧠ�=obF\aS��=�nOx.�r�Θf�X|�r��o/
D��L̏#�'D� ���"�2�{�3���x:���f�:��00F�MPZcVl�Lơ�'ȧ��ΓQK�w ž�^B�A�X��J>���ե-p�c׍��|3#��eU�}��Qn��yV�r��]�`Pɚͬ�74�vZ��#���/|���a+�e<��������O�޶�r�ud��(>��_eo�r�$�k��<6�K��Uޣ|��O���w���?B��n�"�r�	̦���_��:�¢���%�U��6UwGۀ���ř�nގ�A��p�9UJ�l�H?�����L�K��t:�����E��Gv���\sKe��m�/�F#I�;�b���ύ�^�%��e�cI����
Y�4�nv���߯΅���_��iܱB���Ƕ_s�=�/�AnK
�pm��N$��
}�����	��|+�-"�s��X��5��������ʅ��^=�W����#���k��{��cN��K�B}�}04d�{�+Zc=P|���vb}����{�͒'��|�'�<>��yn$�Ո��1�r�r�� b�ɚ�t	�[.;߲A�tj�a"��,���V?/���$0���?���<e�KOv�Io	�&F�Xs���z_�i�&̮��]L��΍3��R�W�bV�X+�$��U�:ր�jڈ�Z�c���㭒.�
,�uu��7C�;�
���ǦRcR���}u�?%��^
ҳ��'AV֧�iC��1;/���"��z��	{����z�oco�W�gɝp���� ��]����Ʊ�]������՗�|��#[�-���������+͵�@,TWڇ�-�z�B��G��K��1�s(�d�p)��&�Re�ۢs�<~b�pvw_��J�
�U���+��n��]��Ǘ3׫D�.w����9PL]ľT���)�(V���#�Q���(g��p��aA�:��V�䗻�RO�����̩5�ˣ��,�2L�
�P�Ȑ�����U�%2p�B��8�ע�eO�t��WGrʨ�̋�<�=�I�$��r��a�ky4M����F���	.Ds'�"l��e��%��;�>�Ω�R�x����q��
�	�f4�Q�i��$@!�dr�
�
ƻk/�]�m�1�-kXl�����}㰋�[ۻx���;�w4��?��7wn��U�N�:�p���ژ�c��l�5C˜-�nl�L1��5M�e�ƶ���kk��
gp��S�t�ׯ�XL�,U���	j6L�z�N,Sc����l��a��^.%�+:�9�8`wPgOsL�e�&aDn�Ĵ�H�p���K�#2g”FT�"��x�Sؙ4x0>���_Bqv��D�R��|�˄S���p%�*/w �>�꺯|�@�r{�
v�$�Q�zD\��M�_ͨ^�,BNRD��9�6��R�P���H��l8��-�7^�	�؃J�� (1�NQ��$;p�LB�R	j�s�fx��"t���p��D���Jc��}��|{�i����i){w���#XJ��@|(�o�K�y��g�zЪ�X�/(<Z����E���\��>����1���Lx	.h��~���_2Wxʗ�ྂ9#�gwF.H����6@֊��X)DaFa#�U]�����#Ԇ�1����F�������7�M�G�sɖ�Gv'["�"߃\���Q�_��s��,��p�
/��E`�̏��0�>6�d���赤������,��.\$��I�ҕݯ��3�P�x�a�p��>�5Jꌋٰ�-�2��y�I��+!��&u-jk�Պ�#�u|;��i��I�dp�)�x�d�0$y;ӎ�L�j��PscrE��������w"{3�#d�!$,Z�5�X	��ԃ1�7s]��!��ϬP�:��M,a����t�o�d�y�Q㖒��v�+-�P���л���^���myB�
)���-��|ځ���`��o_B�yp�Z�Eq�EB����T�ESj�2]���Nh�J4.�2q ��d�la������u��f*�O���l/���,�1�av|�3����Btr��߯�q����߸���x�I��}x"`U>��r�[�x,W?{�Kv�>~�3w�u�{��Oȉr��7���/���_�h��v�_�}���Fj:�%?k8���>�s�KO�?��wȏ��g����%\f�b����\4�,���Usz�-Я�u�.E�-�b�h��U痽����[��_?T�m�,��V��,��~�R<(֥(&q2n(�����_�r+��|��������m�%�
�s�%Ļ2�Ȳ;Y#��/�l�68D�]�@� _��K/�]…n���ٌ3{���(Ԓ�+�=[`���	��R'�a4�{4�Α��k�q�r�1Zn7!dC U���*��%0�b������+�2|-��ʜ_*sso�H���o0�̉�oa�|u얰(}ܰ0�������u��HB��Kn��z&]ј#������톷0��Rb|�W	jAo�n��W�W
�����w
�.<
��X�z�*d+�o���Y勤+7�&��}���:]x.�*�0��n.��yWv{�Ѫ6���%��5�k��?��?���7�����ޘ.:q�7�5[x̥(7���'�'Z��G��表0�G{/���(*��1M*e?���3y�+<����-�<��D�3#�tDQ�� 7���n{ՋWN�~ze��j�<׊�h�T�'PAZ�}�'E
�����&�a�3B�
�t�C�"r���/�*�}��DŽY��1_"��|���儲����Mfd�x��Dt�ɪ������zWD
��G��(���\�zU�jR>zׅ�*�������A�G7�m��^��s�7��1�J�R����Z(��U��胈fd�W���
��s��6����S;H��׶���w��s�a?�؇�����/{$�!�诣Zw��j3�E�W��ս�IK�����)�<�w�
��g?Kޤ�ז
�
7�L��[
?�����DŽ�:.��b��A��2�f�����`������*�śe��?��a�46�\�v-��T	�֘CT�|:{W�Ix���Ѽe�7z�N;wI��z/��-�kq)v��f?�X���[���r�Jt�	s�	�J�Jתى7��r���nP1��UWg$(�1+���%���g�~Ϳ�ѝ[���Y+n{slh6���h��D�K*Ij��5�2���� �4����Q�8�J$E�:��@?1������ŠF�RZKB�m�&�.�"V����r�"��6�h�c܊��z* � �ӵ�'C��܏�O��>R8�ux\��S����Sd�D�K�L� 8)/�g)��BK�L;��3Wj�9��kY�l�Œ�Yf[]*�X3�9zC������)3�II��N1Tȿ���  �Qnj"c
�'J���d������:5���NJ�7iU��vg�4��K���BTh!V/Vđ��D�#��;�Y
�b��G�I�C��uS\�v��+���G��w>x�+^y����.<��aj�n��~ы�~����w�Uםbp�/\�����NP;#��`rv,
�*1�ɦ
2���D�$\�I%�C��T��wf���z�|y��N�Y���锷����wɹ�ީ��5�X_y�8t�|�]���\�ソԜ;�J+(��������Ma��KIL��ĝ��;qt�R�qs�py?n��ӳ�P̊p�`�MG��%�~����k�)5��4�O�k�2�ZJ�1�Pe}�>vl{��1�'o�T#��[9�WӔ��8FμE<~�C;�I���ԬR�9��[:�����m�宧�k��7�4���'>nA�s��h���f8���˂Y�Wؼ�ꄃi6.�qv�\2�
��4�⁡�_������Ç�f�u��������\lX�U�ΧKGw���8X�&�pn��hgj��O��$�ÕZ�ǃf3��h����Y*�PU1�dž�~��w�w����'��^>Hxi����%�T���sX}ԝ��/G�3[9����ü��)�k*d�Q�ޕ�"��V�{s�ը����a8����|��-ի�W����ug���?Tך��u�:�~w��k��R9��b{T[�yi�^�
��G��w�uS=�#B�"�S��\"q�y5�@��r"<�bGa'���ώO:�'���3�a���ض[{����U�a��o}(�\�Ъ����[���\�����?~ݚ$V��$��x:O�X���t��2~�=��V���+�û���?&/{�>��nY�~��?���j�Z;\"��;;����ڦ��p�{�Ra�h��a0������a�VaB�C�=����W�jnw\��[��R��Q2g�G�
Dqc��#��.-%�C������:Y��x~[���
�S��S�G���9Ur�O��=�/�c��Q���h�=��<�<��X�� �i���9�~����|$`��	�&�N-.G+�.����2�+�됱&�2Mz��i����2���I�9	;��.۾�z/�-
�=�I�G��Cr����ig�1�g.���9��uSG=����{yY�L�v��`��p�v�R�o{��!X�>��C�"E�,�FMK�Ɖz����p�e�b1�|�iZ�H��z����+����e޴���Y֩�uf�2O��ɰo5̓g-���u�I�+��y���|�������!���޻T�����GӼ��,�C䯎���	_�x��OP��~+x�o^��}⡇�ߙ�A��/L ���l1.��l:�'����`���pC��;$��%��c�y�|ts11�d1�sb�NtK�m����ڹUYZ��-U�?�["�^� �8�-�Œ{|�#�	�t�+�Pv�vc���F�u�,� �-��k$!�;h��a�g�f�qg��d�Cf�\{b�N&C
zg�s�m
�����,"-ڊ��Uj+�ڴÏ��Vo����Zm��w%M�v��w/YXmV���sK���	����{Գ�R	5^j�
3�>z�4?g�m���R%z�k�7�EFHIZz%���O��b��CpW17��2>H>�T	n,�Sx����'�.�9�NƓ��F���R��c��7An���"�C��
Ԗ�s��&9ḧ`�)V(�\Wd"E�)�r�PL�
��si��a߹^����)j�N'�i*��LSr�ٍ�e�և�j`K{���]\K����T�d��H6�ld��"%�M�����'���������
b�	���-��z�
d�E��@��f�s�Hh`���e�欥S��m��15[���2
��^Ѹ��~�����#��F2M��gY���ڙZ��&���rzh1k��e:/�fӭ���
!�[q��W�Ьz���m���Ap�Wt��Ȣ�N�
�o��RR��5��"B��|�qN獲��iZ��<0�Mn�~�ε�].�#ތ��_��O�Nd>W2�Y�\��I _�k�t�`y�[L��y
��qf����'��:I��_8M�_OðV��B�L|CP'�\��ӓ���q��(ZvpEQ��[+�,m��؜8'FX�,}(e��H�B{��4l�V��z���j�xS-���?�-�h��_��
M�UtZ�(z���������ۏ^���W�}�+W+Gڅ��P�|ݺA�(I��M�뺘jHr�%�=H(��i8ѕ�`���+o>��v���O\��3{+W��T�A��r�0�&��_~�m?�z�	
�SM�ώuRK��>z��wv�N\����c��k\8�z��+Z�`ݓG�������t�+u�'^�����<��S���~nC�a�V'ry7aB�j�m�U�����!\Z�h�U��Pd'C�^�
*O,7
��Y�[.�%3��r
���ۄ���\E��FŤ�HaRj2�
�^�~O)M>*�r���D��	�aM�*Z)̩��ً�#�Au
L�YM��%ަ���r�+�J���O>K� mn*���gY���Yg5��c�Y/B�b,�PP��5lxg]k���	�|2Cq���Xh
�n"yů�u�"���_���@�W�����w��3�p5�J�%1(ͷ���+��A��O�\��&�:J�0Ҥ3_t����tε��I�xc����!�u����&��V\����q�d2mcI��r����-�G�:?�s����b�W��o�����c��]qf)��uO�,���ɦ(����h�f�K�p�o$�<��/>�����O=�ԧ�z�'^�O���S�Wm��t.-�4���j%��$��U�8}���g�۠�a�VN禱�}�#Ϝ'��~�ѧq�d�)��o����o�3�g;�	��;��ɤ�T�fzr�ZӲT�B位e��]�zd�1����v�_X���{�ss���a�Hj��K?�;++��������2�'_��\���Z$�_Q��p�p3���*�����A��H�ɽR��Ur~y	���GV�t� '�#������N�sH=��hI�K1�J�R��ϼ��ϼ������j��rE�u%�v�3��~����^����}�X�e]/�Z�C^_�;���7{�V�]\9�z@]$r��x�G�C;be��������~ٱF+�V�,ao/�f�&����u�E8��U��\�
�WA<����o/��)a�Y�p��B���C�3�K�;�Bc�=���eɓٟ��H���4�)\�2U-��!�"��N�e���n���D�j;��/��!�]�?ʔM��$��#��V��N�v�a��8�^��t��I�8�%c�`�]s�>Y����]�
����a�lQ�'�f�z����v����i-k�r��Nԅ#���J�T#�u���o�b��5�OV�'�V�@׹Rk� ��o�6����E`�eѱ-���a	;���[X #�B�/GA�0q]
�)���]��P�%���5%l�b�64�(mX7ihr��DU���fH�sԿO�-��=�����]��
=�R�q�9ɗ�9<�&��99fq���8
�p#����64!w�(k@4�NfVMj���|�ʕR�Y%]F)t�ɹM�X7�f��բ�f`q55��uJ��QSכ��n�����˴ĝ�T��(%�O�Uvmf,���0��K�����emӬfB��ˋ�����B�0�o�Y��h������r\1�n�U��t�L����l����qvE�7V�ի͍�]�-k�htUA{v��ϑ���q�������|�PH���n�l4F���?΁QX��]WwO��8���Gz�8Gɀ����� ^������
k>��m�
,eU�C�TV���P��h��G���Q6g����\E�"�ZL��%���A��D�m1��N^����
�a����I��|��PQ%U�`��y�v2F�	�]:��۹~��&�*��
!��R8�)CљT�(�R9�u� HF�o�&��!�R.(ܞ��*,�Ʃ�#Ȝ i���s��x�u�.�����ki�1Q`r�	p��-F�b�S0������B�Rǵ1�QM�K,I]Ju�HG�qʹ4$�TE6��5GY[���D�	�J(8�������†���a`x"|�q#�G���vi~���b���/�,�6�!�Bw�B�<年�ݥF�����~8)w{�e1�"Jj\�C�yjJ�75�3\UD�!�/�0-ä�	��G��h3�0<���!����
����B��k	e���xk!L"�%�	�Dr��ĩ	[��b�Ig(��ÑY{J��#���!Z]*�押W�0tn��t����C��*ua�F,|*`R�8M�Ț�%J�0*l.��	�KF͎�i�pq~��a�<�+�M-�Ё�J���G-�ϑ���ר�%h���.�&!&�DX��2�4�o^�^�@VϪ�`�Ճ���B����/�/^W�R%w�;���Y�]��,D��� ����FUEZ#"�Lj^�QP�N�Z��܄2ü"��4#�'c��l���pa:�'��|
z�g)�/��f?
]:x�ۗ���6�;t���mS�"7͑C�)!��'��'��
7����@�����x�!�Ol�tɉ]�:�ֱ%�;#;�7DA�F�2ɟ�|��q�l�a���<���F��tU=�B
�]�V��8k��?kw�3���a��A���0�9G�u�3l�d�\��-r��]l�F�P�.X��%x?�����r8+/���\�I2] ��t��g�l$H]5���I�/�]�ڇ�U�C
Z��b��q����V6�=;���-%ߛ��ˮ5�t����A7Ci��g�
s��0e�-��"��eeb�f��Ti�򓅺H\G	%���|����8����h&av����_��W�S�L;W纔K.�՛�],5�A@kb2~�ۥ"�8�9��'�dk�s�����`��`~�(D۪>�7�?�E%)87�WQ�!n�D�Džfy0�e:�c�������E�U��h$a��$U�b���y*�YB���E•�W�6D���0�B���\��HM���g�������ji�d�t/u���T���u-"�nH�3�9�ܢ��[e?�5����X��~n�95hS���Ȃ#����9~_�"�<+���jȩ	狝��E�oCo0wSi���Ua�m�%�&3��t�k� /G�l#4UZNh�n��)���m����ڨ6��H�
2��f&`�a�*_w�p�y�<�&��w��3�]Ѱ,ȴ��8��i�BXE��
~oW8�J�/Kn*Ǡ�`��D�+[�c{��;6�6� �� �
�;�*S�#Ja�Sj4*iT��6c��pV�kcD&��sP��'�I��Q!�F
��:D�s��RNJ�F���$)kF��������p�ya&����9���ز�nѳ�&�YHM�1�D�G�܏��)𮆲	�}I�S��zc0�a`!Z�H�oB]��.j:�e�*�������8v�;N�\mkHd�ᚍ��8��(�N,�_?�H�&a���&Rf���&"e��\�`��V�'p��h�[��6�����ӔkDf���@���,L�tZS��5BZL�폗]�s#S�Ȼ,t��~��/A��
͆a_*F��	����;�R��҆��
����t��koCO�j����U|�YK:��kq�9�?�S�3+�=�8(�����X��[������궥��U��kioN��R#d�	¹J���Ս�2�ss:E���Z�h��\�,iz��{�2�Л�[���!1�i��<u�zRӇpہ�Ȋ+�N+��`a�5�c�����iB3�ש^��4ʦ%���		��r�,��6�nG�h�T�*������u2�y��^��P�(�4C)w�q�K�j"S/����OJ�mNŹ�~��C�5
�J%���C_����>|r4:9"��y�F�_R{	O��ԅ�7��9о1�W/,ƅ�©��m�
/+�����]{]U��w��x(k�R�+�M�T�b�/&�.>��l��˿�d�}����7�K����h������o#oz�ׯ?��ϟ:�����k��y�y�MӔ�#���	c�T>�y�E�����7��o$G��?8���wi��/��'^��<�ز��4�b��`��<w���Q?�]��/����@�l�_��(����5�Cѱ�QI�eܵ�����F��x�vsxn�_��#����ڛOo
��_�z���FZq	B�s}��y��¿(|����'�)|���o�V��B9^3C\>��	.[��~�'L��?���:C�'\H�4�M2EaXQh,f��e��!x�Y"�k��3��I6E�j����v�9�	>E4+<�0/0������1{
�ǰŷm��4��,�yv�Z3�j�h���W���p+�� �l�FD���ߢm��`ٯ�ՎY�_.ʇ�&�E�If���-�t
˱��OR�WRR�e�顨jņhVl/��X�\g�Jf�
!���K�!X��mI�N��9�/��擲f��V�ר���8�l٠^)���[���SY��>�Ѳ-��uY�X1��gF=JZ��\����������-	��>�{b�ܺ#�gP�n�<��r=0�*�"�iF�XcnW��p8N_o�l~�i�Z~��z\�hCڏXBˑ͙nI�v��$�5�dS��""�K����1�ݖI��<��g?�*�p��,<�8!ŪB7�iJB3��6�F�t�
�:>Cj��(����<Vd(k�!'�Ҏ�v�dՈ`�4�c�"S6�S):a9�0���ݺk��������4���+��b����
n���m
�m$dR\kH��VI�
�5����\���_z�Z6��%p;V�5%����f����Ð����S�6wV��q��x����6�i�D���Rd�Ǘ)y�	ZR�4��Ikwu�0��t�
HJ6�D���&Q[I�	���˹�F��z'��AyLų��ߐ	V�]8^��p�pC�B�
_-|�X�i�.�n���#��%���7��!t�R��KTI�ib��frU�&=�6cэ xFAM�|�X�&G��#Z����+r�2�l���y����p�A$�M'������m����*>p�b�]�L*~���襁���TF3]WQ5�n��G�&�/ժ�`S�6�w��+��4���Ѝ��Y�$�źݮ�S�{%:ԏ*��uc�†�ѣ�I�I���q:�LkL�q���DF�b7u�Fo'q_��	3�Ku�� P@�֡����[j�U���!-�̒��"�.A�G��R�+��l�����|P��2ǫ�V+̓�*��v)1��;<z4�fj;zQj�JAJ���3a�=BL�6ћ��Y�m�/��b��V'&���)��[+7�U�sq1��ͰR�:nt����E��.r�r�WbZ$l
��
!�jg��\:�(��g�e�N�`�����i�F�^�h�!DPyPӆpL[�_F�]��`��2��.��$mka붎A�]�����,~p}���0��WB@�]���6���|y"���PaЩIU8�S�U�iHq��:��3�u�
M�|g��-�`�d5�GnT��&7��.��ʊ�oX�V���3�	Yj2��U�G�'�E�k�pvp�Մt�U�|N���㣓Ou�<_H�Ƕ��>R�R�"N�h��C��Tӭ����Ŏ�OTr�
cQN!�+E��Ķ js�JLd��RÔCm�5]
$͂�K��`�?z�����`�*�!�,)�C� Pz��3߄}�U?3S\P���^�8��O:E����:�v��\:����*��C�J�S�tڕ���m����cyӡ���ë�n>tSi������*����߶����n$g�Xl�4o�8Hw�9��H}��q�A�Zm���x�/Z�Ϧ��>�ș��K1Z��������ȵ���}��çO?����0O|�v�0���ws��q*NJ�_�Pdӄx٤ߟ���Ͽ�%g~x��?t{�^=�%|7�:}�u����u���Y8W�f��M~�P�
O-�Ss7�����$��s���&�JG����������ƽ�J��^�HB��b�뇃�桨I�X>y��
�]���j��m�)�}�ЄS�$�m8�o��+��x�ٿ����B#`�p-��
��ɦ���9{K�L�j+�V�/\��_�x1/X������m�_�-����e�'?T;W׽Hw��-��Hw���o��m�x�u����'�H~�^�#Ow፻.�����7P�t�'�!���W�`�p�j��3i�J��0RW���IIWQ�O�i��O���0$�S����Kɯ�t�_
���MS�l1�L)���-=D��cMǥ�"xY���a�������o�j�rT������i>ȋ��E�b�|1/��
]����u_�aqZ���>�-��b;k��Ft��\����V!VT��Q.�	�W�hYMjN��Y��G���ug��J2U)��|��a֥��ʱ�ry�Xňm�Ed�k���\�1�J*���Xu�LV�Ms�,˺��G�V��ȼ�i����֙0]
�O&WV��n[�.��J�^iJnעz���|�����Zo}G=����z�W���Ss��-��}��ukE�Vt0�pj�d	B�hN�
�H�p���p �cw��PO}[���l
��m'�|	���[��h`���I)飼�-�̳	3��y`�m��ѰŻ5�,$��c��\?cȈ�,�����E!��j��wkI�eKV �ق�&�����t�"�8)A��ޠ�E7v�R (�-�o|���凟4ޗ��|?�~��
~��z���3�Ms��^������/�����2ZN��U
։��`2Srg�Ă��"&�8g/����ޡ�!�f8����3��g�o���8�N�e����G�-2��H���L����6�a^��菇x�qG4��8�ߖ?�$�]�3�����g�Oh�Du]`�"�E]г�4����?�0>��3G�^��xT�zk�c|�#e��[��
x!���|��KZ���5"��
��`��q���7tLh�4����1���;&�v>�xH�ɷu}�o}���G�"o,x`%:�� �T4�̱�<���j5���������n���&o��{_W﯆ս����?q����1|y�Q�1T�,h�,��I�À�q8�vI�t�2$H�D ���z��{�~�M/�;v�atf��Gg�=�"��g����'�����x��ހ|lo8��ޗ3���}�~cL�t�8��޿#ۿt�$c���}<s
'
��.�W��t�Pa�N3��!ؠ.�#"KF!|�����.E*%�!-��F${ޭҁ�e�\�K3�E `�`ADCD�Û(�L̘�p�Wm,��N�Z�VƷ���Z�ǟ��q�<��E/�",���е�5>��kaW��ȥ�QU.P�b�ʌ<DZ�8�r2B��t�5^���"k�/�K���TJ?���❖Qlm&u	ÓI�ѡ�qM��2�V,R���Z֥��6FO�զ�>��	!�5�SnlI	����	[�2p:}�yh>���G.��>6�~��s*9�cP%��B� �%7^��e}S�vȫ��{�f��?<|����[�\�lu}�t����p����zJ�+�����ȇ���ъ�4��0l�Fy�[_[��L`��:���Ql�N�g��oa\�Sxgេi���/�y��ߠ}z��JUu�3���H@MJه�pc��0��)�H�s)S\��I�2�Re`9.Ɋ���˰
Dy��}�	>��W� �te��F�D}�M�2�yc����QGSm��qdC�YC�<�b|��ԇZWZz�KՑ�BH�7\�i��O���^�bL'S�e��E{�׻D"r��t��b��D��U����Ud?')l�E�YCL�9�s��på� �{g� �6�tjB	h�T�X-2�/#d4���>�SD�f����2�~(�9�SD�g�GM�YC�3�;8\)�P�t�0ˬ@M8����'I�-Q%!��9��0C*ۍ,\�i6F5��D4fw2��wQ�
�R�C�rh�<�T��H,w�b}�0�ʨ|*�b��!��59
Q����ۏ!��'u�`p4+�U^�7�<�@8�N��s $��r�zM�@Bf���:�����xI�;����|�����1��6]n{	�,�mŹ̵�oY�!&3m"=�'�?�Ԗ�W�=`F �Y��qY��4�e���b��DD�2qY�…[Ν�6�q�B'�Q�Q�9����ݐ[¡:%Q� ܠ
,�v��k
z� 7�97�@���>ŀ��X�e���Z.+�Ũ�pi'O�a;n���b�[���\����DX�Z1hM"$~��K��Q=ф�pl4l�?��ؾ�	3N-WV(7W�[�^4.�K	�}��T���ɰW�I�(�����0wì)B�uM�ߦ�0�>O9�O���^q�Ӿ��*��k玅�0�s�ّeW���k���kSԩ4ZA	5� Z���4�W�,��s��{�[۷�1����i�'E#���jx��#�R�R�`H�B���&.�P87J,ax�I|��&o�Qi�&�l�0ݶL_��@7
!��ĥx"xв�%�![�E�X�S0'���a��r�pL�'H�E,1�͢�5ؤ�9�Z�!`�Ap�R��)�I}��n��6Q Yw�@D�l��I	z���p9�JSf�fP���Գ��7-1e&*;�i�q��R9
�p�N�^���N��i���-�>�q!���|�\a���.y�p'����?]Vk���&�zBn�KX�Vu9���k�u�$�#L�8�A���kFϲ=}�ge��ؖ�`��
Ϥ��DF]�6�V5|	�o�H�k�u`=(����HD$``58u�0�`|LT��A`*!�v(��ط�|�`A����Q�b$QTpQ���o��€gGMF �haQö�����P��9���1x����-����P����t0�P
OK0�'��Xhd����=�{�6�Ǡ;L&�F���Y�w��T�<��.��䰑‡$$��
�:n�4�ν�}�0���E�b�S��`*�E�i��L/N�3MQ�iJ��I+r\p���6+�`>�7������VBD\�e��q�c�.嗐:��`���Ѽ.
�|���_.|��$%w��&ߤ�@N��2�Vgl��$��B���jEX�WC	�(~��؀K��-�L�a6�	`r��G�M�*��n���5��d�-���"�/?�c!Q�w4\�Ѧ�@��p]���L騟u���P!�.`�H
_�87NJ끓���&�X9���;�V��}�QzA--M0颊��:�J�+���t}8���>�D�8]$�^$�:�T��v���6>�C$�r[:�m���p0U;�&�cC"�Ov2��8Ǩ�eq}�"�pIF16��>4c������GS�4H��!:xf�d#�ʥ畟��^��@D8��;�!��%\�NE�s����}�߆#3��.=
���n���
$--��m�7O�@�)Q��8':��arK�6H�}�5����D���~���e�Wu�!�f��d����П7�ٴt�"�&��<� �K[�m�A��t��2i���@Dz���Aq:$����tu�/f0���vs�1�H?E`ZvÚ�#g"4s�@��P(���兟��*����j�TT�di��>����8K�X
a���Y�q�}��yT)W�/����%�B(4h.V"L��:[V��CL�c�=ə
�G�腴�1XH_��B��)*Н��ט��d��xQ�e��GGM����~�9��p$Ś��B!����ȬG��K�<���?�uD���_&��d�&�{L;g���%�\��X�9g7P!`�]��<�j託����y5���/g��B�ˉN�ez0�zh��u)F3��*�pŽ�
D �!w�,��*�l��yl�[Z�6��܂�7|Q��붵��V�{I�U�)�U��c��LEИ���q�PE	8��/S�P��:\�P]2ی�Q�\�7����s�:��U��?2�D~�Zl�P��p��N!E�ZR�vbNo
��<�3t��܏A�'�����&!�.>.DQ
�t�U��j�c
E�K��	�)ܗ�}Ӱ�����aȳMD�i��{x��
��~�h:B�?ڤ�)4�O�f�����xoT�����<U����>��!£��%�B��V�$�:��p[���^_�@�
�*�=X֌l�����.�yy?���Jh	�i&GX�A`8��	(��N"9�`VfF\W�`=�
�)�4�Zc�	&I��L�#�2 ����r}� �~R̳�����e�|�֡��(S<�H�z����%q����ăi"'}9�ݧbE���\��A���:8Vr�*���4�C���x�>A5��=�N�Eڅ��?6MUu� m�M�Ñ�l��fi���!R���SlU��O��dq�>GX�W��p�'CO�@����x}��P�k��P�:�w��ٌ�g�
f����ya:�	��m	�'1q�5):��� c��t\��4M��8}2Zh���k9�X���r,C�:a#S�C��j�P���U}mm�o91�@��g-�\��j
�3�*�Bsz���i,y��(�Ц�K)f�����_D�1�)84f���؄�#?�N
ݲ�nz�w��֥��Ѧ�[�kB�����<�z��#�]�����8t���]%��
�{-�҉l�%c��0j�&,D�lNsl��dB��̤l���P^�b<�j�ێs�N�W�L�?L���-��N�E&�b�Ԅ��T(,��H����b�(�QO��p�c��s]S4��K|XM6�~F�׈vK�W2� �. ^H��b�y���皃�7^��A��
���PX}�죂��5g
�\TC����PQ���F˫��b�u����ghw`_~l��c/޲�q\��z=>S�Fh�Q�����S�d,\�Z���L���Y�k��2�B�5����ok��z�ea�}�{��o؀ȡ�g]'3��<��\y0��g�H�2�����>j���b�R�{?>>������}��e;�V�v����2�����%yQ���'��O�l��k����������l�T]{�p�p5�"��3�p�+�ǜFjU��I���vx����}^�,WL&`�0�O
��7�I��EYx�Y��n9�B�ak�#��~��67tpd)6$X��SN�}�:���ERx~�o���'a�qtv(�Ȭ`��)����Ho\�؟����*��3�XZϨN� ��ݑ�/�2��'
����1%�9�!��I�48�H�����J+����T��VIw='3Dl�K��#���G�M%�ϻ_��L�%-%7�C^�/��Wr�'���u7>}Ns�=h���4��jD��s�[F�1�o<��c�W���o
�ԌUkgM"!쫢�q ;`%�Ϛ��L	8mŕ��0��=f_c��̵Ӓc.k�iˍQr���x�-�ˍL+z./TwB�"�-�B��+�TxA�E�w>Z��p7.�mrDɯ# �D�H�z���C������H��S���I.�&d_e�����vI^�4�1�r�9S�4�0WE�4��b��gh\Ւ&j�A�;ð�;
�"�k��)\��h00ycL�CX7ΐ7a�Z��קy5ٴ#�A�`i�h��;(��j��n��
��(h����&�h����S��`����A�SL�'CE��F���ؐb�(8'���+q��x��X�E��
>��`̦�n�Uv���guW�&H��Z��$p�8uw�W��>���y��WI^���O!(m���d��f�xT�ؓ]T�"�G�l�8�<T"�)��CpI��æ�,R�1=��	�J#S�L�g���z| �S\Q,!�\ǔ�OD�k�@�]�D��"��N���d
o0�����=j��I.(���k��/�2M+!��K/�	��[^���9��Kh�Ї/����jTU�mbL�K���:x�k�I��	���N�d1�����oQ�!�V��X6���E��#�9����N�<�!�Y�U��&��b�a���0��b_�]��C��L��k��.������WB�!��ј�@�*U�0XJm�/ ������J����!3����*�p�`FGOL�J�w��>��?�"�f��!��i)Ƣ��6�2K��#��C눞���:rk藠��Xܑ�Z�>�N^�;v$�`��`҇�+��CZ@Y���]�k�͇vP���j�$1�j���ڜ��`��u`Ř@�B�n;i�������n8vt��t�aTa}�����y��0%d��cG�Dw��C22��0�⚷�Κ]0|O7�W��<��Yˤ',m�n�ҥUe���c�(�u/M�f;*��/�KkQXkn�8x���A�����:"���Sתuq�͹H����$/TD��D}Np{m��WI�D��6(I�ʤ�։��z�Ѕ,_�����KG�P�K)l%A=�|��%4�K|E�v���H6�3t�3׀8s."0,��`�K��Ѕm�M��ΥW����k�0OXT�4]B�[�Øf����r��SU�pL�!u_Bȣ��InWl�o#Ԡ�����%�J	�:]�>���2 ��n��h�2b�$�r�h���0N���ýg/���9cQ��9���y�.V!eX�/f�]��\rn>n\��0����[�Jcr�����i�u��ۢ�i�U}fΟ=<���g}�yf���n;�:N	:����<C��wI��Y$���P��.��|�˭?���ޕ?����z<#/�0!���]��br�ob�����~��/)u�A�L��Å�
o(�����3�/�Y���T��g��	�;�%I���h��J5ˤ���dC ��_��E�TQ�d(��C.������q�5ƻt���c�
�},��]�$�`*�7�^�����=�s�
�}���9~<�}u�!
�I����y��p�`����3hyS���4��
���Md
C�5�*�P��o�%����@<2Q�y,��%þCWs9������Bu��T�N3���F�>%�>��s
�Lq�1�l�^~�x�Ë�7��D/�~�;����w(��nK�Iq��	�h�M����9w-έ��WtE����^�7Κ6�_y�-C���8�@���9�C0N�U�G<ϊ�US�5�F��>�=�DI��	�~S�f	lַVV�r�ku��̻VH����j"]BBp�3��zzdZ*������c�L&�T��O
-/���.,�+��__��^"�8�[/U5-�V�Wnn��1�l�5��&X(]�拁�"�M���I�+η¾M��6��M��)��	|��	��fч7�,Յ���+�?��6v���_�����n��&�D�L>�;��λX>#�`��b�"��-��Q�9
KOS�q�6,C��C�Y��b}�؄�c�]��^���.�v��Y֜U�RR���U�-i�ۮ�U�R�"��MO��k�mK�'��{�B#VEߺq��*���7�l��#��Y�v�!�)x� pLijݺ����ޛd�_��O�2d��Z���&��W���.q��d��jUn�	�� �VV�("$�
V��lTa�:\�z��q��x��e
�
���fK�w`�T�o�]��Y��$��*o�a@X1D�%���Ǿ�Щ�\��?���*ȇ��/����z�=D��:���-��F.�={s�������v��:A�������`��Ս�S!Ͱȝ��ΝlU�!�4��9����=��߆��fdq�6���N~���������<-^�xrxb��7��:ج+�b����~q��h��䀸E~��$�sOw�s��S�����]f�P�W|�C�ESD릮y#pzh�aZb��	k�
��ԡ��Y��,��ƝnN�˨G�� �<�kwH�9f2j��`4�?��}��n��	��NU3��%M�Z�^�ȩ�3"VUEC��~l���p�ʌ�!�A`S7�����M�!V_�G�l:��0��ݬg�L3����I�.�����X��
�,#K1�3�I�y�㭕��e�'x��kZG<i�O����m���ֺջ�y�J�����|�L^�Z׬5W��~���e�_u]m��y��ٝ���]r?H�$��w<�G�H�%�d��,ɒˮlɶb4���J�8i�ԩ�X��:q�ب�m�&i8)��1ڠ)�&
�vS7m
�@��HS
P=�}g)�E�q�[�Β�3�~��>ϯ5��<��S����Fl��/�Șg��#l|X�����}�~��a��{�����W���܍&�-��}��_�w����]=x$�韑�H�1��;�ӒH�WiV���rQ'1�U"�o<x��r�t:�.s�^�]l�R��@"� ��Ln�o�ǔf�,
��^m͈+�r���J�:�!tj�]�C�X�Z$��9�T�RZx�ƜRXЂz���!#��V�US~$�@�6P�ʶ�#y����3�D��<����t|���-�*�N0[L`�����_<��Ԣ����?���鑸���Ϭ�c��ݽ��=��ѯF>C��^�UN��~�ĉӦv��}����+;O��?��VH�::����[+[��%ci
/�0v�|����u]$���A�“��KEP�=C�f2�o-&�i�Mw�$%[��A�J�&g�:t�J�8�k=��G�����gɹ�>r�<
��HJ%��	i�F���E�G�_�5�pM�!��Aag0��IP�v��EC0*�.Iqx�T�ZWI�6�w���g#����B�ʝJ5�Y��u2��T>SO.nJ��'.e�ٖ���4W'��޸tfS��Q�v���=g�u�h�������,w�9ٙNw�^돆�J�?u�p�\v�YRp���iY��?_��"���wj�J�"9ڨ�g�f5��It�
�Y�=��f3�����_'��Jz��ס��a�9=�r���)�Y��?�|AyI����c���^�aƍB�U��>g҅Ig�E�Y��/:&r�R�_d�R�n^�*�Ѱ�����^J_K�xD\#�(�{q�s�"���'�z�\�磻N������r����H
�b��P3�Mtڦڈ��#U�f��;�@U�ߤ����\�ˌA�1-ksw�w]�IY3�
��v؀��7�%5p�ts����o1�ִ�F�t��dcbh����_\i�_���X;�M]_�B��8�U�6U�:��%LkKe���Cf,�Kl��aQ��I�'�a�l�kup��D=��S*3:N��gY�ڝ���i[��^��)��5ٺ�����:Ĵ�:�g���RH+X1�_���5:�]+T~qz�t�j�^_
�;=vl:=6%�U�݌�a+�FЖﱬC�\]�ND����Cʉ���(C����ůg\�	�,W��d�l&{_��[iz��=���4U㖶��TÒ|m߫7���Kޑ4ϼ"�+�������)�{�8�i����3r�u_k�}*-���ݽ&��L��b*w���
�g{���L‘ �Z�2d��*y!(���gq���5p�m�^�vL"8���c��[)4O���d#�V�r��BH#���k-�����
l��7�yJ6/w�e�۷�����$�ˍ�
-�VD��
�z�1���;X
qPE�:�r�;\�8�!c'��r��;�Gݗ�s�ԩט�N�D���?�;�1؋��b����/t�c�I>%��D1��r���9������Pj�J�B���(�'�����z��<�����^�&��I����j���jݷ
�yy=�y".�0�l0�{oղN�T:n>R��ê�����&إ�!�
2,�h��l�N7�_�n
ϒr���?;ܚB��O*�NET� ��}��7�e�C�ǔo)��2ؼ
�w�ryy/��`+M_t�W�tpbQT���\�,��v��yS�!�\k��_�`��M2M����)�z�<e�pH�X�8�0m��%�#dR ���&_����͗].����+'��k���=e7y�echl1a��Pb�zm�H3�x��(�ܙtQo��>��S�1�
��@^���)�Y��/�N�\ސ+;�f6�Y�C^D��&u�Z��&�j��v4�i�i� <~�M-
�|�aE�1<�B3��j�,�̘�1)'��4a�zq��,j�B\���I��x_��FmV�����Th�8k���p~���6��A�Dx��@�b�ZTG���T*�v1KK�i?�Ԣ�N��|�G=SEn%fQ
Bs�;�N��2&��si�x�C�mjE��ek����&\N3"a=��M�a�3���h�%�b��WO�&��qU3�
�2��X"2��oX�idTkm�ժ�v�jDӎ�"���9��X �61�j �
9�,�^NJ��"��P�A�Z&\��8�m5�$���]H��4� u���f�Z�=��I}rL�Z,0<JU�!*��3���r+�U8���$���m7vs�7��Y��iق���p0<g�hoD�P0���@B��hpB4K�-�n[�;/ka�m{�}�����b�~*q��;�a�4mB����$�7b�Dš�o�#KS�sV{�Q�z/�k�o��y��ާ��������<9�, ��SsR	Žd������:��|{1�b��_-���ʓ���6��Hf.E^p�y�^3~2y��Q���]�08Z������D�3���D�J����`�(�m�J��hζg��P��<��q��s�}~}����Ẹ��&�4 ���T�&�Ik
�טn��4ۆ�n���h�:���aRp�w�,�)J�3�x҇�z�²�nA?���ᑸ'+m7i%Tߺ{z���h�4S��d�'兣N�(8�Z� ���
b[Vs d��_��&KH�d�䶗��H�]��OH9:��
�4����2�
�9�"hQ�T��q��q��?�鄅n�'�_Cu�C]���o^��Us�`2���o I5)|c�2ɿׇ���-��iӓ�9�X�[�W�*Jq�[\����As1i��~�p��I�6~�\��G����nw��o�}�����$i�․��<��s_�1���=|���6y��(t��s��[߾cU���:��)j�0p�V�V�ua�0��0"c�[wMv?3wo}���{��^��y���"*U]<|���YiF���t��)5��䗔K`wS�OM&�b/)`g(S�s��d�n�4�T9.��7��z�%9\F��G؁�)��.E=M#�Z�K\
h���t;#�@���-f[u�,��e�t�kV��c%�1��_JTu��O�Ȩ�*�+�,_�(R�;�ax��0���՜�9�)*'�Gf���	�u�B�{�B��m�0�&	9G�غ:0�aT"508�����U����h��G�~A3��P%��G����ԤX`��V�������V\��ҼA�`�i��px�[����/�:���UN������	�9���I��D��,<Nq�>ű\� :8g�k��@��<)��D���鸃R�W���!�+'��t ^;3H�S�X1FZ'���8\��8W��բk
Sn��_��֯M����G��d<�!B�=d�mđH֣�\G�{�#�s0�z��AEA�U�s(-.?�W�;?2��9��Jڏ]]���E�%k!$b`�#�0�bjl
��w5��Un
�Γ��Ì�m�a�o�"��b��;�u�h�����Id�n7ڕq�٤�k�t�v��m� �7zm���<��d�r�E��7��Iً�ȴm3t �ԃ7tM�G+�Z=�ײ�sƺ�i���)�\JX ҰP�7�Y*�a�
5����(��Z�~�
g����mu�fs偧�����Kءv���^���H��h%���")�8�D�뵘?�V:�}�s�������f/���)M�~@�ud�yV'��uIyn�k���ºjU��U�0�-߭7������Yq$!���gU���]U��_�ەsR�Zj�I�-����y��]�ԕ8�,A�ԗӓ��6��R�#^��i�(��Bh�|���,�f�.�g���ԯ���]`�Z;�<�* �K5�Q!��)s�X�tj�f%�c%��E���Ņ&�<�PK�쵂C���q�C��m0/�!�V-���aD�=ǂIQ
�p\1x7�� ���#�b;�:6`X��=o�f�p�cX&I�.�D�\�١
_8Κe���
��f�h`Ǎʚ?6x׈�tM0�T+F�l�TcA�Z�R�N 4b�����x�c`d``���}�3���+7��X|J���6�V�@.X�sx�c`d``<�S�w@��(��x��T;�A��;���]����?�d'�2��L0�4:
d��x�D|�">"�Cg���pCM�Q8o�گ��{zN��ꪮ��5F�D)=�GN�ZH�U�����TK�P=m�c�>�L�G>~�Fj����t�(��
�uP���H
(�,ۮFt7aۣ�K#�+���C�<�ĝ)}.�q��$y��,k�V���ѷ�B�e�px�3�����t�`^f;+��jj_8�8��7�٠���A.:镯�LzT��1�J�e��_}�A��?��C�;��i�3D�5���SGZ��U~�D��j[��j:B�:��c�.ɟ�<$�'���]�>��,�R'�ss���];��_����{7g�y&�q�)�;�=�1���T�Gl3�������;��\�9�R�伨�Q;KP���ڹ���Y@�N�YZ�0'�����g�g�I�>��n��ǝ��e�s�[���y���D~�W�g��+P�;�%+5!�
���G�=�{Ř2�8'�p�W����L�����;�\B�>�7���%�+��@o޶w"��*6�\�r������?��8�v�.f�d��n���=E/Hn}��_�n����"o'u�AO/�|���R�]��{М�gO�}��o>$�.�g�뿉�a����b�
�o���BKZ���� �N�H��@`�J������H���	vN�"~��
d
�2��*�"P~�(�D��0H�`�|�Npl���B�6\��j���.�!>!�$$�%�&&�&�'�'�))6)|)�*R+p+�,&,~,�--V-v00Z0�1d1�22B2z323�44B4�5L5�6�77|7�8�9$989v9�9�:z:�:�;;�<<@<�==X=z=�=�>P>�?*?�@@�A$A�BRB�C(CzD�D�E>E�FBGG6GPHXH�IFI�J~J�J�L(L�MMzN\N�N�O^P�P�QnRNR�R�SDTZT�U6U�VV�WWnW�W�X*X�Y�Y�Z\f\�]T]�^^B^d^�_4_�_�aaLana�a�b4dd\eeDe�ff4f`f�i�j�kk�ll^l�m2o�pxp�q(q�r*r^r�s�s�tt�t�ufu�u�u�vv�w<wrw�x�yfy�zzlz�|@|�|�}j}�~(~�~�v�������ЁR����j����̄��2�R�����2�����抐���V�،�����b���P�֑Z����ܕf�������>�~�������@�p���<�؝��P�����d� �Z�ܡ��$�f�ȣ4������b������L���������������B�n������j��\�(�l�*���ʻ�B����x�코�Ⱦ(�T���п����z�:���Vʮ�0���jό�R�nҐ���0���2Ԭ���lֆּ�$ט��<�\ۊ���ܺ�2���6�x�c`d``\��à�L@��`>�^x����jQ��;�6���R�8"�D̄Ɖ��kč��i:M�dr����>B��W�]�.ħ�Ɠ��j��($�d�{Ι���H�������
|v��WaOTA8��
��)��mgWxϝO�<p]�
��W�%��Xx��p�k�����=fu�[�o'��B�����,좃o�9�!����Rx��^�{�p��Cx�܇�%�›܉p�k�o��+�	.�"B������6��)Bd����C�\�Q`�ګQG�
�O�Lǜ��%B���r���#��1��c)��G#j�A��ft�'�.�������b�+<��nޣ^oym��Lw/x�=���y|�	wk�����VV��G�[5�<��SuA�<L�H��Vj��,vo-����B:���7����ƛ�;���1�ͬ�Ğ��F�����V�E�Y�5k��� �ix��Q�3C�Nf�����AF��02\=;Ć�2�2
���gw��g�c.7&ɂF㌝u�μ���e�o��e��N��f��
�x�uW�丵����.����v��d��l���A�U��l�#�U�33�I>3c�3C>333���U��d&}�ؒ�֓�����>��S�O]�>�/���zԧҐF4�	MiF{�Ot���Y:G���t݈�Ӎ�&tS�٩�ѕtݜnA��[ѭ�6t[�ݞ�@w�;ѝ)���]�j�]C��ut=ݝ�A7�=�^to�ݗ�G����A�`z=�F�G�#�Q�hz=�G��'��I�dz
=��FO�g�3�Y�lz=��Gϧ���JIҜ2�I�!-���*�T�2d�QCKZњZ:�ҋ���z)��^N��Wҫ���z-��^Oo�7қ���z+���N�wһ���z/���O�҇���U����(}�����������������������������������������~�~�~�~�>N��Oҧ����,��(��8��$��4��,��<��"��2}�~�~�~�~�~�~�~�~�~�~�~�~�����������������������������������������������������������������>��=��y�#�<�=��>�g�,���r��o���|�)ߌ���|�%ߊoͷ����|�#߉��߅��W�����U|_�w�{�
|O�ߛ�����@~?������H~?�Ï����	�D~?���O����L~?��������,8�S�<�sV|�.��5�|�
[v��W�斏���"~1��_�/��+���*~5��_˯������&~3����o��;���.~7����������!��[)礉�F�?���^l��BU��j�)�7�v8ܾ5�=l~ժ°��ี}�L�uVȨ.����&�P����h�pA)�IZ
rW�k���.	[ݸ&��������V�]�z�g�H�^J3/�j�*dF���P���DZ�b��&YH���3��vS�T��
E�IU:���05*��B좭�x��y>pF�"�S�hy����u`d��Q-2�9��.N��\T��.U)�6��m��&��>�ZVފ\�`�1L����6�]�m�z�Ժ�e�BNN�R�N�nl?UY6��L�Z�8���;��9OMS�"8Ժ,DK,3�{��B�崻�2fk�Լ�r�D�qc��*M
ݤ�%�&:������U�"�FƲdY+#��o��9ɑ
,��+;s�+u)�4p�c[�Tڼ;�2��,��-� �E!]�$�RY1ýX�I�I'��&+�	Q����e�Aj������۲��\[7�YʺqܴM�ڽDW�L�!]Sa��ε��HRTu��Nm������b1����6nT��p<�bY��U.�u"ىVUP�|�r�F�.cU	��L�%U��ow�=��\�x����"��x��C%�����#��9�FY���O�H�M#�����Z�s_�ۦi�I�X�Z��0샋hX1FInt)�9 0��Vi��n���Zm�	�N'����ׁ(ő/���(�T�r�≜��9�Ux�N�U"
%��L39��N�S~]I�%�Ok��&qQ�TnX�u��&(��v���
�Wu,3�37�Ƽ�
d�TF2�Ұ�FY�K��mn;����Ano׈2�����6�_��	$�*����\�RY�	r��d���P���6bon�?`�*e=t���%�1HϏ��[���m_�i�'�=`����
��������5����Y�E���H)�3D��z��Ş��U����VBQd]����L�C��Gq"��)m�I3�-K	�.BѤ>f(</�uO�,ؿ��!�3�����ގ;�Ҙ6��eҌ��(>�U��|�'Ǟ�@#Hฃ�MD�k��i��[/I���Ы���8i�+�\�<L#d<JA��`��,�-��Z9QD:Y�S<���:�V��r�1w�l��߉�;A�
�e,��(���@N�Ǻ??s�,qR�f�κ���u�����
=�b��}a�BVP,<$G@c�SK��e�-F���	���j��̠�YS�gN���@�.7�A��\�ݡ0!��u(P���N6���N���Z�	5����p7U��-l�ds`�p!�'��",D���W�~��]XB�+�C�.g����ƍJ�����:j*�H��!J��q�+1:���.{��aR5��S�R끷�ANJ�L�Z�]@űO�Թ��J<ɟ�s
����(]	반�,b�~��nl.Ӡn]�@��Ϸ�(o0�t&�V��ll:������1��ZO,������V��B5{/Z�Er=��K�C�`�X�z�ڍ�ۙ���u����l
�*T#��pJ]ȽyH �N3h n�L-B�!����ڦ�D,���
��?�	CoY-�wj��/��L�ϊ:����yZԢ\��ܢ�u��~m�L�W�uz�ݯ�����=m<�H�T4N#�\���[�`��C�/�oaONN$��9�%�9/D�5��l],E�q&��-�����F��f�����S�l�`�
b����C��m��69#�d�h��~�j۫�zt�A�$���S���b'�#�{��=C��U���ds���3������t�F�$/�Š�,PW~�_:��8FgI/�h��ߗ�hC0N,�z'�S_���,˦�2����LWK�'�~öM��H���Մ}�L������1�ԴyqR�!��"=~�`G"���u���@A�tpv��9��*����`l�kSŪ(F�PE���@���!A��7U�����^!+�
�,f�����D��˸h{+��Ϩ��BdP$�,�AV�+	�?�U���K�D��Z��y����Q��\b!�B:K<�B�#��/[ɍb��*�����ۢ�T�À�N���j#�2qn��P6���M�뚸��3����%|B-"�WCA�T<�L�E��&�M	Xs�)�	m�P�9�%>wzi^��CX�v��b�6�DV��p�H>��������ˠF�W#j4���3��Iٷ
lD�I�^S�~cqi������assets/webfonts/fa-regular-400.woff000064400000040654151336065400013122 0ustar00wOFFA�
�,IyXFFTM0�qqGDEFL*�OS/2lO`A��cmap���Ǡ��gasp���glyf�5Fn�lhead8�36��hhea9$5�hmtx9<�T_tloca9�66�Eˈmaxp;, ��name;LU.05�post=`I��OA�x�c```d�	�9`�c�U(}G.��x�c`a|�8�����ч1����Je�dha``b`ef�FHsMah������0�4ՀZ1.R
����x����K�q��>n
ϳ3c��)<HP]:u0�
��ݶ�C�0*��Ƞ�����,a�.i�A!T*�^$,(|��pf��I��Ak��f�/��scL���
�q�)4��Ng���䚕���x	��B^�비�(W�q>ɵ\�|��q7s+?�>��_����\
d���F�*�d���R/W�M�奼�Q��i�QW�h�F���И^��X��S��}���E~ԏ���d[r�6f/��6n�m��}�1β��XOͳ���y֥XKe�D吜��ڝe�Xw�cZ3k�e�ց�u_��ƞ�7l�}��JiJ������Kt���5�M�N
t��Q-Ũ��S�:ZC���S>�����8�#8���؀�1�UX��w���0��L��[x�>$�nA#��#��E"�H��ܻ�z��7�N�S��r�~��P�ɀCN0�샿���~3S��x��}	�$Gu`FyUVeUVfuuuu��wW��3}Lϩ��jiZ��nI�F	!�VԆA�A�����l�V��Y�1�l��ˀ�~<֞����X�,T�Ȭ����a��33"##����_�#��?�;����\��P� ™i4�ꍺ�,"�^-��8�����@_����M�~oЎ������%�%��ıdn� ���k�&���O[�)ccʥ�k21<���X�5��E��8�n��Ϡ/p1.��D����]�]�X�����a�1M�I��C�n�5 ��w��L	w���neD�MN�wq񽧜�B_0N?q�}��X��F��φ�g?z���wX��w�޽q�\�;ƕ9._������LaU땲]�;�j!���=�z�P��m���ܭ���c	��n%�5�j��JVؑL����?���ʝ˳�˳�5�V"a��B��x�
U��+�ɇfiN���+����0Dž�5^����IE
�*}`�>���������_+�)}�B�}�qz�����[�E�����DԸ
��d��ϡux� W�*�.�
���}َ�.�5�Ge8A	*+��5�2.�-�1����9��(��UzDOcܼct�����Y4�u���<�<��
<��1��1}�wT������`��/r#�,�F���I���B�Zw�ȱ�����Z�R���'v��텽���]
	%���q�/��O?�.yGr�d�0=�3	59n����E!�I#M 3A&���r*��^,�րU�B��E�H������ŋ�
7���!�l�Μ�$m���5޳By�v��ؘf���Dz52N�QF�/�o�vd'��#�<�,�Dk��k���_�0U(L�8��(��-s���wÜN�̚�0�\�wJ�)�#3]�6�Ɏ`�#�"� jD���:z"%�m&K�����7r���UD�Rxܼo�d������ar:%���ר�Ds�^�͟�|º�0�͙��v����3��7Ͽ<aӎ
�i�D�.��S�������'���=9���+�!�R&�<�C\�Z�8.�d^Q�S���{��x�Օ��ۊr{��d���Yn�,��cH'
�E��(0�h�4i���]$��	�HS�ê.ˊ0�L]!JB���®����L7q�㤌��%B$E�BK𸤇��)$J�z���F'�K��&p�4�~
p��z�Z�K�W�f�`ܪ�Eh@���`��Qjz��v��I� ����n�����S?���|����cW݀J�p�T(HҎ�nY�|��;�/G��=rd���,'ml��%�_`�*����#���V);���dR��!E(�(p1\�B�ᰛw.I�bQe,��Y�I�>�����Oת.��p!�?|��ᩱv�#Eux����]����y����f���G������N�!���8�Q|t�i���fZZ�jtTC��]�-��m>�5�jn��ֹlf$Y�|~D�G�U}��E��"%(��_�J���T���-t�;��Qߵ��NGUu�J��'�X�1�o�?O�F��7o`��5`��PK�����Z��䷞|���W�t�:���>�܃#�*��A�)�u(SCo�óN�ߛ��|�ʘ���� �+�[�?��r�_���Q��{.k���J����ZJXm��4�/_��%oN�~�`�uDY�ݱS���GaփG�l5҄%�ec�y����Tk.�2Q���#�[n��ȥ�ؚ��^�����極5N��a�}�
�۵��<�<�.g+=eg@6z��I�,������W�C�w��0}�Ю_���gv�R��w(��Zf�_,��z���d?�I��sG�$���*ł�1u�0L($Q��;T����!�D+A��܅�����4�-ѐ�w�'�K�cAcnOPW��ă'��zm��}�-�%��E$�f��5�kb��E1�h��(��/��o칹>�\7ߘ�����R�cz(���d~d��TƢf@%�5�6=J1���>K��V<J�Mw����z,u!z6��� �7~��9^D���]
='Hq�L��TX�6�)N�7
�h�
���"��W��ƠOMAt$��1- ���Ύ�e�����N�f�>`_J�H�Rpl�R����:�*��
�`~�א�g�궜��ݷX�D�ڦ�ׅ�U
a!��|�bBI1I'2�h��:��|@n�G`*1;}	x%�Q��p-X`	�Y�d�̾�Y^@�Ui��q�w͇v�~�NJ��/�������H�ݣ:Z�6)W�cc���S>Aȹ�y�6
�m��s�0�~�iZD��-�.Fj�h�3Z��P\p��aGE����E�}]�&�D�G��[z�W(H��M�ue��*'��{ޏ�*O���k��\���q��
CO��8�
^��:�/ڒ8�H�&U8���M�в���W]��Nf&�$��Eզ��㪠��A����㡱2ˆF�N�jHҬԠ96�.��"H��a���33�t534R�M��tS�E����s����aDɄ�5�尝/�Vx������ځ�ډ�Op7s\�"�J*a�{Q��-�
�5#G��(�б����v�F���)>��ZvH‹��9�9���Bq=,*fT��M�\����T
Y"�s��RԸ�VVtu!;l
�,M
����I@��i���gf4=7�����0�Pc(��3#��Y(�Ĝ��ͬ5A$5�#���k�T��0�����Q��N./4�(�EF$�Qu�{�E-j��E-��?�����]�[�%do�H܌��G��5`�����@���8(���>,d��pׅ�w�����#U&��
e�����\_6[	.b����(�A3`	:$Jd�e�����R#f���r��rc� u��@4���Ӛ8��u���8�/�3~�n�|���ol� $��2Y7��]�Ԫ����y#a-{F�����0ī05O��]�/��|�ð�?Q�d��0��x�ͯ�U�C=I����Ȓ'��u�U��gV�v������F+�O�Pi����m�+c�zb[���kkb���^P�1�9X��^�\y����w#��|#�珞R
C��V^����K��'\X��m�eL�c���,H����x��k�h䭷g)�+�Wʋ|
�t
�Q�L	 ��B���쩄N�c$Ne��h={�0���1��v�-J���ȡz�AG��B��l5HHH��F�3�V����ـ�"�5��(�B�œ8���1��;���¨E�G4;���%/��Yb�rT�b��'�aR�#�C����x�/IK�x-:mq���l���㒘'$/��N_���9�,��J�CW�K��??���\�:
?�;��<�������S0
D h�;
�
�$�
;)
p�0#���X����\S�����i�U�ߙ�� �|?��S�=���	U9(�*���;OhQ:�A�)L�2w
M�وN�y~��#���Cܭ��{�<j�T:�d��K��;�4}�7�m�F�J9��lg
5��W�)�L.h��@�k����t�s�Y��L-����Q
���<wn�Yb5K/���c잾�3�Vع���t�6E��mDW��F{u}/�%F+b�v���u6�AR�(5�<��s��.q�[���ܚ��2Z�O�)��N���Yr'�
~��B?y�ӂ:��ԅi�m�u�}��9�M�"z�{�a�ݦZ!v�;�EV?�`�;v�q�����c[AO���|���;��~{�c0�(����A�/��U�����e�:`'e\�b3`of�7�c�D�q�&�`��$;�3C@)���0��[��d/l=S�V�
,Ƅ�akx�n�mL�m�w�
q��n��Ƚ��e�܇���#|\��"ֳյ��/��V�'>�4	���fJ��%��������Լ�њW^ۦ�w�M�~��s�k^�ߣ��zo�]?�E������V,ȓ��0B�c�)�F�t��nEǘ��@�������|�i����5T3NQ���'z�#�O�/(!-�����A䵢P^2b���'�4�s\�'���ww�t��R�7A���ś�A.��G��<�E݇��e��6��|W��VzM!�臝�c
��l~7�3�e���څ����&.z:��oGh�Ccc
-J
�޳��҉����.]�z|�0�9s3�VO�L撵ҕsN�ܹti~�Y$�����4�-������(c�@��I�R��ɹ��v�bv�ϝ�S�́�O�A���s	oQ@AVy6&q��ؖs��iL�Cuq�J�o��|��C7��#i���&���El��4i�{��U(֭�:�rq�lT���J=�
���K2Ʒ���@�C}��D�K��-Xn���0��j}o��}��ֻ/��wSނS��m�}��3
�}�M>�n3�����`�{� �.F���i�^�%B�jS�_B�;Uc�n�']wܚ{���;�Ujg�r\ͳ�<9B<[J�|��"�`ޫM�ҟ����d�X;,R@^d�x�˟�b̷`j����sS�
w#��4N�g��
U��@�*�F�hH#J�/\5%dixS��l��*���	I6r*!$L�6Sc���rlP�Ɋ���؇�H#A;t����!!��Um�B~I���g��t27��,Ո^DH*��;��5�(��Q5f���UY�"D�C�
{H�ږ!�ǽNc�?G�K��s����Qe'5� ��J��Z�m�E��0��t�~�m�j�F9�S*��C���T���x��h��+&�,��ȖB͛���mj�A
e�z)_�g@�3#rȐͨ��],��:N�:�S�v)!Fٲ*ù䝌F�ZX1b�h0�!{
/d�r�
Y��@dG�[G��#l����1/���ig�TY��j�2=�A�Ql�"):�&�4�Bo���!��+F��Ѥh̳�$T�^U�ȑ�
��
a�‰��WO��S������`���}`ԭ������õ��7��/�>nO�>�
���צ�Db6h���d�B�Z)��:ȍr�z�ɻbN�V"�[A���;��'J���-�E���֓��QË�]�:��,��|��\�k�+1��,��WQ����PK�]�+�P�#�o)�~�5^�0�)���3��K������=��Q��~��$g�ֵru6��^ǽ��"[yʾ�_̃�D���]�3�xrK�-���%4�s�W�m}�OS7�y�������

n���]EW���wA��b��J���ék5p#c�u���"��FI��B��TÚ�`�8���T�
`!'H�>P�	��<���HѨ�TE͗�a��L�c��R$�G��� �I�1�I��8���lP���e�ip��pw��p-�bayq�"
D1Y
R��]:	4���D̫�Sy�	B�WT^/K�ʃ%(�w���%����ehܔ����5f
���0T�JϷ��p�sY\� 5	X�ע������U�@�[��Ym
,�!"�)���Q�(�@�Dꂎ̣X�BcpNG�ux��a�_��Q�/˱l��+��j�E�q������5%��� O��^�i��ۚ?���
K<����A����}\�v�XK
mf�&����؟�$#��a;��j��r��	ނK���LMs9n��an�_%�mD�5g���;�c�����pl�R�����
5����Z*��J��7��$�iWJ-?���I���`D	�
e)�R�����­�B-j�~�5��p1vk*�HH#?�S���>ui?
2�r��
-�2�@�EYz14����K�T�DN
��*1ݲ���L�|T^�H����X��XD�jtgT�c��z�-�/7_]�Է��
�n�?�"5]�S��aKP�&��M��y��.�9����\���
�Ēiy�Q(n�:�m�9v�由����DA�A��M��?��<��)B�W�1
O`�i;&�W�1�F�m6j��������c�!��8��c`{
��0L^dP�ˍ".z>t�2
�4v���-�$:�L��G��L���w2;�=CC�h4�V�/V�ef�>v}-�_�m�-[�hn�!/�?�>�z�D��
��X��>��E'"9��E���8/Z��*gƍ�Խ	1�L>�Ws�ջ��E���F:�|�Ѱ05g�	{����]�л^���ѿB�	��Ƌ��q\
8`�z��n�]��Ж��E�kZ(�(��	ȶ��mkP(Y��!u�ⱳ�\���N]�������=_P�X�i<vE�_�sɞ86���AJ��=����:6��/��jů���nUk��U�K�W9�]�+#���~Ni�Yݼ�q��;���'���`�uL���?>�k���D��J����yn�����K��P]j����{�7S�~���Ck���H;(}�����W68�j~O�~�##��dm��!v�gG`ԍ�l|��e�e��I7�T���μH�I���zcQ�9�eJ�������%��+�ꪪ�?���>���V/+!E�R��1'왊�̤�t]E�d��R$%^Q��Xv�?F����V�0��hjOs5?h&�M>@�O��&ά㦂Y�l�:C����
�Μݵp,�42W�0��X.<��%EU��+p�z���ϊ� i��ۙ��AQ{r�+ܡ��s�K�����_������w�%�A��,�f@�M'��%��0�֡�(
/-&���"���(&���TU;��h&�Jxp�z:w�<:k*���c��nf*��J��ӝ ���XM���;i�3kY��"k�b�@�J��Y�����*�1
ԛi��{��ఔj���.�@Q�M��1�b�>}nuV?��68�s�kf�4�ѱ��o�/R���3g.�9�S5��(7�l/H�C@��@��s�̽��Ui�v���P��u�F��ъ�Z�I�P�v�=咢>'��*�+n��{���X^b��ݩ�D�HѿDo��Z
�2�uU�i��x�7W�R3���F�:=����[�M)�i_���Y�-_Z,s��F6�6+lA]4V�Yk�/7�/�F?E#�^ �j��aj�����A>�`��o����rN���i�d�)Y��/z��0��0F�1MJ�l7���fɗ����a'/b�������$r��8�J�]vJ�40��t�<=]���uѻF�>�_=t�!��s�ޜL�y���ׇ�ps�[�\t����0�b������y�P�l�;6�Ʌ;�g�2�����*
��
��G��U��H�g�B��l��2g/ٱ��q��l>a�H�s��y\Bo
M����R�T��������Twd'���q��_�
�,u�B�,$dB���"bQ�
w$�k͸J��)w-p�g|����:4b�e��Ѡ[�\�Q�,=�
tw�A�Ri��CSRR0��5շ�d{(]I�����`8�%:`5V1�%���J�7��1i4yֱߥ��n7BQ��9�����_��8L�}Z�T�������������u�� *:��[M?o|l��X�X��eaH��E4�lx���E�@]̀(-׀`��и���;��p��̈2������7�ٳC���ܖr�J�x��A嶠jKD>�ZD�?�*�S!�}�b�����T=�f��q%���ƴ�Z�)~��K�|	
��iRC�1ZR����9Qӱ:0�(�&�G*��n737[+��`n��@�D37�
&0��p�)�,3f��I~2r�(�u��ܽ�?IO��W(Fߢ?A�oˑ�_El����t䳁��C��������Ӳ�N7?
��@d8���c�RQ�c.�nl��џ��{�i,]ۡf:�چ�EڧfG���qِ%��>U/T��{ZyZSÀ2ļ���q!j�p-:L�)4dNc�ĥA+.�F��R��� �ܠᇾ��a!���JT��cUS�1!��e
c��(��
�و\�{"�VD4.#;#���"R2RI��z�P>���׵G4C���SD�Y]�S]2��	�G��<�_�IY�9�Ƈ��� 	׸Ƕ��i�0ץ�3����T&�כ�S�-�RϽ��γb	�0�:�+��	tGz?(��3�=L6Ŵ�l��D	�+��A��DjI
Q�a�����'c�e�Z8���(\2�?�G�+2y�3�x�	��$���URL�ު�a�i9�V�_��zVH�^EAp�b�^fY����ar�*���8�kv�VC�+��;K��Q��wH�`^e�[���N�?�G�tWtd�Q�k�H#Q��b	+?L"
H+[��T�8����.7$�k���#F�>�h��mf��Y�H�c7S�uR0�<@��F-	�~((ء��l5x���z�
�U�M��myT�v�{���ezk��թ�ƉPJ�(ʲx�~gJ
���,#��Wh<��\[��Ѵ���s�����s��e�����
ѽә�7�}��L?��6���j,x���`{��~hk�pM����>t#������WM�YS��uY1ez��Jk[�|e��^��j�9P�W��]NOwV���K�x#K��6M���/+�X����4;u�s��1o�*@i �a1*w�M�$�tLԨ�D2I��KX�T�)�=�� t���Xk��0�Fh]!͏c]�k���)]�)�l~w
%��4��M��n~��G���x*�n�R��݀�H��.�:�/���.��*�B���kT���X'
�X�7/�7�
�M��u�b;�.e��z�@���d��{�Ȥ��%YFR��Ù�e�P��:��>�݃���9=oF����D�;T��%t`�_Ck�Wƹ�������e1�/E��	>M��U���q-i[w�t��������3u�jYf�{Y��5��VO��R �S��z֌$�3�\�(���R�{�l^m�"zR�w+��!����$�űĭzZ
�%����AX	�e����k��N���Ǘ6�H ���
��L>r�Vr�P��2XBJd�k�){.���N�b �"j."�+�ym[2A���S���E�Ğ��@'���H�СTN��
6o�P�L���;]@܂�*�DCʺ�X��v�l�HW��/��
��"���iӍ1zX8%�WWѠ�cM�ੇ���F�m��F����F�6�q@j!�PdZn��	bӇ��j��#��p���&��uT]Wb�Hh�/�dRwѝ�>IT�&�H"���	�����~9H�`��K�ܝA�7�S	��*&����@�ݳ��,]g�� X�r���8�O+�bB��q1Q((�tɕ���+X�/�m/�C��H,#˙XD��>WN��f��s���-�]��-��ҁ/5S}�X��3ݿ~��6#�$�d�u���wg�q���,��_����)`l�����J�%����l���D��M%�CÓ(���]򹼰�N��Μdk���V���**�K���R����o���թ����c_^��m9g����6/u�l�/�\���)�,hUaҤ��ڏ�or�,�����v�,�lq�B��cҨ8ڱ�S��M�$�.�aq���24;��u7�h>5�8]��!E�Q�[�����>m������,F��ȰD9t�)o�mw\r��Wm�X�f:�}s$�R�"@vx��V�m�!�s}	�Q�_��W��OT����<�V�̊��£j�:V�hN�k����4�nU�m�2�Y����W�vj=�7�>I���i4�}q�*L�/� ȲQT�� ��9P��6��Q@��΃Q^�A�y���}^������tNj!��xL�'=���'M�4"m��M�޲�d$��#�걕9�J���ě�õh��+cW{�g0*�3
�x���l����`���~�iګ�%c\?��Ͳ���}.�
/�ٽ�����f�s�
�q"0����!��(h!W��5�O�!C�<~,�7_l^:���=��k��9����144$� Zn^(�m����@�T�+���Q��G���j�g*�>�Eڙ6it	`_���T��}���c��&;��۷9CSi���K)&�Gs�������f�׺u��h�e��f������>�1�>�K��	�e_u�`�ӟ��
�ճ��:1�Aۼ�������n�;��h��N/[���g���+c�,���������t�����}�,�M4�XB+���Ufݡi��d�����|P|��M~Ef�_���;����ݮE�˺��޷mzW++�o}G���=G/�����q���#?�#~�g/8`�%Y��R�pϸ+�)��])fI�A�b�i�F��ExE�.4�o:�������/V��k_���*��j>PE��4[ѵ���J��߹���h}��ֻ�OE�Ǯq�����+��֌�
���!�٤U�"
Q����Q��Y��^6��,�zzI~��̟S��K�y�0�G�yT��M��|RUA�yC@
��/�d�������v�}Ӂ��o�ct�+n�m�nk����y|�‚�ز'�V��R���%9��~m��E����ڱ�4�q��s�U}!�]���_��7�^���t|��(u����ݱY��v�6��ݗ@�N��b�xWP�kOj��j��(�U��+`5�x�X�������XX�%�I��[�&�S���ioh�>�]�4��FѪS��vw�Sy`?�+�na�,F��"�$%�겢
��XUT�%���ܳ�tp���j�lc�(���U�	�j.ELAVdZoJ
8�4���q������&2��a��n���'�_����9=��a���}~S�{�Nפ���[�=�U�g=��t�-��'ҝ�����Glϭ֗vz���K�g~c���,��a	�k�7�1ky5s#'��vXok��w�7o��<�g<]�w�m�tzQ���ŔO�i��PG�$Pf�3JI�0��Ȃ�2��.�������G�s�n�WrG��?�ӻ�I�2Y,�Ҩ���R���Ε2[x-��^vf�1_)6��X�(w�J�3�w�H�ڮ��w�gsH���2S�<��19�ÍX��/��6�_N���+����Ke��ґ�x}D�u2�γ>��A�����
��
��>���$��g:N�q�
�b�A噃��R�/�,� ~Q�R�,���U��f�9"1�_Ŗ�؛��ތ�T�b���Uju\��E�bůD���NŶ$�c���A��( (�B@�&��|��Ot;]%��M�61ϓ�h�����l_�8`u=����1i��F���Uo^�0i����Ä~"��U��\�Y����S�L�[�^����*���NQ:�w�!�w������{-�H�R���~M۟h���;뀠��Գ���x"?r��:��(�������B�9��}��u�ܴ���V�U�c�� O�U8�|�n��3B�$�
p�cF�-��%#t@�-�)a]�������W}�������B�ü| 6�#��]�{yx��yy�VۯH�m�m_�;l}a{�\���Đ�1^�zP0�5�m�u:(���A�$B�$"�*�=��{����vS�qWq�qw����>ŠQo��o��|��f��<�����;F�;���y���0Ӻb�tPir�c<[��_"H���3���5�h<=_#�t���)�m���v\y�R"xt�Ι��N��T���"����UE��B�ʅ��#�Εa�Ha	�H(3��1�T��h"17��Y��tǕ�Hš+��J�ٛUr=�^���;� uJg���
��Z�
�WG�K�[��׋��g�_oϻ!���a���A�y0ﳒ �1���aQF�[����v�xŝWdc���a	~HcYI�C!^:�
��-I�V��D/���=��s�v��yH��(���a��7��\��"Ow!�?�[4bOo���M���D�6v:ƻ�p��wܝ
k��{K�cZ�����];s��߷��De�WR�i?�x�����^N�ss�`jfn�w��x����tpu���Ln>�-63��H\D3
|6�Tc�G�3t��a&����, ?�H��R���lX��o���x8i&f��fD��?D��̾���٘P$M�	�5MR��Es�ܲ��~�e��&�X�5���o���w���?�_�������4�/�)(*C*P�S��I��(�Y�z5��-/�&7���Qn�4�C�}���o�'��T �]OZS�a!��M�̇A�!]�t��Ɗ�U799�!�N�l���S\w����q�K�n��Iu�Bp��1��]�����ca�H�J8Ǹx�',=���@�t�$m�cjё���.Ӳ3X�I�ږ����g���$�<�f4j�"=b���`X��d͝�!�lðC�c�(`�h<Q��l�D��t�;D����<��-k���� X��U]Pu*h��
�1�AY*����H��W���c6|:�W��I���if���{�A��-���Į�2b[I�u����^��OYP�57^^)��6��x��C��F�^aÆ�'f��*8	�fB���G4~�
��ӏ��L�*��'����ip�M
8Su�8��4\��4��g�`$2�h8-ټr\wB<	)��!�?=5!���'������Lw���Mwga�z�t�vy���(Cf��1�̜��q���i��
�������X%�3�O��=i�n%��s��zȲ:jS|w;�Q	Xϵ(�e�a�Uu��B	�/��8D�ʐ}��0���-oB6ȏ��wq~[�Ŷz�v���w״��9��p��C��#���u�
���܁r%���F7�m��p?�ʕX��l-uI�v���ꊽ�ⴾx%8�^����ފX��ޖ1K~~ll~��q�<(d>�4F+8튋[,?�54-]�mQ�-s�uw�t��Ϸ���Os�[����eكuRs�G����^U�m�>: ��'�'�X�=	�@@�����=���s�Z�;������s�S�
]2�����}^�w�a�+pS�V@�&�[���b#���� ����ݾ/P>�qn 3Г�=%[�d(���,�D�X̌l����l=�
-�j��bOt�~O�c�]�@a�c��V72�/����K���1�������펕��]�2��ȻA�cc��-�-�<�g��l�D�/T?�z��7��I��qI���{%���YQ�z#�_�{��Q��^d�|^Tq�fR��x�c`d``�(���o󕁛�nt,�
�o��'S;�I ��,
�z~x�c`d``<�S�7@��(�&��	x��Q�
�0}Ω�Y�;�Q2St@�
��;��G�ɉ���g�9�C�LK�c�Já�Q�RS>o��y�=f��+/�+��v|�M���P4z�q�ս^2�����m�
��L+_�+�\\?}F��_8��d߳�ݴt�]�J�i��IwR��U��g�Գ����yQ[_�@|��n��*��b���H�*N�b�b�	^	�

:
�
�:�6��

�N��D��>n�8�(f��L�D�L�l�.l�D��f���Z�h�D��h�  h �!
!J!�!�"f"�#N#�$$j$�$�%%P&B&�'
'P'�'�'�(((l(�)$)�)�*N*�+6+~+�,J,�--�..f//�0,0�1 1�22p2�3�3�4:4�4�5 5�66Z6�77bx�c`d``�Ű�������$��3$��x���An�@���i+Z�j�Za1AA�D��JY�AT �rS7��d,{ڨG`�`Śb�8B�-���@P[!Dc������o���9N~7�V(㵰�9|vqK)������³��q�y#��k�w�%\u�	/c�}*����Vx��/�k���*]��/�䬘����E�v���Kh���3x��³x��	���/�s>
/��
/c�}$����Bx����k�|�#E���Ш��*��F��&ƈ�q>�-��q�ou�[�3�zsefȽ����)9�m���!��ߋ�@w�(��Q�pr��d�߼j���q�o-�Z^�r:zH�
&��/^��.G���Dž�]��毲Tc��[��LEi�Q[MTu1]=�䯝�_�y��$��I,/��u�,f8���D��ь�-�5��Br���r�Pw@�e;��Gz�gzh2���:�"��ў��bKu~X-�2��:�}�0���+쇔[�d�z}�}�'}y]3���{���'��3s	9��x�mTgw�6Ԝ$��d��.��ޙ�{�$W$N A�e9�'w��C�M~Y��l?G�	�Y��b�#����Ή����t���衏%,#@��a�c
��Q��c8�3qN�l��sq����b\�Kq.��W�j\�k�:\�p#n�͸��6܎;p'��ݸ��>܏� ��x��1<�'�$����x��9<��"^��x��5��9�7�&���x��=���#A
�rp��JHT؄��A�-̰�9v�!>����3|�/�%�����;|�S8��#~����7��?�'���Ĕ�i�T�֤����4\��	ӛ���ӂ�i�,��܌/HG	W��Q�S2m�x�&m�,[ܥ9��i�t>J��2e�U_NdQPi�&R����#��a�[^Q�T�.ҡ#�LL��
Y�D	Si7Oӵ��iTI^�H�,7�}	A�����T��^"�yO�-Zқ5SP�E’	���"��$D�K]q�İ����K�f���v�([�[PLiKK0�ݷ}��w�V�rQ�mb��>����bZ�۝�i���@��6`߄��
��:��.bm��ȕ���R���z6H�i�q�E�ˬ�V���3�ҁ�h;!1nf匔on3�3jh�$�[��Y�rل[<%ٔLd�>q{(�a�*+۸��&���K�i��#i��n��)������#���D��u�ڂ��phE�L�Q)
9՗�V���C�
e�0hT���G'\k���#�w��6�te׏�Te�5�XB+�;Ѭ.�W��ڃ^݂U���G�Nm��BVm�Y[�LieW��K#���������f�,�{�<�vK3Z機�xi�l�|������V3RQ�K9��ŔB��i8�K��u�^yc�Z�M�_��;�u�;~(�}�P�����J�ys+ץ����h�}V�z�=�i�Y-�)�ٙ/O��d������)���z�Yn��AL�/�Hψ���F�Ml�d���/���փ&c��6�Yf5m��W������zS���

1���M_�:�~�FM��m󾢽���m��"%��6���5��P�=ݶ��\�kU)��o����\$�vdefine.php000064400000010727151336065400006521 0ustar00<?php
//Prevent directly browsing to the file
defined('ABSPATH') || defined('DUPXABSPATH') || exit;


if (function_exists('plugin_dir_url')) 
{		
    define('DUPLICATOR_VERSION',        '1.4.7');
	define('DUPLICATOR_VERSION_BUILD',  '2022-06-27_12:00');
    define('DUPLICATOR_PLUGIN_URL',     plugin_dir_url(__FILE__));
	define('DUPLICATOR_SITE_URL',		get_site_url());
	
    /* Paths should ALWAYS read "/"
      uni: /home/path/file.txt
      win:  D:/home/path/file.txt
      SSDIR = SnapShot Directory */
	if (!defined('ABSPATH')) {
		define('ABSPATH', dirname(__FILE__));
	}
	
	//PATH CONSTANTS
	if (! defined('DUPLICATOR_WPROOTPATH')) {
		define('DUPLICATOR_WPROOTPATH', str_replace('\\', '/', ABSPATH));
	}

	define('DUPLICATOR_PLUGIN_PATH',				str_replace("\\", "/", plugin_dir_path(__FILE__)));
	define('DUPLICATOR_ZIPPED_LOG_FILENAME',		'duplicator_lite_log.zip');
	define('DUPLICATOR_INSTALL_PHP',				'installer.php');
	define('DUPLICATOR_INSTALL_BAK',				'installer-backup.php');
	define('DUPLICATOR_INSTALLER_HASH_PATTERN',		'[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]');
	define('DUPLICATOR_INSTALL_SITE_OVERWRITE_ON',	true);
	
	//GENERAL CONSTRAINTS
	define('DUPLICATOR_PHP_MAX_MEMORY',  4294967296); // 4096MB
	define('DUPLICATOR_DB_MAX_TIME',     5000);
	define('DUPLICATOR_DB_EOF_MARKER',   'DUPLICATOR_MYSQLDUMP_EOF');
	define("DUPLICATOR_DB_MYSQLDUMP_ERROR_CONTAINING_LINE_COUNT", 10);
	define("DUPLICATOR_DB_MYSQLDUMP_ERROR_CHARS_IN_LINE_COUNT", 1000);
	//SCANNER CONSTRAINTS
	define('DUPLICATOR_SCAN_SIZE_DEFAULT',	157286400);	//150MB
	define('DUPLICATOR_SCAN_WARNFILESIZE',	3145728);	//3MB
	define('DUPLICATOR_SCAN_CACHESIZE',		1048576);	//1MB
	define('DUPLICATOR_SCAN_DB_ALL_ROWS',	500000);	//500k per DB
	define('DUPLICATOR_SCAN_DB_ALL_SIZE',	52428800);	//50MB DB
	define('DUPLICATOR_SCAN_DB_TBL_ROWS',	100000);    //100K rows per table
	define('DUPLICATOR_SCAN_DB_TBL_SIZE',	10485760);  //10MB Table
	define('DUPLICATOR_SCAN_TIMEOUT',		150);		//Seconds
	define('DUPLICATOR_SCAN_MIN_WP',		'4.7.0');
	define('DUPLICATOR_MAX_DUPARCHIVE_SIZE', 524288000); // 500 GB

	define('DUPLICATOR_TEMP_CLEANUP_SECONDS', 900);     // 15 min = How many seconds to keep temp files around when delete is requested
	define('DUPLICATOR_MAX_BUILD_RETRIES', 10);			// Max times to try a part of progressive build work
	define('DUPLICATOR_WEBCONFIG_ORIG_FILENAME', 'web.config.orig');
	define("DUPLICATOR_INSTALLER_DIRECTORY", duplicator_get_abs_path() . '/dup-installer');
	define('DUPLICATOR_MAX_LOG_SIZE', 400000);    // The higher this is the more overhead
	define('DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR', false);
	define('DUPLICATOR_DEACTIVATION_FEEDBACK', false);
	define("DUPLICATOR_BUFFER_READ_WRITE_SIZE", 4377);
	define("DUPLICATOR_ADMIN_NOTICES_USER_META_KEY", 'duplicator_admin_notices');
	define("DUPLICATOR_FEEDBACK_NOTICE_SHOW_AFTER_NO_PACKAGE", 5);

	$GLOBALS['DUPLICATOR_SERVER_LIST'] = array('Apache','LiteSpeed', 'Nginx', 'Lighttpd', 'IIS', 'WebServerX', 'uWSGI');
	$GLOBALS['DUPLICATOR_OPTS_DELETE'] = array(
        'duplicator_ui_view_state',
        'duplicator_package_active',
        'duplicator_settings',
        'duplicator_is_pro_enable_notice_dismissed'
    );
	$GLOBALS['DUPLICATOR_GLOBAL_FILE_FILTERS_ON'] = true;
	$GLOBALS['DUPLICATOR_GLOBAL_FILE_FILTERS'] = array(
		'error_log',
		'error.log',
		'debug_log',
		'ws_ftp.log',
		'dbcache',
		'pgcache',
		'objectcache',
		'.DS_Store'
	);

	
	/* Used to flush a response every N items. 
	 * Note: This value will cause the Zip file to double in size durning the creation process only*/
	define("DUPLICATOR_ZIP_FLUSH_TRIGGER", 1000);

	/* Let's setup few things to cover all PHP versions */
	if(!defined('PHP_VERSION'))
	{
		define('PHP_VERSION', phpversion());
	}
	if (!defined('PHP_VERSION_ID')) {
		$version = explode('.', PHP_VERSION);
		define('PHP_VERSION_ID', (($version[0] * 10000) + ($version[1] * 100) + $version[2]));
	}
	if (PHP_VERSION_ID < 50207) {
		if(!(isset($version))) $version = explode('.', PHP_VERSION);
		if(!defined('PHP_MAJOR_VERSION'))   define('PHP_MAJOR_VERSION',   $version[0]);
		if(!defined('PHP_MINOR_VERSION'))   define('PHP_MINOR_VERSION',   $version[1]);
		if(!defined('PHP_RELEASE_VERSION')) define('PHP_RELEASE_VERSION', $version[2]);
	}

} else {
	error_reporting(0);
	$port = (!empty($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] != "off") ? "https://" : "http://";
	$url = $port . $_SERVER["HTTP_HOST"];
	header("HTTP/1.1 404 Not Found", true, 404);
	header("Status: 404 Not Found");
	exit();
}
installer/index.php000064400000000017151336065400010362 0ustar00<?php
//silentinstaller/installer.tpl000064400000201143151336065400011263 0ustar00<?php
/* ------------------------------ NOTICE ----------------------------------

    If you're seeing this text when browsing to the installer, it means your
    web server is not set up properly.

    Please contact your host and ask them to enable "PHP" processing on your
    account.
    ----------------------------- NOTICE ---------------------------------*/
    
if (!defined('KB_IN_BYTES')) { define('KB_IN_BYTES', 1024); }
if (!defined('MB_IN_BYTES')) { define('MB_IN_BYTES', 1024 * KB_IN_BYTES); }
if (!defined('GB_IN_BYTES')) { define('GB_IN_BYTES', 1024 * MB_IN_BYTES); }
if (!defined('DUPLICATOR_PHP_MAX_MEMORY')) { define('DUPLICATOR_PHP_MAX_MEMORY', 4096 * MB_IN_BYTES); }

date_default_timezone_set('UTC'); // Some machines don’t have this set so just do it here.
@ignore_user_abort(true);

if (!function_exists('wp_is_ini_value_changeable')) {
    /**
    * Determines whether a PHP ini value is changeable at runtime.
    *
    * @staticvar array $ini_all
    *
    * @link https://secure.php.net/manual/en/function.ini-get-all.php
    *
    * @param string $setting The name of the ini setting to check.
    * @return bool True if the value is changeable at runtime. False otherwise.
    */
    function wp_is_ini_value_changeable( $setting ) {
        static $ini_all;
        if ( ! isset( $ini_all ) ) {
            $ini_all = false;
            // Sometimes `ini_get_all()` is disabled via the `disable_functions` option for "security purposes".
            if ( function_exists( 'ini_get_all' ) ) {
                $ini_all = ini_get_all();
            }
        }

        // Bit operator to workaround https://bugs.php.net/bug.php?id=44936 which changes access level to 63 in PHP 5.2.6 - 5.2.17.
        if ( isset( $ini_all[ $setting ]['access'] ) && ( INI_ALL === ( $ini_all[ $setting ]['access'] & 7 ) || INI_USER === ( $ini_all[ $setting ]['access'] & 7 ) ) ) {
            return true;
        }

        // If we were unable to retrieve the details, fail gracefully to assume it's changeable.
        if ( ! is_array( $ini_all ) ) {
            return true;
        }

        return false;
    }
}

@set_time_limit(3600);
if (wp_is_ini_value_changeable('memory_limit'))
    @ini_set('memory_limit', DUPLICATOR_PHP_MAX_MEMORY);
if (wp_is_ini_value_changeable('max_input_time'))
    @ini_set('max_input_time', '-1');
if (wp_is_ini_value_changeable('pcre.backtrack_limit'))
    @ini_set('pcre.backtrack_limit', PHP_INT_MAX);
if (wp_is_ini_value_changeable('default_socket_timeout'))
    @ini_set('default_socket_timeout', 3600);
    
DUPX_Handler::init_error_handler();

/**
 * Bootstrap utility to exatract the core installer
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\Bootstrap
 * @link http://www.php-fig.org/psr/psr-2/
 *
 *  To force extraction mode:
 *		installer.php?unzipmode=auto
 *		installer.php?unzipmode=ziparchive
 *		installer.php?unzipmode=shellexec
 */
 
/*** CLASS DEFINITION START ***/

abstract class DUPX_Bootstrap_Zip_Mode
{
	const AutoUnzip		= 0;
	const ZipArchive	= 1;
	const ShellExec		= 2;
}

class DUPX_Bootstrap
{
	//@@ Params get dynamically swapped when package is built
	const ARCHIVE_FILENAME	 = '@@ARCHIVE@@';
	const ARCHIVE_SIZE		 = '@@ARCHIVE_SIZE@@';
	const INSTALLER_DIR_NAME = 'dup-installer';
	const PACKAGE_HASH		 = '@@PACKAGE_HASH@@';
    const SECONDARY_PACKAGE_HASH = '@@SECONDARY_PACKAGE_HASH@@';
	const VERSION			 = '@@VERSION@@';

	public $hasZipArchive     = false;
	public $hasShellExecUnzip = false;
	public $mainInstallerURL;
	public $installerContentsPath;
	public $installerExtractPath;
	public $archiveExpectedSize = 0;
	public $archiveActualSize = 0;
	public $activeRatio = 0;

	/**
	 * Instantiate the Bootstrap Object
	 *
	 * @return null
	 */
	public function __construct()
	{
        // clean log file
        self::log('', true);
        
		//ARCHIVE_SIZE will be blank with a root filter so we can estimate
		//the default size of the package around 17.5MB (18088000)
		$archiveActualSize		        = @file_exists(self::ARCHIVE_FILENAME) ? @filesize(self::ARCHIVE_FILENAME) : false;
		$archiveActualSize				= ($archiveActualSize !== false) ? $archiveActualSize : 0;
		$this->hasZipArchive			= class_exists('ZipArchive');
		$this->hasShellExecUnzip		= $this->getUnzipFilePath() != null ? true : false;
		$this->installerContentsPath	= str_replace("\\", '/', (dirname(__FILE__). '/' .self::INSTALLER_DIR_NAME));
		$this->installerExtractPath		= str_replace("\\", '/', (dirname(__FILE__)));
		$this->archiveExpectedSize      = strlen(self::ARCHIVE_SIZE) ?  self::ARCHIVE_SIZE : 0 ;
		$this->archiveActualSize        = $archiveActualSize;

        if($this->archiveExpectedSize > 0) {
            $this->archiveRatio			= (((1.0) * $this->archiveActualSize)  / $this->archiveExpectedSize) * 100;
        } else {
            $this->archiveRatio			= 100;
        }

        $this->overwriteMode = (isset($_GET['mode']) && ($_GET['mode'] == 'overwrite'));
	}

	/**
	 * Run the bootstrap process which includes checking for requirements and running
	 * the extraction process
	 *
	 * @return null | string	Returns null if the run was successful otherwise an error message
	 */
	public function run()
	{
		date_default_timezone_set('UTC'); // Some machines don't have this set so just do it here
        
		self::log('==DUPLICATOR INSTALLER BOOTSTRAP v@@VERSION@@==');
		self::log('----------------------------------------------------');
		self::log('Installer bootstrap start');

		$archive_filepath	 = $this->getArchiveFilePath();
		$archive_filename	 = self::ARCHIVE_FILENAME;

		$error					= null;

		$is_installer_file_valid = true;
		if (preg_match('/_([a-z0-9]{7})[a-z0-9]+_[0-9]{6}([0-9]{8})_archive.(?:zip|daf)$/', $archive_filename, $matches)) {
			$expected_package_hash = $matches[1].'-'.$matches[2]; 
			if (self::PACKAGE_HASH != $expected_package_hash) {
				$is_installer_file_valid = false;
				self::log("[ERROR] Installer and archive mismatch detected.");
			}
		} else {
			self::log("[ERROR] Invalid archive file name.");
			$is_installer_file_valid = false;
		}

		if (false  === $is_installer_file_valid) {
			$error = "Installer and archive mismatch detected.
					Ensure uncorrupted installer and matching archive are present.";
			return $error;
		}

		$extract_installer		= true;
		$installer_directory	= dirname(__FILE__).'/'.self::INSTALLER_DIR_NAME;
		$extract_success		= false;
		$archiveExpectedEasy	= $this->readableByteSize($this->archiveExpectedSize);
		$archiveActualEasy		= $this->readableByteSize($this->archiveActualSize);

        //$archive_extension = strtolower(pathinfo($archive_filepath)['extension']);
        $archive_extension		= strtolower(pathinfo($archive_filepath, PATHINFO_EXTENSION));
		$manual_extract_found   = (
									file_exists($installer_directory."/main.installer.php")
									&&
									file_exists($installer_directory."/dup-archive__".self::PACKAGE_HASH.".txt")
									&&
									file_exists($installer_directory."/dup-database__".self::PACKAGE_HASH.".sql")
									);
                                    
        $isZip = ($archive_extension == 'zip');

		//MANUAL EXTRACTION NOT FOUND
		if (! $manual_extract_found) {

			//MISSING ARCHIVE FILE  
			if (! file_exists($archive_filepath)) {
				self::log("[ERROR] Archive file not found!");
                $error = "<style>.diff-list font { font-weight: bold; }</style>"
                    . "<b>Archive not found!</b> The required archive file must be present in the <i>'Extraction Path'</i> below.  When the archive file name was created "
                    . "it was given a secure hashed file name.  This file name must be the <i>exact same</i> name as when it was created character for character.  "
                    . "Each archive file has a unique installer associated with it and must be used together.  See the list below for more options:<br/>"
                    . "<ul>"
                    . "<li>If the archive is not finished downloading please wait for it to complete.</li>"
                    . "<li>Rename the file to it original hash name.  See WordPress-Admin ❯ Packages ❯  Details. </li>"
                    . "<li>When downloading, both files both should be from the same package line. </li>"
                    . "<li>Also see: <a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-050-q' target='_blank'>How to fix various errors that show up before step-1 of the installer?</a></li>"
                    . "</ul><br/>"
                    ."<b>Extraction Path:</b> <span class='file-info'>{$this->installerExtractPath}/</span><br/>";

				return $error;
			}

            // Sometimes the self::ARCHIVE_SIZE is ''.
            $archive_size = self::ARCHIVE_SIZE;

			if (!empty($archive_size) && !self::checkInputVaslidInt($archive_size)) {
				$no_of_bits = PHP_INT_SIZE * 8;
                $error  = 'Current is a '.$no_of_bits.'-bit SO. This archive is too large for '.$no_of_bits.'-bit PHP.'.'<br>';
                self::log('[ERROR] '.$error);
                $error  .= 'Possibibles solutions:<br>';
                $error  .= '- Use the file filters to get your package lower to support this server or try the package on a Linux server.'.'<br>';
                $error  .= '- Perform a <a target="_blank" href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-015-q">Manual Extract Install</a>'.'<br>';
                 
                switch ($no_of_bits == 32) {
                    case 32:
                        $error  .= '- Ask your host to upgrade the server to 64-bit PHP or install on another system has 64-bit PHP'.'<br>';
                        break;
                    case 64:
                        $error  .= '- Ask your host to upgrade the server to 128-bit PHP or install on another system has 128-bit PHP'.'<br>';
                        break;
                }

                if (self::isWindows()) {
                    $error .= '- <a target="_blank" href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-052-q">Windows DupArchive extractor</a> to extract all files from the archive.'.'<br>';
                }
                
                return $error;
			}

			//SIZE CHECK ERROR
			if (($this->archiveRatio < 90) && ($this->archiveActualSize > 0) && ($this->archiveExpectedSize > 0)) {
				self::log("ERROR: The expected archive size should be around [{$archiveExpectedEasy}].  The actual size is currently [{$archiveActualEasy}].");
				self::log("ERROR: The archive file may not have fully been downloaded to the server");
				$percent = round($this->archiveRatio);

				$autochecked = isset($_POST['auto-fresh']) ? "checked='true'" : '';
				$error  = "<b>Archive file size warning.</b><br/> The expected archive size should be around <b class='pass'>[{$archiveExpectedEasy}]</b>.  "
					. "The actual size is currently <b class='fail'>[{$archiveActualEasy}]</b>.  The archive file may not have fully been downloaded to the server.  "
					. "Please validate that the file sizes are close to the same size and that the file has been completely downloaded to the destination server.  If the archive is still "
					. "downloading then refresh this page to get an update on the download size.<br/><br/>";

				return $error;
			}

		}


        // OLD COMPATIBILITY MODE
        if (isset($_GET['extract-installer']) && !isset($_GET['force-extract-installer'])) {
            $_GET['force-extract-installer'] = $_GET['extract-installer'];
        }
        
        if ($manual_extract_found) {
			// INSTALL DIRECTORY: Check if its setup correctly AND we are not in overwrite mode
			if (isset($_GET['force-extract-installer']) && ('1' == $_GET['force-extract-installer'] || 'enable' == $_GET['force-extract-installer'] || 'false' == $_GET['force-extract-installer'])) {
				self::log("Manual extract found with force extract installer get parametr");
				$extract_installer = true;
			} else {
				$extract_installer = false;
				self::log("Manual extract found so not going to extract dup-installer dir");
			}
		} else {
			$extract_installer = true;
		}

		if ($extract_installer && file_exists($installer_directory)) {
            self::log("EXTRACT dup-installer dir");
			$scanned_directory = array_diff(scandir($installer_directory), array('..', '.'));
			foreach ($scanned_directory as $object) {
				$object_file_path = $installer_directory.'/'.$object;
				if (is_file($object_file_path)) {
					if (unlink($object_file_path)) {
						self::log('Successfully deleted the file '.$object_file_path);
					} else {
						$error .= '[ERROR] Error deleting the file '.$object_file_path.' Please manually delete it and try again.';
						self::log($error);
					}
				}
			}
		}

		//ATTEMPT EXTRACTION:
		//ZipArchive and Shell Exec
		if ($extract_installer) {
			self::log("Ready to extract the installer");

			self::log("Checking permission of destination folder");
			$destination = dirname(__FILE__);
			if (!is_writable($destination)) {
				self::log("destination folder for extraction is not writable");
				if (self::chmod($destination, 'u+rwx')) {
					self::log("Permission of destination folder changed to u+rwx");
				} else {
					self::log("[ERROR] Permission of destination folder failed to change to u+rwx");
				}
			}

			if (!is_writable($destination)) {
                self::log("WARNING: The {$destination} directory is not writable.");
				$error	= "NOTICE: The {$destination} directory is not writable on this server please talk to your host or server admin about making ";
				$error	.= "<a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-055-q'>writable {$destination} directory</a> on this server. <br/>";
				return $error; 
			}

			if ($isZip) {
				$zip_mode = $this->getZipMode();

				if (($zip_mode == DUPX_Bootstrap_Zip_Mode::AutoUnzip) || ($zip_mode == DUPX_Bootstrap_Zip_Mode::ZipArchive) && class_exists('ZipArchive')) {
					if ($this->hasZipArchive) {
						self::log("ZipArchive exists so using that");
						$extract_success = $this->extractInstallerZipArchive($archive_filepath);

						if ($extract_success) {
							self::log('Successfully extracted with ZipArchive');
						} else {
							if (0 == $this->installer_files_found) {
								$error = "[ERROR] This archive is not properly formatted and does not contain a dup-installer directory. Please make sure you are attempting to install the original archive and not one that has been reconstructed.";
								self::log($error);
								return $error;
							} else {
								$error = '[ERROR] Error extracting with ZipArchive. ';
								self::log($error);
							}
						}
					} else {
						self::log("WARNING: ZipArchive is not enabled.");
						$error	 = "NOTICE: ZipArchive is not enabled on this server please talk to your host or server admin about enabling ";
						$error	 .= "<a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-060-q'>ZipArchive</a> on this server. <br/>";
					}
				}

				if (!$extract_success) {
					if (($zip_mode == DUPX_Bootstrap_Zip_Mode::AutoUnzip) || ($zip_mode == DUPX_Bootstrap_Zip_Mode::ShellExec)) {
						$unzip_filepath = $this->getUnzipFilePath();
						if ($unzip_filepath != null) {
							$extract_success = $this->extractInstallerShellexec($archive_filepath);
							if ($extract_success) {
								self::log('Successfully extracted with Shell Exec');
								$error = null;
							} else {
								$error .= '[ERROR] Error extracting with Shell Exec. Please manually extract archive then choose Advanced > Manual Extract in installer.';
								self::log($error);
							}
						} else {
							self::log('WARNING: Shell Exec Zip is not available');
							$error	 .= "NOTICE: Shell Exec is not enabled on this server please talk to your host or server admin about enabling ";
							$error	 .= "<a target='_blank' href='http://php.net/manual/en/function.shell-exec.php'>Shell Exec</a> on this server or manually extract archive then choose Advanced > Manual Extract in installer.";
						}
					}
				}
				
				// If both ZipArchive and ShellZip are not available, Error message should be combined for both
				if (!$extract_success && $zip_mode == DUPX_Bootstrap_Zip_Mode::AutoUnzip) {
					$unzip_filepath = $this->getUnzipFilePath();
					if (!class_exists('ZipArchive') && empty($unzip_filepath)) {
                        self::log("WARNING: ZipArchive and Shell Exec are not enabled on this server.");
						$error	 = "NOTICE: ZipArchive and Shell Exec are not enabled on this server please talk to your host or server admin about enabling ";
						$error	 .= "<a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-060-q'>ZipArchive</a> or <a target='_blank' href='http://php.net/manual/en/function.shell-exec.php'>Shell Exec</a> on this server or manually extract archive then choose Advanced > Manual Extract in installer.";	
					}
				}
			} else {
				DupArchiveMiniExpander::init("DUPX_Bootstrap::log");
				try {
					DupArchiveMiniExpander::expandDirectory($archive_filepath, self::INSTALLER_DIR_NAME, dirname(__FILE__));
				} catch (Exception $ex) {
					self::log("[ERROR] Error expanding installer subdirectory:".$ex->getMessage());
					throw $ex;
				}
			}

			$is_apache = (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false);
			$is_nginx = (strpos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false);

			$sapi_type = php_sapi_name();
			$php_ini_data = array(						
						'max_execution_time' => 3600,
						'max_input_time' => -1,
						'ignore_user_abort' => 'On',
						'post_max_size' => '4096M',
						'upload_max_filesize' => '4096M',
						'memory_limit' => DUPLICATOR_PHP_MAX_MEMORY,
						'default_socket_timeout' => 3600,
						'pcre.backtrack_limit' => 99999999999,
					);
			$sapi_type_first_three_chars = substr($sapi_type, 0, 3);
			if ('fpm' === $sapi_type_first_three_chars) {
				self::log("SAPI: FPM");
				if ($is_apache) {
					self::log('Server: Apache');
				} elseif ($is_nginx) {
					self::log('Server: Nginx');
				}

				if (($is_apache && function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) || $is_nginx) {
					$htaccess_data = array();
					foreach ($php_ini_data as $php_ini_key=>$php_ini_val) {
						if ($is_apache) {
							$htaccess_data[] = 'SetEnv PHP_VALUE "'.$php_ini_key.' = '.$php_ini_val.'"';
						} elseif ($is_nginx) {
							if ('On' == $php_ini_val || 'Off' == $php_ini_val) {
								$htaccess_data[] = 'php_flag '.$php_ini_key.' '.$php_ini_val;
							} else {
								$htaccess_data[] = 'php_value '.$php_ini_key.' '.$php_ini_val;
							}							
						}
					}				
				
					$htaccess_text = implode("\n", $htaccess_data);
					$htaccess_file_path = dirname(__FILE__).'/dup-installer/.htaccess';
					self::log("creating {$htaccess_file_path} with the content:");
					self::log($htaccess_text);
					@file_put_contents($htaccess_file_path, $htaccess_text);
				}
			} elseif ('cgi' === $sapi_type_first_three_chars || 'litespeed' === $sapi_type) {
				if ('cgi' === $sapi_type_first_three_chars) {
					self::log("SAPI: CGI");
				} else {
					self::log("SAPI: litespeed");
				}
				if (version_compare(phpversion(), 5.5) >= 0 && (!$is_apache || 'litespeed' === $sapi_type)) {
					$ini_data = array();
					foreach ($php_ini_data as $php_ini_key=>$php_ini_val) {
						$ini_data[] = $php_ini_key.' = '.$php_ini_val;
					}
					$ini_text = implode("\n", $ini_data);
					$ini_file_path = dirname(__FILE__).'/dup-installer/.user.ini';
					self::log("creating {$ini_file_path} with the content:");
					self::log($ini_text);
					@file_put_contents($ini_file_path, $ini_text);
				} else{
					self::log("No need to create dup-installer/.htaccess or dup-installer/.user.ini");
				}
			} else {
				self::log("No need to create dup-installer/.htaccess or dup-installer/.user.ini");
				self::log("ERROR:  SAPI: Unrecognized");
			}
		} else {
			self::log("ERROR: Didn't need to extract the installer.");
		}

		if (empty($error)) {
			$config_files = glob('./dup-installer/dup-archive__*.txt');
			$config_file_absolute_path = array_pop($config_files);
			if (!file_exists($config_file_absolute_path)) {
				$error = '<b>Archive config file not found in dup-installer folder.</b> <br><br>';
				return $error;
			}
		}
		
		$is_https = $this->isHttps();

		if($is_https) {
			$current_url = 'https://';
		} else {
			$current_url = 'http://';
		}

		if(($_SERVER['SERVER_PORT'] == 80) && ($is_https)) {
			// Fixing what appears to be a bad server setting
			$server_port = 443;
		} else {
			$server_port = $_SERVER['SERVER_PORT'];
		}

		// for ngrok url and Local by Flywheel Live URL
		if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {
			$host = $_SERVER['HTTP_X_ORIGINAL_HOST'];
		} else {
			$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];//WAS SERVER_NAME and caused problems on some boxes
		}
		$current_url .= $host;
		if(strpos($current_url,':') === false) {
                   $current_url = $current_url.':'.$server_port;
                }
                
		$current_url .= $_SERVER['REQUEST_URI'];
		$uri_start    = dirname($current_url);

        $encoded_archive_path = urlencode($archive_filepath);

		if ($error === null) {
                    $error = $this->postExtractProcessing();

                    if($error == null) {

                        $bootloader_name	 = basename(__FILE__);
                        $this->mainInstallerURL = $uri_start.'/'.self::INSTALLER_DIR_NAME.'/main.installer.php';

                        $this->fixInstallerPerms($this->mainInstallerURL);

						$this->archive = $archive_filepath;
						$this->bootloader = $bootloader_name;

                        if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
                                $this->mainInstallerURL .= '?'.$_SERVER['QUERY_STRING'];
                        }

                        self::log("DONE: No detected errors so redirecting to the main installer. Main Installer URI = {$this->mainInstallerURL}");
                    }
                }

		return $error;
	}

	public function postExtractProcessing()
	{
		$dproInstallerDir = dirname(__FILE__) . '/dup-installer';                
		$libDir = $dproInstallerDir . '/lib';
		$fileopsDir = $libDir . '/fileops';
        
        if(!file_exists($dproInstallerDir)) {
        
            return 'Can\'t extract installer directory. See <a target="_blank" href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-022-q">this FAQ item</a> for details on how to resolve.</a>';
        }

		$sourceFilepath = "{$fileopsDir}/fileops.ppp";
		$destFilepath = "{$fileopsDir}/fileops.php";

		if(file_exists($sourceFilepath) && (!file_exists($destFilepath))) {
			if(@rename($sourceFilepath, $destFilepath) === false) {
				return "Error renaming {$sourceFilepath}";
			}
		}                
	}
        
	/**
     * Indicates if site is running https or not
     *
     * @return bool  Returns true if https, false if not
     */
	public function isHttps()
	{
		$retVal = true;
        if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
            $_SERVER ['HTTPS'] = 'on';
        }
		if (isset($_SERVER['HTTPS'])) {
			$retVal = ($_SERVER['HTTPS'] !== 'off');
		} else {
			$retVal = ($_SERVER['SERVER_PORT'] == 443);
            }

		return $retVal;
	}
    
        /**
     * Fetches current URL via php
     *
     * @param bool $queryString If true the query string will also be returned.
     * @param int $getParentDirLevel if 0 get current script name or parent folder, if 1 parent folder if 2 parent of parent folder ... 
     *
     * @returns The current page url
     */
    public static function getCurrentUrl($queryString = true, $requestUri = false, $getParentDirLevel = 0)
    {
        // *** HOST
        if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {
            $host = $_SERVER['HTTP_X_ORIGINAL_HOST'];
        } else {
            $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; //WAS SERVER_NAME and caused problems on some boxes
        }

        // *** PROTOCOL
        if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
            $_SERVER ['HTTPS'] = 'on';
        }
        if (isset($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'https') {
            $_SERVER ['HTTPS'] = 'on';
        }
        if (isset($_SERVER['HTTP_CF_VISITOR'])) {
            $visitor = json_decode($_SERVER['HTTP_CF_VISITOR']);
            if ($visitor->scheme == 'https') {
                $_SERVER ['HTTPS'] = 'on';
            }
        }
        $protocol = 'http'.((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') ? 's' : '');

        if ($requestUri) {
            $serverUrlSelf = preg_replace('/\?.*$/', '', $_SERVER['REQUEST_URI']);
        } else {
            // *** SCRIPT NAME
            $serverUrlSelf = $_SERVER['SCRIPT_NAME'];
            for ($i = 0; $i < $getParentDirLevel; $i++) {
                $serverUrlSelf = preg_match('/^[\\\\\/]?$/', dirname($serverUrlSelf)) ? '' : dirname($serverUrlSelf);
            }
        }

        // *** QUERY STRING 
        $query = ($queryString && isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0 ) ? '?'.$_SERVER['QUERY_STRING'] : '';

        return $protocol.'://'.$host.$serverUrlSelf.$query;
    }

	/**
     *  Attempts to set the 'dup-installer' directory permissions
     *
     * @return null
     */
	private function fixInstallerPerms()
	{
		$file_perms = 'u+rw';
		$dir_perms = 'u+rwx';

		$installer_dir_path = $this->installerContentsPath;

		$this->setPerms($installer_dir_path, $dir_perms, false);
		$this->setPerms($installer_dir_path, $file_perms, true);
	}

	/**
     * Set the permissions of a given directory and optionally all files
     *
     * @param string $directory		The full path to the directory where perms will be set
     * @param string $perms			The given permission sets to use such as '0755' or 'u+rw'
	 * @param string $do_files		Also set the permissions of all the files in the directory
     *
     * @return null
     */
	private function setPerms($directory, $perms, $do_files)
	{
		if (!$do_files) {
			// If setting a directory hiearchy be sure to include the base directory
			$this->setPermsOnItem($directory, $perms);
		}

		$item_names = array_diff(scandir($directory), array('.', '..'));

		foreach ($item_names as $item_name) {
			$path = "$directory/$item_name";
			if (($do_files && is_file($path)) || (!$do_files && !is_file($path))) {
				$this->setPermsOnItem($path, $perms);
			}
		}
	}

	/**
     * Set the permissions of a single directory or file
     *
     * @param string $path			The full path to the directory or file where perms will be set
     * @param string $perms			The given permission sets to use such as '0755' or 'u+rw'
     *
     * @return bool		Returns true if the permission was properly set
     */
	private function setPermsOnItem($path, $perms)
	{        
        if (($result = self::chmod($path, $perms)) === false) {
            self::log("ERROR: Couldn't set permissions of $path<br/>");
        } else {
            self::log("Set permissions of $path<br/>");
        }
        return $result;
	}

    /**
     * Compare two strings and return html text which represts diff
     *
     * @param string $oldString
     * @param string $newString
     *
     * @return string Returns html text
     */
    private function compareStrings($oldString, $newString) {
		$ret = '';
		for($i=0; isset($oldString[$i]) || isset($newString[$i]); $i++) {
			if(!isset($oldString[$i])) {
				$ret .= '<font color="red">' . $newString[$i] . '</font>';
				continue;
			}
			for($char=0; isset($oldString[$i][$char]) || isset($newString[$i][$char]); $char++) {
	
				if(!isset($oldString[$i][$char])) {
					$ret .= '<font color="red">' . substr($newString[$i], $char) . '</font>';
					break;
				} elseif(!isset($newString[$i][$char])) {
					break;
				}
	
				if(ord($oldString[$i][$char]) != ord($newString[$i][$char]))
					$ret .= '<font color="red">' . $newString[$i][$char] . '</font>';
				else
					$ret .= $newString[$i][$char];
			}
		}
		return $ret;
	}

    /**
     * Logs a string to the dup-installer-bootlog__[HASH].txt file
     *
     * @param string $s			The string to log to the log file
     *
     * @return boog|int // This function returns the number of bytes that were written to the file, or FALSE on failure. 
     */
	public static function log($s, $deleteOld = false)
	{
        static $logfile = null;
        if (is_null($logfile)) {
            $logfile = self::getBootLogFilePath();
        }
        if ($deleteOld && file_exists($logfile)) {
            @unlink($logfile);
        }
        $timestamp = date('M j H:i:s');
		return @file_put_contents($logfile, '['.$timestamp.'] '.self::postprocessLog($s)."\n", FILE_APPEND);
	}
    
    /**
     * get boot log file name the dup-installer-bootlog__[HASH].txt file
     *
     * @return string 
     */
    public static function getBootLogFilePath() {
        return dirname(__FILE__).'/dup-installer-bootlog__'.self::SECONDARY_PACKAGE_HASH.'.txt';
    }
    
    protected static function postprocessLog($str) {
        return str_replace(array(
            self::getArchiveFileHash(),
            self::PACKAGE_HASH, 
            self::SECONDARY_PACKAGE_HASH
            ), '[HASH]' , $str);
    }
    
    
    public static function getArchiveFileHash()
    {
        static $fileHash = null;
        if (is_null($fileHash)) {
            $fileHash = preg_replace('/^.+_([a-z0-9]+)_[0-9]{14}_archive\.(?:daf|zip)$/', '$1', self::ARCHIVE_FILENAME);
        }
        return $fileHash;
    }
    
	/**
     * Extracts only the 'dup-installer' files using ZipArchive
     *
     * @param string $archive_filepath	The path to the archive file.
     *
     * @return bool		Returns true if the data was properly extracted
     */
	private function extractInstallerZipArchive($archive_filepath, $checkSubFolder = false)
	{
		$success	 = true;
		$zipArchive	 = new ZipArchive();
		$subFolderArchiveList   = array();

		if (($zipOpenRes = $zipArchive->open($archive_filepath)) === true) {
            self::log("Successfully opened archive file.");
			$destination = dirname(__FILE__);
			$folder_prefix = self::INSTALLER_DIR_NAME.'/';
			self::log("Extracting all files from archive within ".self::INSTALLER_DIR_NAME);

			$this->installer_files_found = 0;

			for ($i = 0; $i < $zipArchive->numFiles; $i++) {
				$stat		 = $zipArchive->statIndex($i);
				if ($checkSubFolder == false) {
					$filenameCheck = $stat['name'];
					$filename = $stat['name'];
                    $tmpSubFolder = null;
				} else {
                    $safePath = rtrim(self::setSafePath($stat['name']) , '/');
					$tmpArray = explode('/' , $safePath);
					
					if (count($tmpArray) < 2)  {
						continue;
					}

					$tmpSubFolder = $tmpArray[0];
					array_shift($tmpArray);
					$filenameCheck = implode('/' , $tmpArray);
					$filename = $stat['name'];
				}

				
				if ($this->startsWith($filenameCheck , $folder_prefix)) {
					$this->installer_files_found++;

					if (!empty($tmpSubFolder) && !in_array($tmpSubFolder , $subFolderArchiveList)) {
						$subFolderArchiveList[] = $tmpSubFolder;
					}

					if ($zipArchive->extractTo($destination, $filename) === true) {
						self::log("Success: {$filename} >>> {$destination}");
					} else {
						self::log("[ERROR] Error extracting {$filename} from archive archive file");
						$success = false;
						break;
					}
				}
			}

			if ($checkSubFolder && count($subFolderArchiveList) !== 1) {
				self::log("Error: Multiple dup subfolder archive");
				$success = false;			
			} else {
				if ($checkSubFolder) {
					$this->moveUpfromSubFolder(dirname(__FILE__).'/'.$subFolderArchiveList[0] , true);
				}

			    $lib_directory = dirname(__FILE__).'/'.self::INSTALLER_DIR_NAME.'/lib';
			    $snaplib_directory = $lib_directory.'/snaplib';

			    // If snaplib files aren't present attempt to extract and copy those
			    if(!file_exists($snaplib_directory))
			    {
				$folder_prefix = 'snaplib/';
				$destination = $lib_directory;

				for ($i = 0; $i < $zipArchive->numFiles; $i++) {
				    $stat		 = $zipArchive->statIndex($i);
				    $filename	 = $stat['name'];

				    if ($this->startsWith($filename, $folder_prefix)) {
				        $this->installer_files_found++;

				        if ($zipArchive->extractTo($destination, $filename) === true) {
				            self::log("Success: {$filename} >>> {$destination}");
				        } else {
				            self::log("[ERROR] Error extracting {$filename} from archive archive file");
				            $success = false;
				            break;
				        }
				    }
				}
			    }
			}

			if ($zipArchive->close() === true) {
				self::log("Successfully closed archive file");
			} else {
				self::log("[ERROR] Problem closing archive file");
				$success = false;
			}
			
			if ($success != false && $this->installer_files_found < 10) {
				if ($checkSubFolder) {
					self::log("[ERROR] Couldn't find the installer directory in the archive!");
					$success = false;
				} else {
					self::log("[ERROR] Couldn't find the installer directory in archive root! Check subfolder");
					$this->extractInstallerZipArchive($archive_filepath, true);
				}
			}
		} else {
			self::log("[ERROR] Couldn't open archive archive file with ZipArchive CODE[".$zipOpenRes."]");
			$success = false;
		}

		return $success;
	}
    
    /**
     * return true if current SO is windows
     * 
     * @staticvar bool $isWindows
     * @return bool
     */
    public static function isWindows()
    {
        static $isWindows = null;
        if (is_null($isWindows)) {
            $isWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
        }
        return $isWindows;
    }

    /**
     * return current SO path path len
     * @staticvar int $maxPath
     * @return int
     */
    public static function maxPathLen()
    {
        static $maxPath = null;
        if (is_null($maxPath)) {
            if (defined('PHP_MAXPATHLEN')) {
                $maxPath = PHP_MAXPATHLEN;
            } else {
                // for PHP < 5.3.0
                $maxPath = self::isWindows() ? 260 : 4096;
            }
        }
        return $maxPath;
    }
    
    /**
     * this function make a chmod only if the are different from perms input and if chmod function is enabled
     *
     * this function handles the variable MODE in a way similar to the chmod of lunux
     * So the MODE variable can be
     * 1) an octal number (0755)
     * 2) a string that defines an octal number ("644")
     * 3) a string with the following format [ugoa]*([-+=]([rwx]*)+
     *
     * examples
     * u+rw         add read and write at the user
     * u+rw,uo-wx   add read and write ad the user and remove wx at groupd and other
     * a=rw         is equal at 666
     * u=rwx,go-rwx is equal at 700
     *
     * @param string $file
     * @param int|string $mode
     * @return boolean
     */
    public static function chmod($file, $mode)
    {
        if (!file_exists($file)) {
            return false;
        }

        $octalMode = 0;

        if (is_int($mode)) {
            $octalMode = $mode;
        } else if (is_string($mode)) {
            $mode = trim($mode);
            if (preg_match('/([0-7]{1,3})/', $mode)) {
                $octalMode = intval(('0'.$mode), 8);
            } else if (preg_match_all('/(a|[ugo]{1,3})([-=+])([rwx]{1,3})/', $mode, $gMatch, PREG_SET_ORDER)) {
                if (!function_exists('fileperms')) {
                    return false;
                }

                // start by file permission
                $octalMode = (fileperms($file) & 0777);

                foreach ($gMatch as $matches) {
                    // [ugo] or a = ugo
                    $group = $matches[1];
                    if ($group === 'a') {
                        $group = 'ugo';
                    }
                    // can be + - =
                    $action = $matches[2];
                    // [rwx]
                    $gPerms = $matches[3];

                    // reset octal group perms
                    $octalGroupMode = 0;

                    // Init sub perms
                    $subPerm = 0;
                    $subPerm += strpos($gPerms, 'x') !== false ? 1 : 0; // mask 001
                    $subPerm += strpos($gPerms, 'w') !== false ? 2 : 0; // mask 010
                    $subPerm += strpos($gPerms, 'r') !== false ? 4 : 0; // mask 100

                    $ugoLen = strlen($group);

                    if ($action === '=') {
                        // generate octal group permsissions and ugo mask invert
                        $ugoMaskInvert = 0777;
                        for ($i = 0; $i < $ugoLen; $i++) {
                            switch ($group[$i]) {
                                case 'u':
                                    $octalGroupMode = $octalGroupMode | $subPerm << 6; // mask xxx000000
                                    $ugoMaskInvert  = $ugoMaskInvert & 077;
                                    break;
                                case 'g':
                                    $octalGroupMode = $octalGroupMode | $subPerm << 3; // mask 000xxx000
                                    $ugoMaskInvert  = $ugoMaskInvert & 0707;
                                    break;
                                case 'o':
                                    $octalGroupMode = $octalGroupMode | $subPerm; // mask 000000xxx
                                    $ugoMaskInvert  = $ugoMaskInvert & 0770;
                                    break;
                            }
                        }
                        // apply = action
                        $octalMode = $octalMode & ($ugoMaskInvert | $octalGroupMode);
                    } else {
                        // generate octal group permsissions
                        for ($i = 0; $i < $ugoLen; $i++) {
                            switch ($group[$i]) {
                                case 'u':
                                    $octalGroupMode = $octalGroupMode | $subPerm << 6; // mask xxx000000
                                    break;
                                case 'g':
                                    $octalGroupMode = $octalGroupMode | $subPerm << 3; // mask 000xxx000
                                    break;
                                case 'o':
                                    $octalGroupMode = $octalGroupMode | $subPerm; // mask 000000xxx
                                    break;
                            }
                        }
                        // apply + or - action
                        switch ($action) {
                            case '+':
                                $octalMode = $octalMode | $octalGroupMode;
                                break;
                            case '-':
                                $octalMode = $octalMode & ~$octalGroupMode;
                                break;
                        }
                    }
                }
            }
        }

        // if input permissions are equal at file permissions return true without performing chmod
        if (function_exists('fileperms') && $octalMode === (fileperms($file) & 0777)) {
            return true;
        }

        if (!function_exists('chmod')) {
            return false;
        }

        return @chmod($file, $octalMode);
    }
    
    public static function checkInputVaslidInt($input) {
        return (filter_var($input, FILTER_VALIDATE_INT) === 0 || filter_var($input, FILTER_VALIDATE_INT));
    }

            
    /**
     * this function creates a folder if it does not exist and performs a chmod.
     * it is different from the normal mkdir function to which an umask is applied to the input permissions.
     * 
     * this function handles the variable MODE in a way similar to the chmod of lunux
     * So the MODE variable can be
     * 1) an octal number (0755)
     * 2) a string that defines an octal number ("644")
     * 3) a string with the following format [ugoa]*([-+=]([rwx]*)+
     *
     * @param string $path
     * @param int|string $mode
     * @param bool $recursive
     * @param resource $context // not used for windows bug
     * @return boolean bool TRUE on success or FALSE on failure.
     *
     * @todo check recursive true and multiple chmod
     */
    public static function mkdir($path, $mode = 0777, $recursive = false, $context = null)
    {
        if (strlen($path) > self::maxPathLen()) {
            throw new Exception('Skipping a file that exceeds allowed max path length ['.self::maxPathLen().']. File: '.$filepath);
        }

        if (!file_exists($path)) {
            if (!function_exists('mkdir')) {
                return false;
            }
            if (!@mkdir($path, 0777, $recursive)) {
                return false;
            }
        }

        return self::chmod($path, $mode);
    }

    /**
     * move all folder content up to parent
     *
     * @param string $subFolderName full path
     * @param boolean $deleteSubFolder if true delete subFolder after moved all
     * @return boolean
     * 
     */
    private function moveUpfromSubFolder($subFolderName, $deleteSubFolder = false)
    {
        if (!is_dir($subFolderName)) {
            return false;
        }

        $parentFolder = dirname($subFolderName);
        if (!is_writable($parentFolder)) {
            return false;
        }

        $success = true;
        if (($subList = glob(rtrim($subFolderName, '/').'/*', GLOB_NOSORT)) === false) {
            self::log("[ERROR] Problem glob folder ".$subFolderName);
            return false;
        } else {
            foreach ($subList as $cName) {
                $destination = $parentFolder.'/'.basename($cName);
                if (file_exists($destination)) {
                    $success = self::deletePath($destination);
                }

                if ($success) {
                    $success = rename($cName, $destination);
                } else {
                    break;
                }
            }

            if ($success && $deleteSubFolder) {
                $success = self::deleteDirectory($subFolderName, true);
            }
        }

        if (!$success) {
            self::log("[ERROR] Problem om moveUpfromSubFolder subFolder:".$subFolderName);
        }

        return $success;
    }

	/**
     * Extracts only the 'dup-installer' files using Shell-Exec Unzip
     *
     * @param string $archive_filepath	The path to the archive file.
     *
     * @return bool		Returns true if the data was properly extracted
     */
	private function extractInstallerShellexec($archive_filepath)
	{
		$success = false;
		self::log("Attempting to use Shell Exec");
		$unzip_filepath	 = $this->getUnzipFilePath();

		if ($unzip_filepath != null) {
			$unzip_command	 = "$unzip_filepath -q $archive_filepath ".self::INSTALLER_DIR_NAME.'/* 2>&1';
            self::log("Executing unzip command");
			$stderr	 = shell_exec($unzip_command);

            $lib_directory = dirname(__FILE__).'/'.self::INSTALLER_DIR_NAME.'/lib';
            $snaplib_directory = $lib_directory.'/snaplib';

            // If snaplib files aren't present attempt to extract and copy those
            if(!file_exists($snaplib_directory))
            {
                $local_lib_directory = dirname(__FILE__).'/snaplib';
                $unzip_command	 = "$unzip_filepath -q $archive_filepath snaplib/* 2>&1";
                self::log("Executing unzip command");
                $stderr	 .= shell_exec($unzip_command);
				self::mkdir($lib_directory,'u+rwx');
                rename($local_lib_directory, $snaplib_directory);
            }

			if ($stderr == '') {
				self::log("Shell exec unzip succeeded");
				$success = true;
			} else {
				self::log("[ERROR] Shell exec unzip failed. Output={$stderr}");
			}
		}

		return $success;
	}

	/**
     * Attempts to get the archive file path
     *
     * @return string	The full path to the archive file
     */
	private function getArchiveFilePath()
	{
		if (isset($_GET['archive'])) {
			$archive_filepath = $_GET['archive'];
		} else {
		$archive_filename = self::ARCHIVE_FILENAME;
			$archive_filepath = str_replace("\\", '/', dirname(__FILE__) . '/' . $archive_filename);
		}

		return $archive_filepath;
	}

	/**
     * Gets the DUPX_Bootstrap_Zip_Mode enum type that should be used
     *
     * @return DUPX_Bootstrap_Zip_Mode	Returns the current mode of the bootstrapper
     */
	private function getZipMode()
	{
		$zip_mode = DUPX_Bootstrap_Zip_Mode::AutoUnzip;

		if (isset($_GET['zipmode'])) {
			$zipmode_string = $_GET['zipmode'];
			self::log("Unzip mode specified in querystring: $zipmode_string");

			switch ($zipmode_string) {
				case 'autounzip':
					$zip_mode = DUPX_Bootstrap_Zip_Mode::AutoUnzip;
					break;

				case 'ziparchive':
					$zip_mode = DUPX_Bootstrap_Zip_Mode::ZipArchive;
					break;

				case 'shellexec':
					$zip_mode = DUPX_Bootstrap_Zip_Mode::ShellExec;
					break;
			}
		}

		return $zip_mode;
	}

	/**
     * Checks to see if a string starts with specific characters
     *
     * @return bool		Returns true if the string starts with a specific format
     */
	private function startsWith($haystack, $needle)
	{
		return $needle === "" || strrpos($haystack, $needle, - strlen($haystack)) !== false;
	}

	/**
     * Checks to see if the server supports issuing commands to shell_exex
     *
     * @return bool		Returns true shell_exec can be ran on this server
     */
	public function hasShellExec()
	{
		$cmds = array('shell_exec', 'escapeshellarg', 'escapeshellcmd', 'extension_loaded');

		//Function disabled at server level
		if (array_intersect($cmds, array_map('trim', explode(',', @ini_get('disable_functions')))))
            return false;

		//Suhosin: http://www.hardened-php.net/suhosin/
		//Will cause PHP to silently fail
		if (extension_loaded('suhosin')) {
			$suhosin_ini = @ini_get("suhosin.executor.func.blacklist");
			if (array_intersect($cmds, array_map('trim', explode(',', $suhosin_ini))))
                return false;
		}

        if (! function_exists('shell_exec')) {
			return false;
	    }

		// Can we issue a simple echo command?
		if (!@shell_exec('echo duplicator'))
            return false;

		return true;
	}

	/**
     * Gets the possible system commands for unzip on Linux
     *
     * @return string		Returns unzip file path that can execute the unzip command
     */
	public function getUnzipFilePath()
	{
		$filepath = null;

		if ($this->hasShellExec()) {
			if (shell_exec('hash unzip 2>&1') == NULL) {
				$filepath = 'unzip';
			} else {
				$possible_paths = array(
					'/usr/bin/unzip',
					'/opt/local/bin/unzip',
					'/bin/unzip',
					'/usr/local/bin/unzip',
					'/usr/sfw/bin/unzip',
					'/usr/xdg4/bin/unzip',
					'/opt/bin/unzip',					
					// RSR TODO put back in when we support shellexec on windows,
				);

				foreach ($possible_paths as $path) {
					if (file_exists($path)) {
						$filepath = $path;
						break;
					}
				}
			}
		}

		return $filepath;
	}

	/**
	 * Display human readable byte sizes such as 150MB
	 *
	 * @param int $size		The size in bytes
	 *
	 * @return string A readable byte size format such as 100MB
	 */
	public function readableByteSize($size)
	{
		try {
			$units = array('B', 'KB', 'MB', 'GB', 'TB');
			for ($i = 0; $size >= 1024 && $i < 4; $i++)
				$size /= 1024;
			return round($size, 2).$units[$i];
		} catch (Exception $e) {
			return "n/a";
		}
	}

	/**
     *  Returns an array of zip files found in the current executing directory
     *
     *  @return array of zip files
     */
    public static function getFilesWithExtension($extension)
    {
        $files = array();
        foreach (glob("*.{$extension}") as $name) {
            if (file_exists($name)) {
                $files[] = $name;
            }
        }

        if (count($files) > 0) {
            return $files;
        }

        //FALL BACK: Windows XP has bug with glob,
        //add secondary check for PHP lameness
        if ($dh = opendir('.')) {
            while (false !== ($name = readdir($dh))) {
                $ext = substr($name, strrpos($name, '.') + 1);
                if (in_array($ext, array($extension))) {
                    $files[] = $name;
                }
            }
            closedir($dh);
        }

        return $files;
    }
    
	/**
     * Safely remove a directory and recursively if needed
     *
     * @param string $directory The full path to the directory to remove
     * @param string $recursive recursively remove all items
     *
     * @return bool Returns true if all content was removed
     */
    public static function deleteDirectory($directory, $recursive)
    {
        $success = true;

        $filenames = array_diff(scandir($directory), array('.', '..'));

        foreach ($filenames as $filename) {
            $fullPath = $directory.'/'.$filename;

            if (is_dir($fullPath)) {
                if ($recursive) {
                    $success = self::deleteDirectory($fullPath, true);
                }
            } else {
                $success = @unlink($fullPath);
                if ($success === false) {
                    self::log('[ERROR] '.__FUNCTION__.": Problem deleting file:".$fullPath);
                }
            }

            if ($success === false) {
                self::log("[ERROR] Problem deleting dir:".$directory);
                break;
            }
        }

        return $success && rmdir($directory);
    }

    /**
     * Safely remove a file or directory and recursively if needed
     *
     * @param string $directory The full path to the directory to remove
     *
     * @return bool Returns true if all content was removed
     */
    public static function deletePath($path)
    {
        $success = true;

        if (is_dir($path)) {
            $success = self::deleteDirectory($path, true);
        } else {
            $success = @unlink($path);

            if ($success === false) {
                self::log('[ERROR] '. __FUNCTION__.": Problem deleting file:".$path);
            }
        }

        return $success;
    }
    
    /**
	 *  Makes path safe for any OS for PHP
	 *
	 *  Paths should ALWAYS READ be "/"
	 * 		uni:  /home/path/file.txt
	 * 		win:  D:/home/path/file.txt
	 *
	 *  @param string $path		The path to make safe
	 *
	 *  @return string The original $path with a with all slashes facing '/'.
	 */
	public static function setSafePath($path)
	{
		return str_replace("\\", "/", $path);
	}
}

class DUPX_Handler
{
    /**
     *
     * @var bool
     */
    private static $initialized = false;
    
    /**
     * This function only initializes the error handler the first time it is called
     */
    public static function init_error_handler()
    {
        if (!self::$initialized) {
            @set_error_handler(array(__CLASS__, 'error'));
            @register_shutdown_function(array(__CLASS__, 'shutdown'));
            self::$initialized = true;
        }
    }
    
    /**
     * Error handler
     *
     * @param  integer $errno   Error level
     * @param  string  $errstr  Error message
     * @param  string  $errfile Error file
     * @param  integer $errline Error line
     * @return void
     */
    public static function error($errno, $errstr, $errfile, $errline)
    {
        switch ($errno) {
            case E_ERROR :
                $log_message = self::getMessage($errno, $errstr, $errfile, $errline);
                if (DUPX_Bootstrap::log($log_message) === false) {
                    $log_message = "Can\'t write logfile\n\n".$log_message;
                }
                die('<pre>'.htmlspecialchars($log_message).'</pre>');
                break;
            case E_NOTICE :
            case E_WARNING :
            default :
                $log_message = self::getMessage($errno, $errstr, $errfile, $errline);
                DUPX_Bootstrap::log($log_message);
                break;
        }
    }

    private static function getMessage($errno, $errstr, $errfile, $errline)
    {
        $result = '[PHP ERR]';
        switch ($errno) {
            case E_ERROR :
                $result .= '[FATAL]';
                break;
            case E_WARNING :
                $result .= '[WARN]';
                break;
            case E_NOTICE :
                $result .= '[NOTICE]';
                break;
            default :
                $result .= '[ISSUE]';
                break;
        }
        $result .= ' MSG:';
        $result .= $errstr;
        $result .= ' [CODE:'.$errno.'|FILE:'.$errfile.'|LINE:'.$errline.']';
        return $result;
    }

    /**
     * Shutdown handler
     *
     * @return void
     */
    public static function shutdown()
    {
        if (($error = error_get_last())) {
            DUPX_Handler::error($error['type'], $error['message'], $error['file'], $error['line']);
        }
    }
}

class DUPX_CSRF {
	
	/** 
	 * Session var name prefix
	 * @var string
	 */
	public static $prefix = '_DUPX_CSRF';

	/** 
	 * Stores all CSRF values: Key as CSRF name and Val as CRF value
	 * @var array
	 */
	private static $CSRFVars;

	/**
	 * Set new CSRF
	 * 
	 * @param $key string CSRF Key
	 * @param $key string CSRF Val
	 * 
	 * @return Void
	 */
	public static function setKeyVal($key, $val) {
		$CSRFVars = self::getCSRFVars();
		$CSRFVars[$key] = $val;
		self::saveCSRFVars($CSRFVars);
		self::$CSRFVars = false;
	}

	/**
	 * Get CSRF value by passing CSRF key
	 * 
	 * @param $key string CSRF key
	 * 
	 * @return string|boolean If CSRF value set for give n Key, It returns CRF value otherise returns false
	 */
	public static function getVal($key) {
		$CSRFVars = self::getCSRFVars();
		if (isset($CSRFVars[$key])) {
			return $CSRFVars[$key];
		} else {
			return false;
		}
	}
	
	/** Generate DUPX_CSRF value for form
	 *
	 * @param	string	$form	- Form name as session key
	 * @return	string	- token
	 */
	public static function generate($form = NULL) {
		$keyName = self::getKeyName($form);

		$existingToken = self::getVal($keyName);
		if (false !== $existingToken) {
			$token = $existingToken;
		} else {
			$token = DUPX_CSRF::token() . DUPX_CSRF::fingerprint();
		}
		
		self::setKeyVal($keyName, $token);
		return $token;
	}
	
	/** 
	 * Check DUPX_CSRF value of form
	 * 
	 * @param	string	$token	- Token
	 * @param	string	$form	- Form name as session key
	 * @return	boolean
	 */
	public static function check($token, $form = NULL) {
		$keyName = self::getKeyName($form);
		$CSRFVars = self::getCSRFVars();
		if (isset($CSRFVars[$keyName]) && $CSRFVars[$keyName] == $token) { // token OK
			return true;
		}
		return FALSE;
	}
	
	/** Generate token
	 * @param	void
	 * @return  string
	 */
	protected static function token() {
		mt_srand((double) microtime() * 10000);
		$charid = strtoupper(md5(uniqid(rand(), TRUE)));
		return substr($charid, 0, 8) . substr($charid, 8, 4) . substr($charid, 12, 4) . substr($charid, 16, 4) . substr($charid, 20, 12);
	}
	
	/** Returns "digital fingerprint" of user
	 * @param 	void
	 * @return 	string 	- MD5 hashed data
	 */
	protected static function fingerprint() {
		return strtoupper(md5(implode('|', array($_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']))));
	}

	/**
	 * Generate CSRF Key name
	 * 
	 * @param string the form name for which CSRF key need to generate
	 * @return string CSRF key
	 */
	private static function getKeyName($form) {
		return DUPX_CSRF::$prefix . '_' . $form;
	}

	/**
	 * Get Package hash
	 * 
	 * @return string Package hash
	 */
	private static function getPackageHash() {
		if (class_exists('DUPX_Bootstrap')) {
			return DUPX_Bootstrap::PACKAGE_HASH;
		} else {
			return $GLOBALS['DUPX_AC']->package_hash;
		}
	}

	/**
	 * Get file path where CSRF tokens are stored in JSON encoded format
	 *
	 * @return string file path where CSRF token stored 
	 */
	private static function getFilePath() {
		if (class_exists('DUPX_Bootstrap')) {
			$dupInstallerfolderPath = dirname(__FILE__).'/dup-installer/';
		} else {
			$dupInstallerfolderPath = $GLOBALS['DUPX_INIT'].'/';
		}
		$packageHash = self::getPackageHash();
		$fileName = 'dup-installer-csrf__'.$packageHash.'.txt';
		$filePath = $dupInstallerfolderPath.$fileName;
		return $filePath;
	}

	/**
	 * Get all CSRF vars in array format
	 *
	 * @return array Key as CSRF name and value as CSRF value
	 */
	private static function getCSRFVars() {
		if (!isset(self::$CSRFVars) || false === self::$CSRFVars) {
			$filePath = self::getFilePath();
			if (file_exists($filePath)) {
				$contents = file_get_contents($filePath);
				if (!($contents = file_get_contents($filePath))) {
					throw new Exception('Fail to read the CSRF file.');
				}
				if (empty($contents)) {
					self::$CSRFVars = array();
				} else {
					$CSRFobjs = json_decode($contents);
					foreach ($CSRFobjs as $key => $value) {
						self::$CSRFVars[$key] = $value;
					}
				}
			} else {
				self::$CSRFVars = array();
			}
		}
		return self::$CSRFVars;
	}

	/**
	 * Stores all CSRF vars
	 * 
	 * @param $CSRFVars array holds all CSRF key val
	 * @return void
	 */
	private static function saveCSRFVars($CSRFVars) {
		$contents = json_encode($CSRFVars);
		$filePath = self::getFilePath();
		if (!file_put_contents($filePath, $contents, LOCK_EX)) {
			throw new Exception('Fail to write the CSRF file.');
		}
	}
}

try {
    $boot  = new DUPX_Bootstrap();
    $boot_error = $boot->run();
    $auto_refresh = isset($_POST['auto-fresh']) ? true : false;

	if ($boot_error == null) {
		$step1_csrf_token = DUPX_CSRF::generate('step1');
		DUPX_CSRF::setKeyVal('archive', $boot->archive);
		DUPX_CSRF::setKeyVal('bootloader', $boot->bootloader);
		DUPX_CSRF::setKeyVal('secondaryHash', DUPX_Bootstrap::SECONDARY_PACKAGE_HASH);
		DUPX_CSRF::setKeyVal('installerOrigCall', DUPX_Bootstrap::getCurrentUrl());
		DUPX_CSRF::setKeyVal('installerOrigPath', __FILE__);
		DUPX_CSRF::setKeyVal('booturl', '//'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
		DUPX_CSRF::setKeyVal('bootLogFile', DUPX_Bootstrap::getBootLogFilePath());
		DUPX_CSRF::setKeyVal('package_hash', DUPX_Bootstrap::PACKAGE_HASH);
	}
} catch (Exception $e) {
   $boot_error = $e->getMessage();
}

?>

<html>
<?php if ($boot_error == null) :?>
	<head>
		<meta name="robots" content="noindex,nofollow">
		<title>Duplicator Installer</title>
	</head>
	<body>
		<?php
		$id = uniqid();
		$html = "<form id='{$id}' method='post' action=".str_replace('\\/', '/', json_encode($boot->mainInstallerURL))." />\n";
		$data = array(
			'csrf_token' => $step1_csrf_token,
		);
		foreach ($data as $name => $value) {			
			$html .= "<input type='hidden' name='{$name}' value='{$value}' />\n";
		}
		$html .= "</form>\n";
		$html .= "<script>window.onload = function() { document.getElementById('{$id}').submit(); }</script>";
		echo $html;
		?>
	</body>
<?php else :?>
	<head>
		<style>
			body {font-family:Verdana,Arial,sans-serif; line-height:18px; font-size: 12px}
			h2 {font-size:20px; margin:5px 0 5px 0; border-bottom:1px solid #dfdfdf; padding:3px}
			div#content {border:1px solid #CDCDCD; width:750px; min-height:550px; margin:auto; margin-top:18px; border-radius:3px; box-shadow:0 8px 6px -6px #333; font-size:13px}
			div#content-inner {padding:10px 30px; min-height:550px}

			/* Header */
			table.header-wizard {border-top-left-radius:5px; border-top-right-radius:5px; width:100%; box-shadow:0 5px 3px -3px #999; background-color:#F1F1F1; font-weight:bold}
			table.header-wizard td.header {font-size:24px; padding:7px 0 7px 0; width:100%;}
			div.dupx-logfile-link {float:right; font-weight:normal; font-size:12px}
			.dupx-version {white-space:nowrap; color:#999; font-size:11px; font-style:italic; text-align:right;  padding:0 15px 5px 0; line-height:14px; font-weight:normal}
			.dupx-version a { color:#999; }

			div.errror-notice {text-align:center; font-style:italic; font-size:11px}
			div.errror-msg { color:maroon; padding: 10px 0 5px 0}
			.pass {color:green}
			.fail {color:red}
			span.file-info {font-size: 11px; font-style: italic}
			div.skip-not-found {padding:10px 0 5px 0;}
			div.skip-not-found label {cursor: pointer}
			table.settings {width:100%; font-size:12px}
			table.settings td {padding: 4px}
			table.settings td:first-child {font-weight: bold}
			.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
			.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
			.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after
			{content:"";display:table;clear:both}
			.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
			.w3-container{padding:0.01em 16px}
			.w3-center{display:inline-block;width:auto; text-align: center !important}
		</style>
	</head>
	<body>
	<div id="content">

		<table cellspacing="0" class="header-wizard">
			<tr>
				<td class="header"> &nbsp; Duplicator - Bootloader</td>
				<td class="dupx-version">
					version: <?php echo DUPX_Bootstrap::VERSION ?> <br/>
				</td>
			</tr>
		</table>

		<form id="error-form" method="post">
		<div id="content-inner">
			<h2 style="color:maroon">Setup Notice:</h2>
			<div class="errror-notice">An error has occurred. In order to load the full installer please resolve the issue below.</div>
			<div class="errror-msg">
				<?php echo $boot_error ?>
			</div>
			<br/><br/>

			<h2>Server Settings:</h2>
			<table class='settings'>
				<tr>
					<td>ZipArchive:</td>
					<td><?php echo $boot->hasZipArchive  ? '<i class="pass">Enabled</i>' : '<i class="fail">Disabled</i>'; ?> </td>
				</tr>
				<tr>
					<td>ShellExec&nbsp;Unzip:</td>
					<td><?php echo $boot->hasShellExecUnzip	? '<i class="pass">Enabled</i>' : '<i class="fail">Disabled</i>'; ?> </td>
				</tr>
				<tr>
					<td>Extraction&nbsp;Path:</td>
					<td><?php echo $boot->installerExtractPath; ?></td>
				</tr>
				<tr>
					<td>Installer Path:</td>
					<td><?php echo $boot->installerContentsPath; ?></td>
				</tr>
				<tr>
					<td>Archive Name:</td>
					<td>
						[HASH]_archive.zip or [HASH]_archive.daf<br/>
						<small>This is based on the format used to build the archive</small>
					</td>
				</tr>
				<tr>
					<td>Archive Size:</td>
					<td>
						<b>Expected Size:</b> <?php echo $boot->readableByteSize($boot->archiveExpectedSize); ?>  &nbsp;
						<b>Actual Size:</b>   <?php echo $boot->readableByteSize($boot->archiveActualSize); ?>
					</td>
				</tr>
				<tr>
					<td>Boot Log</td>
					<td>dup-installer-bootlog__[HASH].txt</td>
				</tr>
			</table>
			<br/><br/>

			<div style="font-size:11px">
				Please Note: Either ZipArchive or Shell Exec will need to be enabled for the installer to run automatically otherwise a manual extraction
				will need to be performed.  In order to run the installer manually follow the instructions to
				<a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-015-q' target='_blank'>manually extract</a> before running the installer.
			</div>
			<br/><br/>

		</div>
		</form>

	</div>
	</body>

	<script>
		function AutoFresh() {
			document.getElementById('error-form').submit();
		}
		<?php if ($auto_refresh) :?>
			var duration = 10000; //10 seconds
			var counter  = 10;
			var countElement = document.getElementById('count-down');

			setTimeout(function(){window.location.reload(1);}, duration);
			setInterval(function() {
				counter--;
				countElement.innerHTML = (counter > 0) ? counter.toString() : "0";
			}, 1000);

		<?php endif; ?>
	</script>


<?php endif; ?>


@@DUPARCHIVE_MINI_EXPANDER@@
<!--
Used for integrity check do not remove:
DUPLICATOR_INSTALLER_EOF  -->
</html>
installer/dup-installer/ctrls/ctrl.s1.php000064400000000400151336065400014447 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

require_once($GLOBALS['DUPX_INIT'].'/ctrls/classes/class.ctrl.extraction.php');

$data = DUP_LITE_Extraction::getInstance()->runExtraction();
die(DupLiteSnapJsonU::wp_json_encode($data));
installer/dup-installer/ctrls/classes/class.ctrl.extraction.php000064400000071132151336065400021057 0ustar00<?php
defined("DUPXABSPATH") or die("");

class DUP_LITE_Extraction
{

    const ACTION_DO_NOTHING         = 'donothing';
    const ACTION_REMOVE_ALL_FILES   = 'removeall';
    const ACTION_REMOVE_WP_FILES    = 'removewpfiles';
    const INPUT_NAME_ARCHIVE_ACTION = 'archive_action';

    public $archive_action          = self::ACTION_DO_NOTHING;

    /**
     *
     * @var self
     */
    protected static $instance = null;

    /**
     *
     * @return self
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    private function __construct()
    {
        $this->initData();
    }

    /**
     * initialize extraction data
     */
    public function initData()
    {
        if ($_POST['archive_engine'] == 'manual') {
            $GLOBALS['DUPX_STATE']->isManualExtraction = true;
            $GLOBALS['DUPX_STATE']->save();
        }
    }

    /**
     * 
     * @param string[] $folders
     */
    protected function removeFiles($folders = array())
    {
        $archive_path = $GLOBALS['FW_PACKAGE_PATH'];

        $excludeFiles = array(
            '/^'.preg_quote($archive_path, '/').'$/',
            '/^'.preg_quote(DUPX_CSRF::getVal('bootLogFile'), '/').'$/',
            '/^'.preg_quote(DUPX_CSRF::getVal('installerOrigPath'), '/').'$/',
            '/^'.preg_quote($GLOBALS['DUPX_ROOT'].'/wp-config.php', '/').'$/'
        );
 
        $excludeFolders = array(
            '/.+\/backups-dup-(lite|pro)$/',
            '/^'.preg_quote($GLOBALS['DUPX_INIT'], '/').'$/'
        );

        foreach (DUPX_Server::getWpAddonsSiteLists() as $addonPath) {
            $excludeFolders[] = '/^'.preg_quote($addonPath, '/').'$/';
        }

        foreach ($folders as $folder) {
            DUPX_Log::info('REMOVE FOLDER '.DUPX_Log::varToString($folder));
            DupLiteSnapLibIOU::regexGlobCallback($folder, function ($path) {

                if (is_dir($path)) {
                    rmdir($path);
                } else {
                    unlink($path);
                }
            }, array(
                'regexFile'     => $excludeFiles,
                'regexFolder'   => $excludeFolders,
                'checkFullPath' => true,
                'recursive'     => true,
                'invert'        => true,
                'childFirst'    => true
            ));
        }
    }

    protected function removeWpFiles()
    {
        try {
            DUPX_Log::info('REMOVE WP FILES');
            DUPX_Log::resetTime(DUPX_Log::LV_DEFAULT, false);

            $absDir = DupLiteSnapLibIOU::trailingslashit($GLOBALS['DUPX_ROOT']);
            if (!is_dir($absDir) || !is_readable($absDir)) {
                return false;
            }

            $removeFolders = array();

            if (($dh = opendir($absDir))) {
                while (($elem = readdir($dh)) !== false) {
                    if ($elem === '.' || $elem === '..') {
                        continue;
                    }

                    if (DupLiteSnapLibUtilWp::isWpCore($elem, DupLiteSnapLibUtilWp::PATH_RELATIVE)) {
                        $fullPath = $absDir.$elem;
                        if (is_dir($fullPath)) {
                            $removeFolders[] = $fullPath;
                        } else {
                            if (is_writable($fullPath)) {
                                unlink($fullPath);
                            }
                        }
                    }
                }
                closedir($dh);
            }

            $this->removeFiles(array_unique($removeFolders));
            DUPX_Log::logTime('FOLDERS REMOVED', DUPX_Log::LV_DEFAULT, false);
        }
        catch (Exception $e) {
            DUPX_Log::logException($e);
        }
        catch (Error $e) {
            DUPX_Log::logException($e);
        }
    }

    /**
     * 
     */
    protected function removeAllFiles()
    {
        try {
            DUPX_Log::info('REMOVE ALL FILES');
            DUPX_Log::resetTime(DUPX_Log::LV_DEFAULT, false);
            $this->removeFiles(array($GLOBALS['DUPX_ROOT']));
            DUPX_Log::logTime('FOLDERS REMOVED', DUPX_Log::LV_DEFAULT, false);
        }
        catch (Exception $e) {
            DUPX_Log::logException($e);
        }
        catch (Error $e) {
            DUPX_Log::logException($e);
        }
    }

    /**
     * preliminary actions before the extraction.
     * 
     * @return void
     */
    protected function beforeExtraction()
    {
        DUPX_Log::info('BEFORE EXTRACION ACTIONS');

        if (!$GLOBALS['DUPX_AC']->exportOnlyDB) {
            switch ($_POST[self::INPUT_NAME_ARCHIVE_ACTION]) {
                case self::ACTION_REMOVE_ALL_FILES:
                    $this->removeAllFiles();
                    break;
                case self::ACTION_REMOVE_WP_FILES:
                    $this->removeWpFiles();
                    break;
                case self::ACTION_DO_NOTHING:
                    break;
                default:
                    throw new Exception('Invalid engine action '.$_POST[self::INPUT_NAME_ARCHIVE_ACTION]);
            }
        }
    }

    /**
     * 
     * @throws Exception
     */
    public function runExtraction()
    {
        //OPTIONS
        $_POST['set_file_perms']                = (isset($_POST['set_file_perms'])) ? 1 : 0;
        $_POST['set_dir_perms']                 = (isset($_POST['set_dir_perms'])) ? 1 : 0;
        $_POST['file_perms_value']              = (isset($_POST['file_perms_value'])) ? DUPX_U::sanitize_text_field($_POST['file_perms_value']) : 0755;
        $_POST['dir_perms_value']               = (isset($_POST['dir_perms_value'])) ? DUPX_U::sanitize_text_field($_POST['dir_perms_value']) : 0644;
        $_POST['zip_filetime']                  = (isset($_POST['zip_filetime'])) ? $_POST['zip_filetime'] : 'current';
        $_POST['config_mode']                   = (isset($_POST['config_mode'])) ? $_POST['config_mode'] : 'NEW';
        $_POST[self::INPUT_NAME_ARCHIVE_ACTION] = (isset($_POST[self::INPUT_NAME_ARCHIVE_ACTION])) ? $_POST[self::INPUT_NAME_ARCHIVE_ACTION] : self::ACTION_DO_NOTHING;
        $_POST['archive_engine']                = (isset($_POST['archive_engine'])) ? $_POST['archive_engine'] : 'manual';
        $_POST['exe_safe_mode']                 = (isset($_POST['exe_safe_mode'])) ? $_POST['exe_safe_mode'] : 0;

        //LOGGING
        $POST_LOG = $_POST;
        unset($POST_LOG['dbpass']);
        ksort($POST_LOG);

        //ACTION VARS
        $ajax1_start       = DUPX_U::getMicrotime();
        $root_path         = $GLOBALS['DUPX_ROOT'];
        $wpconfig_ark_path = ($GLOBALS['DUPX_AC']->installSiteOverwriteOn) ?
            "{$root_path}/dup-wp-config-arc__{$GLOBALS['DUPX_AC']->package_hash}.txt" : "{$root_path}/wp-config.php";

        $archive_path       = $GLOBALS['FW_PACKAGE_PATH'];
        $dataResult         = array();
        $dataResult['pass'] = 0;

        /** JSON RESPONSE: Most sites have warnings turned off by default, but if they're turned on the warnings
          cause errors in the JSON data Here we hide the status so warning level is reset at it at the end */
        $ajax1_error_level = error_reporting();
        error_reporting(E_ERROR);

        $nManager = DUPX_NOTICE_MANAGER::getInstance();

        //===============================
        //ARCHIVE ERROR MESSAGES
        //===============================
        ($GLOBALS['LOG_FILE_HANDLE'] != false) or DUPX_Log::error(ERR_MAKELOG);

        if (!$GLOBALS['DUPX_AC']->exportOnlyDB) {

            $post_archive_engine = DUPX_U::sanitize_text_field($_POST['archive_engine']);

            if ($post_archive_engine == 'manual') {
                if (!file_exists($wpconfig_ark_path) && !file_exists("database.sql")) {
                    DUPX_Log::error(ERR_ZIPMANUAL);
                }
            } else {
                if (!is_readable("{$archive_path}")) {
                    DUPX_Log::error("archive path:{$archive_path}<br/>".ERR_ZIPNOTFOUND);
                }
            }

            //ERR_ZIPMANUAL
            if (('ziparchive' == $post_archive_engine || 'shellexec_unzip' == $post_archive_engine) && !$GLOBALS['DUPX_AC']->installSiteOverwriteOn) {
                //ERR_CONFIG_FOUND
                $outer_root_path = dirname($root_path);

                if ((file_exists($wpconfig_ark_path) || (@file_exists("{$outer_root_path}/wp-config.php") && !@file_exists("{$outer_root_path}/wp-settings.php"))) && @file_exists("{$root_path}/wp-admin") && @file_exists("{$root_path}/wp-includes")) {
                    DUPX_Log::error(ERR_CONFIG_FOUND);
                }
            }
        }

        DUPX_Log::info("********************************************************************************");
        DUPX_Log::info('* DUPLICATOR-LITE: Install-Log');
        DUPX_Log::info('* STEP-1 START @ '.@date('h:i:s'));
        DUPX_Log::info("* VERSION: {$GLOBALS['DUPX_AC']->version_dup}");
        DUPX_Log::info('* NOTICE: Do NOT post to public sites or forums!!');
        DUPX_Log::info("********************************************************************************");

        $colSize      = 60;
        $labelPadSize = 20;
        $os           = defined('PHP_OS') ? PHP_OS : 'unknown';
        $log          = str_pad(str_pad('PACKAGE INFO', $labelPadSize, '_', STR_PAD_RIGHT).' '.'CURRENT SERVER', $colSize, ' ', STR_PAD_RIGHT).'|'.'ORIGINAL SERVER'."\n".
            str_pad(str_pad('PHP VERSION', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->version_php, $colSize, ' ', STR_PAD_RIGHT).'|'.phpversion()."\n".
            str_pad(str_pad('OS', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->version_os, $colSize, ' ', STR_PAD_RIGHT).'|'.$os."\n".
            str_pad('CREATED', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->created."\n".
            str_pad('WP VERSION', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->version_wp."\n".
            str_pad('DUP VERSION', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->version_dup."\n".
            str_pad('DB', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->version_db."\n".
            str_pad('DB TABLES', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->dbInfo->tablesFinalCount."\n".
            str_pad('DB ROWS', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->dbInfo->tablesRowCount."\n".
            str_pad('DB FILE SIZE', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['DUPX_AC']->dbInfo->tablesSizeOnDisk."\n".
            "********************************************************************************";
        DUPX_Log::info($log);
        DUPX_Log::info("SERVER INFO");
        DUPX_Log::info(str_pad('PHP', $labelPadSize, '_', STR_PAD_RIGHT).': '.phpversion().' | SAPI: '.php_sapi_name());
        DUPX_Log::info(str_pad('PHP MEMORY', $labelPadSize, '_', STR_PAD_RIGHT).': '.$GLOBALS['PHP_MEMORY_LIMIT'].' | SUHOSIN: '.$GLOBALS['PHP_SUHOSIN_ON']);
        DUPX_Log::info(str_pad('SERVER', $labelPadSize, '_', STR_PAD_RIGHT).': '.$_SERVER['SERVER_SOFTWARE']);
        DUPX_Log::info(str_pad('DOC ROOT', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($root_path));
        DUPX_Log::info(str_pad('DOC ROOT 755', $labelPadSize, '_', STR_PAD_RIGHT).': '.var_export($GLOBALS['CHOWN_ROOT_PATH'], true));
        DUPX_Log::info(str_pad('LOG FILE 644', $labelPadSize, '_', STR_PAD_RIGHT).': '.var_export($GLOBALS['CHOWN_LOG_PATH'], true));
        DUPX_Log::info(str_pad('REQUEST URL', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($GLOBALS['URL_PATH']));

        DUPX_Log::info("********************************************************************************");
        DUPX_Log::info("USER INPUTS");
        DUPX_Log::info(str_pad('ARCHIVE ACTION', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST[self::INPUT_NAME_ARCHIVE_ACTION]));
        DUPX_Log::info(str_pad('ARCHIVE ENGINE', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['archive_engine']));
        DUPX_Log::info(str_pad('SET DIR PERMS', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['set_dir_perms']));
        DUPX_Log::info(str_pad('DIR PERMS VALUE', $labelPadSize, '_', STR_PAD_RIGHT).': '.decoct($_POST['dir_perms_value']));
        DUPX_Log::info(str_pad('SET FILE PERMS', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['set_file_perms']));
        DUPX_Log::info(str_pad('FILE PERMS VALUE', $labelPadSize, '_', STR_PAD_RIGHT).': '.decoct($_POST['file_perms_value']));
        DUPX_Log::info(str_pad('SAFE MODE', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['exe_safe_mode']));
        DUPX_Log::info(str_pad('LOGGING', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['logging']));
        DUPX_Log::info(str_pad('CONFIG MODE', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['config_mode']));
        DUPX_Log::info(str_pad('FILE TIME', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['zip_filetime']));
        DUPX_Log::info("********************************************************************************\n");

        $log = "--------------------------------------\n";
        $log .= "POST DATA\n";
        $log .= "--------------------------------------\n";
        $log .= print_r($POST_LOG, true);
        DUPX_Log::info($log, DUPX_Log::LV_DEBUG);

        $log = "\n--------------------------------------\n";
        $log .= "ARCHIVE SETUP\n";
        $log .= "--------------------------------------\n";
        $log .= str_pad('NAME', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($GLOBALS['FW_PACKAGE_PATH'])."\n";
        if (file_exists($GLOBALS['FW_PACKAGE_PATH'])) {
            $log .= str_pad('SIZE', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_U::readableByteSize(@filesize($GLOBALS['FW_PACKAGE_PATH']));
        }
        DUPX_Log::info($log."\n", DUPX_Log::LV_DEFAULT, true);

        DUPX_Log::info('PRE-EXTRACT-CHECKS');
        DUPX_ServerConfig::beforeExtractionSetup();

        $this->beforeExtraction();

        $target = $root_path;
        DUPX_U::maintenanceMode(true);

        $post_archive_engine = DUPX_U::sanitize_text_field($_POST['archive_engine']);
        switch ($post_archive_engine) {

            //-----------------------
            //MANUAL EXTRACTION
            case 'manual':
                DUPX_Log::info("\n** PACKAGE EXTRACTION IS IN MANUAL MODE ** \n");
                break;

            //-----------------------
            //SHELL EXEC
            case 'shellexec_unzip':
                DUPX_Log::info("\n\nSTART ZIP FILE EXTRACTION SHELLEXEC >>> ");
                $shell_exec_path = DUPX_Server::get_unzip_filepath();


                $command = escapeshellcmd($shell_exec_path)." -o -qq ".escapeshellarg($archive_path)." -d ".escapeshellarg($target)." 2>&1";
                if ($_POST['zip_filetime'] == 'original') {
                    DUPX_Log::info("\nShell Exec Current does not support orginal file timestamp please use ZipArchive");
                }

                DUPX_Log::info(">>> Starting Shell-Exec Unzip:\nCommand: {$command}", DUPX_Log::LV_DEBUG);
                $stderr = shell_exec($command);
                if ($stderr != '') {
                    $zip_err_msg = ERR_SHELLEXEC_ZIPOPEN.": $stderr";
                    $zip_err_msg .= "<br/><br/><b>To resolve error see <a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-130-q' target='_blank'>https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-130-q</a></b>";
                    DUPX_Log::error($zip_err_msg);
                }
                DUPX_Log::info("<<< Shell-Exec Unzip Complete.");

                break;

            //-----------------------
            //ZIP-ARCHIVE
            case 'ziparchive':
                DUPX_Log::info("\n\nSTART ZIP FILE EXTRACTION STANDARD >>> ");

                if (!class_exists('ZipArchive')) {
                    DUPX_Log::info("ERROR: Stopping install process.  Trying to extract without ZipArchive module installed.  Please use the 'Manual Archive Extraction' mode to extract zip file.");
                    DUPX_Log::error(ERR_ZIPARCHIVE);
                }

                if (($dupInstallerFolder = DUPX_U::findDupInstallerFolder($archive_path)) === false) {
                    DUPX_Log::info("findDupInstallerFolder error; set no subfolder");
                    // if not found set not subfolder
                    $dupInstallerFolder = '';
                }
                if (!empty($dupInstallerFolder)) {
                    DUPX_Log::info("ARCHIVE dup-installer SUBFOLDER:\"".$dupInstallerFolder."\"");
                } else {
                    DUPX_Log::info("ARCHIVE dup-installer SUBFOLDER:\"".$dupInstallerFolder."\"", 2);
                }

                $dupInstallerZipPath = $dupInstallerFolder.'/dup-installer';

                $zip = new ZipArchive();

                if ($zip->open($archive_path) === TRUE) {
                    $extract_filenames = array();
                    DUPX_Handler::setMode(DUPX_Handler::MODE_VAR, false, false);

                    for ($i = 0; $i < $zip->numFiles; $i++) {
                        $extract_filename = $zip->getNameIndex($i);

                        // skip dup-installer folder. Alrady extracted in bootstrap
                        if (
                            (strpos($extract_filename, $dupInstallerZipPath) === 0) ||
                            (!empty($dupInstallerFolder) && strpos($extract_filename, $dupInstallerFolder) !== 0)
                        ) {
                            DUPX_Log::info("SKIPPING NOT IN ZIPATH:\"".DUPX_Log::varToString($extract_filename)."\"", DUPX_Log::LV_DETAILED);
                            continue;
                        }

                        try {
                            if (!$zip->extractTo($target, $extract_filename)) {
                                if (DupLiteSnapLibUtilWp::isWpCore($extract_filename, DupLiteSnapLibUtilWp::PATH_RELATIVE)) {
                                    DUPX_Log::info("FILE CORE EXTRACION ERROR: ".$extract_filename);
                                    $shortMsg      = 'Can\'t extract wp core files';
                                    $finalShortMsg = 'Wp core files not extracted';
                                    $errLevel      = DUPX_NOTICE_ITEM::CRITICAL;
                                    $idManager     = 'wp-extract-error-file-core';
                                } else {
                                    DUPX_Log::info("FILE EXTRACION ERROR: ".$extract_filename);
                                    $shortMsg      = 'Can\'t extract files';
                                    $finalShortMsg = 'Files not extracted';
                                    $errLevel      = DUPX_NOTICE_ITEM::SOFT_WARNING;
                                    $idManager     = 'wp-extract-error-file-no-core';
                                }
                                $longMsg = 'FILE: <b>'.htmlspecialchars($extract_filename).'</b><br>Message: '.htmlspecialchars(DUPX_Handler::getVarLogClean()).'<br><br>';

                                $nManager->addNextStepNotice(array(
                                    'shortMsg'    => $shortMsg,
                                    'longMsg'     => $longMsg,
                                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                                    'level'       => $errLevel
                                    ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, $idManager);
                                $nManager->addFinalReportNotice(array(
                                    'shortMsg'    => $finalShortMsg,
                                    'longMsg'     => $longMsg,
                                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                                    'level'       => $errLevel,
                                    'sections'    => array('files'),
                                    ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, $idManager);
                            } else {
                                DUPX_Log::info("FILE EXTRACTION DONE: ".DUPX_Log::varToString($extract_filename), DUPX_Log::LV_HARD_DEBUG);
                            }
                        }
                        catch (Exception $ex) {
                            if (DupLiteSnapLibUtilWp::isWpCore($extract_filename, DupLiteSnapLibUtilWp::PATH_RELATIVE)) {
                                DUPX_Log::info("FILE CORE EXTRACION ERROR: {$extract_filename} | MSG:".$ex->getMessage());
                                $shortMsg      = 'Can\'t extract wp core files';
                                $finalShortMsg = 'Wp core files not extracted';
                                $errLevel      = DUPX_NOTICE_ITEM::CRITICAL;
                                $idManager     = 'wp-extract-error-file-core';
                            } else {
                                DUPX_Log::info("FILE EXTRACION ERROR: {$extract_filename} | MSG:".$ex->getMessage());
                                $shortMsg      = 'Can\'t extract files';
                                $finalShortMsg = 'Files not extracted';
                                $errLevel      = DUPX_NOTICE_ITEM::SOFT_WARNING;
                                $idManager     = 'wp-extract-error-file-no-core';
                            }
                            $longMsg = 'FILE: <b>'.htmlspecialchars($extract_filename).'</b><br>Message: '.htmlspecialchars($ex->getMessage()).'<br><br>';

                            $nManager->addNextStepNotice(array(
                                'shortMsg'    => $shortMsg,
                                'longMsg'     => $longMsg,
                                'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                                'level'       => $errLevel
                                ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, $idManager);
                            $nManager->addFinalReportNotice(array(
                                'shortMsg'    => $finalShortMsg,
                                'longMsg'     => $longMsg,
                                'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                                'level'       => $errLevel,
                                'sections'    => array('files'),
                                ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, $idManager);
                        }
                    }

                    if (!empty($dupInstallerFolder)) {
                        DUPX_U::moveUpfromSubFolder($target.'/'.$dupInstallerFolder, true);
                    }

                    //Uncomment if needed
                    //if (DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) {
                    //	$log = print_r($zip, true);
                    //}
                    //FILE-TIMESTAMP
                    if ($_POST['zip_filetime'] == 'original') {
                        $log .= "File timestamp set to Original\n";
                        for ($idx = 0; $s = $zip->statIndex($idx); $idx++) {
                            touch($target.DIRECTORY_SEPARATOR.$s['name'], $s['mtime']);
                        }
                    } else {
                        $now = @date("Y-m-d H:i:s");
                        $log .= "File timestamp set to Current: {$now}\n";
                    }

                    // set handler as default
                    DUPX_Handler::setMode();

                    $close_response = $zip->close();
                    $log            .= "<<< ZipArchive Unzip Complete: ".var_export($close_response, true);
                    DUPX_Log::info($log);
                } else {
                    $zip_err_msg = ERR_ZIPOPEN;
                    $zip_err_msg .= "<br/><br/><b>To resolve error see <a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-130-q' target='_blank'>https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-130-q</a></b>";
                    DUPX_Log::error($zip_err_msg);
                }

                break;

            //-----------------------
            //DUP-ARCHIVE
            case 'duparchive':
                DUPX_Log::info(">>> DupArchive Extraction Complete");

                if (isset($_POST['extra_data'])) {
                    $extraData = $_POST['extra_data'];

                    $log = "\n--------------------------------------\n";
                    $log .= "DUPARCHIVE EXTRACTION STATUS\n";
                    $log .= "--------------------------------------\n";

                    $dawsStatus = json_decode($extraData);

                    if ($dawsStatus === null) {
                        $log .= "Can't decode the dawsStatus!\n";
                        $log .= print_r(extraData, true);
                    } else {
                        $criticalPresent = false;

                        if (count($dawsStatus->failures) > 0) {
                            $log .= "Archive extracted with errors.\n";

                            foreach ($dawsStatus->failures as $failure) {
                                if ($failure->isCritical) {
                                    $log             .= '(C) ';
                                    $criticalPresent = true;
                                }
                                $log .= "{$failure->description}\n";
                            }
                        } else {
                            $log .= "Archive extracted with no errors.\n";
                        }

                        if ($criticalPresent) {
                            $log .= "\n\nCritical Errors present so stopping install.\n";
                            exit();
                        }
                    }

                    DUPX_Log::info($log);
                } else {
                    DUPX_LOG::info("DAWS STATUS: UNKNOWN since extra_data wasn't in post!");
                }

                break;
        }

        $log = "--------------------------------------\n";
        $log .= "POST-EXTRACT-CHECKS\n";
        $log .= "--------------------------------------";
        DUPX_Log::info($log);

        //===============================
        //FILE PERMISSIONS
        if ($_POST['set_file_perms'] || $_POST['set_dir_perms']) {
            $set_file_perms   = $_POST['set_file_perms'];
            $set_dir_perms    = $_POST['set_dir_perms'];
            $set_file_mtime   = ($_POST['zip_filetime'] == 'current');
            $file_perms_value = $_POST['file_perms_value'] ? $_POST['file_perms_value'] : 0755;
            $dir_perms_value  = $_POST['dir_perms_value'] ? $_POST['dir_perms_value'] : 0644;

            DUPX_Log::info("PERMISSION UPDATES:");
            DUPX_Log::info("    -DIRS:  '{$dir_perms_value}'");
            DUPX_Log::info("    -FILES: '{$file_perms_value}'");

            $objects = new RecursiveIteratorIterator(
                new IgnorantRecursiveDirectoryIterator($root_path, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST);

            foreach ($objects as $name => $object) {
                if ($set_file_perms && is_file($name)) {
                    DUPX_Log::info("SET PERMISSION: ".DUPX_Log::varToString($name).'[MODE:'.$file_perms_value.']', DUPX_Log::LV_HARD_DEBUG);
                    if (!DupLiteSnapLibIOU::chmod($name, $file_perms_value)) {
                        DUPX_Log::info("Permissions setting on file '{$name}' failed");
                    }
                } else if ($set_dir_perms && is_dir($name)) {
                    DUPX_Log::info("SET PERMISSION: ".DUPX_Log::varToString($name).'[MODE:'.$dir_perms_value.']', DUPX_Log::LV_HARD_DEBUG);
                    if (!DupLiteSnapLibIOU::chmod($name, $dir_perms_value)) {
                        DUPX_Log::info("Permissions setting on directory '{$name}' failed");
                    }
                }
                if ($set_file_mtime) {
                    @touch($name);
                }
            }
        } else {
            DUPX_Log::info("\nPERMISSION UPDATES: None Applied");
        }

        DUPX_ServerConfig::afterExtractionSetup();
        $nManager->saveNotices();

        //FINAL RESULTS
        $ajax1_sum = DUPX_U::elapsedTime(DUPX_U::getMicrotime(), $ajax1_start);
        DUPX_Log::info("\nSTEP-1 COMPLETE @ ".@date('h:i:s')." - RUNTIME: {$ajax1_sum}");

        $dataResult['pass'] = 1;
        error_reporting($ajax1_error_level);
        fclose($GLOBALS["LOG_FILE_HANDLE"]);
        return $dataResult;
    }
}

// Skips past paths it can't read
class IgnorantRecursiveDirectoryIterator extends RecursiveDirectoryIterator
{
    #[\ReturnTypeWillChange]
    public function getChildren()
    {
        try {
            return new IgnorantRecursiveDirectoryIterator($this->getPathname(), RecursiveDirectoryIterator::SKIP_DOTS);
        }
        catch (UnexpectedValueException $e) {
            return new RecursiveArrayIterator(array());
        }
    }
}installer/dup-installer/ctrls/index.php000064400000000017151336065400014274 0ustar00<?php
//silentinstaller/dup-installer/ctrls/ctrl.base.php000064400000003452151336065400015050 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

/**
 * Base controller class for installer controllers
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 */
//Enum used to define the various test statues 
final class DUPX_CTRL_Status
{

    const FAILED  = 0;
    const SUCCESS = 1;

}

/**
 * A class used to report on controller methods
 */
class DUPX_CTRL_Report
{

    //Properties
    public $runTime;
    public $outputType = 'JSON';
    public $status;

}

/**
 * Base class for all controllers
 */
class DUPX_CTRL_Out
{

    public $report  = null;
    public $payload = null;
    private $timeStart;
    private $timeEnd;

    /**
     *  Init this instance of the object
     */
    public function __construct()
    {
        $this->report  = new DUPX_CTRL_Report();
        $this->payload = null;
        $this->startProcessTime();
    }

    public function startProcessTime()
    {
        $this->timeStart = $this->microtimeFloat();
    }

    public function getProcessTime()
    {
        $this->timeEnd         = $this->microtimeFloat();
        $this->report->runTime = $this->timeEnd - $this->timeStart;
        return $this->report->runTime;
    }

    private function microtimeFloat()
    {
        list($usec, $sec) = explode(" ", microtime());
        return ((float) $usec + (float) $sec);
    }
}

class DUPX_CTRL
{

    const NAME_MAX_SERIALIZE_STRLEN_IN_M = 'mstrlim';

    public static function renderPostProcessings($string)
    {
        return str_replace(array(
            DUPX_Package::getArchiveFileHash(),
            DUPX_Package::getPackageHash())
            , '[HASH]', $string);
    }
}installer/dup-installer/ctrls/ctrl.s2.base.php000064400000022324151336065400015372 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
//-- START OF ACTION STEP 2
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

$_POST['dbaction'] = isset($_POST['dbaction']) ? DUPX_U::sanitize_text_field($_POST['dbaction']) : 'create';

if (isset($_POST['dbhost'])) {
    $post_db_host = DUPX_U::sanitize_text_field($_POST['dbhost']);
    $_POST['dbhost'] = trim($post_db_host);
} else {
    $_POST['dbhost'] = null;
}

if (isset($_POST['dbname'])) {
    $post_db_name = DUPX_U::sanitize_text_field($_POST['dbname']);
    $_POST['dbname'] = trim($post_db_name);
} else {
    $_POST['dbname'] = null;
}

$_POST['dbuser'] = isset($_POST['dbuser']) ? DUPX_U::sanitize_text_field($_POST['dbuser']) : null;
$_POST['dbpass'] = isset($_POST['dbpass']) ? trim($_POST['dbpass']) : null;

if (isset($_POST['dbhost'])) {
    $post_db_host = DUPX_U::sanitize_text_field($_POST['dbhost']);
    $_POST['dbport'] = parse_url($post_db_host, PHP_URL_PORT);
} else {
    $_POST['dbport'] = 3306;
}

$_POST['dbport'] = (!empty($_POST['dbport'])) ? DUPX_U::sanitize_text_field($_POST['dbport']) : 3306;
$_POST['dbnbsp']		= (isset($_POST['dbnbsp']) && $_POST['dbnbsp'] == '1') ? true : false;

if (isset($_POST['dbcharset'])) {
    $post_db_charset = DUPX_U::sanitize_text_field($_POST['dbcharset']);
    $_POST['dbcharset'] = trim($post_db_charset);
} else {
    $_POST['dbcharset'] = $GLOBALS['DBCHARSET_DEFAULT'];
}

if (isset($_POST['dbcollate'])) {
    $post_db_collate = DUPX_U::sanitize_text_field($_POST['dbcollate']);
    $_POST['dbcollate'] = trim($post_db_collate);
} else {
    $_POST['dbcollate'] = $GLOBALS['DBCOLLATE_DEFAULT'];
}

$_POST['dbcollatefb']	= (isset($_POST['dbcollatefb']) && $_POST['dbcollatefb'] == '1') ? true : false;
$_POST['dbobj_views']	= isset($_POST['dbobj_views']) ? true : false; 
$_POST['dbobj_procs']	= isset($_POST['dbobj_procs']) ? true : false;
$_POST['dbobj_funcs']	= isset($_POST['dbobj_funcs']) ? true : false;
$_POST['config_mode']	= (isset($_POST['config_mode'])) ? DUPX_U::sanitize_text_field($_POST['config_mode']) : 'NEW';

$ajax2_start	 = DUPX_U::getMicrotime();
$root_path		 = $GLOBALS['DUPX_ROOT'];
$JSON			 = array();
$JSON['pass']	 = 0;

$nManager = DUPX_NOTICE_MANAGER::getInstance();

/**
JSON RESPONSE: Most sites have warnings turned off by default, but if they're turned on the warnings
cause errors in the JSON data Here we hide the status so warning level is reset at it at the end */
$ajax2_error_level = error_reporting();
error_reporting(E_ERROR);
($GLOBALS['LOG_FILE_HANDLE'] != false) or DUPX_Log::error(ERR_MAKELOG);


//===============================================
//DB TEST & ERRORS: From Postback
//===============================================
//INPUTS
$dbTestIn			 = new DUPX_DBTestIn();
$dbTestIn->mode		 = DUPX_U::sanitize_text_field($_POST['view_mode']);
$dbTestIn->dbaction	 = DUPX_U::sanitize_text_field($_POST['dbaction']);
$dbTestIn->dbhost	 = DUPX_U::sanitize_text_field($_POST['dbhost']);
$dbTestIn->dbuser	 = DUPX_U::sanitize_text_field($_POST['dbuser']);
$dbTestIn->dbpass    = trim($_POST['dbpass']);
$dbTestIn->dbname	 = DUPX_U::sanitize_text_field($_POST['dbname']);
$dbTestIn->dbport	 = DUPX_U::sanitize_text_field($_POST['dbport']);
$dbTestIn->dbcollatefb = DUPX_U::sanitize_text_field($_POST['dbcollatefb']);

$dbTest	= new DUPX_DBTest($dbTestIn);

//CLICKS 'Test Database'
if (isset($_GET['dbtest'])) {
	
	$dbTest->runMode = 'TEST';
	$dbTest->responseMode = 'JSON';
	if (!headers_sent()) {
		header('Content-Type: application/json');
	}
	die($dbTest->run());
} 

$not_yet_logged = (isset($_POST['first_chunk']) && $_POST['first_chunk']) || (!isset($_POST['continue_chunking']));

if($not_yet_logged){
    DUPX_Log::info("\n\n\n********************************************************************************");
    DUPX_Log::info('* DUPLICATOR-LITE INSTALL-LOG');
    DUPX_Log::info('* STEP-2 START @ '.@date('h:i:s'));
    DUPX_Log::info('* NOTICE: Do NOT post to public sites or forums!!');
    DUPX_Log::info("********************************************************************************");

    $labelPadSize = 20;
    DUPX_Log::info("USER INPUTS");
    DUPX_Log::info(str_pad('VIEW MODE', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['view_mode']));
    DUPX_Log::info(str_pad('DB ACTION', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbaction']));
    DUPX_Log::info(str_pad('DB HOST', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString('**OBSCURED**'));
    DUPX_Log::info(str_pad('DB NAME', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString('**OBSCURED**'));
    DUPX_Log::info(str_pad('DB PASS', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString('**OBSCURED**'));
    DUPX_Log::info(str_pad('DB PORT', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString('**OBSCURED**'));
    DUPX_Log::info(str_pad('NON-BREAKING SPACES', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbnbsp']));
    DUPX_Log::info(str_pad('MYSQL MODE', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbmysqlmode']));
    DUPX_Log::info(str_pad('MYSQL MODE OPTS', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbmysqlmode_opts']));
    DUPX_Log::info(str_pad('CHARSET', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbcharset']));
    DUPX_Log::info(str_pad('COLLATE', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbcollate']));
    DUPX_Log::info(str_pad('COLLATE FB', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbcollatefb']));
    DUPX_Log::info(str_pad('VIEW CREATION', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbobj_views']));
    DUPX_Log::info(str_pad('STORED PROCEDURE', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbobj_procs']));
    DUPX_Log::info(str_pad('FUNCTION CREATION', $labelPadSize, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($_POST['dbobj_funcs']));
    DUPX_Log::info("********************************************************************************\n");

    $POST_LOG = $_POST;
    unset($POST_LOG['dbpass']);
    ksort($POST_LOG);
    $log = "--------------------------------------\n";
    $log .= "POST DATA\n";
    $log .= "--------------------------------------\n";
    $log .= print_r($POST_LOG, true);
    DUPX_Log::info($log, DUPX_Log::LV_DEBUG, true);

}


//===============================================
//DATABASE ROUTINES
//===============================================
$dbinstall = new DUPX_DBInstall($_POST, $ajax2_start);
if ($_POST['dbaction'] != 'manual') {
    if(!isset($_POST['continue_chunking'])){
        $dbinstall->prepareDB();
    } else if($_POST['first_chunk'] == 1) {
        $dbinstall->prepareDB();
    }
}

if($not_yet_logged) {

    //Fatal Memory errors from file_get_contents is not catchable.
    //Try to warn ahead of time with a check on buffer in memory difference
    $current_php_mem = DUPX_U::returnBytes($GLOBALS['PHP_MEMORY_LIMIT']);
    $current_php_mem = is_numeric($current_php_mem) ? $current_php_mem : null;

    if ($current_php_mem != null && $dbinstall->dbFileSize > $current_php_mem) {
        $readable_size = DUPX_U::readableByteSize($dbinstall->dbFileSize);
        $msg   = "\nWARNING: The database script is '".DUPX_U::sanitize_text_field($readable_size)."' in size.  The PHP memory allocation is set\n";
        $msg  .= "at '".DUPX_U::sanitize_text_field($GLOBALS['PHP_MEMORY_LIMIT'])."'.  There is a high possibility that the installer script will fail with\n";
        $msg  .= "a memory allocation error when trying to load the database.sql file.  It is\n";
        $msg  .= "recommended to increase the 'memory_limit' setting in the php.ini config file.\n";
        $msg  .= "see: ".DUPX_U::esc_url($faq_url.'#faq-trouble-056-q')." \n";
        DUPX_Log::info($msg);
        unset($msg);
    }

    DUPX_Log::info("--------------------------------------");
    DUPX_Log::info("DATABASE RESULTS");
    DUPX_Log::info("--------------------------------------");
}

if ($_POST['dbaction'] == 'manual') {
    DUPX_Log::info("\n** SQL EXECUTION IS IN MANUAL MODE **");
    DUPX_Log::info("- No SQL script has been executed -");
    $JSON['pass'] = 1;
} elseif(!isset($_POST['continue_chunking'])) {
    $dbinstall->writeInDB();
    $rowCountMisMatchTables = $dbinstall->getRowCountMisMatchTables();
    $JSON['pass'] = 1;
    if (!empty($rowCountMisMatchTables)) {
        $errMsg = 'ERROR: Database Table row count verification was failed for table(s): '.implode(', ', $rowCountMisMatchTables);
        DUPX_Log::info($errMsg);
    }
}

$dbinstall->profile_end = DUPX_U::getMicrotime();
$dbinstall->writeLog();
$JSON = $dbinstall->getJSON($JSON);
$nManager->saveNotices();

//FINAL RESULTS
$ajax1_sum	 = DUPX_U::elapsedTime(DUPX_U::getMicrotime(), $dbinstall->start_microtime);
DUPX_Log::info("\nINSERT DATA RUNTIME: " . DUPX_U::elapsedTime($dbinstall->profile_end, $dbinstall->profile_start));
DUPX_Log::info('STEP-2 COMPLETE @ '.@date('h:i:s')." - RUNTIME: {$ajax1_sum}");

error_reporting($ajax2_error_level);
die(DupLiteSnapJsonU::wp_json_encode($JSON));installer/dup-installer/ctrls/ctrl.s3.php000064400000003504151336065400014461 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

//-- START OF ACTION STEP 3: Update the database
require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.archive.config.php');
require_once($GLOBALS['DUPX_INIT'].'/lib/config/class.wp.config.tranformer.php');
require_once($GLOBALS['DUPX_INIT'].'/lib/config/class.wp.config.tranformer.src.php');
require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.search.reaplce.manager.php');
require_once($GLOBALS['DUPX_INIT'].'/classes/class.s3.func.php');

/** JSON RESPONSE: Most sites have warnings turned off by default, but if they're turned on the warnings
  cause errors in the JSON data Here we hide the status so warning level is reset at it at the end */
// We have already removing warning from json resp
// It cause 500 internal server error so commenting out
/*
  $ajax3_error_level	 = error_reporting();
  error_reporting(E_ERROR);
 */
try {
    DUPX_Log::setThrowExceptionOnError(true);

    $nManager = DUPX_NOTICE_MANAGER::getInstance();
    $s3Func   = DUPX_S3_Funcs::getInstance();

    switch ($s3Func->getEngineMode()) {
        case DUPX_S3_Funcs::MODE_NORMAL:
        default:
            $s3Func->initLog();
            $s3Func->runSearchAndReplace();

            $s3Func->removeLicenseKey();
            $s3Func->createNewAdminUser();
            $s3Func->configurationFileUpdate();
            $s3Func->htaccessUpdate();
            $s3Func->generalUpdateAndCleanup();

            $s3Func->noticeTest();
            $s3Func->cleanupTmpFiles();
            $s3Func->finalReportNotices();
            $s3Func->complete();
    }

    $nManager->saveNotices();
} catch (Exception $e) {
    $s3Func->error($e->getMessage());
}

$json = $s3Func->getJsonReport();
DUPX_Log::close();
die(DupLiteSnapJsonU::wp_json_encode($json));
installer/dup-installer/ctrls/ctrl.s2.dbtest.php000064400000064142151336065400015751 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

/**
 * Lightweight abstraction layer for testing the connectivity of a database request
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DBTest
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */

class DUPX_DBTestIn
{
	//Create, Rename, Empty, Skip
	public $dbaction;
	public $dbhost;
	public $dbname;
	public $dbuser;
	public $dbpass;
	public $dbport;
	public $dbcollatefb;
}

class DUPX_DBTestOut extends DUPX_CTRL_Out
{
	public function __construct()
	{
		parent::__construct();
	}
}

class DUPX_DBTest
{
	public $databases		 = array();
	public $tblPerms;
	public $reqs			 = array();
	public $notices			 = array();
	public $reqsPass		 = false;
	public $noticesPass		 = false;
	public $in;
	public $ac;
	public $collationStatus = array();
    public $collationReplaceList = array();
	public $lastError;
	//JSON | PHP
	public $responseMode	 = 'JSON';
	//TEST | LIVE
	public $runMode			 = 'TEST';
	//TEXT | HTML
	public $displayMode		 = 'TEXT';
	//PRIVATE
	private $out;
	private $dbh;
	private $permsChecked  = false;
	private $newDBMade	   = false;


	public function __construct(DUPX_DBTestIn $input)
	{
		$default_msg	 = 'This test passed without any issues';
		$this->in		 = $input;
		$this->out		 = new DUPX_DBTestOut();
		$this->tblPerms	 = array('all' => -1, 'create' => -1, 'insert' => -1, 'update' => -1, 'delete' => -1, 'select' => -1, 'drop' => -1);
		$this->ac = DUPX_ArchiveConfig::getInstance();

		//REQUIRMENTS
		//Pass States: skipped = -1		failed = 0		passed = 1   warned = 2
		$this->reqs[5]	 = array('title' => "Create Database User", 'info' => "{$default_msg}", 'pass' => -1);
		$this->reqs[10]	 = array('title' => "Host Connection", 'info' => "{$default_msg}", 'pass' => -1);
		$this->reqs[20]	 = array('title' => "Database Version", 'info' => "{$default_msg}", 'pass' => -1);
		$this->reqs[30]	 = array('title' => "Database Create New Tests", 'info' => "{$default_msg}", 'pass' => -1);
		$this->reqs[40]	 = array('title' => "Privileges: User Visibility", 'info' => "{$default_msg}", 'pass' => -1);
		$this->reqs[50]	 = array('title' => "Manual Table Check", 'info' => "{$default_msg}", 'pass' => -1);
		$this->reqs[60]	 = array('title' => "Privileges: User Resources", 'info' => "{$default_msg}", 'pass' => -1);
		$this->reqs[70]	 = array('title' => "Check Collation Capability", 'info' => "{$default_msg}", 'pass' => -1);
		$this->reqs[80]	 = array('title' => "Database GTID mode", 'info' => "{$default_msg}", 'pass' => -1);
		//NOTICES
		$this->notices[10]	 = array('title' => "Table Case Sensitivity", 'info' => "{$default_msg}", 'pass' => -1);
		$this->notices[20]	 = array('title' => "Source Database Triggers", 'info' => "{$default_msg}", 'pass' => -1);
       }

	public function run()
	{
		//Requirments
        $this->runBasic();

		$this->buildStateSummary();
		$this->buildDisplaySummary();
		$this->out->payload = $this;
		foreach ($this->out->payload->in as $key=>$val) {
			$this->out->payload->in->$key = htmlentities($val);
		}
		$this->out->getProcessTime();

		//Return PHP or JSON result
		if ($this->responseMode == 'PHP') {
			$result = $this->out;
			return $result;
		} elseif ($this->responseMode == 'JSON') {
			$result = DupLiteSnapJsonU::wp_json_encode($this->out);
			return $result;
		} else {
			die('Please specific the responseMode property');
		}

	}

	private function runBasic()
	{
		//REQUIRMENTS:
		//[10]	 = "Verify Host Connection"
		//[20]	 = "Check Server Version"
		//[30]	 = "Create New Database Tests"
		//[40]	 = "Confirm Database Visibility"
		//[50]	 = "Manual Table Check"
		//[60]	 = "Test User Table Privileges"


		$this->r10All($this->reqs[10]);
		$this->r20All($this->reqs[20]);

		switch ($this->in->dbaction) {
			case "create" :
				$this->r30Basic($this->reqs[30]);
				$this->r40Basic($this->reqs[40]);
				break;
			case "empty" :
				$this->r40Basic($this->reqs[40]);
				break;
			case "rename":
				$this->r40Basic($this->reqs[40]);
				break;
			case "manual":
				$this->r40Basic($this->reqs[40]);
				$this->r50All($this->reqs[50]);
				break;
		}

		$this->r60All($this->reqs[60]);

		//NOTICES
		$this->n10All($this->notices[10]);
		$this->n20All($this->notices[20]);
		$this->r70All($this->reqs[70]);
		$this->r80All($this->reqs[80]);
		$this->basicCleanup();
	}

    /**
     * Verify Host Connection
     *
     * @return null
     */
    private function r10All(&$test)
    {
        try {

            if ($this->isFailedState($test)) {
                return;
            }

            //Host check
            $parsed_host_info = DUPX_DB::parseDBHost($this->in->dbhost);
            $parsed_host      = $parsed_host_info[0];
            $isInvalidHost    = $parsed_host == 'http' || $parsed_host == "https";

            if ($isInvalidHost) {
                $fixed_host = DupLiteSnapLibIOU::untrailingslashit(str_replace($parsed_host."://","",$this->in->dbhost));
                $test['pass'] = 0;
                $test['info'] = "<b>[".htmlentities($this->in->dbhost)."]</b> is not a valid input. Try using <b>[$fixed_host]</b> instead.";
                return;
            }

            $this->dbh = DUPX_DB::connect($this->in->dbhost, $this->in->dbuser, $this->in->dbpass, null);
            if ($this->dbh) {
                $test['pass'] = 1;
                $test['info'] = "The user <b>[".htmlentities($this->in->dbuser)."]</b> successfully connected to the database server on host <b>[".htmlentities($this->in->dbhost)."]</b>.";
            } else {
                $msg          = "Unable to connect the user <b>[".htmlentities($this->in->dbuser)."]</b> to the host <b>[".htmlentities($this->in->dbhost)."]</b>";
                $test['pass'] = 0;
                $test['info'] = (mysqli_connect_error()) ? "{$msg}. The server error response was: <i>".htmlentities(mysqli_connect_error()).'</i>' : "{$msg}. Please contact your hosting provider or server administrator.";
            }
        }
        catch (Exception $ex) {
            $test['pass'] = 0;
            $test['info'] = "Unable to connect the user <b>[".htmlentities($this->in->dbuser)."]</b> to the host <b>[".htmlentities($this->in->dbhost)."]</b>.<br/>".$this->formatError($ex);
        }
    }

	/**
	 * Check Server Version
	 *
	 * @return null
	 */
	private function r20All(&$test)
	{
		try {

			if ($this->isFailedState($test)) {
				return;
			}

			$db_version		 = DUPX_DB::getVersion($this->dbh);
			$db_version_pass = version_compare('5.0.0', $db_version) <= 0;

			if ($db_version_pass) {
				$test['pass']	 = 1;
				$test['info']	 = "This test passes with a current database version of <b>[".htmlentities($db_version)."]</b>";
			} else {
				$test['pass']	 = 0;
				$test['info']	 = "The current database version is <b>[".htmlentities($db_version)."]</b> which is below the required version of 5.0.0  "
					."Please work with your server admin or hosting provider to update the database server.";
			}

		} catch (Exception $ex) {
			$test['pass']	 = 0;
			$test['info']	 = "Unable to properly check the database server version number.<br/>" . $this->formatError($ex);
		}
	}

	/**
	 * Create New Database Basic Test
	 * Use selects: 'Create New Database for basic
	 *
	 * @return null
	 */
	private function r30Basic(&$test)
	{
		try {

			if ($this->isFailedState($test)) {
				return;
			}

			//DATABASE EXISTS
			$db_found = mysqli_select_db($this->dbh, $this->in->dbname);
			if ($db_found) {
				$test['pass']	 = 0;
				$test['info']	 = "DATABASE CREATION FAILURE: A database named <b>[".htmlentities($this->in->dbname)."]</b> already exists.<br/><br/>"
							."Please continue with the following options:<br/>"
							."- Choose a different database name or remove this one.<br/>"
							."- Change the action drop-down to an option like \"Connect and Remove All Data\".<br/>";
				return;
			}

			//CREATE & DROP DB
			$result		 = mysqli_query($this->dbh, "CREATE DATABASE IF NOT EXISTS `".mysqli_real_escape_string($this->dbh, $this->in->dbname)."`");
			$db_found	 = mysqli_select_db($this->dbh, mysqli_real_escape_string($this->dbh, $this->in->dbname));

			if (!$db_found) {
				$test['pass']	 = 0;
				$test['info']	 = sprintf(ERR_DBCONNECT_CREATE, htmlentities($this->in->dbname));
				$test['info'] .= "\nError Message: ".mysqli_error($this->dbh);
			} else {
				$this->newDBMade = true;
				$test['pass']	= 1;
				$test['info'] = "Database <b>[".htmlentities($this->in->dbname)."]</b> was successfully created and dropped.  The user has enough privileges to create a new database with the "
							. "'Basic' option enabled.";
			}
		} catch (Exception $ex) {
			$test['pass']	 = 0;
			$test['info']	 = "Error creating database <b>[".htmlentities($this->in->dbname)."]</b>.<br/>" . $this->formatError($ex);
		}
	}

	/**
	 * Confirm Database Visibility for Basic
	 *
	 * @return null
	 */
	private function r40Basic(&$test)
	{
		try {

			if ($this->isFailedState($test)) {
				return;
			}

			//Show Databases by the host account, otherwise a timeout
			//to issue the 'Show Databases' query may occur on some hosts
			$host_user = substr_replace($this->in->dbuser, '', strpos($this->in->dbuser, '_'));
			$this->databases = DUPX_DB::getDatabases($this->dbh, $host_user);

			$db_found = mysqli_select_db($this->dbh, $this->in->dbname);
			if (!$db_found) {
				$test['pass'] = 0;
				$test['info'] = "The user '<b>[".htmlentities($this->in->dbuser)."]</b>' is unable to see the database named '<b>[".htmlentities($this->in->dbname)."]</b>'.  "
					. "Be sure the database name already exists and check that the database user has access to the database.  "
                                        . "If you want to create a new database choose the action 'Create New Database'.";
			} else {
				$test['pass'] = 1;
				$test['info'] = "The database user <b>[".htmlentities($this->in->dbuser)."]</b> has visible access to see the database named <b>[".htmlentities($this->in->dbname)."]</b>";
			}

		} catch (Exception $ex) {
			$test['pass'] = 0;
			$test['info'] = "The user '<b>[".htmlentities($this->in->dbuser)."]</b>' is unable to see the database named '<b>[".htmlentities($this->in->dbname)."]</b>'.  "
				. "Be sure the database name already exists and check that the database user has access to the database.  "
                                . "If you want to create a new database choose the action 'Create New Database'<br/>" . $this->formatError($ex);
		}
	}

	/**
	 * Manual Table Check
	 *
	 * User chooses "Manual SQL Execution"
	 * Core WP has 12 tables. Check to make sure at least 10 are present
	 * otherwise present an error message
	 *
	 * @return null
	 */
	private function r50All(&$test)
	{
		try {

			if ($this->isFailedState($test)) {
				return;
			}

			$tblcount = DUPX_DB::countTables($this->dbh, htmlentities($this->in->dbname));

			if ($tblcount < 10) {
				$test['pass']	 = 0;
				$test['info']	 = sprintf(ERR_DBMANUAL, htmlentities($this->in->dbname), htmlentities($tblcount));
			} else {
				$test['pass']	 = 1;
				$test['info']	 = "This test passes.  A WordPress database looks to be setup.";
			}

		} catch (Exception $ex) {
			$test['pass']	 = 0;
			$test['info']	 = "The database user <b>[".htmlentities($this->in->dbuser)."]</b> has visible access to see the database named <b>[".htmlentities($this->in->dbname)."]</b> .<br/>" . $this->formatError($ex);
		}
	}

	/**
	 * Test User Table privileges
	 *
	 * @return null
	 */
	private function r60All(&$test)
	{
		try {

			if ($this->isFailedState($test)) {
				return;
			}

			$this->checkTablePerms();

			if ($this->tblPerms['all']) {
				$test['pass']	 = 1;
				$test['info']	 = "The user <b>[".htmlentities($this->in->dbuser)."]</b> has the correct privileges on the database <b>[".htmlentities($this->in->dbname)."]</b>";
			} else {
				$list		 = array();
				$test['pass']	 = 0;
				foreach ($this->tblPerms as $key => $val) {
					if ($key != 'all') {
						if ($val == false) array_push($list, $key);
					}
				}
				$list		 = implode(',', $list);
				$test['info']	 = "The user <b>[".htmlentities($this->in->dbuser)."]</b> is missing the privileges <b>[".htmlentities($list)."]</b> on the database <b>[".htmlentities($this->in->dbname)."]</b>";
			}

		} catch (Exception $ex) {
			$test['pass']	 = 0;
			$test['info']	 = "Failure in attempt to read the users table priveleges.<br/>" . $this->formatError($ex);
		}
	}

	/**
	 * Check Collation Capability
	 *
	 * @return null
	 */
	private function r70All(&$test)
	{
		try {
			if ($this->isFailedState($test)) {
				return;
			}

			$this->collationStatus = DUPX_DB::getCollationStatus($this->dbh, $this->ac->dbInfo->collationList);

            $collation_arr = array(
                'utf8mb4_unicode_520_ci',
                'utf8mb4_unicode_520',
                'utf8mb4_unicode_ci',
                'utf8mb4',
                'utf8_unicode_520_ci',
                'utf8_unicode_520',
                'utf8_unicode_ci',
                'utf8',
            );
			$invalid = 0;
			$collation_arr_max = count($collation_arr);
			$invalid_match = 0;

			foreach($this->collationStatus as $key => $val) {
				if ($this->collationStatus[$key]['found'] == 0) {
				    if($this->in->dbcollatefb){
				        $not_supported_col = $this->collationStatus[$key]['name'];
                        for($i = 0; $i < $collation_arr_max; $i++) {
							$col_status = DUPX_DB::getCollationStatus($this->dbh, array($collation_arr[$i]));
							$cur_col_is_supported = $col_status[0]['found'];
							if($cur_col_is_supported){
								$this->collationReplaceList[] = array(
									'search'    => $not_supported_col,
									'replace'   => $collation_arr[$i]
								);
								++$invalid_match;
								break;
							}
						}
						$invalid = 1;
                    	break;
                    } else {
                        $invalid = 1;
                        break;
                    }
				}
			}

			if($invalid_match > 0) {
				$invalid = -1;
			}

			if ($invalid === 1) {
				$test['pass']	 = 0;
				$test['info']	 = "Please check the 'Legacy' checkbox in the options section and then click the 'Retry Test' link.<br/>"
								 . "<small>Details: The database where the package was created has a collation that is not supported on this server.  This issue happens "
								 . "when a site is moved from an older version of MySQL to a newer version of MySQL. The recommended fix is to update MySQL on this server to support "
								 . "the collation that is failing below.  If that is not an option for your host then continue by clicking the 'Legacy' checkbox above.  For more "
								 . "details about this issue and other details regarding this issue see the FAQ link below. </small>";
			} else if($invalid === -1) {
                $test['pass']	 = 1;
                $test['info']	 = "There is at least one collation that is not supported, however a replacement collation is possible.  Please continue by clicking the next button and the "
								 . "installer will attempt to use a legacy/fallback collation type to create the database table.  For more details about this issue see the FAQ link below.";
            } else {
				$test['pass']	 = 1;
				$test['info']	 = "Collation test passed! This database supports the required table collations.";
			}

		} catch (Exception $ex) {
			//Return '1' to allow user to continue
			$test['pass']	 = 1;
			$test['info']	 = "Failure in attempt to check collation capability status.<br/>" . $this->formatError($ex);
		}

	}

	/**
	 * Check GTID mode
	 *
	 * @return null
	 */
	private function r80All(&$test)
	{
		try {
			if ($this->isFailedState($test)) {
				return;
			}

			$gtid_mode_enabled = false;
			$query  = "SELECT @@GLOBAL.GTID_MODE";
			$result = mysqli_query($this->dbh, $query);

			if ($result = mysqli_query($this->dbh, $query)) {
				if ($row = mysqli_fetch_array($result, MYSQLI_NUM)) {
					if ('ON' == $row[0] || 'on' == $row[0])
						$gtid_mode_enabled = true;
				}
			}

			// $gtid_mode_enabled = true;
			if ($gtid_mode_enabled) {
				$test['pass'] = 2;
				$test['info'] = "Your database server have GTID mode is on, It might make a trouble in Database installation.<br/>"
								 . "<small>Details: You might face the error something like Statement violates GTID consistency. "
								 . "You should ask hosting provider to make off GTID off. "
								 . "You can make off GTID mode as decribed in the <a href='https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-disable-gtids.html' target='_blank'>https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-disable-gtids.html</a>"
								 . "</small>";
			} else {
				$test['pass'] = 1;
				$test['info'] = "The installer has not detected GTID mode.";
			}
		} catch (Exception $ex) {			
			//Return '1' to allow user to continue
			$test['pass'] = 1;
			$test['info'] = "Failure in attempt to check GTID mode status.<br/>" . $this->formatError($ex);
		}
	}

	/**
	 * Table Case Compatibility
	 *
	 * Failure occurs when:
	 *		BuildServer = lower_case_table_names=1		&&
	 *		BuildServer = HasATableUpperCase			&&
	 *		InstallServer = lower_case_table_names=0
	 *
	 * @return null
	 */
	private function n10All(&$test)
	{
		try {

			if ($this->isFailedState($test)) {
				return;
			}

			$localhostLowerCaseTables = DUPX_DB::getVariable($this->dbh, 'lower_case_table_names');
			$localhostLowerCaseTables = (empty($localhostLowerCaseTables) && DUPX_U::isWindows()) ? 0 : $localhostLowerCaseTables;

			if (isset($this->ac->dbInfo->isTablesUpperCase) && $this->ac->dbInfo->isTablesUpperCase && $this->ac->dbInfo->varLowerCaseTables == 1 && $localhostLowerCaseTables == 0) {
				$test['pass']	 = 0;
				$test['info']	 = "An upper case table name was found in the database SQL script and the server variable lower_case_table_names is set  "
					. "to <b>[".htmlentities($localhostLowerCaseTables)."]</b>.  When both of these conditions are met it can lead to issues with creating tables with upper case characters.  "
					. "<br/><b>Options</b>:<br/> "
					. " - On this server have the host company set the lower_case_table_names value to 1 or 2 in the my.cnf file.<br/>"
					. " - On the build server set the lower_case_table_names value to 2 restart server and build package.<br/>"
					. " - Optionally continue the install with data creation issues on upper case tables names.<br/>";
			} else {
				$test['pass']	 = 1;
				$test['info']	 = "No table casing issues detected. This servers variable setting for lower_case_table_names is [{$localhostLowerCaseTables}]";
			}

		} catch (Exception $ex) {
			//Return '1' to allow user to continue
			$test['pass']	 = 1;
			$test['info']	 = "Failure in attempt to read the upper case table status.<br/>" . $this->formatError($ex);
		}
	}

    /**
     * Show source site trigger creates
     *
     * @return null
     */
    private function n20All(&$test)
    {
        if ($this->isFailedState($test)) {
            return;
        }

        $triggers = (array)$this->ac->dbInfo->triggerList;
        if (count($triggers) > 0) {
            $test['pass'] = 0;
            $test['info'] = "";

            foreach ($triggers as $trigger) {
                $test['info'] .= $trigger->create."\n\n";;
            }

        } else {
            $test['pass'] = 1;
            $test['info'] = "Source site did not contain triggers.";
        }
    }

	/**
	 * Input has UTF8 data
	 *
	 * @return null
	 */
	private function n30All(&$test)
	{
		try {

			if ($this->isFailedState($test)) {
				return;
			}

			//WARNNG: Input has utf8 data
			$dbConnItems = array($this->in->dbhost, $this->in->dbuser, $this->in->dbname, $this->in->dbpass);
			$dbUTF8_tst	 = false;
			foreach ($dbConnItems as $value) {
				if (DUPX_U::isNonASCII($value)) {
					$dbUTF8_tst = true;
					break;
				}
			}

			if (!$dbConn && $dbUTF8_tst) {
				$test['pass']	 = 0;
				$test['info']	 = ERR_TESTDB_UTF8;

			} else {
				$test['pass']	 = 1;
				$test['info']	 = "Connection string is using all non-UTF8 characters and should be safe.";
			}

		} catch (Exception $ex) {
			//Return '1' to allow user to continue
			$test['pass']	 = 1;
			$test['info']	 = "Failure in attempt to read input has utf8 data status.<br/>" . $this->formatError($ex);
		}
	}

	/**
	 * Runs a series of CREATE, INSERT, SELECT, UPDATE, DELETE and DROP statements
	 * on a temporary test table to find out the state of the users privileges
	 *
	 * @return null
	 */
	private function checkTablePerms()
	{

		if ($this->permsChecked) {
			return;
		}

		mysqli_select_db($this->dbh, mysqli_real_escape_string($this->dbh, $this->in->dbname));
		$tmp_table	 = '__dpro_temp_'.rand(1000, 9999).'_'.date("ymdHis");
		$qry_create	 = @mysqli_query($this->dbh, "CREATE TABLE `".mysqli_real_escape_string($this->dbh, $tmp_table)."` (
						`id` int(11) NOT NULL AUTO_INCREMENT,
						`text` text NOT NULL,
						PRIMARY KEY (`id`))");

		$this->tblPerms['create'] = ($qry_create) ? 1 : 0;

		if ($qry_create) {
			$qry_insert	 = @mysqli_query($this->dbh, "INSERT INTO `".mysqli_real_escape_string($this->dbh, $tmp_table)."` (`text`) VALUES ('Duplicator Test: Please Remove this Table')");
			$qry_insert	 = @mysqli_query($this->dbh, "INSERT INTO `".mysqli_real_escape_string($this->dbh, $tmp_table)."` (`text`) VALUES ('TEXT-1')");
			$qry_select	 = @mysqli_query($this->dbh, "SELECT COUNT(*) FROM `".mysqli_real_escape_string($this->dbh, $tmp_table)."`");
			$qry_update	 = @mysqli_query($this->dbh, "UPDATE `".mysqli_real_escape_string($this->dbh, $tmp_table)."` SET text = 'TEXT-2' WHERE text = 'TEXT-1'");
			$qry_delete	 = @mysqli_query($this->dbh, "DELETE FROM `".mysqli_real_escape_string($this->dbh, $tmp_table)."` WHERE text = 'TEXT-2'");
			$qry_drop	 = @mysqli_query($this->dbh, "DROP TABLE IF EXISTS `".mysqli_real_escape_string($this->dbh, $tmp_table)."`;");

			$this->tblPerms['insert']	 = ($qry_insert) ? 1 : 0;
			$this->tblPerms['select']	 = ($qry_select) ? 1 : 0;
			$this->tblPerms['update']	 = ($qry_update) ? 1 : 0;
			$this->tblPerms['delete']	 = ($qry_delete) ? 1 : 0;
			$this->tblPerms['drop']	 = ($qry_drop) ? 1 : 0;
		}

		$this->tblPerms['all'] = $this->tblPerms['create'] && $this->tblPerms['insert'] && $this->tblPerms['select'] &&
			$this->tblPerms['update'] && $this->tblPerms['delete'] && $this->tblPerms['drop'];

		$this->permsChecked = true;
	}

        /**
	 * Return the sql_mode set for the database
	 *
	 * @return null
	 */
	private function checkSQLMode()
	{
		if ($this->sqlmodeChecked) {
			return;
		}

        $qry_sqlmode	 = @mysqli_query($this->dbh, "SELECT @@GLOBAL.sql_mode as mode");
        if($qry_sqlmode){
            $sql_mode_array = mysqli_fetch_assoc($qry_sqlmode);

            if($sql_mode_array !== false) {
                $this->sql_modes = $sql_mode_array['mode'];
            } else {
                $this->sql_modes ="query failed <br/>".htmlentities(@mysqli_error($this->dbh));
            }

        }else{
           $this->sql_modes ="query failed <br/>".htmlentities(@mysqli_error($this->dbh));
        }

		$this->sqlmodeChecked = true;
        return $this->sql_modes;
	}

    /**
	 * Test if '0000-00-00' date query fails or not
	 *
	 * @return null
	 */
	private function testDateInsert()
	{
		if ($this->dateInsertChecked) {
			return;
		}

		mysqli_select_db($this->dbh, $this->in->dbname);

		$tmp_table	 = '__dpro_temp_'.rand(1000, 9999).'_'.date("ymdHis");
		$tmp_table	 = mysqli_real_escape_string($dbh, $tmp_table);

		$qry_create	 = @mysqli_query($this->dbh, "CREATE TABLE `{$tmp_table}` (
						`datetimefield` datetime NOT NULL,
						`datefield` date NOT NULL)");

		if ($qry_create) {
            $qry_date    = @mysqli_query($this->dbh, "INSERT INTO `".$tmp_table."` (`datetimefield`,`datefield`) VALUES ('0000-00-00 00:00:00','0000-00-00')");

            if($qry_date) {
                 $this->queryDateInserted = true;
            }
		}

		$this->dateInsertChecked = true;

        return $this->queryDateInserted;
	}

	/**
	 * Cleans up basic setup items when test mode is enabled
	 *
	 * @return null
	 */
	private function basicCleanup()
	{
		//TEST MODE ONLY
		if ($this->runMode == 'TEST') {

			//DELETE DB
			if ($this->newDBMade && $this->in->dbaction == 'create') {
				$result	= mysqli_query($this->dbh, "DROP DATABASE IF EXISTS `".mysqli_real_escape_string($this->dbh, $this->in->dbname)."`");
				if (!$result) {
					$this->reqs[30][pass] = 0;
					$this->reqs[30][info] = "The database <b>[".htmlentities($this->in->dbname)."]</b> was successfully created. However removing the database was not successful with the following response.<br/>"
								."Response Message: <i>".htmlentities(mysqli_error($this->dbh))."</i>.  This database may need to be removed manually.";
				}
			}
		}
	}

	/**
	 * Checks if any previous test has failed.  If so then prevent the current test
	 * from running
	 *
	 * @return null
	 */
	private function isFailedState(&$test)
	{
		foreach ($this->reqs as $key => $value) {
			if ($this->reqs[$key]['pass'] == 0) {
				$test['pass']	 = -1;
				$test['info']	 = 'This test has been skipped because a higher-level requirement failed. Please resolve previous failed tests.';
				return true;
			}
		}
		return false;
	}

	/**
	 * Gathers all the test data and builds a summary result
	 *
	 * @return null
	 */
	private function buildStateSummary()
	{
		$req_status		 = 1;
		$notice_status	 = -1;
		$last_error		 = 'Unable to determine error response';
		foreach ($this->reqs as $key => $value) {
			if ($this->reqs[$key]['pass'] == 0) {
				$req_status	 = 0;
				$last_error	 = $this->reqs[$key]['info'];
				break;
			}
		}

		if (1 == $req_status) {
			foreach ($this->reqs as $key => $value) {
				if ($this->reqs[$key]['pass'] == 2) {
					$req_status = 2;
					break;
				}
			}	
		}

		//Only show notice summary if a test was ran
		foreach ($this->notices as $key => $value) {
			if ($this->notices[$key]['pass'] == 0) {
				$notice_status = 0;
				break;
			} elseif ($this->notices[$key]['pass'] == 1) {
				$notice_status = 1;
			}
		}

		$this->lastError	 = $last_error;
		$this->reqsPass		 = $req_status;
		$this->noticesPass	 = $notice_status;
	}

	/**
	 * Converts all test info messages to either TEXT or HTML format
	 *
	 * @return null
	 */
	private function buildDisplaySummary()
	{
		if ($this->displayMode == 'TEXT') {
			//TODO: Format for text
		} else {
			//TODO: Format for html
		}
	}

	private function formatError(Exception $ex)
	{
		return "Message: " . htmlentities($ex->getMessage()) . "<br/>Line: " . htmlentities($ex->getFile()) . ':' . htmlentities($ex->getLine());
	}
}
installer/dup-installer/ctrls/ctrl.s2.dbinstall.php000064400000107021151336065400016432 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUPX_DBInstall
{
    const USER_DEFINER_REPLACE_PATTERN = "/^(\s*(?:\/\*!\d+\s)?\s*(?:CREATE.+)?DEFINER\s*=)(\S+)(.*)$/m";
    const USER_DEFINER_REMOVE_PATTERN  = "/^(\s*(?:\/\*!\d+\s)?\s*(?:CREATE.+)?)(DEFINER\s*=\s*\S+)(.*)$/m";
    const SQL_SECURITY_INVOKER_PATTERN = "/^([\s\t]*CREATE.+(?:PROCEDURE|FUNCTION)[\s\S]*)(BEGIN)([\s\S]*)$/";
    const SQL_SECURITY_INVOKER_REPLACE = "$1SQL SECURITY INVOKER\n$2$3";
    const QUERY_ERROR_LOG_LEN          = 200;

    private $dbh;
    private $post;
    public $sql_result_data;
    public $sql_result_data_length;
    public $dbvar_maxtime;
    public $dbvar_maxpacks;
    public $dbvar_sqlmode;
    public $dbvar_version;
    public $pos_in_sql;
    public $sql_file_path;
    public $sql_result_file_path;
    public $php_mem;
    public $php_mem_range;
    public $php_used_mem;
    public $table_count;
    public $table_rows;
    public $query_errs;
    public $root_path;
    public $drop_tbl_log;
    public $rename_tbl_log;
    public $dbquery_errs;
    public $dbquery_rows;
    public $dbtable_count;
    public $dbtable_rows;
    public $dbdelete_count;
    public $profile_start;
    public $profile_end;
    public $start_microtime;
    public $dbcollatefb;
    public $dbobj_views;
    public $dbobj_procs;
    public $dbobj_funcs;
    public $dbRemoveDefiner;
	public $dbFileSize = 0;
	public $dbDefinerReplace;

    public function __construct($post, $start_microtime)
    {
        $this->post                 = $post;
        $this->php_mem              = $GLOBALS['PHP_MEMORY_LIMIT'];
        $this->php_used_mem         = memory_get_usage();
        $this->php_mem_range        = 1024 * 1024;
        $this->root_path            = $GLOBALS['DUPX_ROOT'];
        $this->sql_file_path        = "{$GLOBALS['DUPX_INIT']}/dup-database__{$GLOBALS['DUPX_AC']->package_hash}.sql";
        $this->sql_result_file_path = "{$GLOBALS['DUPX_INIT']}/{$GLOBALS['SQL_FILE_NAME']}";
        $this->dbFileSize			= @filesize($this->sql_file_path);

        //ESTABLISH CONNECTION
        $this->dbh = DUPX_DB::connect($post['dbhost'], $post['dbuser'], $post['dbpass']);
        ($this->dbh) or DUPX_Log::error(ERR_DBCONNECT.mysqli_connect_error());
        if ($_POST['dbaction'] == 'empty' || $post['dbaction'] == 'rename') {
            mysqli_select_db($this->dbh, $post['dbname'])
                or DUPX_Log::error(sprintf(ERR_DBCREATE, $post['dbname']));
        }

        //PHP 8.1 throws exceptions vs pre 8.1 which silently fails
        try {
            @mysqli_query($this->dbh, "SET wait_timeout = ".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_TIME']));
            $qryResult = @mysqli_query($this->dbh, "SET GLOBAL max_allowed_packet = ".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_PACKETS']));
			if ($qryResult === false) {
				@mysqli_query($this->dbh, "SET max_allowed_packet = ".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_PACKETS']));
			}
        }
        catch (Exception $ex) {
             DUPX_Log::info("SQL ERROR:" . $ex->getMessage() . "\n" . $ex->getTraceAsString());
        }

        $this->profile_start    = isset($post['profile_start']) ? DUPX_U::sanitize_text_field($post['profile_start']) : DUPX_U::getMicrotime();
        $this->start_microtime  = isset($post['start_microtime']) ? DUPX_U::sanitize_text_field($post['start_microtime']) : $start_microtime;
        $this->dbvar_maxtime    = DUPX_DB::getVariable($this->dbh, 'wait_timeout');
        $this->dbvar_maxpacks   = DUPX_DB::getVariable($this->dbh, 'max_allowed_packet');
        $this->dbvar_sqlmode    = DUPX_DB::getVariable($this->dbh, 'sql_mode');
        $this->dbvar_version    = DUPX_DB::getVersion($this->dbh);
        $this->dbvar_maxtime    = is_null($this->dbvar_maxtime) ? 300 : $this->dbvar_maxtime;
        $this->dbvar_maxpacks   = is_null($this->dbvar_maxpacks) ? 1048576 : $this->dbvar_maxpacks;
        $this->dbvar_sqlmode    = empty($this->dbvar_sqlmode) ? 'NOT_SET' : $this->dbvar_sqlmode;
        $definerHost            = $this->post["dbhost"] == "localhost" || $this->post["dbhost"] == "127.0.0.1" ? $this->post["dbhost"] : '%';
        $this->dbDefinerReplace = '$1' . addcslashes("`" . $this->post["dbuser"] . "`@`" . $definerHost . "`", '\\$') . '$3';
        $this->dbquery_errs     = isset($post['dbquery_errs']) ? DUPX_U::sanitize_text_field($post['dbquery_errs']) : 0;
        $this->drop_tbl_log     = isset($post['drop_tbl_log']) ? DUPX_U::sanitize_text_field($post['drop_tbl_log']) : 0;
        $this->rename_tbl_log   = isset($post['rename_tbl_log']) ? DUPX_U::sanitize_text_field($post['rename_tbl_log']) : 0;
        $this->dbquery_rows     = isset($post['dbquery_rows']) ? DUPX_U::sanitize_text_field($post['dbquery_rows']) : 0;
        $this->dbdelete_count   = isset($post['dbdelete_count']) ? DUPX_U::sanitize_text_field($post['dbdelete_count']) : 0;
        $this->dbcollatefb      = isset($post['dbcollatefb']) ? DUPX_U::sanitize_text_field($post['dbcollatefb']) : 0;
        $this->dbobj_views      = isset($post['dbobj_views']) ? DUPX_U::sanitize_text_field($post['dbobj_views']) : 0;
        $this->dbobj_procs      = isset($post['dbobj_procs']) ? DUPX_U::sanitize_text_field($post['dbobj_procs']) : 0;
        $this->dbobj_funcs      = isset($post['dbobj_funcs']) ? DUPX_U::sanitize_text_field($post['dbobj_funcs']) : 0;
        $this->dbRemoveDefiner  = isset($post['db_remove_definer']) ? DUPX_U::sanitize_text_field($post['db_remove_definer']) : 0;
    }

    public function prepareDB()
    {
        //RUN DATABASE SCRIPT
        //PHP 8.1 throws exceptions vs pre-8.1 which silently fails
        try {
            @mysqli_query($this->dbh, "SET wait_timeout = ".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_TIME']));
            $qryResult = @mysqli_query($this->dbh, "SET GLOBAL max_allowed_packet = ".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_PACKETS']));
            if ($qryResult === false) {
                @mysqli_query($this->dbh, "SET max_allowed_packet = ".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_PACKETS']));
            }
        }
        catch (Exception $ex) {
             DUPX_Log::info("SQL ERROR:" . $ex->getMessage() . "\n" . $ex->getTraceAsString());
        }

        DUPX_DB::setCharset($this->dbh, $this->post['dbcharset'], $this->post['dbcollate']);

        //Will set mode to null only for this db handle session
        //sql_mode can cause db create issues on some systems
        switch ($this->post['dbmysqlmode']) {
            case 'DISABLE':
                @mysqli_query($this->dbh, "SET SESSION sql_mode = ''");
                break;
            case 'CUSTOM':
                $dbmysqlmode_opts = $this->post['dbmysqlmode_opts'];

                $qry_session_custom = @mysqli_query($this->dbh, "SET SESSION sql_mode = '".mysqli_real_escape_string($this->dbh, $dbmysqlmode_opts)."'");
                if ($qry_session_custom == false) {
                    $sql_error = mysqli_error($this->dbh);
                    $log       = "WARNING: A custom sql_mode setting issue has been detected:\n{$sql_error}.\n";
                    $log       .= "For more details visit: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html\n";
                }
                break;
        }

        //Set defaults incase the variable could not be read
        $this->drop_tbl_log   = 0;
        $this->rename_tbl_log = 0;
        $sql_file_size	= DUPX_U::readableByteSize(@filesize("{$GLOBALS['DUPX_INIT']}/dup-database__{$GLOBALS['DUPX_AC']->package_hash}.sql"));
        $collate_fb		= $this->dbcollatefb ? 'On' : 'Off';

        DUPX_Log::info("--------------------------------------");
        DUPX_Log::info('DATABASE-ENVIRONMENT');
        DUPX_Log::info("--------------------------------------");
        DUPX_Log::info("MYSQL VERSION:\tThis Server: {$this->dbvar_version} -- Build Server: {$GLOBALS['DUPX_AC']->version_db}");
        DUPX_Log::info("FILE SIZE:\tdup-database__{$GLOBALS['DUPX_AC']->package_hash}.sql ({$sql_file_size})");
        DUPX_Log::info("TIMEOUT:\t{$this->dbvar_maxtime}");
        DUPX_Log::info("MAXPACK:\t{$this->dbvar_maxpacks}");
        DUPX_Log::info("SQLMODE:\t{$this->dbvar_sqlmode}");
        DUPX_Log::info("NEW SQL FILE:\t[{$this->sql_result_file_path}]");
        DUPX_Log::info("COLLATE FB:\t{$collate_fb}");

        if (version_compare($this->dbvar_version, $GLOBALS['DUPX_AC']->version_db) < 0) {
            DUPX_Log::info("\nNOTICE: This servers version [{$this->dbvar_version}] is less than the build version [{$GLOBALS['DUPX_AC']->version_db}].  \n"
                ."If you find issues after testing your site please referr to this FAQ item.\n"
                ."https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-260-q");
        }

        //CREATE DB
        switch ($this->post['dbaction']) {
            case "create":
                if ($this->post['view_mode'] == 'basic') {
                    mysqli_query($this->dbh, "CREATE DATABASE IF NOT EXISTS `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`");
                }
                mysqli_select_db($this->dbh, mysqli_real_escape_string($this->dbh, $this->post['dbname']))
                    or DUPX_Log::error(sprintf(ERR_DBCONNECT_CREATE, $this->post['dbname']));
                break;

            //DROP DB TABLES:  DROP TABLE statement does not support views
            case "empty":
                //Drop all tables, views, funcs and procs
                $this->dropTables();
                $this->dropViews();
                $this->dropProcs();
                $this->dropFuncs();
                break;

            //RENAME DB TABLES
            case "rename" :
                $sql          = "SHOW TABLES FROM `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."` WHERE  `Tables_in_".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."` NOT LIKE '".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_RENAME_PREFIX'])."%'";
                $found_tables = null;
                if ($result       = mysqli_query($this->dbh, $sql)) {
                    while ($row = mysqli_fetch_row($result)) {
                        $found_tables[] = $row[0];
                    }
                    if (count($found_tables) > 0) {
                        foreach ($found_tables as $table_name) {
                            $sql    = "RENAME TABLE `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $table_name)."` TO  `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_RENAME_PREFIX']).mysqli_real_escape_string($this->dbh, $table_name)."`";
                            if (!$result = mysqli_query($this->dbh, $sql)) {
                                DUPX_Log::error(sprintf(ERR_DBTRYRENAME, "{$this->post['dbname']}.{$table_name}"));
                            }
                        }
                        $this->rename_tbl_log = count($found_tables);
                    }
                }
                break;
        }

    }

    public function getRowCountMisMatchTables()
    {
        $nManager = DUPX_NOTICE_MANAGER::getInstance();
        
        $tableWiseRowCounts = $GLOBALS['DUPX_AC']->dbInfo->tableWiseRowCounts;
        $skipTables = array(
            $GLOBALS['DUPX_AC']->wp_tableprefix."duplicator_packages",
            $GLOBALS['DUPX_AC']->wp_tableprefix."options",
            $GLOBALS['DUPX_AC']->wp_tableprefix."duplicator_pro_packages",
            $GLOBALS['DUPX_AC']->wp_tableprefix."duplicator_pro_entities",
        );
        $misMatchTables = array();
        foreach ($tableWiseRowCounts as $table => $rowCount) {
            if (in_array($table, $skipTables)) {
                continue;
            }
            $sql = "SELECT count(*) as cnt FROM `".mysqli_real_escape_string($this->dbh, $table)."`";
            $result = mysqli_query($this->dbh, $sql); 
            if (false !== $result) {
                $row = mysqli_fetch_assoc($result);
                if ($rowCount != ($row['cnt'])) {
                    $errMsg = 'DATABASE: table '.DUPX_Log::varToString($table).' row count mismatch; expected '.DUPX_Log::varToString($rowCount).' in database'.DUPX_Log::varToString($row['cnt']);
                    DUPX_Log::info($errMsg);
                    $nManager->addBothNextAndFinalReportNotice(array(
                        'shortMsg' => 'Database Table row count validation was failed',
                        'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
                        'longMsg' => $errMsg."\n",
                        'sections' => 'database'
                    ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'row-count-mismatch');
                    
                    $misMatchTables[] = $table;
                }
            }
        }
        return $misMatchTables;
    }

    public function writeInDB()
    {
        //WRITE DATA
        $fcgi_buffer_pool  = 5000;
        $fcgi_buffer_count = 0;
        $counter           = 0;
        if (!empty($sql_data)) {
            $this->sql_result_data = $sql_data;
        }

        $handle = fopen($this->sql_file_path, 'rb');
       	if ($handle === false) {
            return false;
        }

        $nManager = DUPX_NOTICE_MANAGER::getInstance();

        @mysqli_autocommit($this->dbh, false);

        $query = '';
        $delimiter = ';';

        while (($line = fgets($handle)) !== false) {
            if ('DELIMITER ;' == trim($query)) {
                $delimiter = ';';
                $query = '';
                continue;
            }
            $query .= $line;
            if (preg_match('/'.$delimiter.'\s*$/S', $query)) {
                $query_strlen = strlen(trim($query));
                if ($this->dbvar_maxpacks < $query_strlen) {
                    $errorMsg = "**ERROR** Query size limit [length={$this->dbvar_maxpacks}] [sql=".substr($this->sql_result_data[$counter], 0, 75)."...]";
                    $this->dbquery_errs++;
                    $nManager->addNextStepNoticeMessage('QUERY ERROR: size limit' , DUPX_NOTICE_ITEM::SOFT_WARNING , DUPX_NOTICE_MANAGER::ADD_UNIQUE , 'query-size-limit-msg');
                    $nManager->addFinalReportNotice(array(
                            'shortMsg' => 'QUERY ERROR: size limit',
                            'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
                            'longMsg' => $errorMsg,
                            'sections' => 'database'
                    ));
                    DUPX_Log::info($errorMsg);
                } elseif ($query_strlen > 0) {
                    $query = $this->nbspFix($query);
                    $query = $this->applyQueryCollationFallback($query);
                    $query = $this->applyQueryProcAndViewFix($query);

                    // $query = $this->queryDelimiterFix($query);
                    $query = trim($query);
                    if (0 === strpos($query, "DELIMITER")) {
                        // Ending delimiter
                        // control never comes in this if condition, but written
                        if ('DELIMITER ;' == $query) {
                            $delimiter = ';';
                        } else { // starting delimiter
                            $delimiter =  substr($query, 10);
                            $delimiter =  trim($delimiter);
                        }

                        DUPX_Log::info("Skipping delimiter query");
                        $query = '';
                        continue;
                    }

					$result = @mysqli_query($this->dbh, $query);
					if ($result instanceof mysqli_result){
						@mysqli_free_result($result);
					}

                    $err = mysqli_error($this->dbh);
                    //Check to make sure the connection is alive
                    if (!empty($err)) {
                        if (!mysqli_ping($this->dbh)) {
                            mysqli_close($this->dbh);
                            $this->dbh = DUPX_DB::connect($this->post['dbhost'], $this->post['dbuser'], $this->post['dbpass'], $this->post['dbname']);
                            // Reset session setup
                            @mysqli_query($this->dbh, "SET wait_timeout = ".mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_TIME']));
                            DUPX_DB::setCharset($this->dbh, $this->post['dbcharset'], $this->post['dbcollate']);
                        }
                        $errMsg = "**ERROR** database error write '{$err}' - [sql=".substr($query, 0, 75)."...]";
                        DUPX_Log::info($errMsg);

                        if (DUPX_U::contains($err, 'Unknown collation')) {
                            $nManager->addNextStepNotice(array(
                                'shortMsg' => 'DATABASE ERROR: database error write',
                                'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
                                'longMsg' => 'Unknown collation<br>RECOMMENDATION: Try resolutions found at https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-110-q',
                                'faqLink' => array(
                                    'url' => 'https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-110-q',
                                    'label' => 'FAQ Link'
                                )
                            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE , 'query-collation-write-msg');
                            $nManager->addFinalReportNotice(array(
                                'shortMsg' => 'DATABASE ERROR: database error write',
                                'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
                                'longMsg' => 'Unknown collation<br>RECOMMENDATION: Try resolutions found at https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-110-q'.'<br>'.$errMsg,
                                'sections' => 'database',
                                'faqLink' => array(
                                    'url' => 'https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-110-q',
                                    'label' => 'FAQ Link'
                                )
                            ));
                            DUPX_Log::info('RECOMMENDATION: Try resolutions found at https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-110-q');
                        } else {
                            $nManager->addNextStepNoticeMessage('DATABASE ERROR: database error write' , DUPX_NOTICE_ITEM::SOFT_WARNING , DUPX_NOTICE_MANAGER::ADD_UNIQUE , 'query-write-msg');
                            $nManager->addFinalReportNotice(array(
                                'shortMsg' => 'DATABASE ERROR: database error write',
                                'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
                                'longMsg' => $errMsg,
                                'sections' => 'database'
                            ));
                        }

                        $this->dbquery_errs++;

                        //Buffer data to browser to keep connection open
                    } else {
                        if ($fcgi_buffer_count++ > $fcgi_buffer_pool) {
                            $fcgi_buffer_count = 0;
                        }
                        $this->dbquery_rows++;
                    }
                }
                $query = '';
                $counter++;
            }
        }
        @mysqli_commit($this->dbh);
        @mysqli_autocommit($this->dbh, true);

        $nManager ->saveNotices();

        //DATA CLEANUP: Perform Transient Cache Cleanup
        //Remove all duplicator entries and record this one since this is a new install.
        $dbdelete_count1 = 0;
        $dbdelete_count2 = 0;

        @mysqli_query($this->dbh, "DELETE FROM `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."duplicator_packages`");
        $dbdelete_count1 = @mysqli_affected_rows($this->dbh);

        @mysqli_query($this->dbh,
                "DELETE FROM `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` WHERE `option_name` LIKE ('_transient%') OR `option_name` LIKE ('_site_transient%')");
        $dbdelete_count2 = @mysqli_affected_rows($this->dbh);

        mysqli_query($this->dbh, "DELETE FROM `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` WHERE `option_name` = 'duplicator_usage_id'");
        $dbdelete_count3 = @mysqli_affected_rows($this->dbh);
        $this->dbdelete_count += (abs($dbdelete_count1) + abs($dbdelete_count2) + abs($dbdelete_count3));

        //Reset Duplicator Options
		if (DUPX_U::isTraversable($GLOBALS['DUPX_AC']->opts_delete)) {
			foreach ($GLOBALS['DUPX_AC']->opts_delete as $value) {
				mysqli_query($this->dbh, "DELETE FROM `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` WHERE `option_name` = '".mysqli_real_escape_string($this->dbh, $value)."'");
			}
		}
		
        //Remove views from DB
        if (!$this->dbobj_views) {
            $this->dropViews();
            DUPX_Log::info("DB VIEWS:\tdisabled");
        } else {
            DUPX_Log::info("DB VIEWS:\tenabled");
        }

        //Remove procedures from DB
        if (!$this->dbobj_procs) {
            $this->dropProcs();
            DUPX_Log::info("DB PROCEDURES:\tdisabled");
        } else {
            DUPX_Log::info("DB PROCEDURES:\tenabled");
        }

        //Remove FUNCTIONS from DB
        if (!$this->dbobj_funcs) {
            $this->dropFuncs();
            DUPX_Log::info("DB FUNCTIONS:\tdisabled");
        } else {
            DUPX_Log::info("DB FUNCTIONS:\tenabled");
        }
    }

    private function dropTables()
    {
        $sql          = "SHOW FULL TABLES WHERE Table_Type != 'VIEW'";
        $found_tables = null;
        if ($result       = mysqli_query($this->dbh, $sql)) {
            while ($row = mysqli_fetch_row($result)) {
                $found_tables[] = $row[0];
            }
            if ($found_tables != null && count($found_tables) > 0) {
                mysqli_query($this->dbh, "SET FOREIGN_KEY_CHECKS = 0;");
                foreach ($found_tables as $table_name) {
                    $sql    = "DROP TABLE `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $table_name)."`";
                    if (!$result = mysqli_query($this->dbh, $sql)) {
                        DUPX_Log::error(sprintf(ERR_DROP_TABLE_TRYCLEAN, $table_name, $this->post['dbname'], mysqli_error($this->dbh)));
                    }
                }
                $this->drop_tbl_log = count($found_tables);
                mysqli_query($this->dbh, "SET FOREIGN_KEY_CHECKS = 1;");
            }
        }
    }

    private function dropProcs()
    {
        $sql    = "SHOW PROCEDURE STATUS WHERE db='{$this->post['dbname']}'";
        $found  = array();
        if ($result = mysqli_query($this->dbh, $sql)) {
            while ($row = mysqli_fetch_row($result)) {
                $found[] = $row[1];
            }
            if (count($found) > 0) {
                $nManager = DUPX_NOTICE_MANAGER::getInstance();

                foreach ($found as $proc_name) {
                    $sql    = "DROP PROCEDURE IF EXISTS `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $proc_name)."`";
                    if (!$result = mysqli_query($this->dbh, $sql)) {
                        $err = mysqli_error($this->dbh);

                        $nManager->addNextStepNotice(array(
                            'shortMsg'    => 'PROCEDURE CLEAN ERROR',
                            'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                            'longMsg'     => sprintf('Unable to remove PROCEDURE "%s" from database "%s".<br/>', $proc_name, $this->post['dbname']),
                            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                        ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'drop-proc-fail-msg');

                        $nManager->addFinalReportNotice(array(
                            'shortMsg'    => 'PROCEDURE CLEAN ERROR: '.$err,
                            'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                            'longMsg'     => sprintf('Unable to remove PROCEDURE "%s" from database "%s".', $proc_name, $this->post['dbname']),
                            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                            'sections'    => 'database',
                        ));

                        DUPX_Log::info("PROCEDURE CLEAN ERROR: '{$err}'\n\t[SQL=".substr($sql, 0, self::QUERY_ERROR_LOG_LEN)."...]\n\n");
                    }
                }

                $nManager->addNextStepNotice(array(
                    'shortMsg'    => 'PROCEDURE CLEAN ERROR',
                    'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                    'longMsg'     => sprintf(ERR_DROP_PROCEDURE_TRYCLEAN, mysqli_error($this->dbh)),
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_PREPEND_IF_EXISTS, 'drop-proc-fail-msg');
            }
        }
    }

    private function dropFuncs()
    {
        $sql = "SHOW FUNCTION STATUS WHERE db='{$this->post['dbname']}'";
        if (($result = mysqli_query($this->dbh, $sql)) === false || mysqli_num_rows($result) === 0) {
            return;
        }

        DUPX_Log::info("MYSQL RESULT: ".DUPX_Log::varToString($result));
        DUPX_Log::info("NUMBER OF FUNCS: ".DUPX_Log::varToString(mysqli_num_rows($result)));

        $nManager = DUPX_NOTICE_MANAGER::getInstance();
        while ($row = mysqli_fetch_row($result)) {
            $func_name = $row[1];
            $sql       = "DROP FUNCTION IF EXISTS `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $func_name)."`";
            if (!mysqli_query($this->dbh, $sql)) {
                $err = mysqli_error($this->dbh);

                $nManager->addNextStepNotice(array(
                    'shortMsg'    => 'FUNCTION CLEAN ERROR',
                    'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                    'longMsg'     => sprintf('Unable to remove FUNCTION "%s" from database "%s".<br/>', $func_name, $this->post['dbname']),
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'drop-func-fail-msg');

                $nManager->addFinalReportNotice(array(
                    'shortMsg'    => 'PROCEDURE CLEAN ERROR: '.$err,
                    'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                    'longMsg'     => sprintf('Unable to remove FUNCTION "%s" from database "%s".', $func_name, $this->post['dbname']),
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                    'sections'    => 'database',
                ));

                DUPX_Log::info("FUNCTION CLEAN ERROR: '{$err}'\n\t[SQL=".substr($sql, 0, self::QUERY_ERROR_LOG_LEN)."...]\n\n");
            }
        }

        $nManager->addNextStepNotice(array(
            'shortMsg'    => 'PROCEDURE CLEAN ERROR',
            'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
            'longMsg'     => sprintf(ERR_DROP_FUNCTION_TRYCLEAN, mysqli_error($this->dbh)),
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
        ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_PREPEND_IF_EXISTS, 'drop-func-fail-msg');
    }

    private function dropViews()
    {
        $sql         = "SHOW FULL TABLES WHERE Table_Type = 'VIEW'";
        $found_views = null;
        if ($result      = mysqli_query($this->dbh, $sql)) {
            while ($row = mysqli_fetch_row($result)) {
                $found_views[] = $row[0];
            }
            if (!is_null($found_views) && count($found_views) > 0) {
                $nManager = DUPX_NOTICE_MANAGER::getInstance();

                foreach ($found_views as $view_name) {
                    $sql    = "DROP VIEW `".mysqli_real_escape_string($this->dbh, $this->post['dbname'])."`.`".mysqli_real_escape_string($this->dbh, $view_name)."`";
                    if (!$result = mysqli_query($this->dbh, $sql)) {
                        $err = mysqli_error($this->dbh);

                        $nManager->addNextStepNotice(array(
                            'shortMsg'    => 'VIEW CLEAN ERROR',
                            'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                            'longMsg'     => sprintf('Unable to remove VIEW "%s" from database "%s".<br/>', $view_name, $this->post['dbname']),
                            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                        ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_APPEND, 'drop-view-fail-msg');

                        $nManager->addFinalReportNotice(array(
                            'shortMsg'    => 'VIEW CLEAN ERROR: '.$err,
                            'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                            'longMsg'     => sprintf('Unable to remove VIEW "%s" from database "%s"', $view_name, $this->post['dbname']),
                            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                            'sections'    => 'database',
                        ));

                        DUPX_Log::info("VIEW CLEAN ERROR: '{$err}'\n\t[SQL=".substr($sql, 0, self::QUERY_ERROR_LOG_LEN)."...]\n\n");
                    }
                }

                $nManager->addNextStepNotice(array(
                    'shortMsg'    => 'VIEW CLEAN ERROR',
                    'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                    'longMsg'     => sprintf(ERR_DROP_VIEW_TRYCLEAN, mysqli_error($this->dbh)),
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_PREPEND_IF_EXISTS, 'drop-view-fail-msg');

            }
        }
    }

    public function writeLog()
    {
        $nManager = DUPX_NOTICE_MANAGER::getInstance();
        $nManager->saveNotices();

        DUPX_Log::info("ERRORS FOUND:\t{$this->dbquery_errs}");
        DUPX_Log::info("DROPPED TABLES:\t{$this->drop_tbl_log}");
        DUPX_Log::info("RENAMED TABLES:\t{$this->rename_tbl_log}");
        DUPX_Log::info("QUERIES RAN:\t{$this->dbquery_rows}\n");

        $this->dbtable_rows  = 1;
        $this->dbtable_count = 0;

        if ($result = mysqli_query($this->dbh, "SHOW TABLES")) {
            while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) {
                $table_rows         = DUPX_DB::countTableRows($this->dbh, $row[0]);
                $this->dbtable_rows += $table_rows;
                DUPX_Log::info("{$row[0]}: ({$table_rows})");
                $this->dbtable_count++;
            }
            @mysqli_free_result($result);
        }

        DUPX_Log::info("Removed '{$this->dbdelete_count}' cache/transient rows");

        if ($this->dbtable_count == 0) {
            DUPX_Log::info("NOTICE: You may have to manually run the installer-data.sql to validate data input.
             Also check to make sure your installer file is correct and the table prefix
             '{$GLOBALS['DUPX_AC']->wp_tableprefix}' is correct for this particular version of WordPress. \n");
        }
    }

    public function getJSON($json)
    {
        $json['table_count'] = $this->dbtable_count;
        $json['table_rows']  = $this->dbtable_rows;
        $json['query_errs']  = $this->dbquery_errs;

        return $json;
    }

    private function applyQueryCollationFallback($query) {
        if (!empty($this->post['dbcolsearchreplace']) && $this->post['dbcollatefb']) {
            $collation_replace_list = json_decode(stripslashes($this->post['dbcolsearchreplace']), true);

            if ($collation_replace_list === null) {
                DUPX_Log::info("WARNING: Cannot decode collation replace list JSON.\n", 1);
                return;
            }

            if (!empty($collation_replace_list)) {

                if ($this->firstOrNotChunking()) {
                    DUPX_Log::info("LEGACY COLLATION FALLBACK:\n\tRunning the following replacements:\n\t".stripslashes($this->post['dbcolsearchreplace']));
                }

                foreach ($collation_replace_list as $val) {
                    $replace_charset = false;
                    if (strpos($val['search'], 'utf8mb4') !== false && strpos($val['replace'], 'utf8mb4') === false) {
                        $replace_charset = true;
                    }
                    /*
                    foreach ($this->sql_result_data as $key => $query) {
                    */
                    if (strpos($query, $val['search'])) {
                        $query = str_replace($val['search'], $val['replace'], $query);
                        $sub_query                   = str_replace("\n", '', substr($query, 0, 80));
                        DUPX_Log::info("\tNOTICE: {$val['search']} replaced by {$val['replace']} in query [{$sub_query}...]");
                    }
                    if ($replace_charset && strpos($query, 'utf8mb4')) {
                        $query = str_replace('utf8mb4', 'utf8', $query);
                        $sub_query                   = str_replace("\n", '', substr($query, 0, 80));
                        DUPX_Log::info("\tNOTICE: utf8mb4 replaced by utf8 in query [{$sub_query}...]");
                    }
                    /*
                    }
                    */
                }
            }
        }

        return $query;
    }

    private function applyQueryProcAndViewFix($query)
    {
        static $replaceRules = null;
        if (is_null($replaceRules)) {
            $replaceRules['patterns'] = array(
                self::USER_DEFINER_REPLACE_PATTERN,
                self::SQL_SECURITY_INVOKER_PATTERN
            );

            $replaceRules['replaces'] = array(
                $this->dbDefinerReplace,
                self::SQL_SECURITY_INVOKER_REPLACE
            );

            if ($this->dbRemoveDefiner) {
                //No need to run the definer replace if we are removing them
                $replaceRules['patterns'][0] = self::USER_DEFINER_REMOVE_PATTERN;
                $replaceRules['replaces'][0] = "$1 $3";
            }
        }

        $fixedQuery = preg_replace($replaceRules['patterns'], $replaceRules['replaces'], $query);

        if ($fixedQuery !== $query) {
            DUPX_Log::info("REPLACED DEFINER/INVOKER IN QUERY: [sql=".$fixedQuery."]", DUPX_Log::LV_DEBUG);
        }

        return $fixedQuery;
    }

    private function delimiterFix($counter)
    {
        $firstQuery = trim(preg_replace('/\s\s+/', ' ', $this->sql_result_data[$counter]));
        $start      = $counter;
        $end        = 0;
        if (strpos($firstQuery, "DELIMITER") === 0) {
            $this->sql_result_data[$start] = "";
            $continueSearch                = true;
            while ($continueSearch) {
                $counter++;
                if (strpos($this->sql_result_data[$counter], 'DELIMITER') === 0) {
                    $continueSearch        = false;
                    unset($this->sql_result_data[$counter]);
                    $this->sql_result_data = array_values($this->sql_result_data);
                } else {
                    $this->sql_result_data[$start] .= $this->sql_result_data[$counter].";\n";
                    unset($this->sql_result_data[$counter]);
                }
            }
        }
    }

    public function nbspFix($sql)
    {
        if ($this->post['dbnbsp']) {
            if ($this->firstOrNotChunking()) {
                DUPX_Log::info("ran fix non-breaking space characters\n");
            }
            $sql = preg_replace('/\xC2\xA0/', ' ', $sql);
        }
        return $sql;
    }

    public function firstOrNotChunking()
    {
        return (!isset($this->post['continue_chunking']) || $this->post['first_chunk']);
    }

    public function __destruct()
    {
        @mysqli_close($this->dbh);
    }
}installer/dup-installer/favicon/android-chrome-384x384.png000064400000210227151336065400017324 0ustar00�PNG


IHDR���ǵ�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�������	pHYs��tIME�"�~X��IDATx��w�Wy>�����l߽��ْ�1��B�B0͸J��L11�|�F�i���B�����`0��wY����3s��cfvg��U]�y�Y��i;sv�y��V B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!�	D8rpe~U�hY�2SB�F�!�Z�RUI�^6�eЧx@p��
h�� �HT��gۉ��.���E8�	��׌,�ˤ0�C�0%s������<����R�Ҹ�I������)�W|7?��Vu���@�H�Q��U)?wAڵ�Z�%H�nv��O7�ac�'���F&�"N"��2��0�rOh0�n�7��ed�0�4�exÓN㱌��A���ƨib�݈�O�*'��"�5�r��H\;l�o��|�7�TQ��Y��,"~�|4;��o�"����b��ְadG
3a���`�x���O��`@��+h]-)����׼$��/��:���/���r�zfn�8�9)�2^����Z��J=������:xaA���=�¬�DՊ����8"a�q��°a�g$R�yadF��T�z�ޔ�Ey!r��w��c�z��un�W�}/M����4�2?5��ܧ�Zv/��öW�H��I�|}�p�n��̪��tM�;-���$�W�Z�nI3�kf�
�#��@�%���JcdLY������L��bmR��~����u� ������e�N���ET|�a����
T�N�2c��I�3y׭Եą��� �>�*i�(i����I��R�i�),h5���[�/�a�!�������CC�y�*�L�(�������	��u�P�/A�QcF]��i����n`k���a��a,7c�}�Z����g9!�?:LLAW�L��F]�8�yѐ4�?"�h0V;]wW�`+MÆDLH$��E����RŪַJ�O3B�4��ڂr���	��{��	�/L"h�kD�p�
�$���;��`FM+T���V��8�n�0ۨ���`αq�a"�BJ0����7*�G�cf�C��8�MA_�㵣+����)!6�ɿ�T��T�@�Č�40n%0�c�0��	i )$L�&�a)s#R���W֙uF�)�uP_�_z"��@���H@N�r�ID!���aFMkT���r0����U�\��=��֜A�J�bNL�!��R�����.��A(z�GYI\7�=>$�[���`��d���+��Zas��'�%���1+�I�°�HI	i -$��!N$�XV��U��������1` G��2E�X��ʎ��V�Q.f�f5(����0:�qw����2�$�DVʍ5��v:ί�Y�^3{h:8��Ĵk�I#�̬��<�8����JU�BtXba�Ƃ�CĈ0K`4fa�0��)�DFH	�O�D������0�v<X�`�i`�^C�=�!"����0ը�J���MS��4_���OOo��\:�sʇV��ײø�\�˳��CR�Ű�˽k�x�V��ze��E�8�<6��k�٨�^ii`؊c̈a�4�:����R���a1D �.61lsl�_^����%��H"<Z+a��q�dp<1$�֙�}x|�?��CLm%��JZq�����A@�f7��R����AxvP�
�j�$��W�ưƌ�('1	��A�!"���y�-|g�x9���RĂ�z���rB\����ʕ���EQ�B��="�,"�����������"�ߢ�:�u�$�̽�oD B_��@ZK`f03JC��� f�������SBd�
�b�����cɸ"7�$�܄4/�K���D��UK�\/l���D�#���I"���p,z�u�)�O��'/��p��Ͷ
��}2#ċs������C�\9�dL���R���U�����G��P�[������#B_h�š�8}�oi�4�¦���m~� J	yVY�W];���Wq�YF6듗�Q2X^Q
��QU�~�^
F%d2������C�z�"��{�(��Ǿ���_��]�}�2n���B�,3ͿpYg�ʏzX�ѦEˍ�Ei!���f�]-a[��ߌ4�e�%\���x���"�'�Y�*�Q�9�V�`:{���j	��T�{e���3����X+n_��V��K�b���8��R�[�a_���+!!	�} ���Ɖ.0
�Ȥ�4������½�y��j~�$�LH�=U���g��=<]�ft9�Z=k�a����0�i�ۋ���'�O�{�HD�6�( G��RP�=��˺��b�r#vaE��y�Ie�p��X\���W̸�^�v��߿?�	`3O��Z>�`�D �b`�>��Ёy11������P��^~�� ��qӺ`�0q�A@l?]���Wa^��d��c�u:�Ẹ�����!F3���28#Z=��!�7"���2��v��ָ�4�����7��cR�yY�W��L��z�Q���8Q3Y��5~W�F9��?���
�E�HD�	XB���_k�E��=u�.�����j�Yd���eF���m)�����V���6��g�l�W0e��	�D�]D BO�9�1"63�(��.��j͞)h�uB�P��'L�ë��@LA׌,CJH��Zz��U�H�ͱqoiN�q ��'��ZD+�r�!z��P�lo5�0�*(�Ž�y�B��QvD�7=e�_5�Y@��\�����D0>5�qKaw�k��.\fL���M!&M������ɡ@gC�����Z����zƤ{�/+%�˱��\n[����
Ӻ�$�}O�՛jeL�vSz������B B��#�9"�DR$�XI�L@�uV~	��?A����_��jeL9vSy�0��?Ne/���(Dh�'�&��3C礈��M?��u�`�����,B��F8Tp�؊0B]�J{>��h���v�@ka])<X^@>7��_��"1<j�󅝷%�q�c�b1")����I���"�]f�ցF�������Ճ��ʣM��,!&��q����������L�E��•Z	���t��E�HD��@W)�D��$��:x�V�ӓ��>��ai|������D�D$��$��9i����oG�@���\���2 sp��v�����͕��  x�gE���0�q!��D�&BD BO�%��IT�E@��T0����m�i�;�U���
�Y!�"�(��1+�5���cy��!�P�R�������t<X.���k�]o:�� ���D�a��@��Hx��x8��e�ٳi5���;)1$(@U�x�ZB*�G�k\�fZan��E�-򹧰T|��63����EG�YN�|�Y�)t"D�HD�	��	h�SI�~!��K)]ǧ0yzg���x�QDZ~a�3���]��E���%�u�A�C#�i��+�aך�����{��þ�
�D'�K��HD�HD�^D���/�e)�������y��3ꬡh�j�EP̨�
�GRw�ߺ&SH$�f*D�b$`��g��X���r{
Ű��~f�}1��ul`aD�>��"f�@�.�hx'�FpaVv>AtRԾH�bޥ}���+��=���mʝ$ܛZó��w͆�Ch�\f
�GEQse��i�i����
(�m]����,D B"|�5k�ĘA�$0W�>��aڕ�ab�\��Cu�i�-SŷoG^ԫ�>(z��
��^���va�6���@�KA"��$Z��G�>̌�rC]������_]K�z���򋕣h��	g�
���:S��a�ږ��~��C�y�s���C�����~2�l?�5ED3�]�c�5�=�ݳ��Zq�����R߭�(3t��������m�`��c��՟۴�^��$s�!-��Y��l�y\Z�IH3���;̓/H�N�Dw�ß*�a�HD��vszKC�OQ@����uܴǷk�-�n�Ch���?���&oF�.|Z���|����O֡czoڙ�Ӥ��o |ln1!��(�Ќ�A4M�#�B$��g�pvi�[�bN^��5��u��}j{�3�������i��7ڝ��	X��Rt	����1Khm�8V�6�f�d�9����c)N��z�N�!��H�!�';��f�̉��0-�?�DG��x��R?����M��=�W�#x�][q�3W��hPꠡ��"�J��`�#ܥi7����))��w
��ǥ=��?����,����;�w�A^����Q.@�^��=�7r�xga�_�Y)?�"�I�6�T����hN��3A;���̍�q�*��̿"+��L/�Dǐ(P�
��)�w�����R�K�u=��۾3�}������߱Z��
�E�}=�8��t��>&�6�4)��1���
$}!���%�����\)A����6D�D`��NY����W�$+�$�|��vqp�;��w.(�{E�^aͽf��W�ǰͮ���e�<5&�Et� ��y���x�RD�Y�fq,6Iؽ�ȧ��]	�6�]D���Z{1/������z�?d���0&[���uI3����)��At�+�#Ap�#�����ʅi�8���9!?���$<��:����=��NY�oD�����1��re,�┐��^ @k�o�Y0�:�\+����Xaћ�;®����
Z>�~��l�{�˽�ǭ}r��W�L�(#�Y�/����Y�rF��3����{��D8�	�%�C��^��� '��i)�.�P��l��7#��U��+��ZSU^=A�	T���F�yI!�O�|�@�s[FQ��s(�.l���+����zo�F�{,���w�N�A�7&�^B@aȈa����yLH�����T�����ѶWF��C$v�O�lwlqr<����_N񴰣m���J�5V��X�H"E�#�����SU�.(���7]�o74��i����2h0,�`�(��I!�O�U��3\�NU���
�<q@��wk���Xlv�O��>� �3!�޽�P�0�,��,V����O
@1KZ?��u�^����|E+X$�C�wa�	�E���I�H��\�ܴ����i!Nȟl��������	������'�r�&"
03OWX?T��r	������z>t?Y#A�u� �@Z�H�5�C�w���:�s�+n���'�A�{���aq��-�� �m��.A�Y����_�� ����I<=�äiB�ʻ��Y��sݿ�ju�I�^R."�vn�n�FD�~<<��VH	)���4����5�)���K(���~��� X�Hc���ћ�(O̖�~���L����]��[Ap��$$	��ޔ����d:�g}�W=Hy��1@=�ۅ���l��cQ�0:��^/����R��Eu��$BBH��'�tҀ�M���;�8΍e��F3 �
��KD�~4<����̜4���X��Ջ���U� ��4�2��ʘ��/:fZ3*Z�_�����rԞL�:�X��8��'2B��P+݃bFY���(�N���� n�N"�<�)�	�1!�&��6H�%��a)0�Z5��m�a��JK+Gk4��usv��B��n�%OX$pT2�礲1�^��l�1�ű�-�>��܂ì�p���H�&�B��|f^�J	q���c��|O�J��{����&V%�XfZ0�h���D+�R����V�L
��yױ�����Ó @f�̺��f��A�&0�l�̨h�)����t����M�/��e��m�$KJąDLXD0I@R{1��Zi�"k���� ���R�_�u��`��c����9쏵��.m6����
����ǧ�xz2���m�?�ڜR�k�
�-��Kw>��~��G$:pE~I����\�+ӎ��J�(9�ɿ3�?\?GRKL�1��j����Za}{]�OZB\��uA���.�vt9�	x~��?Dž<��x�5�֘vl,8
��ob�aW$���ږ�`�D�0��O���b�?{�&��umK�K;�xv��0y��BI+�]���r���M�7B��_�>�"B��Ǭ4�{�!O !�+慧\��	z�i,p�r'<D ��͍ AR.3c��I�)!����U8-�$�@R�XObԈ��.s���w�֟�$~]TNE9���s���f6F�X^1_���]4*>�v�i�G����^d���ݙ�g"��v�I!�fP�G���Ϋ�<��_��߬A ޶���_�	@�W%HjUh�+|�kj��63��y�Ƽ]GM9P`(; �!4��!@�fV�M�,C��g��݂֏�*�/�
�yD��2� @<-�zNN�M	q\7�ϡ���N�������5���D#���M�1�̍��7:���_OٵҰiiA�3��Z$���d�I�eFM+�hxZh/"h3��#������D��DBJ$}�NX���l�=>T��^
�LP.s]1�XЬg�H�j���}��AdI����Q� ZF����bD�8��@1DS8P��jW<�P�s������@])���ޥh�7���-FǥsxV2��4`t�6si��|'N���ڜ	j��0�:��� o�\`��g�}Ч�_	�I�1�������sB�OJ���>��}��=��e:�$�^��YW_@ iXO /=Ӑl�ZNA��n���f�<����3
��G\�s^θ
,�NWO��H)d�T�O@�	�}�O�E,�c4���P!���`]T�9
~B1?���yܴJe咆G��D����� �$y�1�w��Qa�y�	}��֧1���I���"��"1l�b/�*!�jj��ˌ�V�i�1ݨ��\ج�j�1#�.�sLK��fGqL<���m��2sQ�M�xE��0���-K�!R�{�(�J���姻���Z�~^�H$s|2��*E����RJ����e�Ѷ_��zw�����^#���&����IӋjA��z�anXBˎd.����;�������EK�-r���/0)�9)i !D����TJ�fp�a.��*�;�9i���=]��C_����kB���`��3����7���1�2��'	 vZw����ŽF
3���E]{3�`��"��'��Me�DcfQ�^j�坮�?>��'�_K���~���
�nD�R�����kdt�oMø�#|�o�^w�������W���6�����苳B~>%���$�)���=ɿ;ҧ��g���gVJ&�cqd�SH�
��{�Zcε1g7��w��{�R�?�{!�Ii !�k�4X(hJ3O;�w8�w*�0p��C�����7[B�,ErmJ�!ͼ��$�����fAx��ˌY�b[��9���Vh(כ����%,	!����Ǒ��
�������T����~o�D������b|b┱����R��^�ſ���}z�G��nt��+�ؗ�B<'���t�8����M>���A� 5-������3�@럶={r�ػ �=2����s�zQ:	�xb$����v�FLO8�����?W̷�񆹩}�C$���20s� zcB�g�\Mj`�$d���h*@YkL9
L�+((%ׁ*̷���x�K�0a�aR��T��Z��V��&0}(��6���J%9>1���K3��څ�������0�k��_�iЧ��qD7��D ��,��0�յƝ�������w��[E��k��:H&F��Ҁ%Z���֘wm��v(�����{Aw��k�ߌ=0�ą��k��f
�x��.�6��:W������.�\���~#7���!��R''�|K^��!p�b�(�!�(h� %��Xc%0�:�Z�`�m��8�k�BDw�����o:��3��ZN���xYa4kDe�8�`��E�ĺ�O������~���=�=��܍�V��񉉷���\�N��j�a�o�n�z���ؠO���ph�5j�Wd���"�&��8kZ�ƅi�F���E��?��T������A�0��3��*��M-B���G��ۘB �k�V�A�#AI3c��]�&G��m�Pz����)�]f�
Y!/F����H�13�?��S�
f�:��n�Ȼ������8>��3���E��ScFU���+�w6jw�J�x�A6��p�F�j���ؘG���Zf�c۰����?�я�4�h�]޵Ҍ}�$Z<��k��8�;{���w)&�~Z���"�ΰB��#H�pB��.m��W����k�y�!!���F<W�C3�氾��S��!"�]���aL9���d��i!^����z�At�I$�Qo�#��T��m�*f�*��e���B�L��xN&�UVV�u�Qa��J�Ǭr��^q���p�F�����h�J������Rʯ����A���m�y�Sv�;C��w��X!�'g�e�q�B�-�k��;&�0I�"����4U�A������Ӧ��o��0ϙˌ�����0_����}�Ӌs�V��w�����Ш4_9"��8D�/��&�H����'��J`k������2����F�h~����m��0���b���&/�Hor�i=��G��F#52:�����K���ڎB�w����eY�A���/�la'�]��*��"�,AX&	�IfqOqƷ��^���w�w�`���s����w;�
,:>���t�v���Jw��6�{m��0�H��k�m~'��⚑eWx~V/�,�'j�
4������J`�]��z�Y�u�yB���`w�@`
6-$E{x�홁np������841�Ćs7¶�����;F{��R
R�M��g���U2��=`8�M@�W���\����2R�����zsa֛��j��/f�	���v'�3��{��{ L���Bt�����k��ַ��us;4"�W|#?�hl�i�>/�3��$�U��4g�D�j�mv��l���h"�kS�ˁX���E�<�L���a3���
J]���{��z.�:f�w>�If��w���_�� "B�VS�R�A��Kz�r�q���*>��u֕��/@�]��N��d�W��ܮ=r�(�]�=��?�g��E���/���1�5��w�g��^�~ZHJ٬&�\Q�/�tC��]�����O�)9���zߩW��������B>b=Qg�
��i�%F��Bl�`"Ԕ���Y�6�����?j�~��G�����>��O�\X+
t��=�|����d2��$�m��^�m��9�m۶��oo�9HD���8�KH�����[ą��r����"�M�@��:�"ZOsu��aҏ�[�,)�6̦�?��B�@1���W�k���)�z�2���
��g��k�s$���%ĝ1�7Xc�j��	H�Q3���W���U[��m�o��0P_�ՂR>w�I7��_����Z[�T꽓��'��5��%A?}��?cYV햛7��>��L@!�|tx�2��A4x��mv�x�9K'����|v��;�u~g�s���Ծ�s�ᜢ���0�_�������O"7
�<�p��r(p"I�%C�x�$�@���@�po���J�hh�Z׫OA�s�7��$�Lja@��S���J]��'��7w�y�?3�,�:m���K$�ч�\�A��g��H	�p�;�ØsHK��%-��I���ϐ���8����wO���e��g���/@��q�^Җ-8����d��.�W�G	h�ya��=�ʙm����ڼVwI�׏I������@���|�sop���y�H�Y��'���+���=�ֿ���U�:����i��l��&���+��v��x"l۱�gg�7Ky�D"��3���r���'�B>K�^4̪x��}O�1G�&��YA��DŽ��
��>�oe�h�G�֏	�j��ܸnt�i\0*����O��
�)ͣ�?�u��3����Ѐ�_��c(D��G�7�+��;����~zP��ƍ��0�Z�r��x�I�̌��9����ēNj�z&�#�B�X,6�S?�{���ˊqcQ�;P�C�7L�c�[a�G^x�;��%�^��N�~X8	i c����p�֯�
����m��S1oz�TuW،�w���
�̹����9�P��WqOi�Ud
зoZ�>��+Ζ���r7>��x���g7����?$���z���-[��aM_{�\����q�A��G4��v�g��u�?�?G
^r�
+����"`�0ϥ��N���DHJ��A!��{��;���k��{�W�v;��0=�#�"���YA�3)!.3�uQ>����*6��I�a����}��w��-�����w�S2�K�偎���w�D�W�Z�E�۷m�w��
4
���y�?l�V�.�˿QGB��ND�ʮ��ykA���G`� 'M������ȿ��ߋ������ܳ��_�?p��5�>/����z���t�O�D��]�	TY�-��Jc�����Ҩ��<�Z���@_�܃ֽ6	"��?"�m��=�;�������z���C)�06�"�۷�[�:�lقg>����r��TZ�(
�� =񖅝��Ȳ�`��.��%�<_�2+�V������7�s7��]?�g���5�o5p3��Z=���t��Qi�-|��PD�֨aSiu�Z�y�d�Z�>,��g��2!b���;f�{ڿ��r�����<?�q8��m�dY�9�����x�	�R)�x�IB����0�|�X,ܘ��G"@�������߱w�d����'vu��w�����7����i�L��̻Z��׸�?e���������A@� \6j�$Q>X�«�swi�P�(�S��)�pt"��f������ԝ3��ޛ+�{_�惁��:����:�,�S;��_��_k
ӌaٲeM�뺨��O�����
��8��� %
Դ*!�J�_,A� �r2f�؜,����������w9Z��^G.�7i��f~X1���*�j��Z�vt9�
��F
s��u.Sv�J�Uw�W?��NaU"���HK	0���]Rjӌ�)���/�?���R��L&s���+?꓿w-̘�ځ���װy��~�C<��Ĥw�Dp]������]w݉ý�c?D3�>p��̊k<P��F��ƈ�4�7-���,F�����}�wF�t.4���-!C�߂���:�z��@5�-��1�.�������o����z�K"�H��|���G��R��]�y�>#�M���A��e��f�Z�b��:���M�4{+f�iO;1�jn`[�\��Z|�Ҡ	�>x���h4PVnA3��ͺ��YB`̴ Sj�%��Uʡ�ɧyB����xv�?���J��x�p���C?]21�K��q��BỘ�m�WZ��C��:����|�o����9��Ճ�7x�x�?�R�d䇆�X�|�E~�/�v���O>��YǴbXs�1ok�榷����
t$!2-͌�4��|U�oR�'� x����/����/�!�0�.�|���OHH٬�	4c��f�_3_�f�#�?���e`�l\�K��X'@����bƴk��<�?H���w&z`x���D�
��B�KZo�u�S*Z=�2�A�;�w>ʥRldt�ԉ��.�߾m��ͯ7m�aX�V,_��8����������?>�o��A"�,����bF^��?;�ϋÆ٬й���ܵ���vM�^|�l+��ׇw���vd�9����eP�|\��s�X'�9|��r�c���Y�c1S��?;�k3����{�u�YP�6��s�y�\.[�cc��,�ƌm۶����x��.�B`rr���C��l�T��\l�	�]�U3۰�\�;W��k��Z:@Z�Ț���=!�����m��){R0��36ɟy^i}53�����E�}\3��1��Ya��C=��r�86*/xu���H�I��VaE<�g�r�
���Rw̺�{�;��A��y�mD�Z�����{||��T*�&�~��-������?�E�`Y~��j�F��\.__��M�����m�c�$�6�,�mL�1�5�{C��#P�l�S�'�����sb�-�������k�v "�C׌.�FRB�EF�E(�S�1��x�R�ú��sX���"���r�J�Y����z�>��~��R��p�F������;G��.I��k�6�-OmƕW|�>���m˗��e˛㤔B�^�r�����~f`�v0 KDI+,(wg��W�]��HI��iط���R�g3ԟ7��C3?���J�P�����OF��e�&�� %�zI
9f1��x�Z��>�<���-�P@�OOe��-�����\P�ו��1Lt��s7�V�&�'�O�4�J�5syj��w��#�<����T���J����S����X"^=�
9)�
�m�Ӂc�$��4a�gC]*�wE�P'���|����~Ϡ	73��{4��4�D�Q�ij�����PJ�u4�~�nO�o�j��]���_������xZ*�\��'��ֿ-(�����r�I���`�~o8w#�Zjl|�C�×�R��Z�&�o�$�����-J��a��Nh��ƅ�����Zm��x0 ����(h��f�R@��Wn!kzUK%��3���n�	�&���534������M\�xZ�&I�������ull��ۻy��LA��gy"��Rd��T�����y/�~��w�F�m��?g�Q��R#��o�
5�?���O����<�H���0�p��m�[��W��-`w0 ��W�lCF�y�qXOAW-B�w�6������f���������G�H�'����'H���.��Vi6s:�{z��<����p|2 ����7�:�%�O�?���03�q8g��h4R###M�k��7?�k~�c<��C͞�A��^�Rby(�S)��Ba��/xQ��_�|��z0 ���V(*�1���^H(3�iß�%�w:�����/b����2+n����8�i{�=�OF&�h=�bc��9��5�-�jS���0����"�&�I�� +$�O�5�U��C/yӆ۾�©�ف�Æs7±�����;�B���6?�kv
y8 !�������1�r���X,o+��փ��M�fv;�ҜgЏ�;�КI��_o?���7�,N�@�%���OD��'��Ȅ��uSa3�8��?�/�s2%��ǻȟ1�4���pWx)���vS�$¸�N�G�Դ���ݏ���/���o�#�(
��ۆs��i$s��;���.I�Rk9d�j�f���k��#�4	_�)!�>0���g��4@J��R�|+��{��n�{C�Xa%ಶ4�i�
�B="��>K%I��k�4�q!n�V�Ǜ"�?$��ep�'Bx��a�sl�hԚq��*y�g��%�V�&�Ȅ�@M��J]���N�峿�9֕:�~(�Mf2�w
]�H&��>[�<�_\{���w����W�n&Zj�Q�զ�s�����D� vii��Ze�Eb�I���4Ǡ�T��������I�~]����|���U�0�P�{O�牤�$֋���^O���]��'��C��3��B��wy��%	�Zq�M��_�!�k}CE�_:y�͟y���R�8�{�F(��T�]��#'�V�?�o݊_��x��!e����s�Z�f�)�fH)�L�0>>�g�Zk{nv��^�A�H�~<�u�2Ia�3&�-�H��V(�\�B��ԛ��O�2D�>~��
�`]�C>��Dž8�"q� n������{ -xV~�[}5�¨��xi��	����W�.|���?��8�2X;���mkm%����\��װ�ͩΎ���n�O<�vZ�_@�ft���y'�xR�tkĈ���z�"�q��^;�ia�'q�Y�C���ij���1���z�?�gJ�@�3�k>b	��!���,�f��AK��ߣ���_��IR�)(A���$RH
�k�
��ֿ.k���N������� ���oxd�"+_�������5�z�I���w��n,��˂������|�V�Yd�o!KD�0p����������QV.���/�g����8�������[����!���,�Gb$>#q�@;�\3N�+��#�B[�""���XO!���2���o*���O}˿?v>8`�a��y����EV,���� �e��n������m�>��l�,e�L�-���֚K���+�_���}�
"��e�)��qjL�+94�*���4��vG��&��6-�	#Wkm� 3��b�Vk�7.D���"�Y
2!>b=C�]��%��c����l���LAm
>�%�1G�SH��(��o������`�1��ǃw��W�<��K!�Y#�c�b����S���4n�͍ضu@A·��5�/'�3�
��z/YL��119�l���*�b�7Gr�^��.��I,����q��	����M��N�?@G�WC�fQ���f5����DQ��!�kF�����QS������R�ul��[z����f�'C1G�S�w��okZm����w��n����s��(�h���؅�i�����Y���}�6�i�i�E���3�1;餓��C3��`ۍo���!��e0I .���-o�~�QR.j�
�Y��>��CC�%b�z����+�OIu�:�e
d$pqL�:�Ik�f�sN�����ҹ�, X���q��@\P��5��ַ�Xmxٯ��y�󆱡�0б8���D�GG�.������L��������;wB�P��=���
�)�B6#���˗/o;N�V+Y���w8��v�u�wŅx���t]k]@���[�?�'L������j�j�o	(D����ÓȤR�������G��ݜA��z{7qi�g��X���P�����Vg����;���+���{���^Dӆ��QO��5�����vNM5�1��D������ݯ�іXk���p�!
�K_��?����g���[���DN�>,@�@�wXc��������^����ܖ����>��V_��(�PE�\N�2S��Ú?�Q�Æ��ي��ߊ���@.�J+���S���wT�>���{�����-�p�y�^w)�0���4cG��i�Q(p�-����L��'hy����@{����%N>��Ȥӭc�Z�v���0�F$����1�)��)!V1���'*J�������m�v�^��{x���P���{���' M�e1!�#�6�(��	�=�A��G��bXn�#ޗm��j�ާ�}'���W�<����8����#���:��^XX��݊��Y��/zv�꽼��f���y���0�̏�J��׋ŢF�6D�L!��O�F�p����駻Fc��W��.��v�4�[����C�����>�`�`k���B��C	]���Y��2���i���Yo�i��r�H��r��o4"��=<<�Q�0V��bw�q;���@D~�/�v����;�1�VmY�011	!=jc��X,N��Y��~z�cr0"=���	����G�k����vE����Z���#�������|������3�?S�u�$̀�%�i�cG�x��Ђ��d���s���O�k���7����L&�g����%y��]*�p�]wb~~��O����^���Pk�-������s���lW��[#�OoD�b^�?L�\�%r�.��/��C�)dX���o�aّ��C��/�B�����`8̨���,Z��-k���ab<fu�}��zS]�Sl���ןs�ժ��dN�f����ڛ�x��˥6m�^;F����H	�e��5h�b��c�������|��hD�=	��ddQ�"�	��ڞ�1�4���a�}y��'XkP+��3��E��'�,��u`�#��q�FU)ht��	����7�֧���X��[��'}���fփ�w֟s�F,�ɜ��d.2M�i���}(
�Bd=g�a94�
i4ǰ^����G�ؾmkd��Ht� Ό�X��*
Xn;k�,^�!�  &v��f�����᠆O�yD~�g�t�FM�Vĭ; �mE�����`v8|�w׵~wC�,�o���3���Xl
ЪgU.������h�ܥ��?KI!�P�l �������a8�Y�i��������GCp���H�4 �5���>̮͌���EM?�f����~�#�~4<�B"Z�0�3C1�t���	9�K<#h#���`G�
�O-k��I4p�v�9�¶��t:�t:}I�4׀���(�Jx��G|��1��-q����7�x�P��'�*�LD�{W�^�t&�:1�m���q=F+"���#/4I�nB
F�uC�:=�th����	8��FD��~4<#.��y��
��(�Y�'4�5� $
�!�]���qok�>}�u�KIɃ�o֟��m'R��)�d��4�4��5���x�1�J�f�O��y{o�DH�p��j�f�Ώ�A���Wk���o�!�Һn���W*�H�A�	��'#�p�פ�|I���ڋ��pi����/��ݬ��������L?�|�p@��'`x�o�̅�́�5��K<'����D��\g}�S�ڽ	!xе�֟���$}�43׆M4�bO>�8��2���
*yJ)��Hi`b|�~�s�z��f�@ D���Y�C�!�s*k��\*�4Mczll<z�� �����hE�L�Q؅��\�q���7֝�5��� ��9��á	0c�����p4�f�Y���[��C�9ÀIA�/��o��,-�s|2Ã��Y�~l�I�R��'�KM3���_0J�2�<��J��٫����t3��o6`C�#8�����133�$���hh��j�R)䇆�����Z�v��nW�N�&���o
V�Džx9� 5*!�W)�-��"���yx����y�y#,?��|���35I�'��mf�Ef�ۄ��FK�gO	qY�d�>��3��<6��7��n*�L�=�_j���V�>�X,a�-(��mMZ��DA
��Z��a`ttǟp��G�/��gӗ`�p�QGÊ���9���J�5��h F�>@��2�A������
�}�.�����V������D4pn���GC0����0���:<aſ3�+����<������(7����m�7?�?p?�u�7@)7�H$|�5p/�Jؾ}*�rH[�����c6���1����a� %̘�,����4�Z6��;�˫���K:f3�x���I�Z9&c/$PS��k��
	��=��0�!2d�f����b����'�~�|�"�����A b��o��H��1!��F����e��U'�pە�\�� ������t��\Ǝ��P�TZ���
��e�:��/��i�|k֮E>?T5m�A�e�L L�@6��!e �R)?�"��.q�����Kg	a�ˬ�L����!#@q�,"Cϒ�c��3���V���b�[%P�"�ϼ�|JA�
D7桀M�A�
����?$���=Z�e�v?�;������DRʦ�(��k�\���[��g�Vla��ם�ܤe��aY�K�3�3�j���;P�V[=�����%��@&��ѫW#��7�?�`�,+�Ϥ���pС�a�����K9���Z�V�E荃B�}2���5���8�e�)@lMJ�Q ��t�D��BFRH��8��t�O����y�VX�7����o�F-���
�na`Rw�O0���I�(���&@D������s�'���|<@���f�i�B�LL!�a�=��Y��[�عu��n�h�����Nˊ_l��VIF�Z�Ν;=���@�@X0!��d�ꨣ�������X�d�r����PJatl1��wah���]�}۶z����9Ƙ�d�t1k[+����|�K���
���ω�f��z���F���#�$Pf��� $D��z��:��S��=�Q�y��Q��=#|!H"ԕ�;��M��6�+�p�'�	W덊y=|�/�(I��m�_�xY]�t��Ӝ�$쯽cݠ����|Ca
o+�t|�O���x<~�ak�z�V��Ν��4��<��^3�L&�+W!��65����4xI��'��Zid2YH�hzU���N"ڱz�Z��?�]�k*
��W�yC"�8�@ex]�3{�4�����R�4���yD�V[p]��۶=�h���r����?7��m���fd~S)&_�̼�b��S��[�u��x7���ߕ�"A=�:w����7�� j��Ȅ�x�e�7�E��f�`h w�>_�>���p�W@����U�9��
�&	XB���'�����b��D��������2�=���HJ��٫��̨�k���F�Vk�?�JZ�� �N��|�
d2��"o�i6��R���A;H�t:�l6���z�~k��h�5d�1d��$�[���3[?cǙ2Ê�`�f3$�HT�A`1�
D4�_2	!*�x��O�s@��r��h�r]�Q���V�R�G}�Ή�	=�Ne	�0�5.���Vv�"�^�Nßy1ٶ��J+���hjx�Z�к-��W��� }����g�J	��"JJ<��O�s����z�G�-�$`��R�m����<�a���^��f���D�;J'��םf�	!�gY�I)W�K5��u��Π^����AHa$bX�O�RX�|y���R�u�PJ]	�C�a����ew���y������0��ggg��d�絥�ih�')_���5��3L�ͧADI�в�0G���೔�t�e�bVY�����B�i+W��+�4���<0�0!@�j��d� ���5\߈�T��g�RpY7@�
��D��5�>3	������+�o���~ �w��� i�1|�q�����9��s���M�
��1��<��A��o���[�*��}�B�3,+�Q!��Zk
���h`nv�z�ˮ�K���B�d�˖#�LA�־��nk4�h^��0��3��5��,D.��i��?ۍF=3<�U����{^X6��$	1�<g��3��5η�r:�@���R�b��g"���^��*�J}YƑ'���&�h�0����2
N��\��I�m�9���_T*0�j�^,>�4�+J'D�D&�}i:��I��i 2lb��I��k#��A����C�Vih^��!�9���
ĥhޗ]v�t�y!�a��o�IX�N�v���AA���o�β,�B)��~y:03����а}I�S ��B�t�����a��O}���.|{h�g�)<#�<�Ng`�f�8�Z�>۶��?�w>}��щ��?���	;���m�H����&���!�@:����Mr�|�nQ�‹��u�Db�"Kbp�J?]��Ցcb񗥄w
‚��Fdž%U	�܁�!�"o"�@'bu�pv:uC]���]�z8���g�&�+�Q���#ʹZ���zf��Y�#��4 :H@��(��f���|��o5��s��ß�/��,�B!�����'�yضݚ�㰈�o�d*���	$�	�D۶�l�>{jj�5���v�Pd�1�#^+kfe��|K��c���j�l��-�AJ9�̯n6�aƎ�����+F�A�-��`����KH���)|~��ʕ+1>6�©@2�D*�3�0L���"�ɂ���a����������(Y=��@W*����U��>���V��p�M�w
t-k	��g��h�����S��K3�f9����xpoe��הZ�@><���D�0<����a{1��}�K��_�6����-A������u!Q��	�F��p�9{�.���{j�DH$��@"�l�P�q�m�q�����c�J)h��<�X�'XȠ���F6�m��9�H\��O�s��u���d2	fN��yL��V�aaaދd����Ӫ�����V��
ZMiO<�8L�D�&(���ԛ��W��xы_�u!��cۯ?���1M�A��|�q��$���0��$N�~^��
%���>��K{�EԝM��v���(����|�uo�J|�*?�s&�]͗V�Z��z��R"m�M�N�	`�f�3��_������jw���惠��O�b�؅Dt4���h�(,,�U��O`;GDz�W2���8��x��#�q��n�Z.������w���9D�A�D�K��U7(�Jw��vc�(.�|�0�Gy�b�ӭx�
?��*���a�U'
�ǫRj@	�0`Fs[�0�Ͼ�r�r	�R	�R󘝙���,v�؁�۶��[�E�|n6�K����� ���.�V����R()�;����.�~̮]�#�3��iF�f�`�0ޭ)BoDi�|YE�u�9^�YÄ�R@�v*a�#<)����j�{τea�U=�^w�!"
�?S@Զm�X,�u���x5C>;�&�I�������1aDZgm�~O�Z��R);��7 а��<��2XV)���c;�ת�r�V�y��ibhhxL��k��A�r�������k�}�"\|�E�^1�V��p�����ss�(��Q*��

%'&&q�y����KH�!7����k�f"�]��e�i����[p�}��;���}{�����,_a����k|/?Ҋ���r�1<�;!
�M�����=v(���p����߫��7&��  f&�0֛�y!�Ձ��3�8(��P��#�-4��l �Lbxx�9���8���8��뿘����Q2J)x�Vx" ��->T	4�Jy���2��G�Je��ӽ/O �L�4^��\���,J�R��[UK[UG��;���{���Ca��\o�&�������A�-:� )2R�H���f���o���@�
�~?�k���O�ji|S�|;U��`F�m|/?��_Q�:
n�
 "$��!3�c���|^��V�f?
����Dį?8�_�:�0?
��[ڴ�\.A�f�`|‚ ��i�D��q�|�O��u������t_���n;7f�;��-P�wJ$a�b��[۶m)�k�S��ڱn�,_��L&�H$V��z��b��,K!���(?��Lz�!��;��'{�Q<��#�����e��������2�1-��O�&X^��%�?�|(�bj��ݗ�Dm��|\���\�F1_Vq�u�=�J7$�İk�o�k����#��
$34�MN�zН�|�Dt������-̀�8�T*нl��/�������<-��ӎ㾷^����}��v�Z��W�k�0��J?33L3+n5�!�J"�=SՓ�z�4??��?�_ݿ��L�Ry�W6�C�VC�X�����[����w���>�1??�,��E%���򹑑�u��z/P �P-��ω�k���]�ۥ�u/-_}/��H�H0`3��ݯ�a��}2���e�9;���͔a`4f5m�}�}|T�N���u�4�M>���:��PJDt���""��Ɓ���Zͫ��a��%�cED�,�l��u�㺮;�8�i�z�D"a�z��W�`�ʣ,+����g��x�ӧ�կ��|�F,f!�J��:��7?��;���੏?�;�RLAaA��<��Rs]:�IH�X���n9
TXB`D��.�5�e�F�i,ҹ��� j~g�2I���7d��5{!~���ડqB�a}i����G�c1���u+���R"v��@���x�����NB\��x��rQ�כm;m��e]/x1��L�������u�������pj��p��<���g�(�,�ȭ��x"�X��B3���WW�\5�+���3����R�t6�?;�I5
�JŦ�>���u��vm
�m	�N�ھmfg��z��Ƶ�;n�%/��9!��g7/�=�O�Տ��������4�P����?�Dw���+\54�7����?IH �
�x��BX,���h����?{?���5���
��ED�B\`MSf�R
�F�Ո�_�O�h"B,�rc��x
��6��R�t�i�R�/�p]��RA�0���_$�����l�\�����s��L���C=`2�,����ʥR��������LA�rOM�-���V]0�4_���r�ԁ
=`�exΎ'��b$+��=B5�QT�O�ޠ���K7���2�f~T1G�A���ߡ�r?Zr��:�ID�&&cv{���$�֨�
	�%ƙ�� �{�Zy�Ùg���:ND�&�K��>��i&m������1M�+&߯տ�q����篶,�e�]�?��?)̯�� A͘�x<)�f��Uw�덅~��0���r���;7�oP��P,��vb��g

�F+zͨ�]9���Q��Jh�R��t:�)�>�~��	l��e�	�ӌ�KJ5�żӿ��^�Х��c��G�׵���b\K���UC�D#׽����5�I^��&k����.��o֑��pX���Y���m��t��}�����y�:H�).�&�^k
��?z�u�U��k"���d�m��f�Շv���|>��B���ҭ߄���bM߀���Z��#�E�'�%
�|Q�;)�P,,�X*6��P�%�gC�6���I��PJ��_X���9=�R��*�HȅB��/�xw*�,�����B"#�� ze�L()�>�����_��I?�A�qrx��8�H�G�b���]{��<�#r��eVF�\�^f����/���Z��	t�%��!�$��K�m���/A��3M�x�a�3|��zB)u�c�=|U6��_���w뼵fh�.3ׂ�J�e�ZV<T���8�&���O�{��9����'�fl(���/
�c�\��q�v�:����[���p�nS��'�������_�������	
$L��e5֘�jI�RK@xK�Kq�@��%�}���H�,��O�����Y������ț1,����m7kt0�~eׅb�+���K�o�h�p\�S���  "J1��"��&��5y5��k\��/��eY0�=�cJ��{��W{���_��n����ZW�h;3g�V�X��h����S�F�$D�'OJ�3�Z�h4��L&eRd�6
��.c�f�2�f=�@���G�{�f~M"���Ax�U���c���h4�%��gH!R�:�����.�ok%	�i�#ѺR�w����`ҽ�Z�/��K��6��-��}0#��U�	�B���+���e=�HmȌa���'ڧK�w,��ˍ������,ٚ_7{�?3_��m�+ö;ҧ3۷�KJ�W�4v$k��Z_t��?���cO�|��{x����~y�_4X�/���u{7Z2���D�H�	@��E�ZC���c�*��{�>�
�~��g���P�՚�S��b�
��N����W`�h3>T��p5��r1o׻���o�R�'�����
{��[U�I�J�����!�Ă]?��:��F�u�a��
+�"�о�2@]+]��|(�N�(������w�񧳃���8�l0��Z���n#=�=��-��0Mӯ������Z_���;/y��xo��{竫��[��BL�Y���mo{��~�d2�d2�,��A�庨���;#|��¤�˱�X�@osZ���S�Q,�&5Ѩ��p�IOˆ�c�O�r�HŅ|Y�L�QV
u���=��=������6�
�<��Q���{��?�`�7�]����{d7��?Fb���@M+]��m���J}�k�;o�vl9^3`�40�#���T�H��W�w)��A�6��d����>���z�{�˽�{wZk��*x$�`%�#kE9�Swg���3���u�`����u��c�X*X�8N��O��ߋ�ü�[h��GHXt�‰d��O`jjG3���L&�J&S8��>���'�'�iru6-�h���
��$��7�}���|O��t��ڴ�d�{S�l_�6�ٵ�qY���,	¨O�Vw���?a�_h#��� �A�ŭ�[׏.��l�8_��;��k�k ߎ�I��'HS؅���Z_z��?��S�w:���C  ����A�UP Nkuw�Q���݀����S�H@�mc~~�i�'�M��: l���+�'0�	0�� �:��fYA)	��i�3x���;�P�בH$����rǤ�ik�$>-�}`��
O�꬞'j
`Ҍṙa��".�f<��@��۝o��`��'���L�>訏#
�͏�4�`��_r�sݲ�"�Y	���/B�]e}�����c�ih~��
���M�[^>6<p�?�̳��I��;�֗h���K��Y���Z;L��u���Ǵ����?��i������/�k�Z����0%t҃�R���eY�a�130Ci�J��lf�X�O�e�&�`��,КHu�̆j"�H���g޻i���܍������3�m3?V��G�P�0f�xF:�gd�0j%��w��c��A{\{����F����`
9�`�7�׷��?K`��D\�%	��i��է��$jj�>\+���^5=x���Z��u�K��m6!L�aIp
�L����`Y�o�g�=���y��^�=w�vC)��;� �qˇ��3?411Y���̳�a��)"9˲�����\.�=��$��:����% ��?�uJ)�\u^��7��|V[V3�\��CCC�����~2�

����[7���.)h5~�DXm%�LǤr��������_��A��A�ۑ�+�c0�_�����9-�/C�0��xq!�z��
���%ѯ��-o~an���6�q���b�(�.�Z��"�����ٱ�W�3?�����^�f͚���w�_�<�����,��]��Z������_�@&�1]�y�a�xp�uQ*�j�w�y�5����/�n}3#nYx��7��-x��+W�j;�qX�ޮ�rþ�������;@�btŃ;]��SB<�ﳈ^#�o#��d*����2f�_�w)y���N<�⾃p�g�cB�_3;XM�H���1�$�
v�����z8��K��8*�B\��v���3��r1�4`��L� �~m}�R�W���vn�8�����s�cZ��a�~��^���8m���h���	̼��>�8�U�|��U��[(/8D�G-A�-o�m��~�3M31!�ۘ�ǖ��h4P�T��[f�֞�>�!�Lz�t��a�O0cj��5�R��\���8�iO���X��1�Œ�:�����J�ʁ(w@����V\94^�j�����w�q�E�_�ĉ�Ҋ#+
l�kx�ZFC�m��zU�l�:�>�)���+�c�$F
N�Cv�Ց�;a%�:�B�Ģx<'q;��?c7�P���.	�1�>|�B��?��Lm�P�&3��:�G��^_�|��a����K�qhK�l#��J�!�"��Y	!��R4;��WT�ݟ��۞���+z���ω�t�/�R�V���R��7\�!���K`�"�8������O��u�j��^��V�~�\*�����_�R��'��M�޻�o�*��l����Gg�������3b$��g kX+R�&�U�`7v9���e ڎ��៏k�/#����$����ȼ][�j�o2���D
�>�}5�b�]����)�f��L!>p���m6��c����gJf>˶��g�&��f��+��7ԡ���[2����=��W!v����e�bn�`&���]ם����[X��e�����*���a4� �|3��m0�%0����,�JZ��/z�?�
wD
��m������|�m�LZ8 �@x��V|-?V��4�}q2{�E�VG�&�\N�n�&LYi�F
�ke8�.���[�/�~\<?�a<"��($Q����k��+�@CD���X�k�A��" ��Z����1��0}�E���;��P�����5�&���@*��a�?�A)�}�$Ak"���� 5�)�B\@�Ia�݅/f��i?o}�m�O�+��i2�=�|$M�k�\n�ܽ2��́V-�V�'��(��f��i�p‰'�9�y.V�\�X�jӆm�V�~�R.}�V��d�z�U�����5N�Cx��4����5��9,�0>��MF0��k�)���Qv�)�������0G����o缴"�T�s�L���#����q����]�];u/ο��!n1Ilxka���V��O?����z��F�D�4�N�af��zψ�gAa8۶���oAM�B�k���q�?��3W��2!�?�į��Ŋ���)��eL�����i#�)�?6�@H�k�a��\>���%X����i�gHH�/�JS�j��v�[�?��l:�q�{���*�rf�=4^z\�ozf<s]�7���'�,x�M"��1�e[�:�իpԾn"�~8kxтf~x�cw����Q�,Ɇ��+���Ze�b��&H`�J�����Q��Ѩ��a͟`��-&�Yo�<��_�1���`�>��~&$�Z'�0L�L&D��ڽ����,WJ�^�7��'3B̂�T�:�ҹ�G��
�
��R
Z�'FGNJ�b��N��o@,B�e����r�Ue�U쭗}?� z���KF�O�c��q���i'����f��ڪm�\�T�.W�����B�j?Ɓ�A!��~��ϭ�3����))/K�x�Ad����8*���a��ZE���U���?�]����nhu��z��v�������!��俭^m3)��;,!N;)����O��<��3!<�9�Z�K�7c1d�9�f�Q�K�����w]����}X1KD�B�B��}P���,�Ք�8�\��"~Y��ߚ���-�F�R���*���)����ĭ�� ��,dY����c��eY����j�2U)��U
q�S�7��ɤ�/s'����m�n~�R���c��Sf�PVȳc$&��-D�JOKe�ݎa[�
W�?�@P��c�s�s��i��A#�ŷ��`p����ze�f��I���xZ*���_P�Ԫ�����.K���c�m��y�I^��~&����G���uD�0����ȿu����6��\�E�Z��8�H"b"�B�G��0���	�,U�3�8�fw;��P�� �!����k
.���@���`�:~�����kp�Ӟ���xώ�ؕr�G�r��x�ڷ���>��p�	x˂7�ފ�DA�_3I�kZ�WH�$|e&F+�8r���*J��O�I��n�g��:��WG��}�ogG���'�`�
��{A�>��Z��{ �r�%仓�x��h~�����0�8�ٵZ�J��:�׀}hx�ifh^cW7�^6��b�\��8�5	1+�x����l�.��8Pv��M@�
"�qll�����;�u�z��!���`��Z��f�	��=a�9�[˼��,��<���b����gc��c3�f�A�V�Z�����g���g�o��H$��`��8(@�WLo�UC5���+c�Sf�sƐ4>`�Xf	x�2�q�4��v6�h�=E8Z:Q��e`v��s����9����W��_�6���s��A�o��+��ǥ<%F�A
փ.�}��gBH)�9�V�~,L��,�����׳�аO�.ʥR��}�_H9-�8�0�_l۶�&�%����gU3�2�����+�
%�l�Ge2�lS�i�j�r�zh�t7�	3\�͌�pԪ�p̱�!?4�0Z��`�uj�J��B�p��bq���7�?��Z�����]^�_s����M
�B�"4X�'�mm�PQ�>�
t8�k�8|����d�Z]:U���:�Y<�g�s��\��;}�I�O�*��tk�)�&K�SL��pP��i�F��8�V�^�I�V<���� ӵ�J�S}�.����(���m�����SR�3b��u�F�Y�|���?@6���Z�\3?����OM;�t�����n��t?ë��9�fRJd2Ys�X�rL�D�{�RJ9�����s��?V�U�0���<_2z�g����IG�7��<����� �c$�b��"���T��[y��a�?n�xF3�4�19\p�G�٪r/����)�|��#�$~��{%q��rv	0�z���*l��1!7%�<�$� ���~�Y0L3V��N��j)�]^O$0::��6�j4(�h4ͅ���!�<;�H���h��X�;�kW�����Tp-D��c�_��O�4	���9h��c��ܝ�}�/��,�H��LLNN���C:��*�z�jv�.Ԫ�[X���4c���jfJ�+2|�6���̟�e���I	�
�W?�,-
lo�Pv]�����cT�����Ǖ�1�|�m|lg��$� ��#�|S���rZ��ɿ�U��!���ﶄ|�~����4M�V���V�^���D"���1Ĭ����Ӯ�7^�z�޶�4�mR�
�t��z��J)N��k`f��֏�R�٦���΁㸩d2��v��J�m�^��z����r�4V�\��+V��[R�� ��v�����O,f}�u]�.�Z���'�l@��e��Tgސ�4It��OHJHOaֵ��Q���D!�$:�,!���|����!��Ӎ�0���3�y�$y��5	��8��x�VAM��F򎄔�f󁁄�t�'�x�Z}W�V��u�v�O&16>����$��Q�F�#��j��lT)�)��ѱ�����"���������,3��nY�/�]�~�"��IT����T��,@J�����0V�Y�L&�9�����J���J�r���u�h��pH
�9��&je�O9R_��/SB��@�2�y��;6��gWg�f���!�����L!F���vu�˜���Sxf:ז�<������=���f��Å�L!n�Ky�D,~_I�<h�ߏ�IT��Sj��%�m�ȟ�d~����m�����
,��5�-��lƇV}�����ka��A��TJݵx���?8��R���zkh����D"��e�099�!FkV��R�����_t]�K�C������o���[vj,(w݂r/S�;��(f�P#�QJ� }�?�f��ĝ#��㰄1�m��y(L�+-�zo�`ֵ��ZF�u��/@0��9.�'�r�V�˃�柬V��Ԫ�K�Fcmx}2����_�r�$�u��W����*�J�� �x�0�N~ֳ��ٹs�v�S����.�M[�n�c�	�a0�$�i|�^kO��������4cXu��X�b%�Ճ��'�V)���s��;v��_�J��g�c�C��8�@�?��[��+��/h拂���ݐ��;� �`�
Sg`����(���AblƮ~hή�s�z��G�+)<#�C<�xh���a�/�i����'�eT��>����M
c��ǖ߳�Q�?=��0�T�Z}G�V��a�k@�D�L�0>>�d2���@�ύFss���[���1�0.��7����~X:�g1�f���q����իU?a�n�4��	����/"���{
Ài���r]��������Z�Ǯ�η����A�^�`	������y�`
��
����~��D����?>c�>8g���Z����O�����o�������_��?h򦸐��Y/����,���`#x�V*o��4�@���iLLL"��Z��:K�zu�z����i�K%�eR�G
Ӽ��﮸��{���[�R��Ej��f�13j�����=g� �Uk�Q���>��������}�?=.����D��ZHִ~zx9sr�kW������Qa�������rbg�z��]_�h5+$V%R8y�;>�������45I1!oLHy��3�������3΂4�T�Z}{�V����o�H�Rm��jS���-���w��Ju{�0�K���_�Χ����s���@�a70��Wi��X�W��2f�z�
8��p�^����P����pa��R��Ɩ�看o뛃�}�C�	�~BXJ�O/��p��h����P�J�nn1!'w֫�_p���>����T�]h��=��q����9|e	y�;���-?
43ت��ת�wT+�K���(H�Ә�\�T*�7'%�p�OK�b�Ν(�JD��D���a�~��_�����3��8,��>���b�*��Q+���;����U��`p������pX	�؇� h�=j+�Y��w���~�w��I99S������q�	�j�R*���^�]�}:g���4�)�
qa����[o�8
/��<�q8팳 �L֪�wT��Kl�^�:��4�-[�T�o`�h/�>���j�ڱ�R�=��0��b�~��_�և>�|��?5�q���_��.�� 	��W�f�k�� ,4��'�jӌ%�� >TqX	A�X�Z�m�ý&n���r�Ӄm
~(��8̀�����Q�4NHf��-�s���
`ڵ�D���r �x)b�_����-ߛ</���@��}��A��U��T*7B6"B&����ˑN���,���������ۺ��0��b�����׾}�G.ħ>�/�A�W�g�����@)BIk�����PEV@z�ܒZC>�(0�P��@x���N�
�hVm�D��%��8bBL�իv}��Ո�$�*���Ɍg�YD��|f(t�?д��ƅ_+���e���Ot�w�B$�ƻ���Ŷ��t:����+�
����6�P�T�m۶6���a<��>��o��~�"���@�a÷�ץ�MB7M���C��aa��Y�a�wX	�5F�.
@y�80÷�/a�NG(4�����L!����q�������I�X�H�d�>���F�%/�-�OL�_Ņq�K�7��5x��:�;��e�{J��Ev8�@&����+Cf,jh�L��T�غ�)��h�?��.���.��c��?����:��b{��UX�L�[��
�8LU��J���}�9�|2�w�pG�ȏ�Ǟ��IDAT�bl���`��{��}���x
�%�H
�S��4�4��f���+�o	��	�ȷ���\�|
��m�� �8������Y�43�V�:
�T�kߥx��26o����3c�eY~�[�z�w��
���|��p��5p�8�~QD�ׇ��)NDb�*��;?�U>v�@�+��$>��}�+�$����Ђ]?��z(p�KXO�dڳ�����7�?�C��a|�k��[?�|-���A���Z�Q,>j�v��#3#��⨣�^���)BJI�T“O<�b��Fp�em�,k��_��<p��?�7�����4FM3O�m�38O�*h�Z.
c�d�n�@��D f���*�]��Nszla׸"7�h���Y��]�CA�DA+����O?�/���vA�7%��^���3����N�Z���/t�h\K6���G�ni��J[r�r����B�oR�AC��em8ᤓ�..,��_
z����ξAtO'���i�3!.���^�$�h��0�F[p@��ڞ�.�@�]�Eqen�D��:]h��+�y���9їYI�� �}����;�_S�����ۄ46��8{��
���=�4��^�?3��?���5k��}v�'�r�<�0
Bxd�'����+V����ՑH�~��2�
 ���f�oO�OH��
�N�>懗8�@`�!j��h/��'li�gOS�Q@9��U�?rpEn���LU��5��\�`�$¤�ı!��^���V3��oIJc�;��w�<�������\����m�>��)H��f�X�v-�TϚ4�B�T��>����f����Tj:�H�1>1qm*�r��o�z��0(��=
/H.�H�\ԙj5vi��@��a����L���n���f.��!K\�CC��K#m+}�]_��y�%�xH���±S3�����
�YҸ-)������}Ԧ��Ot,�{�iB@)�anv�C�gd�9s�H&C��D?�E<�������,r*��M$��懆��d�ΑJ�@�>r�2}k��������m8,@?&���z�aOˈ��F���y�v�����$�K��z��}���%��ه��HJ����{n��v>5�1x逸�0r眀��ց��\�E���~!P*�ann6\ׇS��l2�zO6�������������&�E{N@�RrxF�8��%�^延Vy~�~�a�#�$�䠯kи27�.����:ŜZa�J��D�k����Y�l�� ���w���ޕ��}������fc����`�&ٶ��'��^%I����p�q�#�H���ߴ��W,q{03��9��s��l*�|O&��Ū�+�B!*M�m�g��A��B�vpx
��+��G?S���7�	�	�6\����w��i��y���������
�{���\�����%�{R�|w�4�/�����˲�m���fg?j�v���\.��B���^���^ڹX,��M�`����23r��l*�~O6������333��O��@��`�B�1f6<%������H�a=K1��#|d�!!|77g\�oޮ���9o@�#f�&�^4����Ϲ6���/�-ilJI㔄�*f��7s9�}�Ê�e�R9s~~�c�m�f�A�O�yw��H�����M�~�υ�6�s7��v�V	

Mg2�S�/����m�4q��Q����|NcF���6K2�����
(�Hj�!�z3!;ߞ���X��q�8J_��4��̹��N2�8&���� ��D���o>�R�XB<`���΀��r����F�'f �±��d*�e��I�DS,��m۶�8�|>?��d��n��Ιg��ȿmA�J�V���-(\!��m�X�a4��R�q��m�pX	��m�6#A���4������نV�{3��D�!���D
��/6v��_ҹTc��@��H����N?qˊ�J�S��E����?�?���.,,����֭[��d)��l��+W�lff����P¢3����lBϸ��n�@���S
�Xֵ��ݿ]�
��)�P��c���yO�$��8�$Rͪ��l���rƜk��Z���%�[Ҹ;)�w&�|P��G�V�Tzo�P��n4�f�0����%�8ޜ��w⩧6Ck��z拡��m�\n��'�xM�Pp�����:7AG���W�?�4�]�0-t���"L��k!8[�! @B!Ơ���!AC
�~����5s>��2�8:���rb_�o����wl�U|��G���-)�H�{r��=h|��g"fY�R���b�pI�^_v��c�k��;y;������;��O�JAڒ���{�K_z��Ν�4|�K_�h��%�-�os��255Ƞ�+ZN�`�����2��
�Ԓv<�q��8$�H�u/���z��c ��3,O6m��S0��+��kJ5��:yݖ��铱�}%���,+Q*O)�˗4�5���a�1�%��e=�����;��?)%�ra���7��Cz�;��_^���q���dgW����6l��v��u�=�pX��^�.�l]I������
<a��;�iv	��8|h�Ѫ�^PU�z�<�7��
�≦�����4<��Z���=�'4�ߜ��S�{+�o��%�ʴ�����n�<�0�<dwלִ��8�!�:HPw�䮮�뺟q��b@PPf@��L����\��
]ݷ��`�g�z��s�����NU=�{�hɷv��{�ˡiZ�%��j��z�9�hqK�O����~r���?�M�6l�v�����>�O�����>1]/��1nxJ�@4�L���j��R�`Yv�9�h�+j`I	S�JD���.a*y]h����9]��� f"~�����;&������z+�uEնV	)��F�D���av$�`�b��&m;jTm��>\�O1��yC�������wvtο`9TMK���K���Z�o��\Z�T:`z���O��	<��C�^]G��m����~��[/��
y�׮��8�X�r5��jW,S�e3�����T��nж-��E����S�"�Ԕ��7V��2@p@�s�@j6�aO����S?Ue�B��?7�K�}.������q��gE"��G���^��[��n_r�8*D�r�{�;�ч&���vttο`9TUM�������=|�\.�*��ț���(����ч�ƍ�p4U�9������ӟ���+?*��ʗ::���)eֻF��<���[��B{��:C�4�+M8/&_pl���g���O

��._���aJ�ќf'�()�|�_,G����+�uYMثd7s���!�h�"P�vѦ�7��lH�m�zձ�{c��h�!�e�y��'��F;O���$J��*��uz��} ���ƒr��5�*[��7C��'�����s��}����\{�m?�e�ǯ�_:@��䤔jp��[�]��U�aV�9�V��^i2�#~�;
Q*�;㌝\_#�2-`ϫ�i,?�!�X����%�/�]z
�������\?8h�"�Kua_(��(�1BVU�瑿�J��ak��OږC��wɑ��}�|�}��
���C��;�w�rpEI���*�p�_�,,X��؃��#�
��s�>�t��m���\oo�uw�q����?��ǿwt�7��Qo��S��7_���#��Y,{jѢE�ͯ��^�����)���\�dʿD��x���3P�&E���oB�+�I�B�_��Ngl	�uz|v�۲�`�_�q���G�8��q�(���
��u��{��X��f���fg�a�V}�}��7#�::�/[UQ�j��J�rm���/\�T:=�
���e^y��6�_���=�@�]]]�������~���w��?�cG�a�+b�g!Dý8#G���s�g�j�
���ً.��ӧ��b�1P��=��!%�
ѹi���N!"/V��R`�2�h��`��5��1��G҄��|��FZk�wv
�lۙ��̓D=�2�/�ݖ�'Tm�C_�p�ݪ����;3�<d�y�+��maX��6o�
c�F_����7���C[::�_���x�Z�@�T���E^&���e�H��
MCڙ~�}_'�<֯_��7mr3|8��������w�w������S����㰟�ӯ��kѮ#X�~���5YE�$��t�J��>���UU�|%���3�;�gqC��W�5ÕOLj�Nuż'�󶅍��
l�-���f���<�Xp�*��L!�#B����j��,�ߖ�#�	q�!�K��y��VTt��?]vo��n��ebD�A���DT���2�����u훷O�?c,���N�����%��H�R���H��Γ�	�_� ^x��X�$y1tww?����;���~�K�����8��p+�v�N���{�^= �,�����ZNӴ�����s��K��h��K���~7�N�Q�R)�We9�t�Bă�mJ�A����
J�L��u��Yĸ��QR�t:=�9Dp�EN
"p�pɿ��2W����HrYU�B�f.S�� 6��ma�С^)g�B�>����N��[�?���OD�0�.�JW��yP�l*�Ƽ������N4OA4�x����/������l���[{����/]/�~䊎��7	L^;1��֌���D�u#�C�B �J���s������m���~���1{-ϱ_��ꞅ~M;��H��n�\#v�Bā@Z�m��r�W�(XƔ>��}�����(����a:��J���%�F�l�ܖ��5����B)e�W��!���:�<"�v�
�_�c�@P��>��G;9���Y�'���_�eY�J�����R�4�͛�d2�/�M;����x��֭��l�/��s����m�}}W�p����(��⒎���+WC���x�OJ��,�a�(LNb�m�a��~@U�nU�,���R2���eY������b�L/l�D��5=\9KˈT�H8�@��U�*(ڦ�K��|��j?H6�[��+D��Z'(��5��e�Op~ľj��Y�D�m	�aS���<@\Q��j�����O����V�mc�C
x�ύ��?�ؕ��y��p�͝
Pm�^V,��LsA�R��̝�D2�}�������?����}������������t��5���'���/]��1xE����Rd��l���w��
 T+ʥ����L6�q~j:�94�L�:>>��U���s�M_ۯ�D�y�˞�R�2[�\!z�F��KI��m�2��R��e�:8Q?�a]�M����P��!%���
� �lIy���ℎ�)8�ۗ%�Iˊ��5P�tY���A��%�GM!VK� vC�s���Pҹ>&��8U5�
��M!����3��J��L�l�|�<����y�/�B��bq�eY
�L&1w�<��)6	���v�|��?�۷C�f����{ּ�
o�s˖��^��axE��>Gx��?!t�/ͨp��,LNN�Z������}P�z����]R*o���[R,n=���`��N͌�Ϛ�n��G��x�ؕ��M)��%��?�c��Z���q�Ǡ�z�h�?��_E��-#Tf��٭��]�Ġ�c�������cɀ���ʒ�B	��_�ܕ�
8���㟓lz
��(��I#v�W'G6\�?���lw8�eLJ��T*5�?�C���!�����iL�����C���Ν
�}}}C��=+�;a�]B
;$���5:�o��m/��)��j;w����C>�o�Ƙ��ڑ�L��s��n,{����k�O�����i`n$����	b�e0DH#���Ky�-���õ[O
��f�%��L������c��&���j�O�R�H�2@�A�\�G�)y�%�*	d�R�ΑFC�󀹬��g
1Ձ-���	Ӏ0����֫��yO~��z�⌡Β�k��եbq��D��Xs��C,���]��Pp�hp�'W��fs���W�t����Ⱦ��+Vy�Q]��m{��_3��m��2M��(�K�����i~�qEIs�����H�0��e�W~�s^���}���>#~�3ϗF��ē�]��ʅ1�f3@�N�/��_)a[���k�k�|z��z�����hX����7)��'�A�ĉR�5܍�w1�KvBܞ�GQJ$����r@Y���!�8W�YN�H{{�6�練�w�?���mP�x���w[4�9��$���_�=�k���Z˲H)���X,�9s�"����tװ0���o���~����}c�l��Y������Ǯ��8�a�|M�r�+��!��)%j�v�؎b���"��ֳ��TU���>�H$N�L>?q���>�x_���NY:.���V��{Jy�M��E�x���2�D��9j[x�0�q������wJI
=}���u-fIEm(�@@UH�[ʶw��4]�H�;�r6R����-�J������q�8j��|u{)4�@MؘlE��=�;a2��o7o�kG:[���1FB�K��Z۶5�x�g�A4��X�Q���Ϗ>��!
�ɾ���l6{vOo�=}�}�'������J�k�9@p�eY-����w˲066�b��Y�gc���P��⊒�)����D"��J���.��2y�_�����m��8K.���e8_�d�Wj��S�O���Z+�f[M�4�l��F�M��$�O\S���؃e�ni���kQ�`9��u8:�g�=��K�
�P����!�f:J��=�X�٧�!H��ɮ��=T�W9�?����Q�'Gj�|��>P�YU����ry�m��uD�h,�Y�f#����ONN�����a?q�1&{zzDz��ٹ��{|�16:��qx��պO��-B�����]	)%��*^x�y�'&�����f�Hd��iW���3&&&>�`��{���}}���<t�	��\>�DХ(<���5��٪��c�	P=�Rb���<[Σb�-�;�X�z������d��H1'�ՔmC�MRB�4Q<c�9��<`w_���
���"$|RH�
��w6D�G!�
e�^ߩU>�j�˄h�� F���}(��S�-�	�W����R�\�L��X�g�F4����^�B��'#.�;����Dz��ٹ��{��`�ܾ_���vt,^�pg����N4l�,##�~�0����x"񷽽�?�f��]�5u���g��΅-%g�7'�|�,U���9���%T����"6V���V]uM8�B_�,@�r�/z��L�7әT��ءNG�w��G!��-pGW?�DC|B@����<
4��u����:��.l�-���	����*�3RJ��ζq�`�
pιi�˫��ǧh��(^��/�D�X�SO>���z�����Gҙ̹]]]�|�[�04M��l���X��f����P&�������}x���>�����x��ջ��H4ڣi�'UU}5c��F�W̳�z?����בq�k3�[s��F������g8��,E�j��^r����k�����(�Q���wf���{��T����R�$�7�R�~Wc�f3��o@C��4��NH�(Cn.���mH"���h��7W��j��mCH��Y���W��=#%�	�WE1MsY�Z�z��'���Y�D�ݾ8RJ�E<�����ƭ�3��d�������l�ʐ��0�o�F)�eӅ��Z��eaxx?����3�V��dB�15�ɼ���만�K/��X,�/\sqG�p��{z� �~h$� �%ݜ�>[QOS�4�\"������N�
�D���	����3��!�D�͂�t��L)�4o=Q�E�,���3��Vi���`Оd������d�n� ���)��8H�F�v4�Ĉ 8c��.�3��t�e�V@�\3�Z�vu+Ϳ����i�M��)�x�ٿ��?�����5��dW̙;��b�h���a�
���5����w㖀ح�2�.`$*�2�|�q�_� �aYV�t����l6��d2���WiZ$�ַ��>t��{�����}�\`	Ǝ�p�?���3�u)�Ũ�w���sq��Ge�$\�<@�,�}ɦY#B�s�@4�!���&�����gI�`$���1�HU��<�%�,�k���!�ŀ�v�A+��!�B@ԣG�ɉ��}�=C�x[�5�e��'���9��_c�A��pɿ���k��-mPJ��Elڸ�##��A�s�\.�#�ά>xɒ_�E+��P&x_����9-&�@��c�y���-�¶m���3O=�R�T/SM�9�f�oJ��w%��|�C��rɥ��c�+>"d��(��jj��9nYx�R�3�t)|��G�����;F�����N5�K{��V#~�K7�ϒ��)�vRR%��0�Q4��E
��wv
@�kZ
 K���y��g4�?p��� ,!����Dx���2���&;zo�%��a4L�� ��MCwO4�N�3��$�D�\���?���?�1�d2�-�N]�����s6�<$���0横:+xgRnwċ&��!J�"~�a�#�D��@Y,�G��d��]q�^���}_%����H�=.lHXR���Wo�ˏ���j�XW�cG��h�ԲgK�P��2������� 񴹔����[d%��R`��-�X���!�$��+����[ޘhF���~�P`wu
���������������D
��ڹA�mcI	S��n�$@D8��'m!�>����x��D��Ww�k���5��$�r��-�_����G<ߒJ�>�Ʒ����>(B��ރk�y���%v���@��	�m�6a||K�,�A�������s�����J�VC�!���163�K�7�mwL��ľo��"(	��TJ�Q-�5��C0[�kg�io&j�i���=�!�x �dM��U���mb�9�
��~	�腍6�
�%�\���~9����{�F����"�9ze�xǯ��ƒ�p�1��F��-�)�	[H��}��cq�4�oY�u�m7��F"�uuA�"3~�Bb�R���[�`||�-o�C"�|!��|dŪU?}����7Bg�^�+A �_J�[=�$�E$1��x�q߽���͛��za�b���(9�`������be���@�y!&��Q�Ы�m�[/��,�b��M����&���W�m�Յ��6̡0�(c$pf��'�M �r��vɿ�fD��������+�6sA �����͝��=џ8���3��<�/_	�y²��<��7"�2�,TU��ܮ\*c��m����'pΑH$6%�ɵ�_��w�~��i���JŊ��a�v���!�_�5�����)HBJ1��9ǖ-��{~��۶5<��a�t�%K5�F������6l�j��Gz8�%�>%P{��?���FS��MA�2�	��6�(P�/�����ۮE�H�1��͉!���K�Z�����y9�ήH)��.g�j��d.\�oz�z_��� }�A��\:7��Yx�X�ɟ��e�ϲm�����UӐN����v�F�P�\Ǝۑ��cB(�US7�c�k~������?,o��+����8�!��s�&��ttӶ3��.�e̙
��Z�I�\*m�u���?���@+�ưe�����Ip���5Q���3��x���B���p��$�
����hU���Yx�VV�y*Q�˲5�DM4d/�D��:�.��+�]�8f�nO�wLM���<�z�O�83o�h�?0ಷ��>��f�-c��k�m��,�:ᒿ���"�R3#����C�R���1�σ1"G�״�s�x����G�|�#�_��;:*�{�8��OJ��~���]��g.( \�﫫��\W=Y�a�?/&��ri���^�݁Sb	=ǔuU)-�!�8W��M�)�&t}m��˰P'��!�yp*$
)�J[��I+�,Тs-)_�
`U�X��#b/����إ��B��6�a+�ʾW��9�s� h�Z�%�>|x��
?��[��@¶�l۾NJ��{h���!�LB�Ԗߗ��{�+�
w�D�P�ɟ1MӞ�Ţ�����#�J~����8�p�?Y":���G�U�����n��1):nO�rݬٳ���Aض�h�/7mz�hƌ~�b�e�vZ�>aۛ�I�q�+j�|�.���~rX�oR��(�A��ݒm��50D�
0�to�
�B��M��
�_����r@e���B�����aK'iKH�#zϼ�Jx ���F�|!��hM�C=��ODq)�YB�k�����UMC<���N�w��J�РC��b^PUuc4���?�����Z|�s���q8��
��8-�ܲ���`����	��@�Hi!�����\�VK�h�g�)�V�^�ƸmMR��-S���
��O��4����ښ�1�!\+!�QTh��ݐ�e��������i�,��4bsN'
CԄ�^Y��D�g�Kx�y�O�헛��m�0���7�M#���}�%�Z!�>þb�!>�L�D�<�@�u��u\x�Z��� ��b3�o�F���r�x����~��:::\���������h��91�A�����P�9�#���K�Z�>:99Y.
{mL��0 �Q��3v�'��H**z#іeZi�m�5��6�i/���4W|�-�*�Ƣz���G!�ݓ�]6��^�(�`J'iJ��<^%��Q��Y���c����d�ڰ����k�8����DN/c48�������|� Ť��R�����(��b��4��5x���[�V1<4�R��@���=�F?����k��$>�o���q8��8�9�k��?wEػm⑘i.�p�*�����A&�i��u"?>V�V�Ҩ�E���xk2k�RBRJq���8m�7��Ln�LA�9$�-)���8���셔�Ԅ]6��T*b��x]��QͶ��V�P�cN!R9���?�H٧�Le�BNu��Ie��#v�3j<����̭�@�`�
u�O�rl�Hy��)�����(�FcP�A�o9#l�`�jU���\.��tm��5M[�O��̏��ħ��?wtB��3��[&���?AS�0���E��f4�7#�.]՛�!��ݍD2��i2���Y��-�?�����Fl�X�c��ƈ!�O?eЦ|n�Lٮ�?�Un@�3����*����Z�]M��H0��;p.�	]:�(SXR��8�ظ:Òp?�	٫2v�F�B��5GД-�g�DM
<��G�
 ��>� י0����
,_�
D��yRʫ,j~���D�9��<�vf�Z����QT+��_Q�m��]��w��'�ַ�˧;:!�{�4�(�É(�-��tJ8��ڹ���g�}&�@:�A,`��T*#�r�x��۫���(��9J�Ͻg���
�-��|Z�C+3Q]H��M<�����Ԅ�ۏ�&ś[�����Ւ
`�F�H�U[XR4�S�Y�3���U�;䏮�ZBնQj��fJ�	�"��B^]�/!�L��zo}KV���y�<\7,̽v������kq�Z
cc����vh�v�K����!��p��^֞h��:�=�]�߭}���K)������
��c
Ӹ�P(��J�:�{UR�G�������Ҫ�^-�~��LA�&z����˽g)�@
h��ceiW�mn*�1�k�n[�7z�v��v�%4�B,�k�����Z��ݳ �̩�>��BN�y�'�F�2a�O�K���� P��e��ǹI���j�	��w����X�b��U��1(��{�C��O��\�kC�Z�_+"(�:�iښ���^����g�A��{���3���?c�>���,���uuw#�Nf��D"��{��νi���x��N�寏�(�DQ�y�~��
�vQbwMAA@�~��p�/�����M�ֈ�fa1ƺ9��z�_�&L�F4�
K���@�iEͰ6Z�/�?�2vU��9(�5��p��2`�B�~N�@�����H�I@^:�lء�Ή��]�b����"H����Y�S�M�u����V��Nd7�gHӴ����w	˲?��>�+WCJy�wy�2�q�˰�Lgu��hRR$��,���*�r�4���=�,qӍ{���^o	9)l�R����'o��D�r�W�:�@C��%��ϻ*%8%2��7F]J[!���b��թYx�螅�S�!B��T���1�܄l�E/1�`���>�sH�Į�1��9�����ᇖ:���#�:�4�@P9G�qp��F�4�^H��͇���?}����j�+V��ޮ&��R�(8�vk�O�n�����x9os]ב���zC�oUUGU]��d~�i����LG�!D���7@ݎ�*�g�ļ+��LP���.�����T
�X�/]R�U�Z*���u:�M᫶�����mA�mV� �E����5}��)h�r�p�8q�<kBl+�<dxG��V�L=^�U�KK^�ɚ�&� M�M��/�g�pn�Bt]��U����SIu����T�G=ݼ9�	4�d9s暫�c�!劇�C���a������ɿ�j������a`rrM�k��ꨪi�&�_E"��$�}�m��&"�uۿm�o�^����iA���k&Ŷ=_��Ų,����)�w�RqX�k{}|��0��;R]�m,��4	���"�h�kg���*7M�[��F��W|{8X�wmk��&�?���w�����m�l�
�cI	����@�j����H���I��IW��ɶ0j��G��\��b��"�#ɕ`�Kw%��<?o���8��\u!E!4�p��33�Q��B��H�DRU�1UUώF����b旾����C�F,_�
�1pΏ�u���rD�\�إSZ�L.�t:��϶,�c��~��L'���x����:Flk�$�s��"����2�]n@���VNa��ABQ��S��[��=k�U��]HG�xB;
p��DIXM	h�/�`1M����� �$'�d�+�(�(P�-�5��[��Y4鿀��2�4W�6&yI!壖���D\Q�;�
�\��BH)ɶ�՜�D�S�x�>�~ͣ@��̲L��E��]��TeLQճ�H�t&c����E���4�����`�O�0�ή��3�>f�0�H$�����Χ\��
����W������u8���SB��-�D��"�Ѣ��p�cЈA
�b`n�sF�k��va�^.@��H2��F*B*BL��C���i��� �X�[fH��m�+���ˆ�!��8#�/{f@�}2ŕU�x��P�-�5�!���`�ē2p^��r�����5�]K��,)?d
�'�����FD�8�W��_?�i")����,���e�\*�4�`3n(��)�r��i��]��(�˸�vt,B4³�3�N��[ND�m������[/oL�j�}L�H)�D��f�E"��jY֟K��h������^8d��Tn��i�)���\,��0?�b0nۨbt'���u���IC��mI���7�a�����p��׏7!+	+߮y�����1�|D"��F�2Qw�:0�SHeN�X�Bԝ5�8�'R��" � �d�ԫ�D=��@u��[[zB Hn1ΑU4�	��$���[R�ߖ�"o�p���UB�c�9W>N����8)%���ł֠�6
�S �ZJ�9x�R�i�
�)�2�9?WS�{�z�1�q�o�ឫ!^���D44j��2�ԕ��459k���n�^�]WR��i�sr�� "�����AyS�7�c��r�:���׍�N�B�X���S�@��~��M!Z�>,$ �~��;Ɛ�Z��$㾪(��[�-s[W/|�i�T�^���!�n�a[nK�z���� #	L�f<�u)�W2P�;��wԪn�C�N�O���P
M]�D\Q�U44	1aI���?�}��(��8W�$/ِ%i��O�)-��חK_�ժ
�OD�
1ΗE"���j5��c�	��g��R`���-�Ѭ����n]p
1�"j�{L���@�R#���Bq3���cN�ww�t��n�r)L�����Xڴ񹎌wGm��#QE}
�I����7{�kcie�pJ1������#<~l4Q�b�S~���Y8#����bB%6�;%�f����c&	��3~m��U��h\@�`��^���C==cv�-W}6@��*�i�+�R���:���:�K@t:���5EQ��_MD�ϧ3�6=�@RN��Bب�j�{�A��?�8_���6MӊD"{5�>��A�%����lv��L4~������VJ(��7�P5��jDqD�Q_�'"$��zB�W[+�������cp8�Z�l)��s�|��:2�U)P������b
 "�L���NFQ�U07���K�ŷ�c�Q��{#o����J�.r"�*���p��X4˕3�����GL���+R��J0��fl'q@�$�J3~L���%�mՊ�����k�ـw�9	mݪՙ�8�#)m)�b
�!���
�#����(�5����vT۶a�;]n��;c<�,$��a�,���<�;�k��/t]�c��7n��X�h��+V�T*!�J�@DO���+\�o�a�!�N#�L��@q	p�E_ڮ�+@��dߤ�4������H�cc�1�b�?��?U�P�"�xrH_p�~�h�b$��
0��	�EI@�HBJnI�@p8RQ�|��R�DnC�� �mj���O�qʱ�~6���u�{�� $�[��-�1��-[�����UP໭g�$W� w�Җ�S�s�B<��F��=���.�m�QU�>�(ʵ����2۶��O�
��,@˲`�v�vD��s~i*���Z��D��>�d29N�no�ko�5�P_��1w����f��\iA������eS
�ë����8�Ll�����;��,_ձ��x��V��w_��;��#:Z�G��*�<�h��e�Gu���jI����K����M2	h8�e� Q�m)�@2rhXH��L�
���i`�O�Ͷ~�r6�q:w%�����aK����I�z2ƹ�4۶c����!~�~R¶-�j�)��i�SftM�/�&H��
�ma�}8���V.�EH��6��X!�KD�	����+�og""$���޻�uh$����O��LW HjĨL���X�s>��ضmQ�VkRJٶ��1*��H)-)Ń]r���бq���e�[�f�:�����R���=�����\52;�x�J�-����NIh[z�����6㦎��L/�ؿ�V�g?)EE�E���l���3�X�]�>ѥh��_��G\Ӵ�E��s�(��ڶ�j��m�%��\�	6�'���c���?����<\����[�y�s=�v��VB�s���	h�B�
���1�%�
��9��YBXތ�4�1۶p�Ll��)��Y:�Y!��������+F�	pR��t!�ᬮ>��n5�}��*��
8+��5c��͕LY�\���lp��)EE�E�1Y71�R�ɐb͆b���㩎��䟈D"�SU�%'�UJ�4-��e���s��,�9LOz=����DD�?��;w�!��pK�h���^�,���rA��^�Jp�X�Z����+���I)�-�0��o}��C��
�i�p��"
�k�uD85z���vҪ��uD�ўyfĨ�j����F��6~�[�� ���ע~T#���%���~jtǣ���e���F�$�ѨK��"?�ѬP.�`Yfpz=%\��,�Z�bQ�5ldD��[���;�^�O�؁
��������n���a�Ί)�	&G��tu�_¶�LJ�v~4�L���:=EG2��ܖ�ǺRQ"��A^q2KJL
�t@s�o0�Ԕ���n��^����zف���_6�K@��Q5hQ�Y�\�`I�]��^;���g{��}���vBӴ�iZ�:EQכ��g��c�;��m��x�]{�޲=$��n9��U�2�5�E�V�j٠�'�I(J��;�����x�B��pH,�T�}j���9s-)1�g��GM$%��)$9Ɯ!CǦj	5o*���d��>�ߧ�"2j�\��K����ݱ'm�a����|a7!DB�"gE"��Ei C�Q,`���ps��
au��Dρ�W��-?|����7B��/�:~)嫈h����
_������S�T�ɲ����7u]���@�G��#���Kj�F��m
h$ͩ�4j�T-�f[h ����fA ���sjs��֕K�{
)?���?��}��㚦��D�
�?�S��P�ޢ��.�5��~�$tS��F"�n�ҥ?���w#��,[��m�1�MDW��o�z��ߙ��ڿ�L�z퇱Xl4�
s�� �T&U��n����,7���޻1���T��\+c�VAŶ��hʶ�|x��D�R#��!p��L)�5�X�7}s���'pNq��c�j�!�H��H�EQI�	��*�<��em�����a�MDtM2��ѣ�>����1�X��Dt
ʨ��`F�H	M���@�������/!���N�`%�:,�x�K1�Ĩi��:A{���Sf'L[*%�Wps)�V�o;"B���hܷ��6�{kR�}M����lyv� )eLӴ�b�kUճ�;d]�U111�Z�֨�5��,��������MӼ�T*�俟AJɥ��'��D�7K��ǯ�}���f�*����d��u]���ic��_G8h��"�w)���mK�1����0Y��dڶX꼩�7����Z�q�w[d:5�,)�	��o���}k�&,/Mtt�V_�BȈ�*g���9W
>��j
c��Z�P�`D�?�>�W��>����j�[5M���a���c�}����uvS��v�`:�$E<��
�|�0��ͤ����p�q�y��3��%���Q�K�6{Y��	F�4�
��R�8\���hܷ�{_S��ׄ��k���}}���_)�)�r^<��ZQ��@��k�*��FQ�U'_h�iq8�D�h�'u���J]��i����`�)D�)'��p��zl���R��qU@�'B&��~���I�0��se"�_�ڠWQ��t���[f�J���@�I�T�~��#�[�bQ4����qM�+����M��K�N�H�/K$�W)��@JIDBJ�jU����V�������K���@=%
��b�\�����r����j�zcL���+V1)�*���D��{Q?�I�o6
6T�m��'	D�Ѡ�o��^Jq���ڗ=@�Z��=��6S�F�dp�H�!��G�c�=HH�e#�h���@O$���I�C��L)�
q����q�3��_��b�[�J��RUu���V*D��p��k5��nY�x<�:}�50(�Xc��s���v��!�nb��Upc�"�י��~��!N��sΑN��)e���k���OE(Z �W�}Pq�k�(1����F�m�MB����7�=�8�ĒH0)�T��gz↛_�3֔&;=4Xs�%�1�*�N�U�'�V+ܹ�ju����w߫���kZsdА�b�eYw���;ჼ��%�."�x���{hi�oE�h�=�o*���Äu]�}����kׇ��&�&��5�S�&w|�q7��[1������$�,�j��$z#qO֣}����ל��m�~��.����K��#Z�?_�Xn��j��۷��%ش+��^s��iH�RP~��҈�b�eY��m�
5��n��w"z-��~x��hJ��bs¥��H4�4h�G�I�2DŽ��n"DK�3�&�q���2��^�g)�è5�|�&t��l
�B_4���Ɇ$/	]�
ea�x��G�}R7Vv���K�r�k2�����kҗ�T*ضm���O��S���`���T*U�r�D$���B�s-��eYfH����.'�wQ�[���~v�I�t:�}zڿi���Rn�4-�� �4!�9#�<�L{n[!Fj����<m��L�:`D�&p���{��jB<R���ʏ?�?�n�S��x\t�e@�����Z���=��J[�n�^�5|�e�g��0�F��d2�4�w�J)�m�1۶϶,��4C���} �x#cl��{}�D��T�J ��I�bu�/Q���[�}G��7��B�F8hB�q�3~&�bm��@ɶ����^���a ���p:yՄx�h��l�U�8*����[�ED�:�ͮUTu!��R�b��P�V[&�8c�8�>��H�l��x�U@�	a�mY�=�Z�`l&��B�K���)��O��ނ隼�3�4��NQU$�^�}�8�kE����?O�Ppw�l�R�9��cw�����wK���A���#¬hG%RHr�ޫU!+�և�,�W�';[�g�E�B�u���l6{�ꐿ�Y�����P�T ݦ,
�k[%�D"ds9hZ��-y������A��ߢ���p
N_?�3p�4+S��~ȍ��F#�lRں��V�>Q��E6�����@�,���D9�G�H���?L�L��t�¹�gE�8:����yQ��m��$�"��t^sѥ�k5��V�r�����ЋN�R�\.a�ƍ(�˻L�
.:�r]݈Fc�y�yxm��m��0�9��Í��^H�9^)X�r5�H!�!��7W�4�5����n�;�d���W�5�i@~����(���Ovz8�i�>���A�7H�`	��Z����`�o�?�^����I���>�"�㓶����H@t��˚�.��W�D"yA&��Zմ�A{l�T�s�>�J��P��U�^�W��h,���nD���m�C�m/�u�7�X�|ꩧ©�~�+WCJ���)@cďg��{k"ܬ����P��
'-K)�,���M���7��aw�PХ( �F����Ӳ`�f�:�{��v�M9fG86�A�{�}�OY��'������R�N��p�ŨU�Z*�>7��^�i��`ff���Xl �X[A����b1��� �C�!���gв압J��H$b�w��|�*X��(�r]�E�x��e��[U�t�rF�~C&�A,C��#k�ڷC���점	��	��oz�`�et�p�㨷wܦW�\>�U�g�#œh�%2H�`=Ȳ����l�KJ��}��k�H*�9'��^�E"g;�b������t�wSk���ƻ3�X<���>��	w'*ʶ��e����BUU˶��C,_�
R��<"ZFD) @��˶�D�L��me����x<_sL?��h4:&��".�JK�~��t�?^Z`�f!|��X�'3�L%�G&m��!S��t�˅^�Z��d��d2�F�у���[���3O?���@؞�p6��k�������C"���m�e]<8���X,f��	��e�}�1v--�
�^���N_�X�T�/�H)�ٶm˳�j7��N�~���"���O�-	��e��G6%��IHP��
&%,e!6L�����O�)��4]�Ų����̵�h� �FXH!����ԓO`bbD�1���Z=��ͦ "B<G?�ɤ��o�m���>��ms��!��pm�1"z?]KD���b��&/�� �J��|��e��J����Y"$��C8pW�,l2��.��q�i%l1u����ֵ��p"̋%qB2�W|�a(��`[�[�[Q��w��{ᚋ��j�l6��t&{],[�����|�q���B	)Ŕx~�l�O$�?0�T:0˗�~����<�?�={���p�?�uD��?��uݿGv���M?��@A��icB�_�b�w��!Õ��D�ހH)��V	:m�7�b�$�ǒX�̠;@���(�I�Z�O#�;,����l����'�������u�XlQ�D����c���k摾٧N�r�)�{��f͚�t:���,��d������߭Gu��<�O�� ��<��k�m�!�󥐿����Z�����Q�WQ�A��;�@͡3D(�C��7��[V��z��>9P�
4-�İ ���D�\m��_�I۾��m������p�5]�0�\�2��u�x���`ll��������{(E�@}=��gϞ=�S�ޓ��hY��_����7�Y�U=�O�}A��@��2��A��2!P�����*��c���3�C����ts���%�a�BU�n4		�ƒ81�A��BB��'�?��촑�7ݍL�v�\�8=���ޗ�d���
f���Q���G08�ӏ�iE��LA�L�0w�\d2Yo�<��0�k������ϑ����ttB�8ɟ16#�.�7H�ͳ��m�Z��R)��J"@UտSU�䱱15��x�˞�xJ������j��_��|��gѫ�n�<��}���g���d�v�����g�ٳ���u�x���3:<�Gy;vl�mG��f���,�1��i̛7�L6���ݗ�����������8�xqX��BQ�1v���mi�iY�m�@C3o���B�T,6�8W�[���=7��DB�8��B��7` ����Z�-�7���Œ8%�E��}�<�7o�=���>t�M�bE�K:_�4�L�l.wm�ه##Cذ�!l۶�'}�؃��Vd2�_��l���o��F�Я�����}�Y���������a� �#D�)��b�n6�������{NC��Š��**�;C��ID�䜟��Oh�,`�8��@ӜCJ�
��țF�v�pB=��pj*�U��&<����I�^{�aK��w��J����KaYV<�J ��}M,[$���Z���к�}�v?��!x@J/� r�g�!��a���Hg��/��eY�ø�_����=��-?�aG�!�����T*AJ9���*"�#qZ�?����*�+�M;��B�P��k��(��(����m���/8�g�����A�OQ�D��1���_��uͿN��%7��޼m�=q�Q�s��:N�]|lێ%�����ď��A<��?b˖-S�=-��&Ϳ���^�l6�g�J�e=o�ǿ�����w�?�����C��Dz�+��L�$�����X$X���,k���b\�VQ.��FE�h4z�zr2�f�Z����OU����Z�l-8y�������������WUK=��.�B�H<?�����X,֐�;48�?>p?�l��@��w���Ƞ��^|ȡ��r�+��e��u]_�����o{��˟��::!v+V�cLe���s�9"�9h(��hL�D�M)����Y��	�/�		�LU�K3�l��ubz��8����
9�[V�#F��`��Z*�E����(	�q��҅����_��kk厞�ŗ\Z4=�����X,��ʜ�C���}�����7D�L���}}�8�Ðk��nY�6]ׯ�����7����o��8�xq "��>�9�"z�z�7��O�
Q>-4�f2oܦ�{���e�J�R��J�Ht) ��X,FV�^��a��q@�z�z"�)��ws�Z�b���#���Yt�����B�?a�W���ȇ��{�z�ӧ"RUU]60k�U�ht�t�8��� ��o�m�c~)�z��5z/B�k�700�y$���n#{�ء��ý�}�q��w���a���`�
0ƺ��]���|����u�i4Ԁj�4��� 2�ղ �����!�N#��CJ@Q�i������ٖ���ϻgaC�ԛbl�ph
:�&��#�3�Yt��r��	ۺ���O|�ӏ޷O����}�s�W̚=��h4��6�������~�}�Y��~o��)0{�y�ю�? $��ժk��۳�.��_����b7�b�jp�OT�D��1�㐿ӴG�Z���Z;��<_n��j��B�����bG����b������q�
�c�S�3�� l��`�z-q��_���}���4n[������ލOu���]�a�9[5g�ܵ��?<4�_��.l~�yض紛j�ie
�m�����G�\.�P��0��Z��r˖-w�}�/C�����LQ��3�����oZ
ض�j�
�4�oA�
/�5�f3ϴc��_���}���F�����t2�Luzh�i�&�4����-�E���8�?;��׏�֚���<��x��:����+D�z��yk#��O�B
��~�m۶���=��O!0�.�1��\6�}$�0Fj�ڲ��_U��?�>�V������'c� �.���4P�����?�~W����a���
�T*���D��NS'��b�OL���0��Y}�E�M7�����'q@
��{fcWaJ9�iޭ4b�0��#�W�sN������1�Zq��ֿ|)���j���s��W¶m(��f�y���=(#�ø�g?�֭[��#` �B��9O��^�h1�;~i=�N&C��j�ڹ�)&�;︽��bfp��@J	�������ԣĄ�L���?��(,t7�?��0B��1š4Ƙ��/�D����Ovz�U�& ��V>��@-���2!��H�l�B<2j[�yx�c7%s����{�˯�a�L����[�͛7:y�('�3h
j��\�� ��t)����ex���ƪ��م��o�	����bfX��B��JD��1v���'1�1��B�R��s	wWZ�t���L?3�[�J�"&��!l���x<�X����Rѝ	H�`]\y�%qX����yP�%��I�~t�2�YW.<�t�\����]~%j�E���.�/�G�B`xh?�����/4$�86����n��ۮ�'�|2��{�?+k.���{�n�bhZX�q_NJ���|�*�9g�mHU՟rΗ1��O��%CG�T���ȥU�f��?]|�.I�I��*/��_�(-��;a�&�\4c�D"qi,�_���N_�}�d��k�\�.�"��ps�eA����I�~|�2?��ԟP���t���\.�T*�r�ܹW���yH���{ضm+�8g�&ǘc��m�Y�\�c✰x�b�|ʩ���q2|�jzm�Z��](��e�~�+{�X�|%L�c�HIG!?�(ʻ�X
��M�l�F�Zm ~������㽟��ӼM�Y��Z��������s=_��b���c7Ùć���]�_87��#�r��X��ё�#6�Up��T^�����m=�xO���ŗ\z��2�d2+fϙ�$y��Rbp�N|��}�!� 0V��;� �?;���%Kp��g����g	@��J�rn>?q�%�\a�ܹaM�}nd���j��\�2�"�{��#�0P�T��"0=�7,k�3�6�%x��B�
CGo_?TUub��4"�o��;^���N_�}
� �G��6�<*B��|Q�qr2�k����$�g$ ���6�_r9����}��Y�Z����=l�B@�w,}��/��?T�g��j�U@��J��|td�7�f�6����#��o�u�r"'�D�	���D����|j��[���%���O�;�I^@k�W�ufy�
b�`�,�b�r�t��(7h_����0]L9����2	����oJ):����/C�XԺ����B�;w����x��6
�F�9���y�Z�p�%K���g����gCWM4t]T���y�7��u�'G��}�����l�J�˩�r2ct��(�+
?���`-)%t]G�P@�Z�Rƹ���w��2'`����L%��,�ymݺ�a8�v2�өTj���/��eڧp@������3=0l��D��@�s0��u��e�2?8a[���A��R��������k��A�J)�c�v�����oL��ϭ����#%000�3�x�͛���]��2�ʼnDb��?�Eٲ�ҳ��~��_������q��R��VU�X"��s�3��㉈�*�V�TP�TZj�@{����B>��M>�
.�����e��j5��qd�9��9)��V�yΕ�=��N_�}�X�H�Ji�E�P��%������B<2j��l5��5b��o+{���R���h__߇����K$��o߾
?��Gx���nL�TH��c��:)H�{�x�h�s�Tg��F{#��;m!�.�J�=�8CY ��%�,��-a	����+V���{E9�1�1��*�ri@#�;�Xm��	���'��a�ݰ�7������?h�iE��r�000k��e��
��,=�چ
u���8����,��>��91b��n��1�:��j��.�ʷM�����@Oo�u�drQ�Aܶu~r돱q�sS�fx���g�i�رcv���4��*"�(E�	�E��>MU�%�xuwWwa�…��j��?�|��;6NV����BEQ��_��)�15ئ ض���V�н�^�"��K�
�v����v��(3N["�@.��*�5������;}	�	�K���'g-��K3��	b
7�K���lk��G;9����p�Ϛ�.E�\���������@�RJlݲ?��O���%��c�K�4����ܢo�`����
�(S�,˒�ry+�/��n||�Y@}�_�踽R�x8�<�����)�%D�o8gn�zsvǷcòLԪU����7��n�LL>�ߩ��:�7�d[��wuu�W��xpǤV��߱cۛ9�c7�tc�/i�q��~�3������2vRP�
�]x��ֿ�;����l��%�^]�%�������n "��~���駟zQ��B�f �Lc�r��M7bb|�iAQĢQp��9�1�D�M�� �x[,�N�3tđG)�o|v|�!�ȡ��FM�p��8��r�Tji2�|-c�Z��ZΕ�c�W���9��J��r�˲����\>S;?�{��;����_��&!<_@�== "p�9�ٶ]ִ�������#�'��U�We_gl��cQ��m뒓��>��n|�0����ɧ�
۶�s��&S�7�@bc���عs��F�<�3A�6�}v���1F��'��s�"?�GM�AUU�b1��ҴH"��,�|��i��r���ٳf�:�Xs�ғ
?�\w�x绑J��-o}��H�tM����$�Ε��^�F�/�\*�Y��~�ϐӛ�Z��l۴�]����;{�Ey�߼�m��̝MӼ���Jjpp��'�|J���p���R]�1����i^'������O��R]8�8��C�[� ^��7�L��l�v��(sE��C��f1�B��ᡆ)�LPX��#�)B���011�M�6�P�D�R#B$��j^u8��(J4]���1��D"17���9���!��?���?���N�>�w��0-���,J�3�^�`��9�0ƮT��8�97��-���[�9�T���"��x<�D2	"�e�Nވw��H[�6���L������5NDPoo/��fN�␲�F���w��w��I��3�4�#z'�!%JB�7a�W�x�Uf=�G��pm�f�����N���*�b��2��y6�h4�E�#�J�4
�1��f�ם��蠺`p�b��9���6��<���Q,`�&"��H�&��c�E�UUO�H$rbWW��x<��c��z�a'����tz�;�w��غm;�}ι����=��7��z��2��{EY�S����g�p�4��e��e���4�Z�L�A��#�͢���\�h�//n[VCap_�i���F�O�PO08�h�U���#�R)W�h�b�n@��LJ���>����_��۠c8 �ũ.<Y..�W��;�%�{�O����r�����a���⨣��ܶu�ÉTz�`����q�1�̛;�-06:�O�w���	��+�9���I�رCC�(LP.��i�Ѩ�
ꡧn��Y��W��H�ރ����Gu��%K�?�X��W���[6wz�8�-_��?!v�'�J�_�t�ҷE"���k8��V�H�y�1FA�A�0|�/��0��N��sۀ�:s�匵}�o4Eww����i��!O �AQTH)��1��*ʧѬ��៍���	�F���0w�<(���T*>�{b��;}KtDЃ}�`�P�/'��+:�v�aK�}����#�B�q�8��3p���u�}�H4��d*�:M��C����$���#x�q�s3�
x�T�0�H��zO�
~���=g�z�0{�t�� �7����i��inU�O�m?_������#cc�޶m[1�J�_���N�K�y�_!$W>_U�UU[���!�qR�#c=ޘO�6ΰ��0���_��i�/5�o�ܵ���uc�#�� �� �Hx?�ɺ��V�(
�,L�R.7�o��_���>7�f?���s�Ql7�����	KOD2�r��YW+�����#c����N�"�!�v�?/Ԉ��{'l{��EG���?߇�w0����ˮ�mY�� �J-�D"󃚺۷m��=����z�CA=����N^�����1
tw�`޼y���D�rh�5X�	˲ʀ|�1��i���ri�0�t���|�����c];�+Ws')�r<�|��E�Rʃ�G��N�N{H'��^��.�75b�4�4�g*���X�\�t��6l��w��6*�

��<J�b�@]�j�i���jE���v��8~��)�_(��'��c_���O:�W���g6�m+sL$��
щ۾l�����_��O�=|_�>�<T*�̑G�UU�L�R'���4��y<�c��œO>Ѳ<D3^���*�bs�h�=��d�@OO/��4"�(d��{��X�U��0cl3glc�T*�>bY��4�6sF�����صX�|%,b�-Q�`�\UU3�+��QR��D�c̉�	�jH���VCM��4MO0N{�	���Z�j<[&�A<G3]X��YJ�S�q�߬����Nd�@�ZAarc��(��mDh�����ױn�,@�$!?�H�	H����α��O�:���E�,XR��*�k"Ć�]p�>��?�
�_
�>�h<��ct�96�I��f��"��������blll��m/�O����y�M&�H�3�F��@?��b�Xˆ"�Q$�
B
Qd�A��b\�u˲�q�0�m۞�,k�,�|nlllK,�����/_�
����X/c|>c��gEI(�ʅ��R��9"��~*��v!�kکA�9�o΀��q7���@2�D6ׅd2	UU���U�e�z˲�c||��d�'���1�^UU^�(#��Л�z�{GGG0�Ϸ�4�*��٦��i���,Gu4�k")������'C�w�w����m)���(��G}ff��nc�9��/8�+ʧS�ԡA�%"T*<�i#y�a�$���{��#��
�`�J0� �#�J!�������H�3H�R�"Nw1�:�]�vMK���
���,"g��K)m�,K�Qs�ڊ0%��D"1w�RJ�BRd\JdD�x��Za:��4M����u�e������E�o��D���J��D��X�5n�7L��?�����_ ��*����?{Q,;�1:W�"��f��(%��j����qc�UJ�&�7�x5�M>A�@�@�,Gu�;~)R��o��w��k��O��_�+^X|��d�_~����t惱X���9���D>�g�z�<�0�|��7��C�g0�O�	4:�Y�0p~��!�C�D�h���F.�C"�D2�B4k(��)|/�k;��¼uh��w��"b[��bm�B]�
?@��mö���f�����1�3d����~Nر]�V�R�K�0y?�~뛍%?>��sP���Y�F����he4=�+�B�}y��j����1l߶
��D�/�yМ��鐿����i緜�6'&&n/&�B��k7|u��#�
���U�/����
c�S���G�79�4���<��_�n݃رc{�}�T!�jv0u6�X��1��j�F#�4
��B�h��@"�D$A<G�
5
F�A�mи�a0u�VDZ�l�N�����=·�
a�&�g0���1@�T2�\W��TU����-Ӵ&L�O�0n۲�g��}�����~�����,�D�'ѥ�X�d�+Jp�^Y�\��Νضm
��?�&����QG�c���511~[�X�ڶ�gC�P��p�ɧ���G9�ȣ�F��N�Rk�xM�
�0|��C�C>����=)�G>yf����9^�94M���`�CQ���T*�d2	-�犿��-���a�E�,X��|�,�j5DŽ��LC�g����-�5	�h,���^$�	(���PT!�Y�V�9���d��B���t��Ї΁eYj_�<UUOd�}4�H��܋����J���;�c��-���$}��x��R�������U�emɿ5B�
�O�h49{��%�e]����V�Q��RJT�U��
a�C�199ٰ�vBhvӴ~��s��0�����i>�a�	��1p�A�A�4$	p�p4�D<>���ْ��,�	���7�4z�}[�/��GmD4s�.������)��Z�˲��0�_I)��t�/�@?t���Rj����8WNf�_�L&�bn���ؖ�r��m۶b�/ �Ϸu۶���>����cc?+W�W�����dh�o�P��q�ŗA�"�Ho2�<MU����9�^Ў �V�ضm+������C�u������_�h�h$|j8�&�zs4�D��D���3�5��=x���{���}W�w��ņӯ�
q+S��śJ��k>6a�D�V������je�i5"���ηv��kƹ�"�e��>��i�+�H�Ӈ������ֶm�J%lٲ�6n��d�!JH���:ǟ��tu��C��Jy�^�m�"o��+/��_��+o{�;�i�s8�W)�\n���oO$�ץ��
�N#
#��x�?��GA�X�b��@����U�P����`�t���B%X¢�w���^稱�jp��4��XH`��_���-���ӃL&��w�KoYv�Z��ZJ�)]�7��Yf��7�~�k�8�e�k�t���^���'R��b"�U��+�ش�9l��#�,Gy��x��㝯k��T�k+�ʦ����C��8@p��\*��9sTM�,V��l6��x"��6&)9��C��x�?౿��J�/4�&笭馕h�	��$�<𖷚
��}xE���z&3���M�|w�i�tB�;�H�	��fsNkD����!%j�j�I!�+l��aƘ��k׿�m��`�
H)�i��'�@xm4�6�J-Q�΁B�b����~
Wp�G�5g�f����V.��
���ɔ<�K<��8�p�K`Y�r9Ͷ탵H��\6��X<��5˲01>�'�x���/Q,MS�@pY#��6���;���e͎���B��F���V� ���>�ž"��ic����)ݠL�
)!���Z���a�)%~M$'_�ʗ^���X��e!�+���co���H$��	����`'r��x3)�51>v[�T��+_��s�\z9��y����.��iR?/
�'��r��["�h7E�Ic|l_���ٖ�[/�u�l��_0�I��o�Y��
��>���]	���
/���fOGc1,Z��X,���sWJY��3�Z�R�;�
���D��o��枙b��50�L�a�UU��T*}V,�����5��'�o+
��b��j5|��_��y�o8 �A��������QG#�Y�h�7m��eYqEU{cr�48$�nݟPt�z5:I��`?��ϲ��Z��Ds�b0��s����蜭������UA�����޾��w�
�vE�/�7���(��j�z:���y]�/���\���=R(kD$���o⑇7��dz�ذ�!<��#8ᄥ�4�B"��M>?�S�0�+ʀ�(*��52��&'�VU�Y�4C��M����bÆ�8h�Ҳ��G��矩�r�a]�Hd��0	�H|�0�f!�����hS�_S5� �?ׅB��-�5U4�{�~C=��ڢnv�lw�Ë���*zz��ժ�
�OU�������I]J��|��x���ߌ�֯Æ
�c���e�7n|�n�+wY���{8�1���|��|~�ZEQ�B��"
���-oy�,�ˣ��ݧ(�28�{�~?%O�Q3�!�-��]�}�\���f�˧
������v�p����ͳO�'������q/�KUQ����8}�e��r�+���t�f��o���7���!�=n��/'''�RrUӒ�r�w�cc��(�Ӏ�EBy��J�
�]|��!!�_���y6~@J�VP�'1�N�[g&�]n�(�?�0��;�@��ym�R
�/ \"fS�A�~l�+�Mn)b�8�5���o��8�܃���h�@�ȉ��s@e!���o}s���AS�3+V��|||l6���n�<_
B�$���,�͂m�ڲ��G������n�k-)�{��$�M�O�R��Sc>�D&H���ҍ�d�q9���P�ƼB�a����D�߯y7��t΁1�1Ӵ6������o��>�W
Bb
��ժ[8�

�<�Hlڸ�r�.j��a���fGC�#y鮷ݿ�(�,@��l��Zg�=�y�#�<��I?xL��{�C�w��"�BB48���z�F��	��;P��}��~!�"!��Ư]��\���BN�Ϸ�3�~(f]��k�iGJ�Z�D����]��G�Z���3�h/��A��3H�ތ���5	��[�~XK�FQ�
������4M߂6Bb���Z4�5�3y��"���t����B�E���hY��{o�^���@��~��
��BL�v|�rL��eW�	AOߣ�9�x<�ZE�m��U�&B�%Zi������5����g#Q{�y�l��<�M�,�	�x<��Y���6ӄi�`�P*�P�U4���m{�_�I`�€s�h4斜�P5
�,�B��q;u\��ݵ���ݩ�#ZDD93-�*b�(���7�����2D�� DKT+H��H��vיX��{$O�]��,�8��3�f!�!LUUpТ�8���ut݀�� "���T*n�O�n���jHk��s��q��G<G$c���3�4��g���А�n�	x�����4�񢓂����X"�x"2��_�]~⺫���bE(B�D�\����8�n�.u��e�h�
HH��;�]�$�[����e!����c�CwOO��{�E�q�5]�p�p�h��􅁪��5l/�AS�e���̣T*5�.���v�A�V���q��Nvg.���!�E(B�D+��Km���S����i'��B�C!"�b1u�1�5�'�V���z����ӑ��hZg5�6Id}}��7���30c�	�����Tv9�B���h��[7?��-Bb:4H�a{��fuocѸz���[�(���^��?���H)���
s5b_3n:))e�IJPM�IDAT7�,A6�@�(
/>��رc�O�mt7��vwL%��������?��P�h	�#�dR��Tʷ��Tx��8x�,��(�z��W���Ngp�I'#�H���>Y*�~��d~���Ri�a�H	�$���0����crA�x
�tb�F���U-��ŷk��UU��H&��C1::�j���LV�J~��r����o۶���h�P�h	�0 ���R�D�I)��*��L&��@SgAA�'pʩ�a���������������
��D�s%KN���JBӴ4M+��Q�T�����L�(}�����K��޾�,��S|`�,��<��0
��L�����o�i
Q
@�v@�6���6M�{旚f_5
EQ0w�<w��~$���e=���)�����~��e�}��ᆯ�ʏ|lG�P��GӖ���99�P���`���SBC�e2���h���3�C
q�"�	1T�=�Mt���C����e#���׼�D���4����m_���~?4����LLL�/y��䝖eU<�M$8�ȣ�(*��m�/��}�S/!���/��e�Ї#t�h�P�h	Ӵ`�֨*޲L&����Bذm�H$�3_�Xx�"x��,�B�Z�w|l��^v���|w��ͷ��
}����d��LӼ�3cf����<��/�|?�m۶�b�B@���,�al!�I�6ު�임C��…�����wf�ccc���J����/}�xb|||�+B�g��V�(8��#�Ng`�5�v�� �u�<�>��!!ZBJ	)�IM%��6b�^��7!�J�dfYVy|l�7_���8>>���E�T(�駞����]�e���K�R8��S����4��#��m�_�6����`.�y!�"!v{S��D"xӛߊ��k�6�Z�O�R�+?�1��w�ݱ���7��#�<�.�K����tKM0"̝;Gq�o
���w�L�a�rB"��k�D�nl2�ccb�F(B��,4E͝;����1,Z|0�?�G�u!��48��+���g;=D��?EQ�ccc7!�y!�����c�E6���u�����ox�>g<��N`#�ڶ=�B�C(B��ǯ��w��m
.�3g�SVa#��Moz3�����4�����;�����NO�P.W~<11~�m�5��H&q���b
�k��K~�3�Ɔ��
0����7\�e�u�h���)(��7��;o~����V*l�^;k�,qӍ_�����k_E4���b�S�a<@ze��Λ��;�StODI�T�\iH�r�]��-Bb��2ۓ�={6�?�h��/�mk�Ν;��R���tz���,ض�}xh賶mz$�is��q��J	ضxY_BhZ�rh��W���l�����G
�m�U�F�D��=:H&�x�߿�l�_fYfup��[TU�gOfӾ|����"E�ult�.aۺ'*S�4^�A4uM7/o���p_����t��[;=6!�]� D[ö뤛�d��y�����kqТE��GJi�J���d�jι}�׮����n�
��]�V>U����㖱x�l��^���l!p�M���,ľ�P�h۶aY��'�W�‚q���r`�����?m߾��M?���7²����f����Fq�Ǣ�o�5��& )���Д&D��
���=%���������_f۶12<��H�n�a��f��k_���96:z�mۆ�㠻����*�㉗��S(�N5TP5t�2���bF(B��kc��N�Hd���D���y
Z�(�sX���?��##C������a�k�Ryڋ�RUKY��KO �1�)�]��l��P�T�j���$�+���Z
�ZmBJ闓�����ŋ1k�l�N�Rq���O@,����j5?2<���bi0��w����ժC��c�3ܤ)%b�8�>�X̙3�eM�
���s�Z��4aYR�4"�(4��-��7/�+��v:l�>#�J��(J4U��a����F���r���t��"������N,<h��̲,{td��m#��(��R�~�:��
o���-۞�Ǐ!"FD���Fcx���b�D݊�`—�D"�9s�b޼yX|�,=�D̟?���M@��8c�'��緝��(†0!�1ȫ��8Goo/���p��G�X(`tt;vl���G�X��8���Q�Uw��SN9-Zl�.˥҃�e~�׿�E��c����h<��3���Z��ʵ����KS��1RJ�4
�v�n?	��ͯH>!�k���4�f�FWw7R�fa������B*��I_J��L�4��, �t@��pK�[�U�HB3}SD<���d:��z
��ƶ�[1<4�B���;wbddx
�|�w�	H$��J�<911񙡡����*|��7��Ƿ�k.�cc#;����~;�iRJ$	w��شi#���3�\qǵ^����f�F:�AWW�ϟ���~�3h��r��_#H�Z�L� �t@��0B�_��U�V�GZ�������EQ�#�`��L6�\W=�0�&�Ķm[���cbb�7�E�x������s�zŖearr�f�0����5���{{���
���W_gض}W�T�9�\����spꩧc�(��H$��={6zz{��d0o�|G�3�'�
c��f�۶�J�\B<'����~
��!�;B��y�{!����N����u��y�-�5-rH<����`Y�D��P(`��-�n�D2�-&&&����?�}�Y�~��t��_��o�W�r#n��%�L�ln��y||�>�0���0k�l�r9��ip��q�ƺV�
]�7c�����B~����S�����N�~�}���8���1����tuu��d��b��Ftz4�D"�N k�{�T*�����x�����o|��N��ˊ����䤶p�A��uu7�+ ��iY�A�D��t�q���4M�ڄi��Dc�{�m||lga��6}�7�wS!:�P�xIX�l%����������l6�#��uC��j����W>z�v�����&&&�]U����i������ٕ���d��LA�%�u���Q��8�(��h�T���?��z&�Ŏ�;:}z!�C� �ˆY�98�w���ɹs�-�uu
��^]�O��Xlq4Sc���5��'&��'Vz���r�q�/��S�#x�߈w��=x�痦��es]�Z�~�V��ry�m���b��u}�����������H$*��n���x !�����V�������i)���CU�S��T���da�Z��Z���e�^v&�Ȃ���J�o���d�&*�r���G#�������pybb|g�TRn|����C�
D(B�5�}�y�,+���5+��v���F&&&��ry=cl�s��L�q���
R�ي�^�iZW<�Y�R�����(�;8��o}��Nf���1��mo�r$����;}H{g�s.L�b�T:�Sn����=L>��ӝ>�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D�!B�"D����Zܿe^�j%tEXtdate:create2022-01-05T19:34:08+00:006��%tEXtdate:modify2022-01-05T19:34:08+00:00GV)WzTXtRaw profile type iptcx���qV((�O��I�R#.c#K� D�4�d#�T ��������ˀH�J.�t�B5�IEND�B`�installer/dup-installer/favicon/favicon-32x32.png000064400000005616151336065400015676 0ustar00�PNG


IHDR  szz�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�������	pHYs��tIME�"�~X�
IDATX��it�������;Kf&�>d1	��T����R���(�Ҋ#Eꂅ�r�FA��@	��`\z@�@!1$���d��L�w���br�C��>��{�}~�s�y��_	6y&cP�G��<{wz.X�(��1f�!��oSsGY�`3�w�Ǔ���7q�S�:ܟ�_ۗ�goN�F[j6™��O]	�[��O��4�I����^�&;� �2�~ x]}$tOU�ZZZ.��Y��O��^=���l�"�\���>F�G�P�#�2f�f]�����C���)5*�%�5�Ч�#zuUb И�78/�"`����S��	�P�֨�h��]��@��.-zW@�>ާ�����0�j\�0Ȁi E�����|*�j�ث*�YC
���_1M��t���e|�jA�SM��L��S���h�D�#�{DJ+B��XB��G�i�N-:�d�ϗ;G;\sQh%_�%��M�N�\���?��A�8>���;l��)q\���/8ya�/Ϟ�i����Uv�
8�x|c�-&�:Գ�!��y�d
�+�O%��.n�_w��%Z0������dN���69yᎰ��e��p�NՂDwu��M�k������?�R�m[���kN64�-�}�@���}	�P�����
�6�m�p�c�k<�p�=�w�'%� �u��q�|�Q�Y
����X��ޖ6aS�Qe����\Xmi�0�D�d��i]�zk�4n(�)}L7�@�l�4���-RZ�2����R��!�N����Ҳ�1��H�lLMM=���k�4#+V�j���?!�jN^��EX��H�R!�.s���a��n
���� j��8Q*�)d���q���CW��
�å���6���Ѝ6�l��u���*z���[SRRA]�k�IP�nhW��^]�*���	i)�n��k�tF#�XA(�)W�?c���Ђ����|���J$g�k�,˛�������7|��#�_���<i��]J���&I�c"�� �	=�m-�d�hA�q{-r����ijq�Wvg��A(%�H<�l;!�$!�Y��.�C�mIHH�h~[��q(�ٖg��m�h��JPS��c�
�
�=��,I-����?����>�q�b�1��PIQ�����rJ)t]��(%$=/��u�'�ګ��~��S�����+Ck�7�5>
kڛ)!u��'�)�-���7�����1%	���G�M�P�}„�&��%$&�20��+PT�κr��E� 
���s��l�oV�|��_.b�L�qp#�Zd���v�W�&3A�%���=U�1�Δ,%.^,�n�����KII)�4Mj<�P�{���c�^��;w
g��1�P
J(���EF���>P��ED����Jxnk42��eX�sA��XE���H��r�Q��E#��ȑ�/�����R�Х�ښ��{>+OMMEkk+�Y�q���qq���-�y���,��]��jP�5P#��q�JxIU���NUq	��K��x�a�OH	%�0�L��sr�/��ݞR�4���梽{>+�fz��3A��+�1�1�����+N��-~�E����?�� @'%�pr��0�5�>��%�i�R;���j��b����!uww�p[��W_��SM�*�4M(��H�0F3�@A4�u]3!�0��ZqMbxB��:^c��%H5'#�'M`X��/nv�B�^�g���DJ)����E�ֽY>i�d�ر}��Y�!���_�F�3%I��z�R���ߪiZ�%�]8�%f�c�u}�2�I���R$�xCo �ϙ����,%�H��轍e�o�=֯{kP��sDW gL�TEQ^��v�ݞɦiT���r�#v�4�2>
'��֢�40w�E.˗�/�=0,�565���*9΢�/_Q>c��s�=�W_Y��k����tM�Y,֏V,/9j��Ap�s�7W�N��Z����9�z��5��ֆ{�a��ÇJc�!C�X�r�v��>�Թ�o��	I%�6|���yQ�Dң�((��豪m`�����մv�ƧK֚<�1����Į~-�����hee&@z
Ð�~fYz~�P�1FZ�:��UⱣ�i��)==ݛ���JU�R4Mc�`mmg�vwwMjin��y���B�9��l.ȇSZ322Jz{{T;:��u))��+*}����10$���iZ&A��j�ù6�F�4M���/I�VY=�r?��\�Ј��!X��:�;����Uv�IIɈ���$I0�	]�A)ErJ�����7o�7,zt1WWW3�R�=����M�c�S.~?��C�̳�a�}�Ooڸ�Y��%�!YY;����c��踷���f]��x��.y��d�}��?�:~�.���bz<�g���j�A���xN�e�]n�i�4`�X:���?��Ӄ��v������o��K�,>���PU�N��p����@ĝ����E����$���A�	�Ǩ;%tEXtdate:create2022-01-05T19:34:08+00:006��%tEXtdate:modify2022-01-05T19:34:08+00:00GV)WzTXtRaw profile type iptcx���qV((�O��I�R#.c#K� D�4�d#�T ��������ˀH�J.�t�B5�IEND�B`�installer/dup-installer/favicon/apple-touch-icon.png000064400000063741151336065400016644 0ustar00�PNG


IHDR��=�2gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�������	pHYs��tIME�"!�EfmIDATx��}w�]e���y��n�;}&=!dB���
�mq�꺺��b����5�IJ�ؒ�uײ�"?Ŷ6�PH��f&�>s�)��8�ܹ3I ��|�9�u�=�=���ON�$N�$N�$N�$N�$N�$N�$N�$N�$N�$N�$N�$N�$N���<ё$B�_Ϸ�A������o�q��7Z�)�{����'<N� �mS'|�'����)�"�>�w?)�}�,'��9�{L��͝��8Jolh{�Et�����_����R�[lٸl|p���	�����|+��O�کT��s�YDXDDK%�D��{�U�4��އ�c�Ov,���&i|�&Z�f��2o��Z�0�{�w�$��
��0>!p����hK,�]��Iq�V�D�Q�L�E�0�H
�y����?�
��;D#���}L�펶�(j�Yl�_I	���Ō�a�@���|K��m
�u(���XZH~�Ⱦ��Y�1�;0[H	q{J�o�����()���G�W�~�Ű�olC�0/i��e����-m��ԁ=Gu���2�͙��}���Ec*��c�|����v�A�i�2��K
qF�R�<ft3W	�l��lᄵ��-˚
�&�=X)a�[ư|�`f �,Ofqq�	�9���'���n��?*�t}�g'((��bיDK7>�{��0�ț�,�����̻����x�h�О,����&� @��wF��\�X�A3C�D���RĎj&�´�����yy�.r����n��}��G�el+�����V�u˸�0�ߎ
a\)HP"%��'�i=q	� %����PH��� �qOqc���͆���Ə;��|��+�:�n���%J��\�z
	�S����I�N��z�:�X��G�Лa�w���vH����,��ǽ?OM���с���o�8��������E$�y)g{xg
',�=f�i5_��Ɍ��)��Z�A�(-Ļ�~���yG�/w����wrB��&:m�[����0�^3C3��X;'��'0���tF1K�5� �c�q_i*�E���x���qS����M-sq^�L�UI!^UT
wFQ=��8��Y�k\��>�O�o'.�0Т�O�ʏ��c��m�4�$H��=�M���[{^B�6�]��K�B��{J�w[jԃ��BK�'.�O`BG'��<)'�1�z鱫RD�[�$:5-Ļ�~b�q�z���s������4�3v��_>�x�Jh�
5�Ȅ>aV�$�jf��AD3v�Z��8��/m��-%�o��m��B8DL:��ۢ��e�eV�Ni\��O%�qwqU� "��L�C��$pBk���
/�ЌHND�C�Q�
$�}W�X�ʦB|�!*
"GI��{�G��*����(
 s���n2�3��ԏ�k�&Q�$�O@,"C��BӔ!���e4�6M3�1���hҩA��M XB@�"��=�&�>�&?���[q�#���	�#q��gM85߆�G�9����܏
���E �Z���L"(��������=A"��k�ZAFo��LZ�G#uE��?q��8A	M��ߑ8�J�1#7Q�8�?f���!M}��4GϠ�US9�U���~�^A�Ԩ��εO���`�ZE�0���}�~���=J1&O&<����8BH[�y.�}TW
�`zA����IF�p����gԫ�Ȍ"���֕j�$f0�*9|�>�B�>�v�j��_g0�Z<�O4�$@T>�뉆'��]�\���+��g�������qS�U�߅2���v<б��j6̿��6)t�[}�P͇M�� ��)�@��j��z�`��]��ĕ-����~���'y�$���||6����z\���:w�K�*�}UJ��J�6f�v5����C*�m�a�gAN�[硪u�!����=���x�4��RSf��܅6Ub0LrpM�Nޟ���t�g0�Zk��|�_@�e����I	�y�e�y��W��OKL�:�o�l���'��܉o�ҿ��yUJ��h�^)��	�B `���qU믍iu�M½xp�c~���s೶3�Xe]m��q��h�a�wQQ*���pL>�#��S?�NLԈ9�:�F���'8p���t��մѕ�`Q"���P�Ѳ�
Z]��W�=/
�̣,ߞh�uB���w���\㫒B|����Kl-���[68)��,���ZuT�ZD޳�̧�iS;
ZQ�a�e�x�A�r\�1��=���q�n����:��b2)�'�̀¤$�*�!k�:�בSI�qpR�ҩٲ�<���D
)!�3�WX���R_>k����7�ɭ��?&�UB��<yUzz2�dd��FdV�+
 HAh0m�u�h��$���=�?v��ZP�֤ ����z����+7'��� z�-�Xc�0�p�>�?�İ��&	��`		�L!`� ���p���g���Jh�5�Z��TT��RpuUs�M~�јzUИ�,
���3SY,I$a�`����֟V�u��t�1ʉ�M����2[�
=5����m[�El-�AG�O��'� ���:��M;$vd�=��Z��"�EZ+-�D�l�>=e�x��1m�:���HY#������*�f��h��jm�É\����%�&�m�Z���c����CE��k���CbO%u����	��n�\��jE��Ǵ�X��]�~%ׂ5Ǡ�k^�z(�(�J�����[6���jV}[�|��\��s52o+��8���݋}ñ� ~.k�h�h4�pA�1�_��D�
���=�?�G~�4�<m$�HJ��0`G�P0��{�=��O��ۈ0�j(����
��?�$r$�6����F�ܩ���$:$�@�)D��`hfT��X�cЫb�wQRTt��N�Iy2�� !$�����"+
x����Rߴ��g��u���ڵW�k�r����)�<�޽߰m����cέ�N���`uK'�xy��fڶU
�VeF��עӞ�w\�@�0�l9h0LH������U���Y��A�m�0H !%�R�2|�Я��1`�� ����q[�����k\~����n�2��	��6Q�=�$:EM��}}nC^5�Т���ޏ�<��r^��$R`�R�k�*��ў�R��D�PX�kh���ϳ���r��ʗ�x4�tPwB��yV-��{^��#���G�jU��֤�}��P�&
M�GJ�x�?
�X��`	��0��2���@3��_*�[�*�D���c[)�|+�Z��V"m-w�x�=�$:�$j��|쮖��1�u�0�`��SY���!)��j����ᄍZ���t����
���Q)���ך�yN�0q�m;z������W�Y�n��X� �,�mb�����bQ��0�����T{�A�4]^�?��}DD�Fd�	��g��W�����=������;�l,���tN��ϷH��"�"�*�;+%<R-a"𡧬V��`a"�g7� )�Z����4���{���<����/E�޽]�MM=���\������'�}���Ǐ�X��J�RX7�g[��;�iXB�V�jd���)�pu�i4�M�&[j+q8p�O $r�i�Ѵ��DU���g�*W��
s�'��}��>���6F��;�W��R�c��]�6��+hu���)i���9<3ߊ�L2Ҭ���3%ZL��fY�#r{�����/zQL�-���@�?�S��oh���5/ǝm�3/�I�#0��U�~�2����d��?�6>�zk�A���HHk�Q�|�����UU��I��v����ǽ�RCN'H\�=G9c��;
��S
��8/��S�9Q����nuS�a�O���x�[�h�b����d^
̬
�¥��-߼r��۸�Z,�@�᪁��\Z�N2��'sX�.>bJ�T�=5>bҒ'�D�4�2PI1_0������o�7��IAf��_EӞq�`�X���T�I�y��:'�*���\,(�no�oj;2@�9�e��j�
�5� �V��޵�ˬ�y��R�<.����pް�h:u�>S��V���9<��D�0a�К����
�֯O	yc1��'����Y�Qt��q�hހ���!����X�2���{�m"������_�|-ʥRW���'�H������w�9\�����������T��h�]���{����:�̨��$I$�ސCY��D6����!�?��s�߫�*?m`^91<��pD��|�jl�����c�
<�Q�h�M����L#�v�ݔŸi�W����|}��]�MM[�Ī��>\w�w�T�0����g��d�ˬ���S�<TX}���&�]#3M#smbG�*;0��k�舐�҆I��U1��c^��{��n��G����Ԏ������}wM�b���.�L8+��y�8�����M��/�!�׮�
O]���̫�����z{�`�B(�� ����###�ulf=��Oػ�c�&q�� qP2�=�*G�%���DX����0��ٲ~�����N�es':
�ם�� Z9��Ka�W#q��
"��n�٩,(�Z�����#�̋�,���`WcSSO"�X����ᇷ��s��[��;+��=��~���Ϭ�9���}�\���0ߟ1�Lx2�,s�U&"����``P1��g~�]��‹Fߊ�l�I(hufJ�kM�ʱ�ǽ�1L��;z�!NO7�;��Z���%�$����(
]��f����w��-<�};`��H$p��{�{{�=v���Ǭ�Z����G|�� n6���>����B�DHI���[�W�-��V
��·�͸�}!�Zw'���$Z1�l+���u~����r8=���V��鹛lA��ʌK.y>>����	`��?�d6K��PZ���]�o�<Ar
�=ԇ�I@���6�ӳ��q�T2Oʍ�A�|+oK�-���?�%����L�*�N��1+&T���	��(*��!K�Yt%3`P����ݾ�9'�����^���>}��]���-��Dd�6�Gd���<:::�Z�T*�;��݋/}�縏��B@���H��Y�M+�ҏFf�Ff��wx�$�e�o��?kjG�icT��Q�$ZY�(P���3�B`i2�S��B2?⹛r��WΌ�o��-X�l���וkh��8��>|����Gv@�Vo��@C>�w����h��'��7ԏ;+Ex�?Q�B")
��Ȍ�̎� 
�YW���C}xᓜ��
��m��D+�*��j	e�j���G� �%�NI��@��պAlj0fn����c�c]��\�c۫��ۇ~��ڹ�iBJRJNYr
L�3��c������B��~�ԉG��Xl%�G@�U�42ˈ��~��W�mvl���ײ�8�I��U�C�Z	ZQR
��2*J�Z��>� �D
��T�j�~0�7�$����2�v���
k088Е�5�X��j`p��ӟb�ݰ,J))(EH$L,X���W��;���=�zǬ������[��l�\i]�s$�;$�A�E�����Qm��doivCc�E��-=�hEY�w�Q1G
��)�:@��0�I��BE�u���9!�?�P�׼��q�ga`���\�a�eY�����_�}}{a��V� @kk�����f}��3�Σ�'�����B�+sƃ�6٩'qMK#�g��E1�v��~_�'=��؎�4P֪�$���8���
qɚ8T�@���<'�*���9-��y��+1o�Bte��-�e��M7����a&���$����Cw]������$�Y�Y�пn���t�J��.k�&kM���R����<��߳(������~���v$�DY�nI�C��U�1�yQ�o
�:���	0��j�nB�M�# 3���cll�+���ztd��0�?Àa�Ҁa�H?�,����u�;�>���~�Y�Y��&	�T<�&q��Q߇�uT��BPDf�B�����Y߰�X�g
�l�a&����ѵ��8�%�YO�=�dHl�m��r�@��j݄R�M"�C3'�{����T�]�t��4�Uc�����088Xg�C��5�(,�Lf0g�h�**n���Gv��8�*������o4�	XRT�*8�n���`�[���	�d��7���H	��[Fd�5�S&ƚC��hYh�\�Y��P�f���jhfQ�/{�+�}���J��=�a����w݅��a���uMf��P�7�� �k����ƒ�BaV�rV	���!�
�9��B\7�U:q3D�JO� �̒��݂��
�e5I��R��e�ٴ"2�	l�I��gH�7\�s�����HW*��bƪB����ccc5ˬ��if���<g�\��	�u���C{�[Ko����Nt�L�4T����jL�"�0���#����ӏ��n��R1�U
����9��aDbH�@��:ؔŸi<��W]���<&&ƻ����0V�<���iP*��
RJ03\�E\�4Mtvv������5��~V�t�퐄&^m.�1�������
a��������7��{u��#2��5k�E�'��r�	E�y����	���}3��t:�J�ܕH${�4V��E<�������td�
,Z��R	;v<\���J%��7"�Q���ܾ�����!��sP�A"-��d&�p"x(�lRMj��̟D��?���nj���3���+q���^ 1��!��4$2Ҍ5�֛%��̡����.�g�}��R��$z���J���ޅR�)M�@��Th���_�ŧ���m��B03ZZېH&��z�R�lUj����?�i�1ϴdZH#)���DRX �M�(G@B	�#�EX�3���:�u�D0"�3V��IL�5v`����[1��"N5��L�c#��f����UYm�$��̯̐��2����X,v9��EJ��\.�w�^��嚬�0RJttvb����B��������fH!P�T����ϯ^�җ��cltT?��>%�����q�#��a�
Dw"�"ͼ�en�@����9�H sF�;̰lr�}�����à�N�o���I���k(<Y�?jlGE�0Ivk�VD59fgsT�1\>��DBH����U�7�D�s�gF�5k�D6���]�eo1c����׏r)�g��mm�3wn�*�����
� ��+���T*�����]�vb�%(���'������8��ȭT*Jk��_fp�#���斖�j��ʼn	]u]].˿��Ɖ���a`��3���B�
t2�a��#j�0C1 ���N#j�4�v�PW@����(3o��������m�!��=V���D\r�j�C�l
	;̅,2c]���$̘��H$Q�T�l��B��V��[��$(l���N(x�w�eY�0C����d�N�����z���U|j�砕~��H\&�E���T
D�h"B�"*ۖ�EC�Jk�{����~�%oa��~�S3>�#"t�a�c^$���*��<�ú��OZ�����5OKp��:�[�*r�L�xrN��_�w�v��q����^a���Dm�!'����S̛	�Л�r
���2M��H�r�*����yn��5�L���f���@��+<,�\)
C��r

�L��m-������[�v<���s��Zc��P(`Lӄad��4LS��i۶
�qe�
�H$`F��z�aGTk����*�X�|ۣ�>�,�jhL�
�LdФ�B�5���1�"�\wZۈ'nj�����d���i}-3���DZ��%�F��qJ"ͬ#2_2��o��L��w��CD�<����(<��g�@�!��\�<o�����t:y��)-�Z����S�-��׿���A�%��J����|'���-�h(@)U�Lӄm;0	�4����qfF=-���z$�=�X�_5�JE�&q�fƐ��>����Rak�����f���]�ob�[�/;��6~�؁�+�HK��պ'�z�)r�	SL�C�{�?!
��f�ϛ!�/_sR�<��Rn!�*��1>>? �>ѭ�|�MM`��J���d�QZ�3JRJHÀ�8Hg2PZ\���>|��_���B��ѱ�h�i@!Dᵘ9�j�Je����w���o3��8O��/~n�����x�gL��B���9.�}J�SP/0�d�S��R��Q�3�V�������Rđ�6�w�HI���TO�z�-$M�)�*��a'��W̛�ٟ��r�W�4M���E$�0c��(Pq�5R)����А3�� $�an4Ae�"�`H�d2۶���W)�� p�UW�C\G�e�����BR�K)�M9M�	}x�vTCM�������g<�3&t�$��&Q�x���3SN�$���l�,W%�l�{"�?ɬ��"!��
z�+!�bY�E\�}�x�Ɲa{�X3�D�$�p�ZuQV+�R�@i
���8�B �� ��Fd6T��F)Mw�>�D"	�I#�ɰ�t
Bh�oٳg�@�\B6����/���� 5�$�eDrY�Qũ\C�C�i���i��J�g|�3"�Ϛ:�4�E��y#��`�:;=��T�@�lŚ�G&��I9?��tl����讨�Z?"s���O�"p���(X'�5��|��+�������"�f^����a���*G��d
�T
�\V*��y�F"�q��x���
|`ZR�֞�ݾt鲠g˦�ճ!O�B,.��(�Q�iLޘ�"�ֲf��Ӹ&�DZg�n)�q.X�h1֬�rFc0#B祁ߌ
gX���u=�'Qˆ�0M{x,��:̓���4���j���݁��t�����jERJt�	$jd�J�V�*fXglR����Ys�UѢ��b�-̼Jk���kq �Q'�@"��Ȭ6����۳eS�s� �뺬���q�8�R��O��c��+���˲�Q~||��N#�T�{�䡷�;�YC
��77�*��0�`�:-��kqjY�����4�
�-SNl|���R���~� ݐoǶ�a4�Nw)�{|�W���yNIYo��`#%�`p��M!6������|��A1�Wk�'}˵jT�Z�۶kd�<o#�p���<峃 @�ZUZ�qfF"�D��W*�]�r	�Tl�f1�"f�hT�#&lL���c���݃r�Ӳ�77�t��3��M�5����	�F��z�{Q�$M�N���$0��'ê�s�������{<�V�)$�T�(!��+>�!���N
��_|�.� ]Z���j�ɋ)2#"s�f��z�R��D�~���|��CC�
�}�J���
�Z�`����#�ʹIC��{&
5k\?	�n�&=�����!��m�\�4g4�Mh!�y�b@�
�e�7��g� x,k�.@q�a���֙�1TG�0�,޵�V+3��ʼn4RBNyo�"8�qO�� Zg	��5���maf���_"�RJ�h�W�4�)�`3����`#��UFk�U������o=��Ƒ�Q,\��e�4�n���%T+�&}ӷI��?O��!AaZ������5o;���'4�{cR�7J�S��I�ȵ`q2���4�
ۘy+?�	}뜥��4�p�E���Պ�abi2��<�e0ꇽ(���Rn
X�3��_}���O�}��]A�(�V,ˆa�~�
@���Z�
Z��/��ݩ���k�׷�Ԛ��W���m-�H�2���?
"�t��DZ�ts����R
PT��q�X�4\��
,X������{���3�7:��8��M�[��M�$RL
񞔔/<+��X6���&S�sO�M���|���RqI253�G���7�=��d�{�s{�+r��e�,R�@����`�0"/D�����j�llfA8k�^���QX����f^/��U�A4h���V
 *�@D���W������f�����>��B�MozK�����J�Bm*����-s�u��iA���Ċ�O�gvò��sݛJ�����}�s/y��ILnj���:���d��}�Y���uH���rN�&���ϭ `�Q,_8!@tv��T�]��t�]�o����Hf�'|���ze޲qZ*��4P��y�w1F��ӆ����f،���עX,�4�.��h�զi"�N�0������.|���D�R�~�+������,��PJ�~޼~o�X�
":���R�@H		���f}�	��88�Գ���GKK+�����Ba�K���?���G\��}��?�g��u�V�Pe�]GHwY*���
��k��@\�� j/<ƽ�����D��W�q�Z�`Z8=݀�a�z��=n��h]R�MU�gLf(W*����z^O��jC�f��,+�|�[�I=υ[u��.� ����&3P+gf�Y��Vw���݂l6)�YDh.���}�Nj���}kkk�s��wx泞��Ʀ�Z��rb|�y���X��GtnW]��|�>�{F�Z[��jż�ٴpz*���T�k�X�Q�g�l?�@�c��� i����k]�V�-g��ȅ�5DQ���U�ϭ��A�.e�����������/��]��A��04�`�Q�1��j��J�ͺLD������f@f ��'�z�R�J)��5�ȆAz3�r�T���JdY��c�k�ix��]�SNY
f�+��z�ig��[�u�M_���������v���O�_�S�?�$�k
��T*+M�y���?d���8�I��̮|LG��ō-��m��d�{̯�xZ�h2m��	�<])0�y��`�X�`ٛ�G 3�~�[p�w �NwU��-Z�U�m���)�%�u!���r�b����������3>�P"p3���R�8.�;x��oj�\�4���zW��[p�e�3g.��~�Z�u�Z�p�}�Sg�\��x��>OG-��"y�1o+spuF���w7��i	)1��ݰ��40c��pw�eW�(�'~�o���b^2�=�=�V+�L�d��4s�
���ϭ��Z
��s������fؠ��W����T��Z�l	�`��8hii�m�%�B�@k�BaP6c�i�}�w���_?�`��r�o�fsA�\F.��Rj)��y<ϝ�U��lY��_�E�#�NC+��u�ϗJ��757���y��G��Ń{Q֪|{���E�^�1�$Qi�$�>DƉ������T��\�G��d��}�Ǎ�|n�99���R`�V�譖�@�$�.%�Me̘�062'��V*=�ﯶmm��H$�u�9��01���Qh�+B�
�a|:��Af�◵�{�՝J)|�_���W�V+J@h�q�|�iX�ՅD"�y���R������#���w����v��I���ߒH?P��=ia�ŌT<�����+��1�	�c���IZ�;�3�}�ZO��1�
*
��$3��Z��j	 *ZB�˘�f_+�gHff��_�
���U�Tz��_�p����D"��}k�eE��l��Ƕ7*��o~��8�0tW3�D���Uo|��Ɯl6w>3�R)�$d=�m�A��	J�J���r�Z"��7�똜�cZ�`B)HB��4��1��1���2�{i&��c�;�.�"�K�Ǽ굱f�ɬk?�pS��S-cO�,!��-ksU�[�y����\��\����*�H`��9H&S�����Z3FGG008e�47$�ɍ����7�XDR���_�Z�Q�.e���Q*��rc:��RQ�%��P(\��߲��ȋ��:l��,�3�@}�Q�|���y� �w�����N��w;�r����0�̡eP�Ί��e쮖@@��r}��l.�`Ɩy�o��{�E6��*�J[|�_�L&1o��(�sjԢ��Ãؿo�9�No�<��o�Ǘ�t-T�*ɼ����\� �,��F�U�`H##���1%���2���p�4I�0�#�=F_�Њmc�����M�LgeCo�O��3vWK�]-@��;���{��3#�o������db2�N&���`!¨3�H����������e˲6d�ٍ�j��w�}L��03��T���亓I ��1��)��A@�y�j���d9B(
0a�b8�WKhrR����Z�h��NO���5s��]�Rd��hc]β7�����ƐH&�J�bOl�.Z��J�B�}���w�(۶�!�Jm�T��w�1���bs�G�u�d��Bۆa8�:>�<7��I��S�ベ�?yx����O9��&҆�]�k}�+�32yd����2#�dƞj*��X����J�ˌ-_�2���K`[VW�X�q]wU"���%K��d2bF�޽ر�a�_6MsC6����q!3�Tk���%(N-�����*�֗B������?�:�!���8"o4�	���p5�:��e�\|{�}hO�����^�`Z8-݀LݢI-���H3(��X�l'6W���o����]�|ccW�P���t:�%���L&`�fff�޽۷?"Qv�ԆƦ���rٽ�{�=nc��
��J\ʬ&50]�u��:n����3�5�� HOBǙ&�N���=��+������"01{��țk����gl�/_{%z������׭�N��8e��fs�A�Kh���#;�mP�f��;;7N���߿���!�3f��e���|���<)��q*:fi�A�lN�/<~���1�p}C�WJh�ݥ��	X�̙�&3��uC2��9kZ����h����f�
�B�[��J�RXz�2ds��wƗofƎ������\�aCkk�����&3�8��(Ŭ�N�ZY1Aqt+�T��p��X~��>s@5�ը-�y6�?݊�ji�<���k�ʬiaI2��	 ��떱�Zm)��L{�b�1��/z�K�p��b�X#�˺���&ݘQ�l�A�}��PAPN�3�3gc�u��f��ӎf��k��S��
��=�-ߎG,�""s}�C<�Z���03B�HqS�||���#a9�U���X�H&%�H�2#*���"��P��
��)`�jbf�F�z�p�%z3J��X3�d&/ۂ��؆?�y�R�L&�a���K��q����i�����S05[&���Z�c*93a���$L)�ˎ��#
����O�� 	���~���w�����h:��(�i��<',5�e�&�w�@#����\9�E�{��4��]�bq��ʌ�2����p�����Ʀ
���l���\,O�c""q�G+�D��ґ��#���W�:���"	J@a��0��ƒ�"���ZU<�ic;�p�re��S�|��*r���jգ�+S�;GȰbj��k��a�\�h;��j����r���G6��*�J[<�[�J����S��f'k֑y��q�m�BA9��mX�������Nf��[��i֌�Y}�Yb "3��F���c=A:&��m��_S��񂜔���8l������u�򜡾aWka��f\B�<�P|����iݣ#2w�df�6F8�\xUQ�r]�07��`�2���dW�\��<ou*��)���L6y&}�52�z�R�|>�a������n���8eG�N	]g���2�4[�}f�RW^u�1ۡ�J�7u`�%�H,�0�O���o�ą�*����q-O���V�|
��m��}��-��I"�x��ؾ���aK��3_��W&��Vˁ%���Q1�A/�$P�"�.c��̘���O�/x,�!��R�-^�t&;Yy�Y�m۶��n�ֺ�olܰ��kc�\q�w4O���5W���r�������D�Ȉh�m;�immy�m;͟�����x�Q߷�F��@��y�4�K��F��ﬔpoaC^�6!���f�I���0��?mlG�a�ΒD������?m����4�0�
GJ4YLA���gg� ��)ĺ�enRZ��0>�����~3���#��vU��Z��…���d��7��lۊ;n�
Z�rSSӆ3N?c����Bf�����~`1�P��Hu+�Daخ�;144fn�m��L�;����7oz�[��=nB���τ��z�B�TV_���<�kb��Q�܏�r#����H	3tR�SVjwUk�$0��V��nUG0;���%��F�b����țL����a��Q�è�E���gs��x���k����>d��Z�Ih��t��j��u�f.765m8�37>�d����If>���c�W�V�g�n��J��a�泒��[Z��[���������?��E���翺�0�O�@����nƀW��s��J�����w.��K�������T	m3ݷ���+�DؠXi	��a� �ɋ�P`�+	��)ĺ���<��W��2��x�6��j'���y�Q+[�h<B?�]Pillڰ`��O�?�����>�B䉨���z��x�shp۶ޏ��^0s��8��d��B>w��+�k�9�
I�ܯ#����[���V$�<e�i}>'�-��}�K�}�1Tb�\G����A)��
3~7����	D��!�ED3*A9���S�3��J���h��&1�
F�g�@E#$�f�fl���x�?¶�.�u{�R��Ds��E29�iRsj��ގ{��(��^�䔍Jk�G7<1��t������Ӫ�V*e<�6�w�_Q(�eZ�R�owΙ��q���񖷾�wjƄ��u>N3��C7��͆q}F�5�֙���yt�ne2��O]L��@�$��Xo+jG\7�Gt� HLJ��t�������n�H�
CP�I�z��'���*��A�w�ؤ�KgX���o�f�̞ף�Ze;:;;�L&x?3c��G����AD�|�qÒSN�X*��{l��b��+c���RJ���*ӥ�R1�ֽ����۰c���Z7%�w��UJ�}�T4��c\��方�{
,��N��i��Kљ{�
�zl�FQժn=�x:�S�/���~�C��Ϸ7H�9Q�,2��Ù���D�&����� �%D���*J�Ib�#�f>2�]{%�L$�|�ߢ�Ze�6����8���5�̻w��C>"�s�܆�K�l,LL���{Gt2���V��Uǡ�5�L�(
���qۭ�`dx�L�\�N���p��1��x\g���Fc��~���i!^�j����~9:��z��7I�><����2��J��I�u)���2:-�E��-(\l9~��#����!�JAS��k��Ht���� ��;Rl��N��5(�Jpl;&�j˶���
�qXf�лwv���L6�a��%'���믿nF�}��̐R�!�3�Y��xH�Rع���7����?��;s

�_����x��0��a�cƿ7w(A��z.�)���B�/��[i}��M!�	�

{�|\2܏�0!@
P�*1�02@���c�n�nA�#�Vƃo�4ޟ���%�:��&�8��̾��4ͮ z�֫-�BSc�������5����w��t&����mcab���2Lj����Pk
u��;"��8�����_��b�,�:ײ째n4��a�r<{�[�"ߑb8oM��(��..#���Zj 38
���ߚ�!���VA�O�:�[��-��ew�j='�5p@��7Ry�I&�i�m����.�@��V�#��M���f\9��7�Rv� �a�U�i"���������*�R�
�Ʀ�����ߙ�w�^�ϯGCC��ƞ�V*�-yO��ʓO<��9&(���ۋ��"�\�T*ݵs'�wx4�xR��<�]9i��0�#}1�*��V�%f�a�۴�����I!�jXs�<
F1�5�oLJCN�����S)�ZwD=�B3�U�uM^Ժ�֥�P�:Ia��ΐ�k�^wI��Zo���‰�ɪ��f

b_?��	���~�fzf�D����Dt1�ٍ��v�Ӳk�qhR��k�MM�e��J�j��2�}��{���3��o5��f9��1���� �$3$���j����C�$����<�Q�.g�(cf�`�����	W�n��G�T��B{1b_sD�ƠA���7�_0C2_v�Z� �i]̼�j�0�J�af�R}Xj`��@ٲ�

�|H�'�e�]�������u�(�
�׍O\2|���˶(u�C>0<666�}���=ԋ��\�+��d@uX6�Z=�ič�iK��#$��3��?kf�0߆�4`�X!�dY��CDf�$Y���gMHK>s�E�#I��Q|�ZO�fԂ���5$*���7Č�\8)���ZJ5ӑ��c��5clt�C�`�bZֆT*��'�̈q��+�ID/`� �j�Q���f��n��E}a���f��O9���2���q<t�ŸU17�VkZ�:
���
&0|!^�&!ಾo\}I!�5��+�&i^��a_��A��:�@	2B�e}�E�ZV�Zc,���Ɍ0m	�-$�3mQ3�c�fA��4����q�����y��i�ڒMOh-LL`$�
U�LsC"�ب���Wv��BT���j :�-2���i��c�[�$�S�u:�Ass�yXi}�R
l{`f�9�ۧ|�S�^|:j�[���CIh4��O����
�"��0:��|f�T���7k0�h��u�M��
�5�}n4X��U��O�HG��?`�I3&�o�+W�u	!z�"����-s�0���1��l��d:�Q3��F����^x!��������L;��h����N������q{��`Ƅ�\�N��|���Vb2])
����G��ϙя�����	�#�!�vO����PUA��JP�E��B�D+\�0�puh-j��:$
��� B�z��f�������5W�	��]D���VŹr�'jr�6f/�P(@�4�
�dr���Rk�xC�[n�e>��{��Yc��@�s�n�4��s�2����0����3?5811>�}���x�� �9�73��N�ֹ&̨��b�c
��43��@4�&ӊk]��[�Us'~]�M�/�1��| 8���b�� �#�V��B�[��uT�?J�AW��2�������&���6�_��J��	�t�b��Qi�i��BY��p��K%PT�9�8}�w��$$��k��i��}�e��&�����p�4��2#��7f�0dX�E$	�������[6~�qM��r
w�������o4̅f��"����V`.�H,"TX���ؾ�4�����
�

�=�����DC2�o��$ZYTz��h���r	�~'d
���IQ3�Zo�I����Z��u�a���@��*f�N7��P
��Q�T��4�
�al�roI����D�:�_?�F^���L�""H!�ʨ�n���q!a��D>�G�J�?��YU�#"�
 �]��yi�yQY�y�2�I	I���G�3g�9+iH0��eU�?]����� AgDK*@!�j�#kH�t�x�`�
*��j)����s8�J�7-���WYo6�q[��ŋ^�R,Z���v��`��p��?�$�z�j�</$��aldf�G�≀׽�
�f�(
�#��4�����T�MM�>��
5'	!��`A�H�a���Z�J�ߏ���<�d�#"�%!9<7��H�$z^2Kg�-�,,�,<�V3
��DIrl"[��Ǽu\)����,��w���Wk�:Z���	�Je� b.c��V�e��Ff^W�z�E�?{�d~��߀��&T��.�4��U��R)C�E����%U��,�� �����}��U�?ް,]DtAMBL�b��d30MS3�C�<`��ƔҊY)�u	@���IЄ�8�-�.�ժ�@{��*�������#��9*en��1ķ�G�)/�E�A���R4��jB�iUi]˯8Ԫ����!i��@ĵڥ-���8��lv��5�;�cY��Jd2Y���eY�"Z�y���R�Hf�d�]��5@TDH�����������Y��k�3[B��ђX;�&{���Z#�J�q�Z?���V��T��C�]>8n��
�Q�96�i3�"��K�1�x�4�b��+8��1��-��x]I��	!�gΐ��N��yn�m[=Db��G�W�Nf�e�z6�i0{��$&�e�������j �Sӭs,7��d2B ��l�����o�Q��¬��0�>]-|¦�Q�!a�w1�(��QQPQt$��a'�i'�@�g����f�����||��m�G��u���+F�n�{W3s��6�HD��~"#"�\"z5�~�z�\�K�RH$��Z?��\�w�s��8;�>ۃ�,�	\l���‹}�Q0ӄ�E����xF=�Ia��
��`��1�_��W�}����M�\�y�Q�V�H`�i�0M���QqX���ȸ|�PJD�"Z��5�sm���9)DX(���R_���>�`�T�����n&�n��Ŗ�<�����S-FD�jO��$�X���j�~(�7%��/�;�}x�ek��ىb��e��)��r��}�}p]7����H$��BKYk�A)����#�>�p��+`�R�"�/Q�}��_�'���D8�͢��	̸�u�/B�~�s���c�U��&�.@wUk����rr�G��i,rR`�Pe�~@y�2��/�����j466�X,u%�-R�˥��zQ�T&�3�4s"�D2����� �(�t����X!�I>���QN)5i���sLf�4��fPU���T��?>��Y=�Y�Ҁ	z�E�8x(F��fLM�,N��$�� *z���T�)#fNf��r�V�]�T��4�ՕJ{��A9�dN_�M��Hg� efޠ��h���ׄ�{�D�Q"Z��������w6��iZ�Z�������>��#�Ϛ:pj�����c�w�OӪ��S��8%�ũ���j�n(�7�D3&�Yg��}����+�J�X���\.c�Ν(��S� ��"��AQf�|��H$�/^�e���a��+�̩�2_���}?�њ�tb'�I�Ri0s�R�'m�)��>Θ5��j��y�6�p��ϫB��}%D-�Y`Y*��d *��Z��{��R�Ϙ!���5�������pW:��b�����J�R�������7���J�
��n4��ٲi���!"�-�x7]
�|߯y5��cD�M�@CC�*�->���ŋ��~ݏ�F�fi�����!��hS�:.`hay*�ӓ0Q����݁�9o�����;׬���/���HW:��b�ꉉ	l۶���ڒmLh���	MM�52W*Ս�i�[6~���!"�%�x#���Aus-[�
�<,ˆ����~yɒe������0K���6䤄z:�!�C9��"j��٧�Н�B�Z�T��f9s2@g�
]�L�Ƕ�ՅB��=�
�"457���B���j�繟�,�o�� �tS<�U��L���8QG[
��?,�|���%B7&~[*$,��ϫF��ɉ�$��t�NeAD�2�u�����O�=��|���Z�te3��qVM����wށ������[[[���!DY����ju���ۼ�o��fD�Q.�:��u����y��B�BP.��{�`V�(
,��V��̊����k�aq���y���A*Z���mJ��W��2���?���g�ծl6��8Ϊ�Q�z�-ط�?"rHf�|�wt��s�� 6�J���a���������W\"J!�.�� e}߇뺵I����p]���I�0הJ���Ew�1+�Lй�h�h�a,�ku=$���q~:�Z���1c2������g=�]���-����7�}}�Q�B}�ܹ�0o����bqb�m��>?{�G���2\y��`���Ȝ�}��2k�$0����Zc|l���0���d�Y�t�y�?�!�B��e���DB�p�<7J�
'��e�xJ:"*��^�ͭnj���e��~�uuaph�+ߐߒp��������{��2'B2��%.\�E��,��F�I���p4a�6��K�[��$"��)�9�^L!�t�W�U���AJ�2Mk���h���i��,�AH��:/m���s�����XPj����f��S�@3wtv�01�՘�$��ՃC����ݻw��@�p%,LXz�8e��:�\ܘH$��~���{��*֬����r�4!�7���f�Q�V�V���=�*�K���###�<�i�J�S�nhh��+����=�n;`-3	KKJa�wa1�2�Z��6���ϟ!��Z��~�{{��=��ڷ�?�я�ۻ�iBkU+=e�&�������Pv�����i���̧���5�浯E&�C�i۶/%�"��J)T���57=��E7����w�r#�#�3wnڴ�ˇ��~mYVa�����͝Xj�T��u0*?p^���y�v�ݜ�ҿ`���W���x���wooWcSӖD"����?���ؽ{LӂRD
�4M�yf7�8�L(���attt��$܍��������._��Z�a�{���8��Z�N&�N���4����
������d��r��}��Ur{>4�_�Р�;��'����&i̘�k�^���\����W����{��o(:	�2C�9瞇��>Bʲ�yF��6�R�'5����j��w���R�!�	`�e���2k]W�� �`d���],L```?�)˲.μ�o���?�z��`��hw��V���4-Q��Ժ����n����g��-Y�����Ʀ��D"�����η���03L��p�Ѷ-��Sq�yO�J�J�C���Ϧ�i����9$G
k�x#���b!�ۅ�g"Z��T*��p`�����r�Q�}��hoH��d2ϲl��9��B�5M4I�T�DX`�@��Ժ]���":"2�#G�P�jll�eFLfuތ�dtu-�\Ӳ��*��'P�u��g��qF�\fW\�F���*KJ��4�$��)�%Zk�\*�01/�d�I_ݦ��Z��� P��^all�}}�R�l۾|td$�w�{���.�|���J�.)�s	@�\(j�n��nNK�_8C����W��-�jlj
'�����w�]#30Y,0�;�.�R�d�H��iӲ��$����vƾ[n�c����ޙ�����7�u��,H�q�a�.��N���n��R�g}2k��
��PRC� Z�
jV�R�������Dwg��m��z{g��xq�2V~�܉���y��w$^�y��^uS�4�� 6#L��洶�=�H<�R.��/��/�x�Q�8�4M��wଳ���ˑ�d�����w��߫V�?ܕL&�'�
��k���Zض�*�\-��H�&BN��?\��k���օ�N/�8�x�t+�9���ٳ�9�O;��x``�Վ�?�ɏ�1:n���&4H�(%��E��mu�����_�Zk�8��a�!�����߇��s�J��*��صk�����J��d29�4�瘖��t:s�a�O]9q��S��w�}�]�k����Wcٲet�ū�-�ZaY��a|@J�Fy��کT*(
(�Kԝ;�ᢉ�2��&x�?i�b�c�j]��uh�K��ϛ�D"1GJyO>߰m��e��ێ�x7B�?�
<�&zIY��
�Myi���\��w���ܡ������0�s�Λ�]�t*�
��Q%3�Q$"�T*b���ص�L&`��H$�y۶ϱL�Ŧi�0�˟�8�ƕO{��>��������֭��qjo��w��X�d��b��e2�g�r���i�OJ�f)�3��=�T*a||�ry
�E�xK$hkoGcc��lۆ�"�ע�$�T+OcBg3Y,Z���������\p�Sq��/�Eg�8�͝xο}|��I�D��}���Z��x�{�
�{�Ғ�K���d>d�Ş��o�
����ؿj�Q!$CFe����T*���v,X�s��E6��40s��`Dk}��{2�vU*��0�V*���;��7�N=����w��ƙ/y��ECC��f����0��Ѫ�~�r)�Ӊ��g���**�
\/�L/&>��x���R�!�GccL�df�AD))e�R���188�����F��~������]�Ʀ&���'&ƯI$����q�������0Z�y
�]\������\���NL��w466^�$WH)�㷿���T*��'ImD�z�}"�0��d��Ԅ��9hinA&���8a���*�� �>?��T���g�U���M2C��f=�)e�����%H�Z)���J���,���ꇺ�7�J���%�3�� ��뺟0�6M�r�4^,�lS������zk5Ib�QZ�-����Uhjj�j�z���[m���
:�:�Z��X���W
F{{�s���{�Y���ছ~��|��#��lF�`Ll��>+eR�I$�J��olD.�CC��T
�cÐFM�cj�;�����dK��طֺV���\T����'okqv0+?�8����)%k����J�|�a�%���of2�s-ۺ�4�K)ۂ ���v�|�C��}o��f�/^�����j����$t�~�#�T*��l�R�q�2-kQ�\ƽ������Gv@)U�|�K�IR�:RO�;�oY,˂�8am7ۆiY���V��S�)"�B��� �Ɏ+o�5�,�<�m�FC>�|��e��}���{_��g7�x�k_�oՕ���moG�X4��sm�y�i�/�R�y����>�x�a�����q�ū����yl�Dr��?�~V��,��
����А�>���ө�m�y�aM��	�{�_qۭ�`�#�D�~#"p��c�N��S	.�����~N�~!(*T#&�x|�O��r��2!����a��?KJ?�<��r�OR�������w 3�J��8�e�e�Đ��u]�ݻ۶n<㢋kd}k6�۽m�}��okV��4�c����Vsk��d�r۶_`FS�TĶ�[�~����ȏ�d6��ZL#��F�C�H�)�>ɧ��G���0M����!���\VJ���*��/.\T��O~��~{�a��[�y�ժ����u�����
qi�T:�j��ñё�6������S}b:�5o�x�k���]�$k�y)�L��/��M�~L��b�U�!�TrO+�=�С~�����>���Zk�3,[�)���|�J�Z��a�Ǔ�p����톆��ǹܲ��I!\Ͻall쭖i��GfO3O�	E�o~��P.��]]]ߵ�9�l����)D�N��צ�z��$5՞�L����@�܁���Bm��\��~�Ryq"��{������E~,�˻ދJ�����fY��R�ۖe��0˚y:f���l@����N;��!!�
�I��&���;g!&O%���r��zr�[�Irh�c���)%���Jy���� ZƮ��_��O����Z�/z��~�3�)��)Z̘Fjݗ"&��Yefu�RS�s����α�P{�~i��6)��Q�0�;H$��r��dNPB��|�[��R�i�:7�c�Ժ�ԱEIZ�0�s.Z[�P�VP.�P�Tk�~RF6�4
3�a�6FGG�k�N|P�q(k=�J��M����/t��%�'NHB���V�*m�0M���ZO�Ȳ��'",\�>u�dc�(�-�+S]lTװ���e&Ʊ��)�<cr?z��paFD�]i�K�#����̌@�*��Z��BGrCBJ�ք��<��OG2�B�R��4��|�[���2s&xJ(�0��i�����H&��,?�t�Dm�ꃧ�q�AD|?0�x��qBZ~��y�B,!≟aH����1�Bx�wo�X|Gc��w��eKk���l7
iԖ�"M�#�C����z�s/Q����2��Ž�ή��.��w�U�
��k�f���������q"R�mvm}M�S�����J�j��˗���=w߉;�]P�G����9�.;�޽��#�Ln��:-�g����ߥ�	���-�֪x��	�4h�Y�q��a&�d�x����\.�u�����_�r7>������>����C��|��t:�s�9�aEAJ�'�����5?�c�*����%��mҙ��a�-��ӟ~��z*<��V.�>���Y��'f�1��O}���R�\����`�i�!�hjqǾ�նI��ĖRBH��X�h8a�\J�L6;HD�mۏ��8��,�ӟqT*��'���������22<��~�Cw���Q�{�yhk���D��qP�Ŗۇ��Q`Z�4�X%n�'NX
].���N$�2�Þ��i���=�\�R�{���퍿–�Gގa��/�^�oX�uq6�{劕+�\�J��GS̀m;�mB/�k8�_��NX]�TP�TX)�B�c�N"�ʕODz���<��BacSsK�c���S��8ZZ�
�R����Xr�Rtw�5U+d��a����s]�\�q�ϓ',�]��j��k���d
�O;�(,Z��Z"r���?��u��|�o��>��?�#��]U��y)��b������;P3��Y����$	h�U�R��ju��w�pŠ�/|*� Ȥ��W'ɦe˺p���`ɒ%hjj}�������^�
�_��r��}��}���~㿿~�i�C��5*��6�qN�f�]�T[��j��nY6��lYο�B�~�q�"��@�h�T�O����7���'NX
�.��y�{�*^b�9�|�Ԗ��\�Yg�[�bdt{v��Ν����]�O�����;::'��?=�m�}x�3./
1M���-\��iؽ{7�,9,DGg���k�+�{]��Z����Z��n���"N\�%�Z���g>G�s�y�L6�̶�seX^�L�0
!Z�p���b��/�{�>��މ���T��;���)|�c�x[:��d���i���Ǵ�y�wk}S�0q�\�y�o~�'	��-����NhB�x�080 �;;�d��S�ϰl�<!�yA�i���5���Ȇ������뺍-�m߰m�����-�J�6������;������������'N�1�����ƒ�mZ���y�������_�!���8N�T*�����LS�k_��a9��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��8��
{���R%tEXtdate:create2022-01-05T19:34:07+00:00�C�W%tEXtdate:modify2022-01-05T19:34:07+00:00�Y�WzTXtRaw profile type iptcx���qV((�O��I�R#.c#K� D�4�d#�T ��������ˀH�J.�t�B5�IEND�B`�installer/dup-installer/favicon/browserconfig.xml000064400000000366151336065400016354 0ustar00<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
    <msapplication>
        <tile>
            <square150x150logo src="/mstile-150x150.png"/>
            <TileColor>#da532c</TileColor>
        </tile>
    </msapplication>
</browserconfig>
installer/dup-installer/favicon/favicon.ico000064400000035356151336065400015111 0ustar0000 �%6   ��% h�6(0` $���������9���������?��������{xw�TRQ�ECB�trq�������urq�ECC�SRQ�zwv����
���QON���;99󋉇S���UECC���TSRݟ�����#DCB���


�\ZY͝��.���������/ca`�*))�$##�$##�RPO揌�&���*A??����+**�[YX�XVU�ZXW�`]]�CAA�433�755�644�WUT쉆�-������j654����#""�-++�433�;99�@>>�BAA�ECC�FDD�FDD�ZXW�{xwq��������(�}r���)� �������?gec�432���(''�=<;�NLL�YWV�_\\�a_^�`^]�]ZZ�XVU�SQQ�PNM�QOO�^[[�mjj�yvuD�}|'vsr�_\\�FED�fdcŠ��(�"�O#�!������qGFE���)('�PNN�khg�zwvi�~=���%������~{z$xut:qonejhg�ca`�[YX�TRR�VTT�ca`�fdc�TRR�A??�422�<;:�usr����#�`"�#�������y876��765�{xw����)����~}sqo'ljidba�[YY�VTT�SQQ�OMM�KII�B@@�JIH�yvuw#�+��ȴ&����|z{><<�'&&�`]]փ�;���nlk-hfe�`^]�YWV�USS�PNN�MKK�gddԇ��-#���
��ȳ%����}{y{JHH�;:9�ecb�|yx=nljigf�b`_�ZXX�USS�[YX�urquх��	��ų#����zwv{WUT�NLL�gdd�tqp=ljihfe}b`_�ZXW�a^^�tqpe!�J
��������!����wts{^\[�WUT�fdc�lji=kih	ged�`^]�ZXX�ife�yvu!$���	��	��
��������ron{a__�_\\�fdc�dba=igfecb�][Z�^\[�qon����
��������#��u̒ȝˡ"�,��
������
�����{ywmji{ecb�fdc�ecb�\ZY=hfeYb`_�YWW�b`_�hee�hed�hfe�wts����"�B������
	���c�l���[���������pnmhfe{hfe�mkj�daa�SQQ=kihfdc�\ZY�TRR�OML�ECC�644�MKK����E�|�����������;���4����������edcb``{jhg�tqp�b`_�JHH=igfn_]\�VTS�OMM�FDD�322�988�{yw~�y�����������+Ų�*����������ZXX][[{mji�zwv�^[[�:99=lji0b``�WUT�PNM�FDD�A??�[YX僀~^&� �X����	��
���E�p� ����������QOOXVV{olk�~{z�WUU�.--=pnlecb�WUU�QON�XVV�nlk����5��#�!Ĩ�����y�(�
��������
	�IGGUSS{pml��}|�TRR�.--=}|hee�WUT�ZXX�wts����
�c
�������
�
�������B@@QOO{pml��}|�WUT�:88=jgf�WUT�ZXW�wtsa�f
������
�����
��
�=;;QOO{pmm�~{z�][Z�JHH=jhg�USS�XVU�wtsg�^
��
�����
����
���@>>USR{olk�zwv�b`_�SQQ=igfpnmlii�TRQ�XVV�|yxh6*� �4����
������
������
�FDDXVV{lji�tqp�daa�\ZY=nlknlk?ronfWUT�KII�dbaՃ�~W���"��r��
��
��
������
�������NLL][Z{jhg�mkj�ecb�dba=ron#sqp�{xw8][[�<::�211�HFE�rpo����$�������
�������B���������WUUb`_{hfe�fdc�fdc�lji=urq-vts�|{,ecb�755�$##��+**�|zx��k����
��
������������������b`_hee{ecb�_]\�fdc�tqp:vts8nlk�zwvIron�544���$$#��~|h"�5��	��
�����������!����������mjimji{b__�WUT�fdc�zwv�`^]�spo��~PQON�654�211�WUT䒏�2"�
�T�n�y��������������������wutron{^\[�NLL�fdc�NLK�fdc�������W���T���G���5����]�������=������������wts{WUU�:88�.-,�RPP瑎�+�
���������!���������"����zwv{KII��544����]�S��
������������
	��³$����}zy{=<<��nlk�,"�������
�������1 ���	��
��Ƴ&����|z{988�VUSϫ�� �6����
����
�������h�#�ȳ	����ȳ$����{yw|ron葎�<4(�ə
������
	����
��
�������e�!#�-"�#�$�h��	��}���ܛ&�������}���k+ �υ
���������������������������b�T�U�că������������þ!�<'����
���/�}|&�̌��¨�B$� ��w����
	��
	��
����������
	��
�������������r'�$�
#�0'� �E
��	��
��	��	��
��	������������~���%�A"�*
����������ůĝŝɮ
�����~���%�($�"
��������ƪ(�*!�˨��~�~�
��&� '���������#�1$�/��������'�"� �S̘���j�f��ϐ �L!�:-�) �%�%�*!�B4���������������������������������������������������a������|?���>?��������������������������X|��\>?��~����?�?���?���?���?�?�?�|z�?�>:���������������������������|�����>��?����?�����������������������������������������������( @ ���mkjZwtsL������usqOlih`��� ZXW��322�}2�}|3>=<�'&&�][Z����GFE���OML�qonYpnmYZXX�.,,�*((�USR������� A@?���-++�@>>�GEE�EDC�A??�CAA�][ZɁ~#���|zx3|z2!�
"�
���hfe^987��)((�DBB�TRQ�\YY�_]\�_\\�[YY�VTT�VTT�`^^�nkkpged�MKK�NLL�xut<"�!�{"����#JHG��IGF�pmlY������������vtskhhTb`_�[YX�ZXW�RPP�DBB�ECC�pnmb=0�Ť��$�rpoF@?>�HGF�spoOtqpheee_]]�WUU�QOO�_\\Ƀ��i
����"�vsrFSQP�YWV�nkkRhfeHa_^�ZXX�jgf�����3��
�����tqqF_\\�`^]�hfeRgedY_]\�a_^�spo/�#�c�p�G����
�����nkjFdba�fdc�b__Romldba�][Z�dba�fcb�ged}|yx,�������������������hfeFigf�jhg�[YXRhfe9_]\�TRR�IGG�<::�b`_�H8����������j�_�
������
�a_^Fmji�mkj�OMLRqom
b`_�USS�HFF�CAA�gdc����!���
�����_�3�������
�[YXFpml�lji�CBARecb�VTT�[XX�nkjk���
F6������h�������
�WTTFqnm�lih�IGGRgedmXVU�iff���
���i
������
�USSFpnm�mkj�XVURhfegVTT�ged� �!��
���{������
�YWWFnkk�lih�_]\RomlmjicSQQ�\ZY�|{4����O
��
������%�������
�_]\Fjhg�ged�fdcRtqpNwutaRPO�322�=<<�jhge���ۨ������������	��������ecbFfdc�b`_�lihNrpopvts~VTS�#""��SRQ�����X���������l��������lihFa^^�\ZZ�hfe�ebb�nlkrGFE�EDC�pnlQ$�#� ��f�����&��������rooFZWW�BA@�IGGފ��)���¾���� �����������
����"�vsrFCBA�**)�olkO-"�������������
����%�vsrF>=<�ZXW��?��	����
�����Y�$�$������%�wtsI}{y�����d��
��
����
��
�������V�B�B�X����������$�������3���#��~���) ��k
��	��
	��
��
��	��	������	���h&�����~1%�3'�:,�����������
��	������
��J:�|_�����	���gH7�L:��e����������Y
����'�(���
���V.#�
'�(�0%�����������������������?���?��?��?�s�?�9����Î���?������������s��9��'���?��?�?�������������������������(  ������OML3655�^][fdcBA@�USS4:98q�B@@�PNM�=<<�USSs���hfe!rpo �& �PNKQ0/.�;:9�OMMbYVVbZWW�][Z�[XX�NLK�ca`.�J��FCq-MLI�b`_j����¿dba-\ZY�ZWW�mkj3(��(�P��
��TP+ca_�fccjWTTecb(a_^�`^]n_]\/���(�
��	���{����PMz+jhe�fdcj%$$`^]}QOO�OML�����9���L�����MJv+lig�b`_j644`^^L[YX�ca`/����H�
����LIu+lig�gedjba_dbaHYWW�hfe'������n�
����OLz+hfc�ecborpoi@>>�:88����*!��R������
����RO+_][�TRR�SQPmHGFK��������������KH�-DCA�VTSC�/
��
�����_�6�4�n	��
�Wyvh}zy6��E�!
������
	����
�������E	���2�1���D!��$�%� �"������?��������{ܻ�Y�'��������installer/dup-installer/favicon/favicon-16x16.png000064400000002732151336065400015676 0ustar00�PNG


IHDR(-SgAMA���a cHRMz&�����u0�`:�p��Q<|PLTE�"�#�������vwz�Z[]���MNO���
�
��LLN�x�\\^GHJJILZZ\``b�jjm��_`b�� �!t��rsvABCIJL����������������!��$�%� �"��	��������
���	
��

������
�
������	�
hvyyz}��������HKACDSTV�!*�������OR[]_RRTPQSFGH����'�����zLOcfhbceopr>>@88:���������uILgildeg_ababdWWYefh������vJM_`b446^^`XY[`ac�(�

�	���zMPehjcdf$$%]^`LMO����(3����
PT_acccfTTWbce^_a]^`\]_�����qCFILM������abdYZ\WWZjkm� � KNP./09:;MMOVVYWWZZ[]XX[KLN`ac89:@@BMNP<<=SSU���efhoprLMO556[]^cdf@ABSSU�����֡OOQ���=:���tRNSE�21�DE!�����/��_64n�W6̛��-�CR��
��+��mK�n
��+�oiި�H
��+�jH�9�L��+jL�/��{��+�j}�(PԎ+�j(�n/J�-�-��&Qەbb�ƿ�.q����s!3��4��2�bKGD(����	pHYs��tIME�"�~X�IDAT�c`F=}C#c&`6153��d��X��ml�����\�98]��=<��}|����܁A�!<��a��Q|�1�q�	�I�)�i��Y��rr��
��KJ���+D*��kj���DĚ[Z��;:k���{z��'L�4y��i�gHHμ4k6Ü���/X�h�)�˖�X� �j���]�8�oظi�,�����۶�عk�����+00(*)�08x��ǎ�P�xG���gΞS��VC�]�W��}~�%tEXtdate:create2022-01-05T19:34:08+00:006��%tEXtdate:modify2022-01-05T19:34:08+00:00GV)WzTXtRaw profile type iptcx���qV((�O��I�R#.c#K� D�4�d#�T ��������ˀH�J.�t�B5�IEND�B`�installer/dup-installer/favicon/mstile-150x150.png000064400000036172151336065400015711 0ustar00�PNG


IHDRx���gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�������tIME�"�~X�;IDATx���y|�U�?���g�={�tI�B�EP��U�M�庱��EE�.��6B��"z��\��+�MP@D�&m�f_&�<�9��3�&P0@����k�d2���̧g?c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�16Q�_�߭n���u6(S0z����l<��J�P�G�u�*}�lnX�~l�訪�W��*!��Hn#��T��mMp�l<O��O
�)�Fw,�o�o�=y��:�T����>l���<s߂��i��!��"z%�Y�]7�r0�؍!%�_����_��=�b����E����V�>j-))��ژ������;����ߞ��a��K�L���b$n�PaU_�a�_D��a,�i��)����
�� ����窗���g|O�HH��[h��-tb�5��[SB��<�T�a{�y&&D�7&���!l+�aJ�A@W1�'�q�D��/\��U;���<��M��q��	���	"�t�DXKℚ��8�L���]��/�ͮ�Pƈ�R,,d�b�pn�aВ�������ƥɌ�獅����MO@�@��W��H��@�3�Lޘ��a��A�.@6����Z#��s4Y��	8��(�C�Y��60ƐC�V�����1�xF�F�1�I4�"� 	����U�9�9/l9|�����eDŽ8��b.�Da�9[�C��ad^��>/lvqp�3ڠ�/U���UYˍ#���q��Ը4�������$�s��`��Q�<�c���J�6���9�!Yns��ܽ�0��s�84]�挐�|ha˃q�KBQ�(�=c
6�aN}hb#�I�1��Ň6@h����1��€�J
��3�B�W@��5��/��񍖁��
�:D��+X�9Lt�݄�0��M��ya���c�1@,�,q�g����>�G���c��)���k"��$�ca4��A0����D��hĉ{U�~C���[,�Z��#;�}��4:�1��� �go�$&����Aߛ�>�jJA��k��I��H�7 �ݔ>�U���d��lnlV�ǰ��������TKy&�Z�rcw�?���� ��ki�D�)��S<G��Ra�Jߛ�O���)�����1��E���cJ�C�'��h`źt����8ih�s���	<W��~W��^l�g[DZ'�]�1�䵺�7�_7��%�_�5���V9D�wF/��
���黻+$�ߗB�*���>Y�����}t]��qh�
G���+�f���g�����[�ˍr���ਠ?4,��,�l	\�x>����K`���-DW`�-�o�	��O�{F��ٰd�C�#��þ�-#����CQ�<��a�VGv��@ *�A�����}(��L�T�(�]�BEO���u��Չ4��%ML�xZ_3��_��k���{a88*�Ά%���rh�-7e$�,K�I,pb�"�s�g��*|�u�W��~q,!�[,�s�1���<u�7��Z9$lAp��+���Uꉑ��,�N@�5|���
9 �ȫ�V�J�	e�1$
���&3XK�Ѧ�їm���_;�#���
��a��hY�B�ATjԌFx�-�8�혱u�����+�Dx�D&��"�F���� l�	�����&�Ѹz�'�6kcF40A�0��ң�D����To�X`�&eL��C9
�|�U5���T[��Z����t5��H\?��ƃvn�y���c���d2+}���?//T���ppT��M�>n�.{<�M>��6�(
�f��6��R�B�C��h�h"0:5�b$��I��+6$⥰�Ii,�1����>
�wl+j=1�U�m#��ٞ���`;��*���"���J	:����Uj0���0��i��6 
���8$��KS����t"�����n���+N"��

�w�^^��/�਀4-�Ls�G0x�$��^�rۃ!!-dly��Wj�:1u��"BBJ$�[�<���/
p�2�q��2�?+����4�ev�6.��D��D�
|���öby�v`��1U�h��Z]�_ّ��ˎθG�ˮX�H$����~��WT���Wpwl�^R�w-�%�M����x�<��(We&Gv��[D�K	)a
�Wʘ[B�M��yQ�}=�w�h�~��T��M����Z�yO��z�x*�da]��Z��zL~��{4�n��<R,�8�.���d2�AD5A�BAs�'�U@�H�c��?hr�����_L^��(D�k4�U<c�kT°P�8HYֈ �v`�[<�?�����S��t��1G�w��s�}a�1o��������Z�$&{n������d���{��7ތ��R�f����b��|K�9�m�`
F�h�uq,�+(&F�+4�\��K���X62��I��+cN)j}��{6�8�[�ł�؞��ަ
dV��*䠌Ay��#�����t�7��;�ۏ�6��{�eW��R����;[��,����o
V�X�Er�p�c��?��cH[v��bW���I���J��KkjąDƲ��9;0�}��ݛ*e�56�N
y]A���F�W(��\8*�+4����f�"z94�|���v��pS׶nP6�88*�3�����[��饋ݔ6���IҲB"��2���
�t�8ԛ��q�=�KW'�����ڿdG��'�d\8"S���gL[o�����qˡ�y�S-��|b�8��y/h�T��qpTБ�����AҲ&{O��L~�H !-Ĥ�0��ʘ�a���JK٦ƥ��Bt�Z�׉Q���:��8<S��Rh���q�d]*�����O��r�M����f��+}��
��"z��q!Q���
�K$��-D�2����8�;\�c(��aɪ�΢�kύc�Jm3Qh��������G�w�(4.����F�7߄��>TUWc���Cu�_��w��cvl��'Cc���l$�,-�7��Rj��`.I�Ms���
�wΨ�?�аd�#D������	����#$V���<��yƴ����f�z�ŗ�&��-�77��nE__`Q�"TUUyAl���x�^ 0�n�(�����%��x��PI�M�8��J��~[�x�M��k�v{1��0��	�Ib�D
-�d�7�m@��3��¶�[��xGw�֖���'��8�+���mo���x��ǿ/�ਰ��/NK��=��yN��P��BLH�^
|to���/^m�&0zm�WD6 (Z��aY<��n<��6���aC��xQk,�ر}[˯������X+V���/ۺ�z+}�E�x�����֥�L�:\! ���ق�{Uh�^�h�$��Y3x(�6�M�ű��x.0�-�U�����>�X,v��ޞ���7+�F4�����
��`��_��T�%�%���*tr��F�ā�A�"0�����?e�o���뺦Ղ�34z�H����불�Ѝ�щ�c�rJ��jpfՓ���\�����k�{�&�&&�8.�
A�D�ti3b��X�X����a_�Q!��5I�hCh��A����nW[�ژ�7���5kV�o]�*At�2fM6�kA�ҁ
��:��)c�r:l?~�gF�q�g?��8��C���>���dh����K��A���B��J��}G���<��w����(D������\�:�s����]���Ne�ڢRu��!��]�XvNӖת���ƹ�]�j�v���H���+����(�Ĉ�H$�pa�0����ۆ*}>�U���\��,O������W`G�9\������-����Щ�Y��$���4g&�V�z�k�zf���Ϝ�j�V��X�SO>	��8�0D�*�D<�mۺu��H�R*�;+}>�es�#U%�1�R:D�&Z�M�a0�\`y��$�����I�_{�ϪWk�a�Z��:���s��BRZ9eL[ȟC�S�|�UJ�c|<۲��AL�F2���Bn"���^c�pa�e��+}N�e��E���ў1
���@�ot�2��0)�4���(5��K�Ts"���|�ux�^���W7�V0�X#HD�i����BLʜ�B��u3��?q�:)�չ�DKOO� ��D�x<�e�W�����u]H)�����߲�l7���bn쵱x|̲��b��� ��y!e���f4;>n�٬*��q�i+�W�1K���l�K�I#�Ҏh�Bi�p�����O+mXQ��&�p��򣪆աѝ�WD�Ҕ1����$�
��ƴic�_?Ù���O��Rt�s��>�A!�1p]K�6#�No	�`ܲ�C�A,C�*���7~%�x⍎�\��ҡ1�v��b�eɢ�VA9���R�d�/��[�s:pp̂;��6�1}~Q>���
�r�&�X�3f��)��� x��}��_{s����~U`�5њ�� ��'C#�%����g���G?��B���b����R�RBk
˶��Ԅd2��y�)���ڶ�t:
�q~��
k�/��k�妻�J�6��|Q�R���K>��5�>r�7��~�h��޲��~��x�G�t�W���qٮ���m-Z�K�?~�P��>�[3u�|�;m��U�
[�Rch�G{��Ц��7�04�o�X+ux��2>>�5��0Z�v4�7 �w���+W^�Ϝ��W!�8jjj`���QG�@���vb��mA��}�~� �TT3	��9�u�.Y��	@w���:��6b$Q�,
��H(�]�t����ԭ��jE���ƘT�xnN׮�����Z�AL�i�]
mL�mƘ�3
�3���
������	��`�뢮�n��
�`�W���ҹ�A$��bH��PJ�yhh�l�Y*�|���e��ض�q�džeE�6n~�)�a�4�����w>��6�Qy���0��
JdZPL	��O�^����<���5��*�F�]�Đ�V�8"�Rt0����=���Z�1a�x^��+��BöQUU�q��0ܰ�k_���{��c�J$p]J���
ׅ��c��Bjll��Dt��2�^nl����X̶�+y~����ƥIIt�H�O��i�Ǵ��Z��B��nxgŖ��1U������EnIY.iD�*��u0m�оndf��Ꮬ�Nk�
�u�
��$Y

˶�H&aYVW����ۦ�n`�T*!�H����g}�$���,�i�!!et]J��c���eYG~�S��W��/R���p�p�C�]홴��Ok�(5�Kت���R��d��|tZDk�ƓH[�d��C��h�D�o�Q�}�ç��;`L3P�j"��eY�nV٭���q��o{��+��*&�I���	H�Ӌ�1����,K�Jִ��n��[6?^RS[�\��<_pp�H�3�x�cI,�'�5��3�!�	���@��8��U�0��&�fE"�*iO��
}L�a�m��o�Qh��>Ԫ��Q�����z!�n��o~���v�B��	)%��~��k# �<,�E��c��r�\� H��H%SQ�m�U�<�'ܫ�"=�y.w�w�,�sGd�^�]��O�(L�1�黹N�.�.Mc����9��DzU.:cB�]�L��r&�ih��U��Dm��o�YI�}�V����"c4�1�ZCk
�Z��_�y۳=��&�����R�%2!�b�`{�˲&ײ4��C)	!$��X�W��x�\y@.��*����<�pp�H�ý��Z�ޤn�%>Ym;K��O`0��?K���0�C����Vg����kW��Pc9P��M��0�9�D[\ȍ'��ϨM�=�}k���$�IM�7���B0�t	!6<Wh@����SJ�>��OT��\.c,+����'�T�X�J��G ��<��e#��?����#r��qp̒W�u�~���kG��;R��A��w���������g����f��s�z����Qc�P�6�^��� 
����O�Yh����m
���uݖL&)��`�!
�<�R]B�
߾���ㅡ�lیk��A�
�m�g�9 71Qjh� �.�2��X�x	{�˰t��	�<>6v�_�\�����h�h�p�]�Kߟ��8�s��^���c4��NFm"]�1cs�:;������t
�l劕2;�}/g�hKH���љ�i���^�~G,o�����BA ��"�.)����`����Z뇮��� G�aPW( �(�mHH!�H$��҂�W`��#E�xIv<��+��ro��タ�c8��
U��w9R\�,�|�P�=^��(R^��c�w��vg<�*x���L
�K�aJ����9K���e��:60��x�����{^G"�hnhh�mۥ���`dd��w[��ᦛn�Qh�R~���k6���o�k��G���-�%��4`���P__?n����W/��-sq^�5ܫ��|xlм����#*� @Wg,;�=��������5u�R��A��ڗej�`ǠYh��9�$jK[N��f����V��:��x�¦&�nl��$�Q���[n�iơR:������Q���ipx���)�'���U�P[[�7�>8���ƞ�%�=섁������/�)�I7@h�`��u�Ԫ�z2%4��hl)�ӋJU��~���B�S���y^G*�jY�x	\�-UO�󰳷�B�۱�?��-�+4@a�R?���˵���bqג�3������_�׬c2_qp�ChR�� f��<����=����ӫ��wM\ȵ�ej�`��0�|c���C�W��$�Җ���с5����S[��bG:�nY���u'V,�}�6�s�.�q6��G?|ޡ�v~��6�&���SK$���R!,c���d����Q�F�v���Lm�Q/��˷��9UO�Ҧ�+4&��r����s|pF�q�ɧ�+
�T��e�r���ɆJ��e�f���uI)7���Bcw�R�����A���h�A N>88���Ղ��Q�M�9�u�NdV 3.䚃��(���B�*
�UO�r�[�
��T*ݲ|�~H$��Q,�?�ᡡn)冟��'����h�������9{�\�鸪2�]J�A�z��?���2k���Z�W�51)��̠�v&�i�Ɣ�4�Шvb�o�aC�[�rrk!��:��4�r%���w(���G���hw:�^��_�Ϭ�c�)��)m��N���=�Ks�������S*}���t�Kլ*j��
�ve2�j�)-_UO�s��/,4
��t:ݲ��H$&g��y<�����������;�D�cl3e%���Y��5��8���4��0d��s@z3��kV��t�\�,�D�eC�
4�۽<�|/�=�ݍo�YC�I'��5��w�3U-p ���571����������Hh	��1�֫�L@kS�S��v����R�Ô**�RM���څB2{�P��.sߒ�[]��5�k��HK�D�7
=^~1g	jKX��C��Oi-
�L&*i�BC
�\.�M��D__Wuu͆?��w{,4J2��=mqRap??WU���4h���S[�i� &QhLXDu��l[��2u��;!�.vHJ
����
�')鴿klhF��ַ����RhUO��и��?�gǎ�T*�aӦ;�th@k���<��R��&������C65.M>���Ci!h��m�<|�aLԍB ĥ{&Z�C`�̘��X����ա1��k��$��ƍ�`��a$r����崿c��'����V�;��tˊ��G<^j��rhtWUUo��{�xh5j�Kŵ]��x�"q�g/��g?u�g����88���,lyI��:]���
������6�,��"���8����R-�03~_~\ݰJs�MbM���T�B��� g��,{�
�������w�R��e�W ��G!��M��MwagoowMM���wNB���e��ZO�=!"�A���_HD�R�|��Ͽ���ΘՆg��EjlN=Ѵ��j!�i��G&FceG0��c8��.1)�M���-A8�bIH��~Zݸ�tZ$�V�6\!��hBc0Ȫ0g�%,���#����AG2�jiniA,J#5s���u��Ԭ�ᄍ	
p7`�RjWpLi��}۶u�'�a�&&Npc�,Z��s�A�\��}�,hKT��M�_����w�ڻ���w�`s>��Dc�ʁQ�MII�hKh�� .�B:��*	r��s��f�jtJ��I˂E�4"4�5n<�/�ܕ���3
�w��=�av$���KO�=!"��y���088�U]]���{�!h	`�Uiu��wF��,C��x衿�k�F}>���~����\��%/҃�3���X�?�k��{Ƈݻ�1�JO m;p����X$�D���$�����Vp�$Z�F
��ܓ�D��0DQ��$js�l���]�~�ZUv����M��8.�ݞ�B}�auUUUo��?�ihD�`cL]98�m�P(�Gş�W����*���Դ������88^�����]�T!���w��q�f�������+$�Rl�hvT���#�I�=���V�p�u����Ȫ���otN��B��2�Ex���SJ}#��444��ӈ��P(��?���Ѯt:���mB �5ZK��O�yz�h��c�v��w��_y�^)uA:S��/�xU%^�|���u��6��� ��Nژ�٨��,6�Ae�p{���$:��g��������i�$�$�5�D��F�E���6�����F����Uk��nsmml;Z��"�lٌl6۝L�6�q��Hh�~�Y
�V*�f�0��]�ML��7�GRʗU�8�����E�j�$=���]�^5�B$�C&Ֆ��7�)��hD�U��?��/Z%����/�t]���� j�D3����p�6��v��L��<�ö�m�MLt����m	
 ��c�p�U���h==<��>�HO
^{�E��x���Ά���h��9�z��(@4,!��l��W
���M�0fAV��m��VU��~�*���ڼR�,�c�ͭ��	B��g����>|Z+�۶[R�T��s�C�{>zzz���]�]��_��b��w���3�$&�7����P3�rhh�b1,X��՟.��K#�:����c��ܝ�VX�3KfJ5EZH�ic6�zK�Et���̅!FH���h~۰x�M���xZA�h�6ў�6Q���l\7��>r��:�-�+�{RZX��?ЏB��e�����+�N����R0�1���D{��#�^�oUU5ҙ*��&����YP0�![��Nl�$�J��9� ���D;Bc���4�ZDG�TO+��,��7,^��40k�y���4����	�#�6mL{�����:�-Ҳ��𓫑��W,vٶ��gq���Ƙ��p���p.�X
�r�D�?5.X�q<�s�f>�In�`H��j���Xb�h�)��0��G,H��q�0�1!��a�POޯ�
K����^��Q�
� �m	)sڠM��nV}���3�t(�&�O-���!r�˲�
?��抇�i���HD��Z���.��EO�!.�EsX\7�E��c�\~k��i>���o/t/Z��En�����q���a�2F�� �AX��0w���824�*���[@���$�N_�5=�<&TQZ�J��v��VN��ƴ�8�;����я��ðY)59`*��)�E�a�mI������BD'xy�0�9*��m�x�4�?��F� H���mG;�۶�ںz�axߕ�y�D��i>��%�E�>at-��
��B�IAv�t����XEm~
��k�-�c�� (�a���ZtsȆ
Ѯo���*��)c�<���0�����n%��'W/�IbL�a�ֺ[H����}w���N?s	����ʽ)� B}}�d^��R�($�@QR�ۖ5,�̪H.�V����Y��g��ǟ��4Yv�6���A
_k�T>��Rh2�@Xຨ��\hL[^�<4���O�
!:�E�%71UwJ=(���~t!��;7�������#+�5;�jO$�NjJ��
}{,3F��� � |�B��:�|#�}G�Hb�%Ám�@�X��+b8�'��[$�ȍ��vs�1m�6�a�gF
����9�RʎB��266
�5��6i.o�d��Dn�������d2y4������)�4o&�΀����{W}}#w��1�
r��+(��`{abr�[H4ǒX��r!���kg�:��u�%���r-C��PZC
�5HJض
"�2�l��k���8��3k��?�1��Q�0�D�x�����Ш����AG��>
��eBS�U]��SX��sh�*���3��|����9�ӑ�Z�v���b!�H$`Yv7m���k����GN�Dt6����2��!�@��
�_������WqpTH�����CP�����R{��dͱxNô��pơq���8��|��g�vx�7�6 �D:��m;��w^�&4@Jy*�{�2�]ݫ��F:��뺃Z��W_��=$�Q!1!^j�0�{���dw� �թ*,�%sڠm8�yh���[c��11�m�ں�b1z|�aYjkk�ź���߸j�
���8�h"�Tk]ATҘ2F�u]d2hm�=1��c�_フ��N�E1�c�*c*Z�C#ھ@�T5���rh���3
�>���x,�1>6���?��|>?YҰm
�����]Z��W_վ���Dt�1f?���*UQ��k ��7ë����{l�L��qpT�W,n�DG��J���H8,]���TN�6�'�QC���֚�':���[y�a���Ck�l�AӢ�H&�]Z�
_o����5Ƙ�����v
�5��$��xQku��ۿ���?+{188* %āƘ�~qr��E���`u"�S@�@�׿mF�����.�Ht�<�0::
�� ��8hniF:��RJo��W���B�`"�����ܮa��*WU��W�`����*��GE����k��-@l82S���\hж3ڏ�6��I�E��&�Ɏ���-w�GO���X���d���
7|��/�U�qƙ�B|����E�WKc6��J���,�C���9��_��8�9v{�b���|dU�$���B�7�mG��?���ŗ�����ۺ���vLd�pA ��ࠗ���5ݞ筿�˗�5�q��g�R��eZ��920S{P�MX�.��C�d2��n�WW�8�e\�c�,{� :�� @�B�+�g�\���T:ݱ}[w�m������BH&S8�e/Gm]}w�/���&4�8�Z˲>OBt*�V�ɒF94����8�٬�m���:�\.uT�8�XB�C��>���
����q���i\r���T�c���-?��ctt��4jj�p�1Ǡ����X,n�����>,\7~��y��<_z���Ɣ�(z7����v����x<Υ�
�������v����d=a�|Cc�SO��z�����4� Duu
^���pa����E_�+B�̳>�8O~AJ�#�͉�\N�9�JA=�t��d��ӫ,J)
bddDڎ�Ϝ�Y.uT�8�П4�ptZJ$c��6��fZ=��u�T�c�槚o��&�AJa"��c�Css
�Ÿ}�{���{��.B�Uq��P�+�B����2�k���uU
� >��������x�K��wEg/��M���v"J���0h?z���T*u��-��o��F��6K�,�뢹e^�#�����8��Ap�W,�xtt���8'��?r��q�f!�[���c�}�����eL���p�:���%�0K��IoG��(,^���D�͗]zqO��}�8�P������`�]��~��BJy(5z��3��C"[�lF��^47/�v�ꖖe&��3b��_��E?�<���7�p����z�;�A

ꄐ/�Z��D��
��d90�;�O�Z
)%��<BF=�64�"|���cѢE�����z���}
�8���5ɗ��	����7�}F�Qv�����?��>���wɯ~uy�!�aT����lۆ�b�.\����e�P��򄔛�R��apW�.�۲����b7����t�*%�\J$&�c�� L������w�[�Z��	444 O�b�(���0:2��JU�a�&C#CAt}��W�c��1�ʟ��'�������qp̑��&RB�΃vn-���8餓�#�>:�L�ax���/s����	B��ÚDZ�Ng�Դ��,Ac�$S)mY�(�J�-0x<Þ0l�ޡ���o�1�R9A�/"�B���AD�b�Y���
���E
yx��i���i�۲PSS���Z#��Wk}�eY'�k�|��o'������K��JAb�~���c�Ѷe�<>>���/�d���ニ��_��xQ}:�>�q�C��K����0>>!$džeEbYт��%a��$���P[[����Ri��qX�!E(HxFmtiC#2�H������R������<A�*2m�h��J�)�������Z�|߿z�׮�v�ٟJ���l�>]�xu6�Mvm݂;�#��C�J�Rh�m˺yll�S_��R�
����~Xp���%�O�'�ر=��;���#�����w98�_-H)!e����8p�\�-]wa�6,)ADQ�����Di���uSvUî�HgPWW�D2Yp{_�����}�,�O~�өx<q��8���###�'����n��%Kp̱�i۶o�Ш �q����ں����N���I�q��ß|p�ʲ+8d)8���H$R���RLn;P���l��1�TUaႅH$�6����<�����|�sS�T�׍}0k�F�b�tZ[��4�zRQ��y�]��TU�6SUu�����|�[�6�]!�+,��K9@v����(����Bz�Ј,_������{���k_}>��sϯJ��'�\�tmL����y�_z1�F��J�6;��A*�~j��nj������y7���Z����͠�]['jm����u}����_4�L&��sg��|��y/���;���7���W����.����J�k��8敟��'���D"	˲'׶��5�,]�SՂ�R�G�J��������Eˍ���#��
�ʢ�Kt�HB�r�fdhhpFC���]<^���v��g|���Ǯuy_بQx����x����^��P^L�\R)�jY6,�Bז�x��GUS`W�e�r��eIH����~�K��#�LE˲��"fJUÂei��������,i}?�?�a�Ѻ�D%˜�����_���}};Ŏ�Km����8���������yF+���
�HT��T���z�]�*�n����s/�R[4-h aYB�h��;z���2�̲C^��c��v�P(<G�
@B��$�1�J�6�xZ�<C$F�=%�}?�qk�bis�p�X����7`v��5۶m7����/������^}����y�JU�h�j��� ��@�O��yƍ�}���d2���[�j5�>������O=y�LǶ�k��s�!/�…M(��a15D|?�obEC�y��y��c�1Z煔�q�g�O&S�ן�F�b�M�l��o]�.���0��o���u�p]�bq24�^,ˆ�8*���ya���c�)
��t,��υxի_��˖���/_���=�,.�҅�<�x�����_��R���d�|>��X�(���L`����g<�+X����o9�dr�KQWWˊ�Wp�9v
�0�a˖-�z�����s�1��#�:
K�U�����f�Y�*���q�{ދ��>ܫ2τa�W���oZ�h풥K
��9;>���Aww:�%���
o���/��q�׃�/]����c^��_^[[��eh^ڌ��Z��`�cEϻ��T�����sU橏}�l��q��q��(KZG����1�B>��}�'��<��ʷ���("zB+�@�w����lv|�/�4W�s�f�8橫�jl/]~uΧϋWWW7[�U��>0[�366�K��{	(
�o~�ɱ��{�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1�c�1����1T>`j;H�%tEXtdate:create2022-01-05T19:34:08+00:006��%tEXtdate:modify2022-01-05T19:34:08+00:00GV)WzTXtRaw profile type iptcx���qV((�O��I�R#.c#K� D�4�d#�T ��������ˀH�J.�t�B5�IEND�B`�installer/dup-installer/favicon/site.webmanifest000064400000000652151336065400016151 0ustar00{
    "name": "",
    "short_name": "",
    "icons": [
        {
            "src": "/android-chrome-192x192.png",
            "sizes": "192x192",
            "type": "image/png"
        },
        {
            "src": "/android-chrome-384x384.png",
            "sizes": "384x384",
            "type": "image/png"
        }
    ],
    "theme_color": "#ffffff",
    "background_color": "#ffffff",
    "display": "standalone"
}
installer/dup-installer/favicon/android-chrome-192x192.png000064400000067617151336065400017333 0ustar00�PNG


IHDR��R�lgAMA���a cHRMz&�����u0�`:�p��Q<bKGD�������	pHYs��tIME�"�~X�nIDATx��w��q6�T���l��90�9H�Hٲ�YV����;0�a��d[�$[�r�r��h+�"DE�1����yBw}�����@� �D߃�`���l�S����,`X���,`X���,`X���,`X���h�/�O?o��N�jf��*�.��}�^�mK1�~��;g�p��ƛG�zh�� ��ʵ��5��ś�
�K3^��4����s7&���th����ڗ���ZbX﵈NS̷W�ou�}ҭw���{�z�$� ��bi�++���F���M�[�%�|�^�(�@��\U���D�������] L|f�
���74�5�(�4PpX0��2��ݰR{��7d�Я�?��:/� !��v��(����#+�	�
[Щt�E�J@�Z#�<����J;�*�}��mO���^�C��P�zI�i~?N�%�\U��j�HI
h
�]�;4㎒�w2�����k�����׎,�K���pk��yF<�i�]1�eF^�8��w*�\L�.��3,�-h1LLh���\g]��Ιϓ)tK��\�E��rRn�}�at����4�f��n��eŐ�&�R�0��cJ}��j��+-�?gh�Dc�/`� E�MK�$�"��\�U�8��]T��bǸrqOq�̶"N�֍KM�'��u�-デ����m������+0m+M��L��}�+E�$�1L���b6���fV�1�5q!���z���\_�|�$B�0|f���Ƕ��:%T��!	�Zt��T��(�"�G�������~}'�	<P-/I�.����Z��Bm
'"|�ư��r�;�{�yhQ�C��?{�����������*
"���M�O����`q����&)�y�u��ۗ�k��}	e�4�ƅx��qOa�և|�pY�����`�ְ !�ID
�gO{�<���)Ft��kO�������|]�i�r�™��˓B\����8���hL��̈a,2M4K9��=o� !vy.�xn�d�y���Lǎr;�
Q6!�?=�Tw��s��5V{=�3-�{,����
+�3��>F�~acAB�`��YŜ���zF�_��=R����a�8+#�Տ8�׭�f}M�i[����EWąxY^)�[������5��9��s;vz�\�����������	�9ИD�� "H"��.-��3�-�c�W�h'pSk���熖ne�xc*��k���&0�Tgl�{:�4`kp�&� �@DI
�\Fd2L���Sg����:PK\�yҭ.N�����Rb��&]k�猪�hif�O
 �$����� !"D1L�,Z�FZ~�CP�
�@�>Vʣ�,���B^vO�(g� �~S�0:DMR^n�8��|l+N�a1�*fx�ڷ�P��FX#�D��
MA�`n�4j"#�}OU
8!�%��祉�%A΃��� C�D�F��2+�����b��8��5`<\.bȭB
D3��l��q`�$l�,��$
܄j~~СE�����!1�V�h3mtZv{V��3)<��|��`�OP L��*/�ÿA��Z��g!�@ i����O Wkhp`�<�{8XD�=�5�� ��`���Y������XB� ���u,N�Ѫ��k�Ɓ8�2�Os��������X7�t!+
�n�E" ?�fo?��<�|h[Lx.�͏��,ޏ(̵�37�������P?�C!x��@���4�lZX�5ba0Bt�y��%�^b���gXO
� Q{o��\�5�P�ųl���9����'��#��p�酕D������\�/D��`[�2TYwȌ��TV|���5Dx�$��uI*Ҳ�����ѱV>O~���f6Q�¹i��a�>�e0���6h<G1��
��'X��vx�s9�i|��0oX!c��~4�$�u,?l美�`���e�+ѹ
��<r��h���`�,5��}���B�>�4�9�g���s�ϛ<���"q�}KOu�
>�Es�3�9�C���ep4/�J�i[�7�
f������V�~�-?�ڴ�+��߸�m	JZ�	!_j	���F�5��e8��k�hM���
�#��'?W{�S�s�Y`�"�����c��B8-݄�3M\����ꓞ��l;��{�����N�\�yQF�O�I���}�v*h3c�&�ú���2�o��'[��^�,s^�ж��7���R���kЬ��>F<y߭%�����)���IfQx�x~�=��V4q!�2��1�:�"x�e�[&������b��g?&�|Ƽ�;��c^��S6ћJZ���;eĥ��vK�$2������U���>�y2!���C�����ڥ��>&Ft�A�Ю�1�<���ʯ-<'
�3�D���}N�4ix�dm�u��Qu��'�5�R�ꏣ�.=E� ,�X�Lc��$�ü����F�������ԁ7�ތ���y#t,����_#$�@W,�Evii��X����We��A�}�$R��O%2��\+�:�\Bʿ7��I�����a�sP�=h����CyW�a|�B�"CL
��F6a4�W��~��X���Vp�FE+T�Wkx�fN�)0y6�N"sl!��N��d�VT��}%�?<�?��_r�ʼ�%�<޹y�e���M�ƒVtoa���)��/C����%�e�H3���w���sX{���5�b��E�.�ğ+k� �}���q�k�s���C,���@LH���,I�Bv�+�@
�Xn���a�~����ĚU�QT
��	�C���@ ���3��k���HJ�$R81�A�4����[Ƶ��)��m�b��\chN�+�kZ:1�Ԣ�!�_�ǡ��l�5[h�l�[6���g��1�a�#��5&�uX�3c�s1�95_$\�=j�F�f�IK�B".%l!����30���)I��(��� Ƥ�|"���DI��6�2�q,�H4�.MQ�bFE+���g�sPR~-��B��@ZL'��8:��E�U�GJZ��~d��~�f�޵Wöm۲�3���}���?��O1Ι��҅����R�3R~*F�Vt_a��24�	�F�����D�i�͊!.$�}�A����!�A�
"4��65�d�S$������>��{4�S��wh����%�݂���r��Ɵ]Ѭ�L��hMG�I��0c9iĪZk��$:�9��X$Cp�ƨ�`���[E9\�hXL6���pVē8=�C�iA���ߘP���H�1?�׌�6\y�:�K%kŪUWI!N���<�����C�i0g��Ex��>��s�{�B��ˌ���[-���t��S����ʔscB"gZh1-�BB5h}_�
.z����	�d��F<���֌;�A�y(�<� �=6���ڐW�8�N����Tt�I�RIt�A�`E�c��`O��1ωr<�D�g��r8.��I�+�oW�]'�us�;�ܿ���l@�P0W�Z�6�No*�Kx�Y�~�������ݡ0g��n,7c(j�������'�1����O'�׉[B m��Q���pf�
^
���HJV��@U�b�/5�F�`\$�_7GU��Z�����4�,�3-���B�g��tYc�u�W)b������!p����lpt"�����\��y���1���i!��f����#���U�֦3��Y���ÿ�뻎��Y(ī��㖶Ũh�k����B�ay<�1ϩydcg�Q7�"��1��+�5x�T���Ii��i{R�_1��>��G}w$.$��y��3��;@�����1'��k;���h�^��U1Ao���Z���-nOU��	B=�n�DAx���h1m��L� Zj�K��r*7��0<<lu�ѽ�Lf��2�y�}�c�O��w��pNC!�}K�X���s�͌�ٴ���ְ^�h65�`R&�@4BRh6-d
+`��)W�ו�a�a�h�[����yA�F|�Z=p;.�V{<�-���{s^�����o����87׊sr���a���O ��`M<	����q��}�eW^5�B���#���cu�ѽ�L�z)e�j���n��@6�;�c7�n�[���:�eX߶�ް׭����F~Aӛ<S��$i�Ɵ|^x6	$���Ѣv?3�g����#����D��m\�cm�yz��z[�7�DFYk�21�=�������t,!�����K	9xt��Y]˺�����~�O��d2���13�ֺR.�-�k��؆�~�����y0�SN��T��+>��j��l�B��ّ�Q�)��h��yD��>%
dM1!��1�%_뿪h�ϊ��׏
�ɒ�;�q!��s������Y-aحN6	�FSȿyX��2B�].��:�Y�N

��/�ȍ��Bk
�����;��q�� �������oL!n��xC����؃�d�R�S=�c�{�.M3p�������C>������(j�8*f_�r��r��j
@��XCDX�<��뛤1���X_��5\}����XǭYӓ	l�ܶ��E�R�K�:Z�ǫU�	�Ռ?�p`�g�]qf��0�g.4raU���?u�7�i}4&���ǥ��a�$��S���3�M�e�RƟ4�����u]��F�OU��cq<,��X�%�9�$38k
�[�1���=�"�UW��ؘu̱�d2�M�����݇����d��R�qݻ>��������S)�e�&TX�Ɣ��&�:cq}���"f���A�X�@BJXAed����w��C����z~۶e���ym\��^)�ѐ���� �N�qf�	fH�Q��
9�|߬�a�� ��[GsL���o����ia��E�<�}��x��G�d���/;�M�(UY�O���̟��S�>5�
"�B e>}&����RR�F�~�����
FG�d�a^k�����j	�'��@�I��d/N�`qI��cJ�7I��傷w��(�J�꣎��=��`bb˗/G:�3﨔+�O�'�o~cN�k���B^�7��?��Y6���C���X4ܷH )
H"h`�b��g~����_���s�"8��&i^k�����]�2�,�3O3 PG%�8-��A�K�7�)�A
�0�VO�k�F�R�V�^]#��o�~���c �W��eYp��G�����"�J^q`��Yu����i"mX���"�#J/bB aD��w)�/H1����}��~��
:�ƵVh��u*�+���a�תD��r0IpY��N�%���z=�ժ�jժ��_'�� �Ja���ZC3��կ�Kwttt��m^	�„�o�X�B�jZ���!�?��f����a�P�7(�cR�n��=�]�[[����0��Hldp|�S��J1(��x7��+i��� �6�6����g����
(�J��+zS��&)e�����
����V���A)5V*���{���෩�wp��>���_U�hRH�t�G����R��Y3o��ˈ������_@&�_���YD��*vUJA��A&$ay"��SD\a�2���fO�kֽ�B�\�l��T*�I�}�������]�l����`���k�wьy���3��@��	�$�	��bB��h�:�;�a���j醫u"I�:3tu�U쩖��^��ZU���4�Md A\a�e\�u���SfI�u�߉�Qs�e�ɐ���C���
�<Lӄ�2�|4,[�RJ����[����m�.�K�$ I��l38|\wuN%43����[�y�/D���ڍ*�DJ��L��ć�V�Qe;j0}��I�H�^�L�j]�h��j�
4��XћH&�Bd}���_�X,��o��H�3X�t�R����oP�؇�t���҅���H	y�$z�bƘ�%=<��&0E��g`���bnj醧����\:h4*�z���X��)H"���RPj�-��i����c��s��z���&!D�����7߄R���	)�.]���&h�����{���\������/��E��b�GI�e�M"��b+�LD�/�2�7�t�'B^'C��p��B7���J��N`EH~G�����
>5M�g���^���1s��U��xb	�{��'���R	��0��7�d�R�����R��W�Q�C#��ܺ%���F,�r^�mV�ԃ��V�i����������t�&�Nm#>�{񜠸n���
��c���ϼ����������Ydv]y�5��'��K����w�m�m���r�a��_�d2��˗GuOw�%�G��]���y
?o�B�41����_�����{��X�V�v/3�� zP1����.(�IK�k�F���0�u�s4KO��6��vXo�h�>!����2��g�ګQ,��E�{�xb�v�܉���j�iF��[A���iSS3Z[۠�*K���������\����R�r[��	���G94}�)�N��F�Yd�{+����i��$�3�/�;��IKе�����
�QM�H�-ݖ
AĞ��UV�$��g���{*�������㛈(�w�nl�v/�j�aL"�03-Z�d*���9OD	1/L����x�)�E�B�찞��/
v�����/+���3/H�k i]KD�(UDC>s86͖�Έ�̛���h�=�"��W�E�Z����{l���\��}x�Q�:0Lc����׀eY�^�RJx�w��}#��c���Ïy!	K�"	1@�W��g�.�� �?����������ysg���Z62w�FE���]�7�r��vӆ@D~��๳,nuEϕ�<�jkk��b�@���c�=
�ua�f�eHz9I�$:���|��ݱ���;w���&ЯZ�1�<�Y�������o�U���	�b��^_��|>?k�����C�Z�	='Jt+(�pk1-�}��.�x�,���{%\׵ZZ�{-��DD�C�x��'k��:��!l�F�R�R�u23��ڐ�栵q�Nf�O~�ùb�@L�Jq�$z�0�{���F�M�F�����RH�O�:���kA����U�kT�$�D�i���g��1o���?�;�c67G�Gvx�v���a���5;_B����d2x��O	�-���,��9N�)�������uk7�}א�����JJ=��G���vf�����v��M�`�:62s��ڠ���[ )%��	�g���@��W̲vO�ګຮ���֚��	����(���
��${?��/^�5k�G*��uh,CWW@3��я|hdbbb�����6��m��X;NG�b� �ņ��kVY�	"K�2��(.j3cKx�BP�\?��7E!Ef�� �w��o�.�OSJ(���H�x]�ի��o��`A�b���	���6���R�lnnYk��&ٱ�Q�߿JfGAv���ڊU�Vò,Ҁi��9@̶��5A+�V+�m���y�0kXG�'^w!v�����֋HhF[��͆i���058ˀ	��/��,j�g�a;����x�a(�7�?M�D	O��y� �%jk�pD���	L����g^'�g[����JT*e3�k�5s��8&�?:����X�|L˂��a �����M�&$	��?��w�����އJ�rl̎�E�P�Db�e��R����k�q*Z+�Մ�ڍ�b#�W�(`|lcc�<48�@���z�g-�oY�_߶�u���MtV�dX�;�\ݏ�<D$��9��"x<�?��ц�3A�*/�8����! �R�1x#��	�alS��E�a��"����������kQ�T�L&�k�&����	80��]B]6�Ò%K`��\w�a�K�1ô ��-���s����~۶��m��T*�^)H&"����N��_Q�J)�=�+��im��~[GGu�ʕ�8�᫮^���ObV�{��f�R�1c�[��5\��ܰÉ�5���o���8�ڿvΏ|�[%^�q�
RP����4�F"��BD�a
{�	���
@�fͼ^
Vfi^~E/<�1��t��r��B��ёah���@d3YtuwCJ�������D_�b�i@)%�����w-Z�����^y
��{��rժS`xx���,�RJX�e	)`Y�&!Dm��0M�	"�����J�����Z���KM����|�k1(QrJ=/L]��_��/l�լo��f
0�5S����\���_�8���a����F�� ��:�5�f�0XR
o��'��+z��'{��_*�1666��
G*�FggÀ�y[]��U�7c1�J$`�V�O �J��.z�wk���J��L&�1�����oÞ=���J�]�:������و�1�1g�uZZZs�i����qd���]��p�����%Ĉ�䏂բ6����Z��'@��>�)�~�Z��
J��@��(��D���k�Fē������0i�+��j�/�>�z����{��oٶ�#��p�\� ��3N��mxO*�F[[{�����^/�TJ-c���C�L�i�󼽮�<��o��,
��)�0�
�<��F�.�R�}����ѡ�k玆^ʄ��N���1�:��K/�Ɲw܁�~�3�Y�A��I��i�\�:�@�6o�덯S͝�z�$���3��Sw{�0�)D��{�zZod�x�0�1����P���S���y=����ɯ��L��!�M̜�V�(�@�{!D`���@*�Fkk+�!���X��T��<�ČQ"��H��,�Z�{v���_*q�E����a�	�E�R���w��!�i�0LP�a��OAk
i��7�scWSSnV�Ŭ��0��r�E����eM������A�4<�d���a��M�?����?̶��,z޵���&�k��0.�9j}�`�`=#�t{{i�15�^v�֖a=D�Ik�9��r��Y#�GuU�@2�DSS3���}���^��>��|��Ѡ��\��T
Zk��='�p���/|�tw�ug	qk����l�B("��2\OG��{�D�׫��[�utt���؁�~.�	�CIy���V���B
$)zC�\�&Q�OY��0�
)(���k�628�3,�XVCC=�4�A�H5����<8�q��+�̖��&f���	��"m����qd2YAP�ɏ�O}�c�/~�s��^�2�	f���x�XJ�1��V��L&�t:�\
��q������ ���Q(���!��87�L�j<f,[[�qk�h��JF��N�
D��5n?�
�*��f���'���k�"������Z�XM�O7����f400۰�K.�Zk��z��zf΅j0�d� ض�T:"j���ӟ�Ĥ��=f�4$�I�����B���P(��#�9D�+
(�J����i��>#��2���"�x<~��[o�z�^5�1���I�,�K�N�1�9
-�#L�Fo'M�F��)�G_~_�zב�rx�l$(1�:�V�����-V�VFmD&�KU)��6{��"��-�rɥ��ID�̼Ik��Z�7��/��eY�'���*���3����>_k�R���0�dZ3|_m[�r�H�T��W�Ń<`�y1>>�W���Lg
���O=�d�Gq�������<�q��䤄I8�"�()�[�	ù{:�O���衈��Uf�EVJ6g���-��m� J�������@�Ͳ��}l���Æxa� lP���������Z��Zob�l�nnd�4.|
�@,f (��*�z����|jڿ����gfX�۶�̮����c��7��T*��+Vt��������)�~�)�Ar�40ЏB!˲�m;vlS��,7�ta�C��9��s4I�6����]��)�9nN��21�V����o��X�(��R�,�-�h�fx��==@@~)���Z��71s6�5s'$a$RJ��	���ڪ��!�>�=��?s?�V�X�aB)��G��?�eAJq�����������a9I�G�B?�I;f�ԘE��	� ‡��K�P͆�3���ţ�ܧ�ӯ&�I��N0p��u���ܙ��n�m��j麊�62�űԎCN���c�s��Ym�$�)̓o�%�/��RH)M�qz�֛��Y!�aL2u͟�q8Cl�Z��s]_�����X!���Xgf�W*����
.��2$�IHi�
 ]*�������j
-Z��x<�i��Ѓ�֭��h��T��啺���4cxI�k�9���K =��	��ps�0ԟR��w��Hfb�Z�����`Ļ�DT�a�/��=�x.4���y�g���aV��^��&�u61�iة6?�!��g�>��/?�&�� ˆ�ڏ>��{�.]�~鋟G<���=��D�Rf�m�M��L]�N���d2�W��|\tɥX�l9<�+8���fj��h��0��Ɩ��n��k��-I!���5�&�V���F�z��g�g�x���?xX���1��nB�4��uU�o$P�;��
;T�@�j�m&�I��"���<��f���K`�Y�Tz�R��,�F<G=$�@ĵ��`�UE�>[��cf|�+_zƿ��k�a�*�3�>��m�eu
!N�}�b�a����Ǔ �hvX�|9�>�\}̱0C;N��r������ߘ�5W?���h�f
�A��c|ŝ�������$�7�S�M�]-cw�G����̀�Zxj`'���S�|�N�	I�J���U���@�%�dT�
��XD�1��`�0� ��b}U�.;�W�y;ҋ�o�����x�D��p���9���+���s�ֺO�3j�:��q�2s���t]�)nP��R���T!�D���
���>C
F�&�I�9�D�v��hjj�Rj�X,~�P�*�H��f�`�9��'�^��ߐ��Vo�0�P9+�I��nB��@=��� 
��}�T���)����jFRZ�rẒ�ndF|i<����H����b��@3�m��\�h=xL*=+�_t񥐦iJ���6i�\̶�N�!ed�7.|	��Z�B)f���z��}�m?��?�Ra�b�x���`�\��W���6�<
�Y*�����m~B�7hɒ%x�:����#�ΨJ�rg!��`�޽�R)Wv�����w{�k�?�&!��0�U��e���1?�5L��`e"
[��L�(V�e��亂�0��J�ڒ�6�/O�pLH��ߜ{�;(f�$6[R�w�?�ǟ�Ӄ�3�ŗ\�4�b����&�u.n��f��F�HO�Ӯ�\.C�>�DD���X�_�a���/2��Z�oV�:����o��m��Monp3�\*N���H@� ��	�z��x՟�K�-�Vj�X*}xlt�W�^��B���s��KJ��1�8�?�-Ο6�����/�}�ĵћ���ab�S�DX���@-�Qь���w�͈K#�_)^[R�F�+a	�)f0<��eh�M!6DŽ\���Z�[�݌�ᢋ/����OL�x�����T*�\S3d�Wh��T*U
��RnB�j�����o�jB�hXkW�0r��죄�|�C�R�EL���mm�8������)��V*wT��c��{�[����~�ջ՞�8���
�}�'R��xK���"��0�mh�3���7��nFL����+i���4���?�:�[-A1�Ab�Er��z���#����.��aX����q6)�r�d
---0M���Y��J����} �*��}���/�hjj�0s�Y?��z�=\z�Q~�K��Z�:p=oZ�+@�'8��5x�/EWW�փ�r��������Kf���̧�o�����:4Ň��W���������œ���&B�F0o����n�%Dr�Z'��Dk�S̞H��*vWB���bxkav=�.��bH)����^�q��Z������k�Ó]��J����Q��A�UJ٫|�w���<&��������_�\1�Q>`8*�r�`�$RJ�����O�Q�
˲��8�*��{��V���D�/��w|����p��8<��x�w����ݢ���"L�a`�g����LL!���%�o����'�0P��R	�*vU���l�ٖr��z�m�ّ�\�4�����j����L�0M� ��H�X,a��x���0z|������2.�r	Z�af�ݕW]�T�L5	!N�Z�Z	�B��`YV�^���h�������8��s~;t`؟.��p�yW��
�G��0�!~c~�T0�2��dO��7��7gZ`�H��\����r�ըa�Bl�Kc��y������|�;.D,3����:��I+���r���e�i}!�bC�����0���6ﻇml
�i���}�A�u�/1Zs���|߇�8�Oc���YU*�|�cz��Ձ�|�_�?����<b�Ǽ�K3Cs]�G��6�jՠ��d[��D��N7�4�ā)�_����}�(�k�[ŎrD~�Ŗ�:W��D�t&c�����V���R�\.���E�,���"jn�|>���~����q��x"qX�Gk�Z�)���J%���:�w���o�v�v�u��Z�w]���'?����G�4b�=�����JPM.���p��K�Ax_�� ͯj�/@1sL[��\�i5xAi|V��_�L&c����:��&�u����/��MR��������`Z�V+�V�}M���W�|X��K_�<Lj;n�1s�>����)l���Gh�?b�A�� TC@mG
a��=�<o
H~'��(�����x
dž���_�i~K[�\�h5x�,�i����{�!�[ZZ�d�Ґ�@c@	3cll{v�
�o�[c��S.���;:���sE��e�a��%�7�@�����'g�#�d����������y���n�i�JUK�U��D������GD��:�7'
s]U����Y]���q!��ٿo�R��~���K�-���m������Q��ێj�
)�֘m����K�1�57P�4y�!�������2s�L�#$�(M$��RY��?�?����:��6ė��
b
�9,��N����nƫ�g^��\�T*e����[)�7���kmm���+�
���vxxO<�8��2��[m���OL�9�D|���-�DU؏r�p�hX+�"sH�$|��H�Gj�7�@�A�gC���g`N{h~/ӂ�4��N�ZG����SX�HO��lU��۳c��__V��K�|��3��.��D��߿��\.oRJ���۱|�JX����<��#p�d�D"�;>>��7�	�\�{��1�;��Ft͵?�S�Ǒs}�E�A���DjX՞��%a�2 �dZFrĩ\[Uj#���$V�IH�X#"WgM�KcsB���
^��7�~��_Å]۶��������;ڱr�*XV,N�@���mQ�T�t:�;1��կnz�B����b����ϩ�]�d3=�8"&P8�>P��	�d�k�u�
"������VX�H�y�k�6(��N`yC<��AP�%��k0[Rn�Kc�b=xa9?k��b1k����\.o�</��ގU����kS�v� B�~l��^�ض�5���V+���o�;�Q%�Z��:���V�%!��g;L8b&�b�SX��u��[@�J�2��z��V�B$'<�F�N����7B�4�-!7��ؠ�g���K`Y�580j~/��сU��B,h��v���{���=w߅J��L&�5���[�T�n���#:~τF�>i�z�	� ?�/��ܠuB��nP�lq�5I��?̵A%�{���w�l,��!L�#=�9�S-��_l���A��wx/��b��i��=�����x�ٳw�y�!�[ZZz˥��o�zG��5�%��O�#2ypĺ�I#@D05&���׭�y�����w+���!�Ͻ��z#����c�ڂw�m�s��Z�=rsL�
�9�7X�e��#�wfO����nx��]���P*���涶���
������O��p�eW�0(��AQ߃=��=�]c>3�Xד#�@@�%���
��(�
�@��\�k��"I���N?εC�%߻�c��@�V+�Θ
"@����a��j%"�[ω�o{��m�^[�T6i���Ϳ�4�_�=�w�[oA>�G*������31>>o����_*�VYb���`��'
�c�/��?R���U~�҅�g[DQ��l�4(��2e���YA�~�/2;��H�I��=�#�l$Q����<�(��f�ʼDq����ߩ��?&�u���I�g�Ysdddm����ֆ+�ޞI�'��ݻq�-�G>�G:������322ܷrժ���1�H�R&���\���`�+U�RJ�0�������N�
��F\���Եi!��ek�UxZ1	0l!���)��nh�B�4!�^"������q�
�����u��sfP�62�t���(rx�*4��\�oDž�d��@-����u���/x��?��n�����;��S��o����|��`vMp7�y�!!��D�X���k�mx^�����n�
a�{���؜�zI�=�x�8�=�bmA�I!�'��W ��m)���k�ו��lI���ǹvB&�J]��7
�x�0�>���otuj0�|Ca�K�-���|փ�Mfy�!�N����oi��e��=S��w�[��B��\.����������s΍��D"I$2�f���3�u]�G���ٶ��L&�Y)�	G�^M\p��r��M~�ڍ�]ˑ��(�׬�ߍ�
Gk�r�0�V���-y��%�A�d����(^3�3h��B'`9�����Ղ��4��AC��'W�0���Z?��#A�=�E��L.i��4���Y]�;.��d��ug3�[Z�di=���X0سg�V�Ś�߻wo�����
��x}43wh�k���/8�� xo}}}8p`̜�,��T*��7��o/O�R��8��s�5��}1l"����m�ﴐ�D�n��G�T)GG_�<>u�g\ʨ+�>b����0I#@K��i���4u@B$\���a7Ƥ4�6L�!�Y�mX43�Q�3�$�9&�z���";�?�y�(�adx��u�M�u���	�/�iZ�O5��}{qםw�ޞ��{�.������'<���K�d�%���Ӂ��T�ؽk�?�$
��8*O|������'K)�o���$��A�k_�Ģ%�u}���I�V��8���[E=�Nz J$�DP&	�Ɣ7Z
�%�&p.�fA�����6u��>�똱��xBJ$eؓ�&�u�_T>ƃ�7��
��5�^q`�m���h��.�55�{��IfO#��߇{��r	�l��������#��l!�b�"PXw(�����–Jƣ�<�={vC+e�b��K�3?8�ܗ�vvvg��3��[�v�s��Y��ݱeֆ-�%�x�Et��]�
.�c�s��=����f�r�������w,���~��_4w�7��tJ�b$0c��M BRi��FA��$a���4��k��U����Ab�!h����߭^�vό�뢋/�i�V>�J�0�4�`���/$�@�~ܿ�>T*d2ٛZ[[{����m�oN��
�����c��h��f�hs��2�1�c����55�6
�cV,��}��}�X,n���7����_�L��T|™��%���&)������]�1�6q�n�iF�����43,!`e1F4�6�o�-$l!W�C@	�D̘A�ş5�gƵ �H@�$��{,܇���	��+�$�lZ����GfM~�0�B�����d����ġJz�D�RE&�������z^�m��2�� *|�ADK��RϜ�4U@����߇��O=�<ߋٱ�S��N>�䫚[��׿�?f}�3��ж�<W<2��i���t�������0�ϩi}�1��Þ���Ii�"�y�Ǽ=���(iu�53��
��;�I��x#qAA�(g7Zl��km��$�Ymx�M���|�ŗ�*�J=��ob�\:�Fk[;��f��1t�@�\E:�ޚ�e{���:�b{��.�4ғ��ZC5x�f��{�Xƒ܏���	hkk_n��,�:�\)�\xG:�Q3�1�@��,e:%�U	!�((E����������y^�Q��+������6u��q��� �<a��ij	�ys'��k	�(��QC�Z	p�����p�F��5?6x`���/��[�J�W���̜K�Rhim�Ulk3cxxO>�8�A2���������~��A~ ����/���"���*���C�w:3)zJ)�]�v�7��5z�A8N5���g2�-�Vu�7����Y;�k���Z�5��'<��{-�F�����̓��a!hB�c������~�R�D�[�\��y�3�@��4!��DQ��q�/ru(A�t�gI�Y�6�i֝Y�r����d�V�QU����4F�u�H&�fs��u��x�/fu
s�K.�$�l Hu��>��!�;����n��V���(��0M�۴�ӷo��35g$6ҏ��!�����"��v�<�M��<и�i߄4�<�;txrZH$H��D�^0[Hڟ��܉`���dh���tH���t]TX���XmD@4�\
�Y֪�'W<G6���"�I����������Ƿf���q�n���fu
s�p��D�33����!�_��봰i���G�Z3��Je�?�Q|~�E}g�.&½.�p�0�lX[8LxL��p��6̨��	��-�`��6�^&����Z!�m������
�0I\'�6
 �3��*��G�m�!�E��#`��/��2�az����7���8��LXv�����8�����`Y��d2�S�V�Z��fu
s��.�m� ��E)�9"s����4cŵ�Rf����\Z�q�{���hf,�<O�N��#B�����^��L}�h
	"4�@�{�i�ޏ[��ӭ��%�"������/[���D\�뤠�w�FU�Es6����'�:"ζ�ŗ\!��y^oD�X,�d2�@��n�	�߿��ò���x��q�����y��l�̨T*9���1��Z� !��<k�/��ށX,��;22��3����D�Te��t[vC���jȓw{ܢ��HK�|�ۣ�&�DN�K�p�Q��D"SO�#���
�u".�uf���Z��|�(�!��
����:
�6��K/���J�� k�l;ސ�:�IP(080�a��V۶{������׾��Y]�\#�H�b�2sP�:��52O������
t(��#"tvu�R��:������_�l������(7RҘd�O6w&�<D�if�����P�]�G���8%D'D�֨h>�{L�jIF�@7�v�c�HHy�A��@�RȇBS[o4�I1)!����:A4�l�xLEԄ��#��>��$�}����R������5Vl[�dɌ:��'\r��V��
D�
c�:��	B��J����
��yؿ������g%�|��tY��͆5��z<�4j2��;�E���\;RB�$:[�be��� *4V��I#+�����։���Y$6
B��|�{^h�O��D9�D��^�}�1��eW��,"
�O��aY�<I�3U�GGF���a[c��Su��U�W�=�aw���5@X�0�z�����r}
�S4��	G.�C:���y|�}pttv�f%|�UJ{�W����@����O�� �K;��{E2��H?�L;�J��!��:����	�t2-��,	��}�����{�-$��A�6k���	�l�K/�,"�Bl"�A��
j�A�W�As
�5øɊ�z�j���N��?����%.���H��`yd�D���1z���и����^�0�����]X���DzK��<瞸�Ȳ��0��J��6���Q���_�4��&���R���
	�y�AX�F���Zj"YC�]���J�Zb#�1���^e���+�[ӆXq@~�h�	��W��\z�`f�0���97����=f\7hK���!�M�a�:�����x�i����/0M��-B�5��l����1j|=��H�(J�R-���V�?��g��^q鬮{�p{|��c.tZ�̛[��`TC!p�u\�ె�u����5�L�p�U���16LP��J�E�EY���V��0�����V�h#�Q�Ő���_��	�a"g� +�͚y� <��@��c֖i�=D���s:�;9��n�x��J�~��R�^f���?�r�h87��8�Q�O���@�.Ф�1���L��LCt����hoo�ֺ�������@�Wvw��5A'�R$�6#@�	��h���+����3��Tv��c���n�Z��g'2�I@�/\D��`I!l�� >�V��T���nq�Z�#cXh6-�}��
�! ��Y}��.��ڊ�b5�/�vD�^j�`��V��̐Rn%!z���p�%�B��Dt	���/O5��[��xط�H��u���a@H	)D�VHÀ繻
��S�Ba��>kVx�X��6�UzL����"@�M��D"#���fI�e
�V@;��2�U�?�s�ubw�/�Iv�C��d������@���obf1�V��)Am�6Y�#G@ΰ�fZ "��7��$�+<7�۶�+����Y�u�8N����k��R�f!����ۿ���'\r��(��J�.$������Ʊ��D��r�d������o\�VD��'�(��!�����j��̿�#��W���;�xL*(8�=�N;	
)�tR<a�@��0�Xȕ���L��L�E����ZȄ��J8��~������w��MAu�Yo��7$f���_���D"�+��Č��TP)���va�U?e6��L���z���[���������ID� H|��>6xߢ1��bH$�P�<�g�5y�4�~����R��)�W�Qe�1!D����_H���"���|>���ut.U�����#R�c������QS;2�@^�gI�tQ��(�6x���0�;���\`k�U�8��j6c�l�@�oq�7�D/�%���Y��d2�VJ�	�l�RF1�z����}�n
� �
�}_���7�.��
h�m!�"��i$4!�N�0h�n-�W|���X�j%۟�;��a�t!m1L<\-�L�K%H���n�����T��\��V��}��V�bq�$X1oqX�3�����{%�ժ�L�֚��I��T*�����S�n%��	1o��9#�������_�j0{��)fYH&�`�R��--��]��}�������I)�]&��c��<�YO�ݕ"*ʇ��uAd�P���f�Xb' A��H�=�gV�Ի�J�J%�����0�Mg�"����>�4x3�޸���
�D}��,�7���UD�/D�RJM��#��t&�JԷ:�s��s^�eި$\�K����1����Vc�u������c���A�}�*�u��@��ހ�--���emBd��"FG��6x�{��X��@����^P�M�m �S�s{N�m��?J��6�͍���*�C~�ڍv!-���5�{���d�G)7�I�(ݱ8VƓ0)��W�^'9��:���޵W�R)�mm���I���804t���4��dl�Vf�R�i��dc{��%�^���.!�
�B�n�L�H��d��RBk�ǩ��X,�_��\��!����K�x�U���_���	�Q��";�Չ4LA�1o.k�>!��c��4����ޫP.W�:�Enb|5w��͜X,�d*5x�ʬ{��V�/(�ɥ������&����Ӛ>Sf�d2�x<fT�T<�(�ק?9�_�<��a�Mb��5�C�1v�1�4�/\O��D�/i�>%��/�xG~�Q=�W�Z�Z���=���ư�>���G�����d�AV�M̺�4����1|���	
]	XJD�AD�&y}���)!
�a �Ɇ{"������w��<#�|���Nd���V/@[A�((@=�� �%RX��@q5$Z��Sv��:�����m"�����ݳ��I���L$��5A�R�&�t�i�}����Ѓ��V��KV�>"zx�7�'���L6˲�������L&����SÜ@�0pk�{I"q�A�A�
���np�3�V$�8!��A��7��ZoA�2�{V��ӳ��X��=�mo"���� v���ԤM���M��hii�J�[�R��!�>��O��v���⟉���3�?2}R�4}_}���u�Ν���L���a 'eS��)>3=
:JU�� pw�L�qR*��ysQ�
��3g��{z��u]����'n�7Qn``O=�$|߃���#�͜��vH)�V�W�R}�����z8;.��rh�M)�U����<o��7�Ս��i����R��*��=��׿6���9_�A�܋$Ѳ�Vv�6&�V'�8-�C�;̛Jm�
̖�k����[��]��D�z!e����>�0��2��w5�n��,:;�`�&�V[}��5���H�(�AJ����CDq��n��o<r�,˂�>��_<��|�3���t�T��v��'!-ĩH�\���E���
�L�t�\eޜWj�M4p�,��UנZ���]]��dj�!ev���x�P*k1�Z�ڏ��5�{ѢF�������\����1��D����J)��;-�k�G�Np����ݻkG����4-�T�
x���������E`u�If��t���ZoWj�-h��Y���uP�V�E���M&�����ݻw�{�>���oL�hnnƒ�K`�&�R[=��1M�����\��p��B�m$��8����Ǟ硐/Db�[�t�	�lv��ִ�S�b�Mt��nu����4݄	�0o�j]R���f��Y�����7-Z�6�Ln���ݵs��
���$U��lim�+`�VH~�'��J��\���.��
�x��}B��ɯ�Av���PȣZ�BJ��4��?��c���_9�9[����D����hѨ�aԯ��	��S��n�)���2��u)!���9��yͺwb��<���z��&!D��'��m���J�aֲ��"iM�W�4-x���q�ێ����_��m�f�7��-hoo���B�w�D�}��!�Ϡ�����cH$0M�-Gu��x`���T���dX����4�J@y�*0�o	�e���*]Z�Y�����qk����M�ad�z�	����D���V>Z+tww�c����|��8=�T����/��mmm�Z��R~Yq%�</�d�J~=���,`fL���Z��0�Rˊ���'=�W�ם�9��S��M���u�8p6�����a��9xwyv&�5�މ��c�;�7��l2#��c��W[o������d�2≈�b�<ok�Z�I�S}�v�xA�7�����!����u��A�
*;ל� �T�33\������2߲z��'���ʓ0g`��	��j�!�
AӒ}�4��[gQ���k6`dd�:���z3!�y�a�x��166.x��gf�X���r*l;��V*��t:���[�|��2^�޵W�-�a\'���8EkF�R��T�uqֈ>�5}�s�FG�Ώ��4����G�k��z��~
s��U�"�Ob�[=� j����	��A�o��ঁ=���f�w��z=��Ƭc�=�'��l�R�|���?A�P�iZ!�	D���իq��^�X,�qn�T*��\S���q�]w��pv���P���ƻ�ğ���<��O�y(�7�jCC�H��0M�-Gs̷���f- ��&���R6�L�cDk���������?���!W���g�7�^y
��u��G�dB�?p�6���?���x���M��f�	x�YgÎ���M�r�7�L��ۿ����.�~����*��0�k��B��p�J�ހ�qO���:�Ѹ�R�T�kjF"��(=���7����������|��b��xF�iaM"U#��R�-���w���{�^�R�d�>�I���`||,���񑒱�p���¶�p�����Zˊ�{�\�a��+���yI�_+��^z1�}T*x�;9��k��@����7p��ؿ�A`�[�:��o	)��,p��?j�@�a�I�5X)AX�a�ɿ�$<~`�>�w�ըT*֪ի'����>�@C���ʕ��W��T*
�����ba��3^��V�>�CtX��{%.��'����4�)�����,f6*�2
�|�ǯC-�4x����S͡蹈�J������C���a�Km�~���<,֭�ǹ�#o]�i�I�\��m�_��Q�o90{6�H̖�W^��r�Z�jUo&��~���&�v��C:��m��2�3�x���{va�����~k�/�����kָ�g-N?����<�0��R^+�8��8J�b�X��͞F����H?yp �DgG'����ܯM����?��8�~�7�v�$?ʊ�4N�|=��kfI���^���1�c��2��\oF摇���~�[?����2�FfY/^�SO;Gu�|�\��tg��8?|2����å�]���1���vK)�B����&����uP�T�n���5Voh�栧��s&���{)�_�
��8�y����Ҋj��ѻ�럏=n���G?4gcv�g�t3�$N��A��ZoQ���s ?��%g�fKK�[�X�,!���'�}�Sx�ڑ�`��y��ч}�7�Nɸ�6-�|�4�*�ΜhY1>��3&z���|�c�z�Ϗ�N�+�{-6l�%���e���d���^�0.BÌ��EyK�R=���=0yѫ���Q��Z�~Z�����G�U*UH)ѽh������n����:
�<�mN���'[:�Ϗ�����K1x�s ?�uם8��?S����b�q!�i�mm�c�>��cp`�^�,D��T%���عs'���
�Z��)�H�L�:�4�7���<��˅�8��S�O<�X��i����ۏL��[��t��^����z��X�"Ӵ�%�|���|!D��Z��
��ď��y4�G"�@Gg��[`Y1(U���o\L�H4�dsH��=��X�X,�՚������w����#2nSqDM���ݸ�R��e��j�F�UR�cf��W]����EݯI�R�,+v�纸��m�z�/��?��#��
crQ��42�\K�.ò�����T�+�*�v(�T)u��U*��B�]�w�����Ԍ[o�eV�e���T���݋��Yq���J�_.�8��AIf��A�r�RA�Z�%�7�kĔ�SM)%�������0!��{������0J�b�����&Pp߇��d�8�s�h����W,�{�;�U7���?�L\.Q�ek7bD�6i��g�����>��p�U��W�9��U�T�݉D�o�����~����ƽ�܃J�^���B`��"\'���҂E����--��0	�Ufޯ����^!�D�U�T
���p2��J�Ҥ�A�
ӴP(�[�֭B�V�0SR�V�OB�Bt0�*!(	�����8�V+�V*p]ܰo�H���S�ODH&�hmmC2����ֿ4M�
�!�B؞�all�����	Y#�'�U#2��9��X�x1���W}��߰n�;�O�]2���;�����y-��7�ͮ�;�񟡔�lko����g+;�}<��#��o��ۡ�¼Q}���b!�(x-�!�ɢ��-��hnnA*�

c	QX�k�+�\�'�q���}�々�@�D$��f��(ND��QR��8�:U8U�_�К�Q�t��������\SX�S�}�3�J勉Dr�R�4��kLӺ�0��"A�޽{06:
�䰒h��dq�/��P�
�������k�c�s����H�w�U��
?����w��d������+�v߽���?`��}�Z�B`��թ��i$Ú�B��v�D�t�l�D�d �i@	�h�I�Q�l�+߇����2��BM��Mw��o�&r���[`�6������>r��]�dB}��Dž]�e˖cdd�)O�Ʋ�KL�<Ka;�����صs'FFFj�	@&�Ź/{/Y
��
������ʫ��3��/x�p�u�B�P�utt��H&����B�FGGp�=��;n���P�aF�ܓ�a3Y=��T��iZ�,��y�0X���i�0��̵���k�R���M%����i��fshjnF"���z���T���K)'��q��x�?�Ux���d]����
��݋��?�CCp]�l/{�+�xɒ��������л��y��D��'>������L�-v<�cY�	Dd�����������@��T�<�I�A��� D�:�@��&QUi�nI?�Ɵ����hni	�O����תU��<�Оŋ��3�z�ވwn|~��M�T�5�X�+�J���;w`�=8ᤓ�����_�Ӌ/|�ssM�������o�{w�s_��E�L�Ͷm_`Y։Bcb|7��g��?�̡:��ڂ��j���Q�k��`��Šn#Ah,���������$􇍻Y)�K)���*�J�I)��?����K�|)~���p��lJ����z-�:Ua�ʇi��}�F�K/�b��I��hй��?�={w���5���{�jko�9���hu&�i�#��}>��{��赃=+�k��_�q��ͯ6��
�(�,zMOZD�=��ȄjiiAKK+��<���T�%��oQJ
~���{�{��w�^|�}��d�ꭷ���E���$D�i��J��/��yQw*�O
@��{��AGGW�3��ɻ_��W,�'g�޵���C���z�c�"S;"�$�-@�>7�Yt��pV��g>��hjnF6���:?ڽk�;�_����Y*y�a

!�͖n�z�}+V��	�S�~�K����oxӛ1_�B�ye�����vT<֟��GG��lP��
C��y)��)�H���=����	tx�n��͡�^P�Vd�H��>�Ѱ��6��=k�8�x�
����R����
sA(��/}	�Tj'�q�	׭W�4/j��u-,&_��ħ[_���$"�O] �@�R����"yR)��u)d�薢���]{�\������>�����6M�aBȃS%�5���>�I�,xum��5���
'�t243�j�B��'� h�'�S�$l��޽�R���1P�~�kr��4A �1��??����bAB�E���d�i�R��]�I4�ԉ���i���)��Vk���_+!X[/ (A^�2Q�Tڴ�۠����
N��JO��_8�0��7�|����}D��Y�!���c=!\4?xLD8��q�	'Bk]�}��R���Nf�n""�|�
��R ����`6����+W��g����R���H�ff�f0�Y;����� !�N���̎a���� �<�m����u�9��b(��?迼Z�V��MR
�4�5�-�,@��|�w��x<a657͎�o:��02|�|~ZS��0M
)$@�5k�,��'� !�Ҁ `ϐ24/��{B,+���:݋�u��J��koo/<��#��w���"�.��R�.i��J�4
�����{��C�����q?�6L���y����1��|߇�1�J�i������������V���_�����'���<{W�W��e����?��8��	ܣ�9�݋�yޤ#��z�yt?���y���Mh�P���"r��B ���mmm��?5�����&�ǿ���>����>���!��}�4����N?�ED��B���Cc7Ӳ@B����,��`a��҂ֶ��R�Q�0���2��K)񲗿K�.��;���.Z�8��#�������5Q.�?�+����'�rJX��5�w�#��
�d�j�TyaPÂ�K�(fVDÜ��xܚ���|v+��'�����۷��������chp?���o�V��"���NƲe��y��>��,Lӄa�D|(�cX���P��q`h���3!ISS^��@2�D�Z���������~乗���G?�׾��<1>��uoJ&�8�g#�H�u݃���`GY)��ֶJgg�\������<N��Zk�<H)�W���+V�uݽ�B�#�]�����vm���o���=\,����˖/�/z1�֓��x�Yd��0{�돍�r�T���7X��J�#ì|�@D8��S��]]݈�b�|�qǭ��/=��������~���yǭؿon���9��"R/z�b�Jx�;�a$Z+$I,[�˗���Y9�*|ߟ��7X���}�bA+��̌U�VcŊ�(
��ߏ=�wc���048���(���f�?{5�����M�##_�뷼E���}������&����\̲^��d�?�Wa�=��m����݋�b�Jt/Z���֚k�&��Ǵ4�OG�O‚��<�v������M�:�0�����\n�}�qk��<���a���ع�-�-X�j<��[,����u������5�oӿ��#*��
�<~��U�/�+�׷G�>
��,EGg'��d7�]��}���J���ju��w3��\����ɔ�g��c��D�wt,nim[��~�mۧ�)�iv!,�m����{?�������<����f=��^��M�R���@З��}������Ճ��s�m��cO����W^r)��v�\�‚<\y�5p]7��־<�g��M�:Eq��{���f���]��#r=��o��Ngkk��X�E������Ri�222�cp��?�H�|��oX���K.�y睇;���s��T��h��^��#z�p�;o��ˏ8p`����g��,`X���,`X���,`X���,`X���,`X���,���}f��%tEXtdate:create2022-01-05T19:34:08+00:006��%tEXtdate:modify2022-01-05T19:34:08+00:00GV)WzTXtRaw profile type iptcx���qV((�O��I�R#.c#K� D�4�d#�T ��������ˀH�J.�t�B5�IEND�B`�installer/dup-installer/assets/font-awesome/webfonts/fa-solid-900.woff000064400000273764151336065400021776 0ustar00wOFFw�
�tIyXFFTM0�qqGDEFL*�OS/2lO`C��cmap�?
A6Mgasp���glyfErz�� �#headMx56��hheaM� $ChmtxM�,�0u�locaQ�	w�.�maxp[t �name[�%I�2�post]�N-_�zƱx�c```d�	�9`�c�U(}G/��x�c`a�������Ø�����2H2�0001�23�����04|`���x�=�3!
@5`�V�K��#v'-x���kp���'!1�=gϫHJS@먵��
x�2� H
�:��S��R� *� P
� 	��r��4҄�D@�B��Rv��g�%���;�8�~�_���Μ��p��o��8-�oN;'¿��(���Q-�;N�Hǹ�/"E�࢕h-ڊv"^��D�H��"]L��b�X ��r�+
�Q+��q\��7$�\�!��x�Qv���_��eO�O>#�9L��W�t9KfɅr�\"���In��r����e�l�g�%i�
�bSmT���zL�PϪ��~�&�Ij����W�R�\�R��P�TŪDU�Zu@ի3Ꜻ�.+����n��.���nw7�Mq��#�i�j����V�{�w�{�=�q/�M�u�Yߦ�Q��~\?�{�>��~Z�׃t��u�Nѯ�:M����qz�~GO�3�=O���z�ު�t�.��R����QݨOy-��2/�[�m��y;������z�C^�W�5z'���9�o�	�V�����`��n�I���3��@�+3Լ`�L�i���M�3Ό7M�y�d��f����5k�:��|l�M�)7��S��|f�0���`N��漹l�i2׬c�r����x��>h;ۧlo����m�}�&�W�h��}�N�6�β��E6���<��n����[n+l�������[g��K��Uֳ�~�	�wl|(ع��q�#�D����B�:�>b��.��e��E�X)6�r�O�ݝ�A�H���w�^�'�Ȯ��|J���
����,��ir�\v�-7����\ք������.��bU��[uP]Uw�[
VC}wTC���-S9j��v�KU�}��MwRy!w�nː�nnR�]��������_ܽ��{M���M�St���������$��wwP7蓺ɋ��*o���+�2�ګ��5|�ݵo���{�w�����(3�����d�]���������w��ɐ�KF|��4[滻+����>q���lj��X�n���]�]V��
��*��n���N�]�������oq$�]k�݃_��D"5�
�F_�U���%I���%�@�����H�t���}B{��vSUP)S���6�&�;�F����:ʧմ�VR��ʤt�L�h"M��i4�F�h8���H����@OS?�K}�=J]�z�~F?��Ԟ�$Nȯ�k����K~���'�q���a~�ʫ�n^�+x/��c��o�9|1��_�oy���#��1<�G�A���cx��s܋�0��j\�y��9��q).�Ř���=��s�/8g���8�`:N�I8�p�`2���0	��s8�3��Ŏ��c<���=x7��6����?�bFC��ih�:85P
�P��(�B��`�X���@�B��e�
Kaِ̅	�a*�
��`,��4xF�o`$��TH�a�/@"<��Y�=�t�_@gx�{�-�]@�C4�`M�*s�E�%;�αӬ�c��A���`��^��U�ݬ�U�]����RV�6���z��ְ�,�-a��=6���M�f����}'�6�&����D~�����!��He���x���	�Gy(��W�5==�=�s��;�޳;;3�k5Z]+��
$[G^۲%l���c��d��%8`�
�#�@X;��	��	����8yɋ�/1��WU�s�J��v����뮯���C�~qn���*�r‘�t4⌢\m��	�J�z5;E���ِ��U��������۾��%�~����8ȋCOr)�9W��W�ݚi�C3�B=�s�����`���@+��d�P/�_��̃d�l����y�rq.�q��Drn� 9O�&��P@q�>S���9�)��#xv�;�|��1Kÿ�a߾�I���F���ŝ�-�b����j�{��^@sa��WJ�Q���BOOʣ�k	��Qyr�Ƣ�oD���}JӞ���WK�SR�/���O�ǹ�S��I^nT�DX.nEг[Բ��~�0o���[���Lù}&�7�ͣ�ۮ�c���?j�(�g���s�Kr�k����ȑ��t
��tEh���KSNk�I]��/ʯ���xic�I���ƥ�E�UY�h���6q��WrWq7r�so��m��!E��(�=��k!RZ�ل������ӱ�~�<iܗ�-zN3MM1�Fk��&�Z��Y�SF���:	�M�uZ3�p����b'�&Mt��}r�0���Q�]k�r��t�s�r�Ч[��l��t��@z�W������WIC���h1�	*�cъ��O��z��ub�ط��*�<�
���-�gG:U$Uqu�#��j���I��ډ�>(���}��Ԯ#u�X��'~p2�茈ɏڋ���S���c;N�[�ꠓ��G�_@!����$U=�I�	�c�]�+�{���5s�RXu\�������O�{f�y��xPs��w�_��M�n�<�AI�G<�O43�y�\�w>�nz���V��G���<։e{���o�hu�8��K� �4�����QN�U"���Q��8�������
���9.��F7sy���L!���}���F��z䈚Т*y��W�L��/%��*A�O��n���(��`��x�-�T�H���4��F~��O�laG�#�'O �+�1�~��v;O���]uԹ7�Ց�����.\�Dž�s�����P�an�Ya��s�9s�n�Q�BĉV�뵙bimEs�.�:U����[�'&2jD�D[�vͮ��e�(ZR�*Sː�zG��-Ge��Es�,�)%,�Rd���.�Ia%�Jϒ�gي���0Ǡ����5��W_���l/�6^$�,VU\!�bۇ*m��u|+*^%Op�T�D�ପ�u�~���eXf�
�{��[�Gg�׸���?a."cn��(�ȳ�Iq�a0�ATo�fuZu�Ӎ|�X��
����&sj���#�\	� ��7�y�P;od�G��Zm�qט�x��)Í�x��J��P(N_K�5�51�ϏO�<�M�����3M�D�vnN�-J�Sfv��r��9�S� B͇�(&*�c*>�U�4I��P�$	�"�� �b\_0s�WaiV�h��z����addM�OA2aP��'i�|�����#a,���Zʹ�`M<x`�a���,E�N�m��}����}hJ�UmCB��G⾅Ւ�'��S	,:����N��rt�Q���f����"xÆvb'
���J�.CG���r�����Q�߂á'u���?
�w)�5�$��w��|Z�Z�1�g7���*O�|��52D��X�i�Ё�kόI�"��Ӓ"UdE�+ࡸ�*�Qn�����W��	$�S��Fq���V�D�`U�{>�ˡ��>$[�C�8d�i�*d�?0	N=��w�aXQ���#qH��Y�N� i��
��H�����M��(�<��.��OvYW�U�ڨ��YPRnF��ʭ�|c�D��i�!(�=A�#�&���fs��R��S<�����w�q'`k�	�$�$A��BG�%x�~F��S����.�s���S��S��W8�u��5yN��I���F��tC"�I!���+d�h
Z�w	Ԥ�
&�Y-�i�q1y�\�%31׃ҕ�}���Uչ�LX�̇~�UPɯ�0L/}�ͤ�0�&
����.F �F\�I�p��í��*m��F[bt%���]x���sn+�6����hs޼����.%r?z��D��j}:纽�wS$�/��7�ZC�h�=]�G�N{���IK�B?X#�:Pj5�8ĝ��O9�+�bqd�ș��J��,l�⊭鑑���
]��C�<���.��O��Ww��u`7������`�ܴu�Xbn��,�s1�����c��28�iHλ�)���@,�P:��f�)������5A�Cr�^[zf�$�@��<�)&�m�⪱����9;���xS��*JH��[M
(���7_��h`�8CJ����O�B��t:L��U�Yc`����
�a�N[�~���̖��/�=�^�6����],�	�c�3��̡�����H<QUR#ptGo��1\6$9dKƄ!�!�#(}��g��7�-�Wn�S���9@� 
6'�s���UD�w�ج8��f'�TQw��ê
P^���[5G���-}}����ᄏ$K�#E��-m:��Kzb�qYRT[6��&Ɔ�Ir��N�)�
�0]8n��a%�F9n�FJ�j�Q���|�X�a�!H��K�[]n.���"�d�2ͥf&gHL��
?xI�˙���r&��6ߤ��$�EV�I�-
�р��
U��aU
�Cj2�TɿD8&��p�D��rk�W�y����!.Nz�.7B����R�7�;��M��{˩T9��7��	�gR$�M#-{y�r��r�QJ	��̶I�h�hyO�b�i��D�O�H~���痢�.D|&�7�$��
F�aDf���C#�@_���w���,�uѪ**���gg�h��U�;r��Ah���mX����k�gM�&G�yu�q�������$��{J�ް�D�P�]9᷃��[Ҏ6lcF�b��hVЏ���j4>}�}5Y���V6P��@v@�P��R����i:&�
I@��H���8�,�lHh�������,�$%k����0>�߽���{p6���9h$�b �����!'urב]��gffP�u���1Y�TBf6�=�z���:,��{ag�(�q�?ΦS�.U��T�]'��&ޑ��C�{Dc���k�e^�2*�8��w��u��z�{�
�?:���P�7P�+P�w�w�5����Kż
�8��!Me�ӥd�IRN6K�/O�3C��\O�Mwܲs�;��gKc�u�Uf+�Ūa�
V�y01��?�s���=d�B�F�nJ�š$��JvU���[�J�oa����Ga>P��I�H|+,bx.c�L��PSR%�m�z��ⷣOp��nؓ�����P���%Q�1���
��JZ��y���"N�AcT�w���W*��,�z��x�s���5j͊GRK��9��E��=@g���ߠ�C?�W�Ț�׺�H�i:�
�z���KZ��{W�o���N<O��˝�/��n�=���!������]T�6R����X��)�f�9���m��'mLjb�h����e� ��}n��<�<��r�s73H��y�_�6��NQf	8�ӝJ��:�%�}O}�֩�9�<^��v��S�Է�^a��:�������5��k������9�W�~���<����We�+?{˩^^y?��<��g
�a��un���j�~���s�E�v~�Ӡ���t����������X�ĨU�x 	���z�����L'��a,a�yyCx��/\Z�`���̿��%��o�v��tg��o����Ҥ�4��7$��wj��/%���E��1l�GV.�	-�#�)�!���}f8�Gc~E���|
����AD~�쇏Md��ch�����U�V+-d��<����F�R���	�ƎL��?ے�����	!��[b8Q��Es�����x.Z:��z������j9� hh^��̣?~����<��q�����!k<-P���ߨO�S2�D�e�DzG�?��Yxܥ(Ҥj���S3W��;���0{x&�jB�$E�&�=�d�k�3c��� 4�V�ޠd
۴�]a�_(��ōBY�0����.#����>�1���^�,}~J+�\�@M���
�7W�[F���o���$�eY�0��0(�E�J��4�5��ǹ�I��,5�YE�u���`�|<z�0N>vZ�N8��7ظ�������ɣ'#?7�l<,<J�{��Q9:f}���8�U��o%���y�d�4�ʹ��7c�d����ڊ��Jw�������S�'��$�w�#�Xkŝ�F�ɬ�Ϙ�ZI�M_F��[>Ja���j)tNch�)�P���'q��q0R�W'Fg׮�nZi����a�0k
��u�_y}��]D}�	��b1ˎ�o�sH�[;���C�CJ�mi����Ϛp:��'zo�7�P{֑�>�S�gIh{Z�X=!WʯU�L�Mn��`<r�1OG��&�&Nu��jY��:�s?A�r�̲�n<N�L�	��(F�'
�'�o?����;I��*��QBQ�vr�����ˬ���x��-AC�ס:��4�4f��=�3��vEW��ow�w��i�Y��nC
��|����[�R�	�}D�цfo����w����u�6JO�+��y���_��z����if�>fQCp�㘎J���xL�]�ē�1���~��,��3��v4�x*�&c�o3x(3�g�{E.��U�i��
C�}�L,d��d1�U�M'�h��4�H�"@I5l#��O���[� ��=��v�
2#����5���&�N�
��!4�q��'1�a��m���{���E��@~���'0�J���jxb
i�by��Kk"\e�C
�62�+�Vi\�d`ɮ��4���v��ƶjÆ1�m���������L\R�=y�ϯ���|j��i�{����F
${�����3[���u��]dI/��ͤ����H`����׿/9B�I9u��.Y�t�c@�h������n�2	�RCa�O`O�e؞@��b݊�`�4�����֏�� ��t�2$��{�@�l
�f&Q["�(�l>�UvT�-����
��
��Q{�%b�:Ow����<B�GNZ���\��%*="43=�(���Ԏi7 F�|%=}��L�@<���Bz|�9j�J����p\E�����l/�ל�3*��_��0�QL�`O͝����O;������]�q�l��.��㽆�/�(t������c�zEB�
�u"k4�#���:��X��9��֙v�i�T�W�Xĵ�Ƽ���S�l�q�|�ͽi�;;B+dK?e2�T�{�?�y���)�jg	�U��LѼ�2��K6��
_�)��)N"v4
�&��,>O�hv�9�����T?R%ɖ�2��n"ᝊ1���ww^a���E�՜*�~W7M�w�m�K���I��5��@g���ݡ�`ަu�nM�RS�Ԕ��Q~�nD�'u����G3^��s��@fT�V�}�(�z��?K&'�䀟�G����1�-B��>�Y�A@�*�y��c��Pz"��H�h���,�
�a�ې놌P&��b�+0l�i�X�"]dh&34��r�Z��ȱ9*P9���Υ�f.�	;VcN�ꂋl������{�쫓5[��tI�4��i7)瓯�O,.N^�l�K�%U�(�M�7"�s�P�Ly����>�y�R�N�,e�LxmB$���槦�7�憞.$�E;1`ˑ��C���Ǧ/�$GΗl0��d��e��ȖBP�i}�C�<�h�ѹ	"��t:����
��A
X�:�EFz���^�"�/<����q�����D�rR����‹W�_Z�ϫ��f��,��P
jʱ�}vw�ë�?S�n��Ԥ�pӼ��U�<q*rrG1,�V�HU���K�G�Mfj3ÅW?4"����DWɂ#)���x��p��)����H����U��*°v�"T?1���%��KqY@_�<��!�>�9�a`p��� IЪ�
)~t�y���m:`T����
�k��H�Z�T2p֜5����*�Z��}�
�ky|�J/`�=���=�";l����I�ϧoy���+*?utT"�4�dA��ѣSI�8�J�A\i����n�
�qŐ7>*(��<mU��*PqY�U���~���1����|�^f<��Z��v���'��얾_>o�p�Z͔SaԵ��:D��4���<~D��	X2���P���yS�'��$j���m�@���l�hD�5�G�jD�dQOo��]�Z&���5�����E鵰I�cSZ_�	�dgQ7���oㆲe�G�� ���/"�Z��pl�08�x�-,6��,����7�V�]ċ��R��r�w�U��pd*�a�e>=@d�>ʙ�frB���*�c
�#Mu�#HI��CF$x,��rA��H�a�\r�o�K��<�ZF"�E	�K4t��ԅ�6m�mA�ᬙ������r���I�lSܒl�l������F[�!��bx0��ٞN��?_��u��U8�K�M�^XC���ZޓS���4�kK~����N�r��寨��3�,CPǭ�=Aܛ��"q��_���6����N�;���yzZ�&�����̨����>�s4
}�0o�v�2
�&/g���_��M��(G����4L�;���ͺ1ˊ�g&�.��`�2֙�?�i��RQ�{���&Y�m�x�������bByI&�w,z>�oك���	��ăN�f�`�N�9@���cqfaR�(E���6S���Q�}�싼w��K(%t1��-gc���:�CO,*�"@Q��Fb��mgW��Ӥ���V����
D��bv����t�$5�y��d;2�U5�	��=�;J������BO ��Ī|�,����>�Y~�
p�YjG�(�rN3*ֈ�̒��¸<$����!!3*��0�b�e��$P(��>	�9Eފ|�Y_t���	Y1�L�L��望�+{���bE��sTH*eX�d�_���M�*�'�JT0���Ź?�߂�����op�q��K4+}�ԥH6�zGʾ#[�Ս����藢s�"�v	탧D���{����N��^��9@�	��Fu鿠B<�HZ�T$E�-�"�-Y���$Ų.�6.��ͅ��
�ұ����>2ee9V����u�X�,@2�6'�1$F�(u�ի���
��i�����*XT��TE9 ���a=/�TS�3���τ4;Qj���S`�02��	i�R��B�Ax�,5+�����dE�鎥[�$�E+�����*0Ul�튐7�"�"��N�yX�6����_BM�0��X�p �G�7\��::A	!,��ςA�&F����ba���B����q@.D'7\�?ܺ7�Z<^�o�TW���l��2�>C)Bm�W��2U�m*Zm-�P]羣fQ���=�ߎZ���n[l�����=�Eh$^tM�$��C'5�R4F(��"��?��f�(Vx���
m��Ԩr8]g�S�%o�&2��'�p��aL�d��"Rԅuq
���aI�.�*s��J�`��5
Ɋh�(S;�j�����&��v�(��Ύ��Lt!� ��Dz�׊1�����O���2<n��5>�m9GO�b�k,����.>��F�E���lYO���(S<��R�̺�n�d�.E�W�B�5)�(}��~y�+0۞����K#�OQS.�ch������P�N�w��ӄ��lNU�Zi~��M㣁�蚘/�X���
&$��
Q;���
F�7m�5_� ���kb��,�f[�1v������]�s�(��:H����]�v��-�$��eLmzur��+��>!ګ���1[�`ss�ʍ�z�DX��*��ĉ���6Y��(�'ZKg@q��"n���q�O���i$�%,�j�n���O�a �%@���2J���y�;B'>�ϯI��A�ޯP�WQ��hz`=	��W]��.@+=2�>��g”_�hR*����e����]~�zˌo2ŚU��Ƃ<��U�N������:0��B�Z���Oq�/��z\�	�I�T�^Ú8a�P+kߥ�y��dU÷=�>��)��C���D^�5U>p�L��o#�S�`Aa�-b}іIC�O�=-es����Q���_�~o��WZ+xu[���`���J��a�f�>�vt��Dc؟~�`�7�qC���TM�#jJ�Zh#������G�]���,]=80%&`��(q>�,����������go��Z�Y�h�ʇj-��\Jj;pT{��(�ؾ���x~ŭ�y��ThS�l�iւC�6x�8A�w��7&4%�5,:�%���q5%Xs�#��m�����z��41I�M?qR�};9ٕUR����Õ<�L�VT��h��)fG}
ҡ��+�I?�P���#�S��	���Ê��	N"�I�o����������P"0�X&8$����` 0n�ƌ@"�62�e���]�����#�"U"��d�_��"l����c�);�۪�A�e� 8��y�y�$��F�#�d}ȯ����@C#6:`���
%
�B88H��	�c�;����wΓ����r��Q��ERT��<J��JX>Q\����;�wZ~hHr�B}�V��"��lX$Mz�qa|I��^_�5�ݮ�A
0�F�_2��k�hw4��>p��e����G��,��̷IR�RV@
��A5oa#j��t��L��/���x�U܋��*f�yZ�<���
x�����L����]�`4�S�_��/X�w&����e�J�6�G�W.����ھ�O�\\cL���=�J�N��W�w(t�R�N�S�,�)�s�8�ң�O6�����@�*�p��/�P�1Ē���ϔ���a(��[5a*��<ը;���i����i�˂�e4<������C���+э�z� � �B�e���M�#4��8p�I���r崵���WV�}8��s�f:n�͐d/�������x	�	���F`��9Œ#:odS�]��uc~�:��b�v�`7H�‚�W߱O
�63��W�I
�ߵ5�{��IG�Ҿ�^Ih��)�x<"��q����+���rxț�v[(���<����-t[��o&���Z�ꤪU�m*jHQ�#��u啻�gd�����T�[U�RaY)�����B�)ח�Y�
"*k�$;	z�2�/%�E�K:��N�_j�"Pf��/�igc�*���!%ő��l�s�@�Psu�n-��T��=����{�h.��@Ā}��|��
��d2L�k�������<|qr��KbU�N<5�t)��K�y���K1����j����m���F�7EO�oKf�{X�F�i\݃�b���Q�k�:��o=
��A��)g��w�#�(ځy��8v�+�篜�W�3Y��5�+��tY���D3q�H?����L�vG��=O>�f{e�`����6��d�Y�������Y_3֔�CZBר{��6cl�P�$�D��=�=6�c��+Ɗ�FHp �"�͑푈$�U�7\�F>Gx�nx\q7$T�dB�fdS$
�6G$QT�FD�N_��J���%踥|^%�f�︝��:|b`"���:��@}����Hl�<�7�P=]�w`��ޠ$��f�a
�~x�7�m�B�ts+��{y�0Yq��t�0�|�<�zz�}���5���G+rS��ٓ���B����E[Y��6џ@J�����k���̸�:a-�ʈ>E?���]��☚��r6+��,p�6x����uh{�����i��"�]8�qE�E���գl��9(�ˆ��MƄ9ѪMI�֢Ka45M�E-�,d�G(�y1��)W���ֳn��m��=�/.aK��|�h'�L���m��p2U���7��4g��Q4����l6��h3A�D��*����Y�E����>:~wx������rWe��%��t=j�@z���H0�̨�iÈ���qo	/���)������){�
a5�Y��d0�ub�oED�'�񜁀&j��gA��wHd���8f��L5��/�{���e�/ES�E�A�K?	S-
Bu������鈷���Z.э�LO�ߩ�(#u��m4�
��^�U+/��Y^�����qwp'���g�\Y#O����/xFlF�����ѷ
�:b��=V�NS	W�=_k��$A�*T��r�F0��+��F�bA��n�D\�$EQT�L���*�C�`��EXEY6D%`
9d�1�R^J��e����ő����@�Td��q�X@0T]�_SeA!lIO� �#�F8A4�^|0����'(�"������*�h��Ө-�T�3����Ƿ|	��؈R�FM��D�T���@~��{�G�IK���K�
+�S+:)�]S�Wlj0��F��Dz[��NXi��8n,��S2M�5z�;b���9���J�^,������� �E�\8E
�M,�ju��͗�t�⟾44�|�+\ٕ��	v��u�9���
HlJH޳�����
Z&N�uii��d��އ��ړh+�#AĞX��"�9d��>ce2�V��Z~h��6��	�����ty�2�D�Z�M�L~�{��� �Ճ����U/�����電�9��@��m�f�a����l�J������?�vI�I�9��5F���>���-с ȏ�L9H�?����G�]��)�ԡ6b��'׌X�~
�E�gDI5X
0xN���
^X%��,$���Qceh	��Zf��j���da��<K���c��L3Y�v������tv���t">���Ȗ|��!.^���Y����7e;TʶZ���z�!se]A�	u�U?���w��|�}Ôw��������[k{3�e��;�a��y���(/#p�yTE'=��.�^_f����v nn�
��������S4�S9V���VH��s�Υ�!MϝA3��t���n�g��m��A���.-@�fu�"�,�Qǹ	>�z��8g����:�7��hj�
��P\3��Q���:�&�4]�q�&�o�?ćՀ,aC5����j�26l��6p��U����a���otI�ϡj�p s�ʗԕ}S�y
r����GO���^�[Ss�:=O���_#a|KO�%�Qt߷�k��^;z��R�-6�k�n�.��&�� �7Kkd�(5@���Rl�b,��˪z��T'�C�_���~�ђn&���M-�|����	}�'2ye+wy)���U��ڒ&s2����P�D�4�il�0q;6d�A�Ÿ���Č�3F�xB1�YY�l�-��ej;������و�kb�V�9���U�/L��)�Z���?+�+�YЭ�V���bۻ�?�bec�mv�M7��R�,vb:��	���8�y��2��S����[�ET�����DH>ƙ&��Q:�j|J�ֈ��pE��`X,;�!�3I�@��\	�ڕ�i}7���l|D���+�:V?�h8ȏb�������xt�LaM��N-Lj���4ߒ��b�a�*�����#m�P�{��s�o�ȭ���y�d��LM���
��̓nv�rW�yFDO��Zp#�9fC:�!�(C🟢a�.I8���ȯQ}���̹���,��Jf6
���LQ��x�ZZ�BZh.����#��+W����Lՙh=�Ţ�$L3������3?=ZA�2:}?Q��`Z�\7�Lp��㲯�M��6lD��?��Z�q����HHD��5K5=5Bz"P�l�?O����{v�w�D�r��h��S�@�!sP��bW*6�dC)f����/��ۉ�=>�O�/
�D��^���Є460f�"–��L<�N��bab�fd`L�wr�	�L��@H��^zWgZM�ԑ);l�Ex�jJ��4O��2���p:�9�g�Q��GW�j/�:��\��t�����������Y��S�A���p!|��k�ڡ_��j�7�Kr��X��X�S�! k"
��ɉĖћ��DaQ%yp�6�U�Y.�rw��B�Zs�1��1�L��W�W��tk��>W2
~-g2��8'��R����^�Ͼ��y#�(
�U�F�1X�q�ٜ��aq���/f���S�fkY
**�!ga`@ac�	y��ݬ����c/�#d�G��|ql{,(�s��{|4»(y��g�ۄ#cg���!R=��2:Y۷���-C��b��e
�s�_�RBiΖ��L�u�Y�Y.�[˙F�J�Fq{�$�-If?����y�ML�#Oz�:-�;b���]_�g�!�Z��V��t+��V�خ?DEn�L�s�`|s�[�^KȎ��e�s`Z�<.Sk=�2,]ӗ�?p�X�$*����Ѧi|�a�á�O94.�!}�TŪ2�T��=>��i�v}�̞�P�0@�t
���:Z��.��ڵ���g�]"X��R�.���-�(@ЖY��S�`��7��E�ZYou��OO�\7�y��m<1��@��<Η�Q��j@ ��FՅ�}�V]>���\�����jU��t��lV=��b���_���D#��^�xxQ�i	ʈ"X;�Ň
�V�>#9]����o�3��s�H�Bk�ev��L;w�щ�d"������&���~����P]���+iCL"�����=X},.��o�9=�Y�^kv�^�_�=��1l��L��wa�Љ�K�:��NtR�v�xq�]����.�ж�)��=m�Y�!�~�k`��b� �$��߲E�ӨmZ�`��/�9���%I$�@q	�v,Ӹ��I��C*# ��}����������C���F��N���`j�Q�L_�k�!��*�~_���V���Gۀ~duY{�@}�ԭ�Mj��8�o/R
�
į^�΢ �$��.��ܠ@*��^���y	�}�z�8�!06�?�9r��Yg2�7�^^��q^���:CG�8�R�����:C�2k��@^M�׺=�Ng.�ͪ#SG,�vn�!�[��D��+�P6�S��j��;y���f�L�I!�*�6+l� �:Ӷ���7e�	`��wdnCI�	�L�P���(��ߜ�3��hq�;��G��G	�z$�u�ڲj��qx��Q���O��`���YmO�dU+�ٱ��}��oSh�G���]{���{w��E��Fh;L@��^2�ײ�:<��J�Ƭ�p�9;��L͵1�uBk��w̺��S�KR�Nዞ�m_���i�]��A�|����f��??��6�D��c��nk�FEx��;=�B���_ا$�.0�g��Q��T[̳���=��X{��,��IԺ���1�L@ʣ�������(����)/j�,���+���}��c��FF���X_S���@UmrXNp�N��aI׸�C8�:�]-�^�!�pk�?�)ۗrt�	�T�^=X��g�Ö�jY�j�.�ә̲���,s���S�]��Z�3����{�|tf����WNn'�%cȎ�{�	r�͖���T��\W
cf�Ώ�u�K�:ٶ�9w-�ko���=�}d�}���/�/�
��I�[i�T�JF�-]��:�^��9���{L��1���K�����)��!ԡ�Fnd�.x��F���i\�q�^ �\�K�"�iD�n$�֢�i@L��Su:k��^��F`ƂI�����ϕ���R>_4�y�1�*g���|��I"�	;�5�ւ\����5���BpW��C�����Ev��]f�1�ˑw���5�Ծ�P�q�#��G�,����j<���<�sױ>�G�5H�^#��/�}��cN�9X�T"v��!�\j��(�X���a�n1ē�A\�M�zJ�N�ʨ����@����Q���=C�GkĸMUޮ�oW�	UY\T�ɶo���p��z�=.A8�6�Բa)׋%O���v�OG��(��t򴑪^2�����p e�V�ƀ~]�u�׉
 b�bdx����b�z�v ����<�u�t=�[�(�U�*��?��(u�%��.��@_MM_S2i�t<���+�$lQ!SN�O�u_m�����<��N-�����o'j}ͤ:Q��qX����>�k}y��D-�mb2�L�(���҉i�䁥M�pڦ���èl9�,�E�t!��M��Q	v�L�6�<��tq˛�	�F��|Y��o8m9C��x&5mi�����4V|���؆X,�uJ!�>��]���+�e$a�2/)��dz����`Tz
�$�?9�O�2/�j &E3a������o�jx�O��"�1.�lL��2B&J�Ī\ϼg���*ue�Ġ	]�.=w���8��F��##�#�b�׋�;X���l�"��FHt�ݐH��6��oX^/��QL����p(�cv'�;m�j1D�[�c�(��<�;Df�[�����B��v2:���l+�� oݵ�\�XF��jf��ND�ɴѢ���#�h*`� Y������
���8>Gp|"g�5��'Z}
~]�QC9��8��##�Gb��B���=�A���w��U�4�Aݎ��wWfD��iz-�1S#����5s���ւAB<`ew��M�]x6v;U�iP�=c��I�R�u0{\rP��Ց9�}�#���tY��)J�s�4��>&�ԲsbC����TŲ�°��!�ɣ@$������՜,mJ�Yq�mt��PDY��W^��aA��y
���D
�h(Ě6����&F�,�1z���_�OPo���]����u��K�ֲ�#�i7j��o��G��H�?S6؎}��A�w����a�>�K��8�l���?�k��y7���1
��7-n���)`�<�7�ra?˙<��Z&�#D�뫸Q��y�2y5�oE,W��<'���3
�t���
�͡|24r�!�p�D��J�"�������au�#�@(����CD^��J$>`$��AWu$�"�Xӧ�i7��*�PX
]w�8ئ���ݒ���9�txg�x�؁�oLƍRk2�g�(�,́˷͒��[��.W1̗��
0�K��«_)Sqe�Z5G_R'��f��^"��V����K��a.�n�I�<d��ő�;�ֻ*\C}�
S��B��;
�ь��>�`��KH	��¹���3��d��aK�qCE_��w��g��rb	ƍ).�6'�`+�|����b��.�J�Kݳؾs4@jx�V����S�*��_R:B4�c�I�����cv�O˝�m�rsb>�#R�oJ�[�Q���ՙF���ϒ�������{��Ŵ��8�J�V��f=�N唍�=�8R��$�x+)�c�����lMI�lCU��^LN�'->���pDmmM���"�TA��*��KL�C����l��H�F��VUU��f
SR�8V�n���N��Ч��GJ�qiJ0�c��V!}��d�Z�ڲ����q}z\���\��1֥"�Ƶ$lDKQ��p
��'=�������_�޿;��wl���a]�p[�5�{T�K���}���v��)��������{�ҥ�橷�S�o�pmϵ�3?x!=�o�<Gffm�{)��n��_j��a�|�E�v(�IV��+*t	
m(�C�jݪ�
3�I����w[����� ����?��)iӃ�
͖�5	Ke	��<U�S��=(ӫ����O�d�}�
=R��j�`^@���
1�H��ֱ��[z���:�V*r=�2b�������7�����k+�0O�n�͔�|/�-P�6�a���>~Dݮ?�_��S�#�z���̳���D��)k��2�����:�*@Ɓ ��ޘ�v�����׽R�惢����!p����/x�X�Xz��$,�u��fKo�,��޳�"]0c�	,::?�8.ÿ�F,曝~�`�p#6�gL���4���h�M�6���{�g���>���:K���Ou�����jx���<Fc�E��}C��9��/M"r/.j"&�r�P���]�N�6�ņt4M�9�]�{����
�L�d����Q�"�r�2I�П�դ6�`���e��W2�3T���{A����5���񭕈!:��hj|������
 I2Y�;�
���#�TEM<�ւ�6���]:<2W����p�6��H�|����z�T=� �qs�M-��@�O� = $}�x��w���z��)]��ߢ�l$�I'(�$�K�)Ñ��7?k��%�L�L�ŷ>x��������~��S#�}yw�j1�N:z��3�G:9[�讌���f�9MW_e��JW;|��D�?�����/\lKS�'��ؗ����@�j���������A|��k�IQ�!�Py�zv2�=��oc�[��`1u�ܘ.(���R�p�XJ�E	�X�y��W��vU9�ڙh@��0u�f=Co�جgښȖF���b[�j�Vl��g�MF��-�I`5�TC����q�XZ"Zg�o��cmH�mQ��Bd��\��(��4��6��u"ܶđ����(Ԟ!|�R�[�k�*�C%�����q��8Ĥp�2/�4-h�B���	Q�6ů}e��ϖ��Ӓ)գ�Q9���v�ǫ��Շ3D_��q�D��y�x��/z�Lp�g���&èImx�,+���߃��`I��a���Y��Z
���fw���&�Lb�X��~bw��	����*CP��������)�g��2��U�
�s�0���@�!�ظ(`�MI�6��F�($���,#Y�A�7/�7c������0���Nu�仉�h���b�߮��a|C71�	�<�c��?x�P��_&�s���s��1.�?7.]����2��k7�:��{�*�w����1��@��+������߻R#Onٜ�	�wI�R^�n#~��g��g�b�����m��0,�]ʜaT�P��Ƈ~���1�wn2ymV�]1ZwE]F	ie���/�/�c�A@�O�q��_T�/�퀲�_R��.c?i?D<X�O�{2U7���3���d<���K��Z�\_����Z�	J��ʲ��k0����c�#��f�)/C�'���9c^�vl��lw��u�65�-�i<b�-�W�ֻ�Ӹ���c�uϽp�Ч`No|%w�ua�[Q�>ի>D��n�lK��&�5�<�MWK�>A��	�
���wS��]�G��1ˈ�NRyuT��!���EGY �MT��D�QX6�W"��k���(����ɏ(�����3��Op��V���t#��K��y�zc�5�%�S�7�����>�i�Ru�&i\��6�k�*�q�l8L�Al�6p�x�ƻF��ϪO�/�'�R�Þу��w]qwVŴ	���~�eϩ�����:��'|�����m���S�j�����Am��m���ӗ�F��5�=������LC��9��I�=��-C�>˶�~Ր'P�Pᄉ��K�E�A	'��u�ĵRa0S���4A��i�_��@��,�K"�2����g������H�Z�Հ�"+bI�&����o���u�_��B�=5�_��Я���O����d�v���j+x823���7L�AL��7�����"q��~С�.���"d͐
m$; T�!�ϝ�eꦣG�3�b8LY�!��Nn�&Bΰ��&����=I�\�m��Ckڰ��B���V�d�HmKĐ)m�4�#����G��),☼�pʬ.��4S��P~�"D�C1��F�
����P&�S�^C�i�[�mʣ!*���z8a;�*;����x|((<M:��'=���(�h߭2��%��u��Ә�̬Y�*|@�]	�h���h����r,l�b=��m�g�=嵵���dm��pR�f�ZS3-�L9P�Wҍ)���i'�T(�uF��L]����eO^�3�;�4d§dx�b��]�i��BP;R������I�ԏLJ~Ե�˶e��rL�@JeiG�F�o�m��9�|��Ìb�Ղ鏒;_��b�"�����(Rlnos��v���[R�p���|PN��=v����U�7Rt[��'�_�B(�c�l�H�l��Âd�D
؞]!�&�R꘍'QQ%=-�=$/�6�&d	�FS<���0+??�sN�anQ�V/W��Q-׵��n1��N�7�@�&gv�/��?�@��l&q����g�I�y c���i���q�ld�OL��G��NQ
;�vpj�F�|\���`�L�'��q�1��<IO�ۼ*�2�e/'�9K*NBE�Ce�3��^/7���P�5Q�f$�wa>��Ȍ[�[�h�A�W	�
��D��ڞ�[�E)>8?1�U�K�!+���,��b8Bh(n
��,� 2:~�͋���ƣ{W�����ư�;��Ѫ0�"�<�w�&̇Z��um*�m�}�n����)YU���x��:����*���0�!�a�7Ҿg�aT�?��=�xAľ�2�Y��C��ea2E�;L����1j�֦ӂ����i<]/RqK~�������a����H#g9)bE/�X����|�i��;kA�*g�3ј&+��|ty��l��1~�day9
����(�����?-P[�}\`b�~zH�!�����dl��	�DD��0��n�[PH	jA%����|Ţ{��ZA��{�L᧗/�&��Z&N�n<��jȐUQTe�B�f�q���,ԙ��n�7��@�N����n����Z�7Mm�mB�#�qL��C"zN�i�Ҫ(�6�$���֒1���B��K�!t�o}�
E��]%���!�Ey���S����[b�����%�˧�VB�@6��o5�(S8�'�}��-3�TeVQQ´P�#�u���+'���$�䃊��t���݊
ߪYa5	�7�1v31�{��/�-�+�(��.�#Z0��(Z�G;��6��yٍ�2����wœ���ö] �,DfJCN#jQ�ʘk��~H/ꊄ��J�=�8�iX�2�[T���J�Xj:�ͯ�z8d9ģ]7^8
S$�zN37!^]UP7�ϥ4��Q�����2�_�y���[F$��,�2RUY3u���]��=�
��:8$�'�M��y��5�븛��V���Ի>�0MDX�Q�v_�}��c�#M�;���f��uB]��=k��z~ϐ{�:�O28�g�ZZ�bz�:q���Sdu��1[�=�OW��T{oC�k���1�r�5����LQ�(��t(���m��P��Y��*�f�{i�qꮰ+���hW<s����$zޱ"�Zj�m��q=f���^e��mQ�*�\v�ez=x\����!cr��0A!.�\���¾!������e*��ջ�d����>��0
O�\���K̇���x<H6������ʹb.~��8�+��-'j�]Iq�><9vb�������c��9���s�㓎*�"�3ۯ*&��x:Q�ꆙqI��ĸ6`�5d1��d��m<��Y���h4�V2�����8�IK�N�{��f��8�6jB���-z�%��D�I��h%��,˗ȱ�Ӂc�~,��q0&[�%��_|ۼ���(�cPF�Ze��>��M���W�){u
GJ���F	���D��:G,��1�:�W�G�#n����_}��Ap�e����MQmZQffeZ��W���բ$�q�gh�{��0*����t�J��]ޓȼ���Wiߤ�Yj}���M�M���5�Q�A�.=�W��`��D����frמyS
�	-�%>���Z�&<���~�w�CjX�s�nH��հ�u�&]P˟�ƓK>��d��$� 嗵��oe�8Ҷ���o0�hrT�����r@�	c>.D����h��E�g�1
Gd�ϵ`��h�i�H����VA�n˶}�B�o�j�	좫&��x��/uo'�Uދ֩����[uUOo��t���3=�=�F3��j�#[��}�&ye��Elc�����-2I` ����֘\�(�%$,Q�#yNn��un�s�S�]=3vx�~O�>u�ԩ�Sg�η������zZ�y�-cVF؈�Ϩ�KP-;3�y!�R��tX�%��#�>�–z�%�g�u�Y������:!B��r�P4r\��+�H�m���x%U�:LF�Rv021�?�x��\�<(	9�(<��|��K@ϥ���.Pu�s��8m;|�*�@��/�T��ٔm㡤4zr�~d�5d��&~�P�B,8���@��"ŊS/O晟�|�� �f���O{
.T��ү�F�����O�E����E�	�Ќ�cQUTU�<4��ޠ�HeY�S�eY�S��`��j{w���*��~eB���x^x�0���l۳o�KN�D�R��Q(Ӻ��N̋���\���4�}�N4�����!+gA��c���̱�׺GW��2gpW"�;@�(��',Li�:�7L1Z�#����U�ǡ��LC���K
�4*���y^�͘Q
{eC��w�&�6
I�ټl:�t�P̞��p_�Ҵ�L%q�8���p=�a=�U	!�#�xT3���M]��5K!m��y5�=��K��AB��er�i�K_GF��r�rUd%��٩��$m��d5�
�j6h��S���H����C�"�U!��ԒƗ`֓�紛R�{T�%y��ʧU��9���E,�͕�c��֑b�^BMz_�fkF3�w��O��P,
��i�</��"KYW�ِ��mr@��Zݬ�����%�ۇ`.��i�=���1xms�I�I�%��$���/|�?w��SF/�'5�O�������P���[�a^����fn/�ឮr*\��s��B����9KqjeWQ(��X�<��緖S�rz�_Q��+J?��R���!P���"�p�f���
��d�v������'�65�ƚ���GL����`��b�X�a=���pP�&���<�m.e{&z����ο�������z(��_��r��J=G4�m��Ļe�92�n������Ao���NR�p��h��^����4(��F��ij�P�z���hIYM&u-�4ו���"�}Ɣ�'�SzBVc�,��q�N�R�SzBR_��v���̤�Ǭף�h�&�|a��8��X��
܁��gܾ�*2E�o��L�Vj0��RW���Nnᢽ7@ل��Չ%}�R%��$M��d+f9Ly��;
CH���=�yd!BIl�-�Ĩ!͈)?ǒ�?ۺ���Y2Q_���̋�f4.~Q�.v8i�;#Y�:<��@}�y��R��x.)R�>��Ҳe!�.��Vb6~�ų	�N�)?��˻쁓�;��,+��?%e���>0p*�Կ"Д>�R
e#�[���z�	t�A=ٸ��S���AO�{��ֻ��<v�m1�4�)t����o�;{}H��8���W9�ms8�8��z	Kd)o��z�]|L{cS˾((b��o5����uC����QQ����r�����H�]�B�q�Ƃ�m7�T��P1��6E^�^z���m
Rt9�'��藐�Kџ���'v�p�O��-``;��2*���8F�#����D[*~BW��ֳ� We���Եǃ��4i�\��֔$\X-�u����*.�6�o���u��"V[>�Ȓ�#���3?���R���z�#�n����r�8�d�p��붢e��N� :ʎǯ}�]��n�ix��D�[l��)��=�{;O������@|����Y]��-D�<g!z�e5��[|��W�������L\GŮc�c�[2�lS�����yj:�O�̃�!�Kp�k��Ě��I�&I]��:�Oy\&�]�
#���`�L���ðW#@��C�x~[�vr�ќqh"9�u)��Kp�x H/8�EH�;}<�.�,�r��y�n�g��OVK��'˙�� �+ڔ�-�7�<3��89�ԉ�G��‰�}�7�J<>�D԰V.�AX
or����a>Emy�ORx�����1�0��I#����r���Y�r;=�$J�ީ~�|!t�A�|���
�ס7ȁ,{d���YBaӋصyMb6�/Ϙ{��3�Bh6QR./fff2�˕�K���3���K��CB=�;8���6�s�y}_IJ"��x����G�Կ����Q#d���;�]��½�{�{�$�{�'	�ȧ`zD��&�%�T��Mq��#�'�^m\�5�_�^i�g>�MS�$]���‚�]./�k�L����Ƿi��
*�4](L��X@�vIR��b����+L��*�!t�f���"�N��W��\8#3�әktk_d(��^����.j-GY��E�H$�BQ�B��] ]�EfQ�u��NV�,��@ty��<��6
G�vӄ�eռ_�4�yny��n�d��o�E�_#�����Wf���h"
���%�f��I���l�E6�f7�o�A?�1�&\�|P+�"�)�/��v��j��~�2�>�|�/_ �ѱ�RO�d��wr�F��B?3�S����a�B�Z�
m��R9�����Q^zI1@���O\��v��Op�m��r)�]��c{�
E�R޽T��_/Iy]����;u=/IG~���t�0{z��?���ISn��&��
Z�Z!R�mM��5�\���qD=_���(��Z����h��p[�$�b��M�y��|W��+[KCD�����"�־v�Gڱׯ��Q��n�Q0�Wf�[`z3]V�tY��e���à���5Q����dPL��HE�7���P4ZӰ?QZ
g�x�~V?��g�f �яBmМ��b2�	wa��.Zm���n#!'��A	�i����8xw�L//��R��?����F4�����Z�%�Ht�oL���\�B\�	*�M�GeX�3�)�n�����0m�P��%D]���D����\ڷu ;v�Q&���ɖNR���
�E^,�$"A��,^�y`�u�l��j	��eO����c�mDž�`��_ƌԋ2
|�DŽ�����C�)��Ƀ#�1L>.HF"{�~�Y��(���ͻ�=��X1v�,��n�=���7������` ����݇ɮ%-	�Pcr?�)=;���ј��Bu�t�;$t�8R�6�P0����7-�)���f��Ծ��E�av�K�C�g�S#I�05O3X����s�r��3Vé�
,ը�F*��be��n��(ڱ��䍀���@��Y��Q�h�HQ,�\��D޾�Sͣ[y�
����);���k�Z�R͐�D
�Sɐ˫����M��i7�3��yم���G�O�	�
?�PE��5�I��FъQ+��q�_����B�Dp�$���z9�"�iV�#ww���5Ohn����.�$*�6Sv�[}�<���k[ �i��G�"퇹�FdujŁ���:ek�/�d�J��qN��BB�ݰ������9�o҂��`p��&+�����1�#�>Ƈ���ͺ�������Xj��oKH�޳pR���:�l��`�Α��ߖ��B�-\���U6µ���k��jvd��m+TɎ�Nb5�g��v�(�Qn��K��j���#��R��Bɭ��G��r;��΂[G׷0�1tR'i-n�m�=<�(
��gi~qq~�K�����{||--./������y��w5�����6vd��n�Y-4�Idܝ'���Y��=��?�|G�L1�K�!�Ø�c*V�ZXJ]���+����,*`:��Y
���d'�xTۃО�䞁�a�Է��%�̸fb���*h��~������;ޯ4MeDQscc_ٽ�_�O��4mD�F,����V�M�>9U��]��O�Q*�&�Ќq���ߨ�.�%��~lnl�le���sc�.�$�<qg��w��A�IRO{���2�V+:l^�x�������.iҖB4�b2� W D��ß{��9VG���4D![����lGIh�eH��GG��L�� �b�`{n(S�5�m2�#M��F)�ծ�-���s>޻����0/�\�e���(X�g33�^I� �ּ4)Q�����K:�|,.�A�&G��RJ��t�tO�FAx�SI�R_���ɇ��/�Epboj���!�V�Nk&�,:9���s]���Lr�2/|wj��d�5!��-���H�;B�!9�C���4
4J�uS�2���L�@5�W��k}OF���l.ng�|3\��z�Pw젽蘤aB>f�˜xoƁ��F���'XprY�'�S8�ޘnet���*�D��S̗��z6�����f�Z����{pȈCmp�W�]Kӆ1�Rx:�t�:M-&��4��/qK�B���Tg�>��=�V=fs1,�z��<L�{��W2KV!�G��L`�����&��4��b��OҤ�������`2����;�|<e0z��T|�h��KG�2��%�B�	}z�ӛ�x:��R��\R�����bԍ1�4�a�Q�_�T�ՠ"_\���䀖���5ec���Lb[K�fJ�q��ьlR4�l|�?N�w�Ó���M˒y��i[V�l.0�'}3�i����V`<�J���)Ij~�j��zM�ɜ����ZtY�ɜ�r8,˱�$3�X{��E��ln��2㰚�c{K�8
0fm�t�p
�,�ԥX�^��Y�&���d�	DBA�Y��d��5aG�Pv�����[s�z6�]�M�4k��-xx@�d�C/��IQ�ݥ����!�홬�%Kݦr,80ׂ��}��.�V��if�QT��g�����5oo~�?(D�<�R'���gcC�;�[�	=�-���w<��K�f��eo�xjhqˁ�}�}�(J��:�ԉ�Ue��*���p)lX)��H���M��QC)�)+9�Ď�-`0�C4@VEIY��c��9�G�T��T��6��(|�rm��\ԂՉ������ҧ��l-�}b���o�bb��9�O(�Ie�w��1��,?��ͪ��[��z�êv���"�ߟJ��m[�,Y�r�.V�z�.�G���x�a�*��g=p�3KU��n:U��W�Jzf
�D�O`�Ik\���Kq�r�\:�^#(���
���aIV>�`��d���8dK��
��gI��������q��6v��WWE�$:�_�Ű��	���/c$�D���ㅵձuH�c��E���j�4���<�����8�!���E[�B���VU�J�IISr�0�
�^�ʅ������l<���-3�`��EYu�K��uJ���퐥*)U�FI�h��U�4�B�
�^�W�M��B�R�m� Y9@�e)V��d�쏎�#�f�H�Fu��b_r�,5/2�r���DLw��5�����ً���/`+�'��lO���~�?R����V]�8��>����B�z�,w�E�J~�νl�z���p�V��X+}J����lY�eHb�hA!��|�%,�+��m�j� �:�� �i���X&'Dh�6��KdU�_�}�>X����įq�*?�}��D��q��m���C����~��ޞ,�Mo���I[hM�>���[(�0~qڬ��2��Gw�쓀7�j��0�SUS�bFh��ʃ�H��O����#��4#�$�$�1�V��P}���>
�
mx��ƶ	����*>HJ4�鷨�'��N�dY����2-��wI�z`0�&�-d��8M��sWZg�h��8׀H�6¬qe�3m��q�;^y�UuJ
��D�����y%�~
ey�+�aX���䄖��Xg�g�n<`:"��A�"sy:��d�@�:��1��۲�ۘ����A���E>�Bp�k�|�ޫ���: �`r�#�u�t>t�@�g����_�::�j��c�`��£�2e�$��(s��>���Μ�<�!��~z�$^-a �s�Ƹr�N����*50���pao���X�|��4)�a�q �?�߻�Gx@�<����e�?b�����c#]g���Wҳ�eu�f�).�R�S)j�����y*5>f%n���s�渎朊٤spn�@��?{�l���ji0-���0�{^%���V���YQ�[geA���`|ebŏ���(�A��	Aׅ�
eD�>��$�u�D2ʵ�
��б���e�,�>���w���dj��^3��D8a�G�������x�cf����#҂9�<�肦���ƩGF>�ʢs�l�l��eH��UZ@ٕfs)e����yZXZ��}������W��B�.���������҅_�w�����_��;8W_��h�b��w��@v��;���S���q@�Ql#B|�(6���CW�����P����w#jc�VN����h
��E(R�os�:t�$fV"3<�%q�jh`���Q��ɌD"���Y� � 
��q	W�¼8���"�H����Nn�*��%o�f��07�Ƽ[�<L|�
P�-�g���H����|jKy��0�� �X�$j�LmĘ����ى
�v��إ��m�O�G�!4\���uK�|M#���~Aپ}sS���DB&���W l���Gك��p��r�2C���I���ܴN��
�kV�i����r���K��J|=��_�s液�R�zj��]LuFrk%�jl��+s	�Y/R5ŶX���K�g�-4�]�KnPoE �+���M��˸*1UiviF�]����	�p��>�q��%�0�r<-���V"�-�:���o*�H�$�.��;�+�ѝ8SR&�d���4�RZ�[#�8ӓ�D����V���ٱ�TM��lݻ:�z���[
0=)�5j��ǿg��AJ�{�xRYX2	�S<?m�.�`-�V�m�&=��
�^��t���h��[o�Dn�
Q�ܘ:0�Vs��o��Ѳ�_UiF��c�^+X���$&�'��g�WR�����>�e��ں���b4�I�5:~�2QD��|-]�0��|�&o]����K"_���޻��K�2O�̢���lw-����[���L��_b���:~�,}�ٴM)��hځG�Ƚ���u��p̼1=4g��V?J��e!�':���+>�+'+#)��X�6��L4��W�=�E5))$C_���$�S�$)WH��tYqB�$��zD��+3���\T
�I��?�]r����ן���3G�q�o1�>B�1l�Z���lˣ<Hh `b��N8K1˳0�}�	���|��,*F�|T���j�Q�#���]�z���kH�)Y��-d�זl�*�	r|�uux�݇�(U�_�
�ݚYL�A���i�H��~-.�n0���;1Ye�EC����C�M@m����^@_K@��
��_[+���&�<U� ���j���)���lD�Ą�������윱��J@	�ĂV#!�
��Ά�a�WD7(�Г�>h�Fo�sq�o��%Py��ɿ$��rP��/��J:���Pt��
7s5�딗u�0��Wk��� bՆ�#��
�y�2�X?r�Fr�9E9
g$�Q3:��h�?�O�8
i����ee�\@IW`I��gB�:D�)�@�^�MChb��݃C�>e;��@��w��PI�i���Ѿ`(�4�}�'�]Z�!B�eFF����"*�Vp{�_�]�<��.���Du�t9���x���(Pב�t��	�� �'�u#Ҡ[Ta(�TeHP��-2rH�/Rb�E,
�?�����_^���h,����Z6�fE_���sk|�O؞צh�\y��[6�uE�TƉ���Bq�nݩ�����al�M����zwX>��'�05P�uY ����uc]�u�^�.�C����]���)|��y�u���h�˻ngO�&��N�S�@��<������Hv~YC�Z����e�1M��(����vܹ<��G�8nU����>�틗�����E[�T��z�F��L����\�������Rnr���%_^���[�=�^�}n(��E��
��[G��}�����˽�R�[�RZ吢�S�]t?����p�l�}��!�N�e����A)�4�7j���Q����T��װ'1�/{��IP۝ ��b8�EC�S�>i�z��-��;9Iʡ�������7�BvO} �ۚ�~hu��6
f��~��4�N��a�f���NU�������0���l�C���&�MׇU�s��Z)_9����٬[?$4��8�3�./<Ia�Ô��;�(Y�I]�d5����Y1WV>.����ݲ��S��YAS*h��ZB_ K��(\@K�n���o��f{n[�.�O�Q,�Z)%Z��kE���l��j�v�V��mV������:QW)�3�m��vЭ��}�V&�u߀�v�^�܎��
�1�A�X�-��~�[<�[���0�k�ˍ-����Ri��>`�?�2�[/�f1��ʥYRa�w���K�}��qun�J.��ٰ���uX�������i��e_�oRw�| f��I
	`$l�MIآ2�/�h'�۶R+�";�c��	�=�;����ݺJ�wܡ'B��n��u8����3?��H憭0+�/�Bx��m����hG\
~$=U�*`�Y^;��� m>����CH ���_��Y�iڒ*�k�5U�z�&�i�Ք����χ�H���Ɂ<�^?�R�e.]���zn�깫��/~<k�J�	l�M��������W|q�AfЄ��j��E#����Hy΋<OIuO�5CM8�<�V�
gJSe2
w�!t?������SԾ��u@�A��/3�X&v���ڻ��kiU�x�Q#B��yMV��$5�|��0خ�m1z�>d0�8��8�%Ǧ$�T� ˒���-c"��?�}5յN���I`�XoP��c�;È����^��K�qe��?nf=�Ao�y��"�	�8+���O�K$���y[�fċ�wN��R=D5�6c���Y$���ϒ���~�GӍ�h:Ao��b��ևx�G���0�xཏ[t�_w�L.R[�W&sx�PK;�"�4�l���v4Sf`.r��aΠ�$��&��U*���1��/"Kz�_7�j�"l��*(����EY�L|$�PFk��Ț�艏_]�]���iE9
��*�C�!K�%<I�`?#��!�52GV�x����v�H���P����M�)Q�W�%��Z�
���K���_��Ռ������T6;��!f�Ҕ$���
:�/"�G��~�Ȉ�I�R,*����IE�ISZX��M�?�����K� ��+������I��P(�y��C$�,����*+�Ƚ#�"����9�Jb.�`���+�[n�7�Vz�'e�v'r�_�7tۘ�H�P�%��뇍��|߂xԗ��k����� }N�=��߂�w����ھ�d�wL���]�w#��
ㄧ�A���;�F&h��&g�3{�L�W{��xÓT��bW��,�r㻡8� !Y���u,�gG�PȰ3N��q�r�2��; �9��6uM�ՐތZO���Е����K�C	+��̒2vO1Z�رc�^����; �K��#���%UD|���������ƿ
=�Mp[�{���X��Ed�>
e6o��_��z�T�No4��q�m]רWKE;��"���y���P9d���S�P��:�i8��
 ��Q!���!�P��P�ڭ�����m�b��b�z!�NldHÒ+jv��B���p-�ʭZݹU�RW�|���11$��j��'�Ԝ(�W���+7�e���#�*�ZL�i�BZU+dB�)�9FWN���;�-�}���xH�v�_�>��;��E��x� �Sp���;�ϩ���R�#��:�v�G�zP^]/�-�<��Ď�*}��Q${�����\�Y���yk"
)3����oR�tu��^��(��P�7�D�6�]̼���7�����hDP�X�&�q�
f�n3B����q% 
���#���&I���ⵊ���N��Ba'�g��a�H��!�	� �Wj�wQ>*�~<Jn'������(�U¶qe��J^���A-��KN�׳�#%#LJ��K�?Oh�/�n�����G)BF�C�)\����ֳ��;�P��l

��!��D-��V��m�
���`�s��?x�{��O%��R�G��H�)E��'�CC�l�ݤZ/���?G��9�\ڥ��ruj^M���5z"��=��2��pY��,�JV�X��?��v��#���a�*�émD�����ϣp%�D!�_�F�+��!D�?jCߕ04) ���^
|y���CޗW����F���Ԥ��kD�5�HC
���-kyޒ��$��
I�i�n�tt�Ҥ���ĝD�';� K���br��s
u�5M��'���/��4��ܦ�HcV@�ΏS\"�^��w�/�:�3�N�&�<���R��(��z�@dNą������E��v��Ĭ�c��>����f�ʘ��j�ʬ���d��ʺj�jR�M�������DBy�����6�髭���<�(]݂�.�����z�$��Ï�+��2��T+��J��H@��@Y*ro2v#;�)�U�4�+J0�*��}�Qʉr
���*����~�DcfUۢt����r��P�s�Ie�_7�����8-�f������j��>���?�E�i}�9EdjQj����O>����
b�?&
�I�eJ�Oҫ��oK��(���=͸5��􍴂�$_���|GZ�m�j	X���D�
ե55�1�	֮*YU{�eg�K]�1���
m/�`o��^e�u�u{*mܗI�*|��1ZXۚ��/��<���i>���R̞m�5�^D���rM��/�(J�GQt���+���"���1з��� "��=���a�wIE�>��SC���_�Bn��[WQ�5�zn�X1����TL�E��X���[�������l��AU��.?@d�#S��cE{���#�D���9��i�W���bš����'�)|h����X��c��T���:w��q�_��Z�[��U��|�-3&��Ύ�U��X�J
zl2c����.;j;����P�Wp��n�������?ƀ�A��l�…0���p�a��C�v��~�'���f_��6�M^uDo����q�����e���6$�D�G �M'`�]����_��>��,�9�k�f[�&6]VT����;���b��;��h��ۍ��K���K�0�~�s�Z���۔i���g��|��C�)k���}d�d(�u*
Cb@��L�(;��B6ȜM�G�̍��I�n
�E������u�~Ѿ�Ir�&��4�ϕ����8���A��r����%0�%+���dj��z�8H�w��\2_'�&��#�7\���$bS�қ�5���}ˎ)AF"*GrC��%��r*��Ԁ��\�;�B��"�l���n�2,+AM��x�VB�[���=ɋbҊ�M׆��c�F��y!�#�|�k�0�]=I�~b
�!���i���Y�8����jɱ��))(�,ӵ��r�]iL�a���	�K\���Ȉ*%�+c�����o����Kt�&�͍Q��=>�g�0&=Oҏ��f�7�rt�N�5��U'|껯��X�|�X��WyN��-G�A\���\�!u�&�R�
Y�+�|����4�p��� c�k�>l�a�{��|�
oԞ �vT븑�l@�,e70�Y�mB�$�A�|
<��{;"�[
���NK�m����D�YB��ɼ,eEgk��K���,V-3$�>�ur]F8g�b�X�E�����#��q"o*�Q�$EE&�������-�
Q$�B}/�g��:&�d[	Y�E�;����[��(C���b���1�ݐ$JCQ1-��� y�*x-�H}y�3���I5�y�{�}�W��9��ө��r�9KtrD�J����UE��X�o�1�<��x_ �תRUe�x��butb��~}��(��4����	'fO4f�Z�5y&��(b��pm�
�ԚZb��?̓VG�@#�D�����
��kJ'�>y���j?V҃��u��;y^߹	�B��x���ַ
���NCH#����,��C�O�q)�����
 q[��ı�vjj��Tfw�����Uu#�6���};�3s�l=�DS!9���wހ��1����o����=�1���u1d�͠(�/_5;���D
�>�;��]�@�Bh�u�� �:�,>�
?�-�O��w�7�d֟���UCI�M��\w�%�f��=�s�2ym��Q��+o����W�i88>W�VQWe@�FvN��t��}^�?��Gr�]ɴ�!R�&u�L��gQ@�z۵�O���̉�Nܴ'eFjj8	�?i�?�F�q�������3��ڗ� �n\�z�>exc䗤��JZ~�����hSXt��VO���3x\�z�a�D3�i�z�8D�t����!���7/�ڂf.��;���S�+�S�T�J �.��@Ι���y���E����0�*���;��"��W����˿N���1�u�>K�����B�r�B`Q	
�u�>�n�������7!��E�W���{�]�NWF膝ۯ���|�/��|8U�)�;�:!���]t�9dv��z,#��C����^��Da0�:�,$҃�.%B���*�O�r�d����
��%$�gD	)�S�EH9 �'ɢ�I��v!3M'Jc��?����`�p��1c���m���&�NJ��G��M��<�8�s�c`t��K�������������QEy��|Y��8���)k�G,T�|L��:�y�}�~��Q�l�M����(��
d�������kUu��7��A���F������k���gd�hbTU_��|$[
�_�|�8�u��4�F�q�ʃI�q�ao��x'���?�m�P��inX�@ގn i2�F�&��g}���9I��{A(ӹ(��E?�Ǘ_���c�5R#ʹ����s�>��H��D^:vw��}��;�q��h�����~JڜL�
����<��y��("�ɨ;L�è1eܜ!��,�F
����>�U�~��k�y������O�~�+���H�'K���<��U��<A�<��M�x�!��~����w|��#��&<��dtՎ�~5Jx%�Om�[@gi����ԏ����-6^i��هZ�,�5����$��9�g.�~���lub��v?|Қ>����A�/M�Ș�4�|�?%�?���wtT�/5	a7Z�l�ko�O���e�
C�k�*:�U���d�۠�A�6�i�/�g7�]��ՠ��\�1;־�[g�*-�������.��w*�|���#��N�i���o�7(�T)x��Z�<׳N�8���q���ck0��V?��QI
IAIuȮ��k�J~�3�.�Qc>�(P��A����+�z��K�x���_��w��P�B	�2��B.�#$<�$�����F���f~Lϴ9
��]CXk�D�Mtz�v��a���?���u���x=5C��VNjأI<��u|.�~eo����a�(h�/�j��~9K	D�S�������P��?%�;H}q\��:��R��w�3TL
���ϓ��f2X딗��!ͬ�͓o�'o����VWZ��u	p)M��}��$3�r\2�u��!���'ң�=����C��k�w����cE���[tߪ�?���ڞC�c���0w�p_h�?r�%bѢy^UY�z�kұ~Y~����v��/�~��rK��S��U �@'�H�N�\pr�BbUʵr��/Ϣ*���?^y���?o_��~�M�Gډ⏑]�����=rF��./g�<w��%����y^�\۷/��KD�soM�|E�]*�z��b)�5#�<$	z�+��S�����QH����3<�n��m'�c�ۨ��3v�Hm��3��P�A:D�ѷ�]z�:Y
JS"
��EJU!�^�H��\�wƐ���!�&�-o���2�J��6sW�RHm>38�ٙ�@�L�Mo\~�,�C�9����cJ�ƥ|��oN����(�|bs',�Ϩ����|O���{�v��hA{��!C�ghrO�0�V;b��U�fs@�*��T�۵�Yu�( �-Sm��-G�on|�!Q����q���ݠ�!y��m�e���}S�/O�/ӽ�R���æ �����e��Nf�p#V�aX�=�u�N��[��bFIW�)� [?�O�Is#dF���m�%.zu���9��KP�W�*�65jn�M����[6ZP����(�‹A�

ѝ���:�,&����P�h�D��e�
$�V�&*G��H��$����yt��'O8�L�����?%{R��z�ae�L�dq�T�Х�\��`t���FŸ%���ċm��zM:<m�=�i+�g���R��cb@J����~�W��Ë).F��:m���ЫӀ�K�?����	�)��d}�=�Z�rFt�3hT,�K�r�HM���T
zLT��Ɍ��)㌂�SZ 8�Ԟ�����{��(��	
�S�fc0t�s���!c�(��ˣBmrF�	J�!D4��ʌnސ�D�5˂�Uy��R�=7�g��R<8{�e[tE	o��ᝲ�)���֎�o���C�?6��$�\"K?:ٙ�~�Y�Em�v�����wp2W�rs��@���J�����7z���(����\}�/�d�|�YN�2:�m���~���im��eD�0�UUy$�����p��D,jasOA�Su�ja:,$y�]_�����[��yF *�����9�&oM��T�����蛃T]��]x��\���r}�۸*P���o�/wCՖP���N�,��Ak��1���^��ھ��ʽd�ϤB^[�ȇQ����"HPhl�B�=�I�����e0�wO
�Gr1jӊ��k�QI��2쒇�ݺUU�Uun]g�b�����􋲤�
SmD����e\�l��B2��s!��R�X/c7dr����]7޸+k�éz=JG���ە��C�z#n����c?�����C��;z�f.���%s�R����\���#��i[��$�5�S��9����HKH�,*�rݡ8��D�	K�G��Q��E�,�L��)����-��e���o�����&���7:�_6���I��@ҳ4+����?�q�8��?�o����^��J@��f�d��,ǯ�卮����3
��`�0N��ζSeH�����2��;�9n+������{��Z��vՕԹ������ʫ-9=� ��B��g��^yg�G�I+�m~�޼��U[�ӲM~�]�!��/R�#N�_J@=�{h,��H���L�ş�d�����D�M�,��|��edGN��ϑ3�|�U��!���췃G����B&#���_���(yaP�ޤw�X�zLf��M�P�P\t���5�v0x$%���vME�!�ԏe
�&b�7�N�����<o�W:�~&������i��@w��5��Ğ
�<���k�Z�W6nT�K�����Gt�~�=ǰ=B����k�2��c\��E�eDmڨ�˸#�U��o�q�q�%}�~�ܛ)'-V�jU*�-�c�Ʃͨ��$J>�@~��uҋ�s���r���{��k�W&?��2Ik�������J����f�k6y��<9ϑi�W�?D����%��K4���W�d]bQ�H�,�c��+��}:Zb'K���(�f�-��I�@��;�_}�Q��b��&(ɖ���B�̛�qC	�X<�z�0�ǖ'dyB��!E]h*���|�M&�J�>[�����w*8��� �$����G�z�[��oZJ�-�V��=dk���4�
��&o�g~�bN�����΍�e--�&tI�y���|@�jJ��֊��<o��'�������r�ѫ|��N,��
����j�Y���;�v�ad3�!R�����b�H^�
���=9�t4�a�`t�L��>����5y�g�-�=�I�����u�3<TO0�]�	eЧ�V��X.7�Eb��ni����lۦ) �aPs�)(F����&+�,�	Kļ�:���EK�JA�&������lOI�ژ�[���7gV;���u����
o>��ǃ#"Հ��.	W@t'�P\��<��w��4(J��05�c��8��;TI�;��W���!�z�;{=��G�*���a&�]��G�`��f�%nj|7�{\�$�(Z TX�W*
y�;Pt)H]!����=?���b|1�\�L�ۨT��e�+�(�ȫ�G�5F�:����@�S�fZ��	�:�]�9��%C��Yzt���i	�p*]�*z�d�w����bǯ����ߐ:�r�;iI�$���m�r��z���3-�8E�[Uh*����O�2y\pG4��-��#�A�������@B
G�4}��Gj'�:�)3j㴥�%�	(�m�9�����O�?HֆKf���'���b��=�(Gmk;�|>�0�i��ejE�,�����׿� ��`#o�g2�wR���?�{t�V�X�toH�p�(�����W�>J	&��SfPLd���t(�H�&��Y��I'����:j��h��yA�7�1�|@�����}��X��좈��۱�G)�(N���>9$ȸ�!!q�i�-��2υs<�"���=;+^%�4��%B3�G�S��GQó�D/T��{j��ٱ�Od} �w��k2>VH�14�v*k��<�c=fG�	)�w�<a��B�`�#�r�Р��ן�<�p}���5(�MF�]���,�C
L
�<0�c�ۊh���PL.�Kwg_�
_�=�7s]Op��7�����Z�-{/+���U�{����OkV�382"��|�
c;�Ύ���03�����|�S�x�����34��RkS�zgx�u�|m�O���7�Q�������������B��xrU�]{��W����NG�ND�X<� ��dWB�?�k�&�%k�~�X4
����B1���^��픢<C��(�)�|W����{��|�L
�c|�T�ԳE�ž7�Zǃ8E(�>W^������B��7��o�uq;:(松8�h���+%V%�֓��p�R��Ż�9U2_�Ȁ�8��Ch�8�8��P��w�S��$s@O���
a����
>��{����7���=N@��Ԋ�������W�ZJ��l��o�z�K�*�f,�b�v"�:�9i�c��[w't�i/���7̧�e+���U��zL��ယ~�W`�W���K�,ʔGQiy��LV2}�\~�m����C�����6^{�}�n���;j�S��25��+;�w�	55F��Y���2<ͅ$�~���!�H
jE-��d���ο˔y;:��i��z�.�L��6�S�&�c-��Q������pΊ���"��ő��ت1��ƀ�����>n�Ļ8;v��e���:t�׀�U'	��]�8�O�$�g�)�9k�n�3_�d�����-q�X­�����0�{���ĭ���)߈f���>|���=�/�8)U�\�����:��f�
�^�}C���r�BEv�t��[3]����'�_0�6�׵>���G�û��K�13�D�	m�qnj\K��ob�$���1��0�W`��	�x/$I�˚�ӛ�{
�0I�&uI�D��*���^ߤ'Í_�(7����"�"7M�}'iy.6#4�q��'�9�1ELvmԳJ���ʓ�ȹZ��z�`7r�S��R� fvndd.K�FΚ<ϣ)�Y�!^��ο9 f��%H�E���,ߗZJ�~���}�e$)�����m��ӗl�a�T4M1u�������]9� Wd�|��z�x�x(j�
Q.*w�t1��7����e;
Bex�]]:�]�K~GtN����gF� Y��m�m(@�4/�rZ$�oh�HzHR�����q$���[�u��/�
F�
�
1�xI�#l��օ��S�4�iPZ�n}��$�<�"�w��,���*ol��v��0�z,Fo�|������I�C��2��L��������bđC6Kb�9XD ?���9�E�B�o�S�`��_y2�0�u�-ы�>H1�q��;���E����i&��-�Y��EQ�~����W�g� ݡ�\����2EZD�+=ʶK���k��J��,n��;��H��R�5���Q�{��Az��t�f���|z�*x,���%�/
���:�ٴ]_Eo_&k)YQ�P�<���`ʭ�E�W�FVZ��%��.�����4m�.�n����x1�]`�w.�޸q�5��RǼ/��j�K�r{�c*��o���E~��Z�Z���b �|����K�Cx�/�i�S�D�K\�̧Ѕ�ƾ��K��l�I�/��{@+���_P��G�<�&��Nr��xU��m[�m��e�JY�����'Wv��6�m�,��;K౥{�]XX���̏8����=�x�����^��/F'0jgWw�V�п�<�vu��<y�7�Ro�M�O��N!�V���z�fK�B,G~С�M��Yb.Rؒ��<�Eh}l--��ΦSive��ce�>���
�w4C1�o�r8.�ڠ��A.hh�-��_����}������Ԃ��%�1��*
>��̷�TP/�o7��y?�y��IEk�ά��D]�Bc��ȩ���w�0��f�i��m��J�ŷZ7���eЪwD�6%��̔���V�J�z-񽺕EP��voO���HF=��y%vʮ����}U��nf�Ļ�#����]U�wH�5!Zb�f�|†�^���F}���y���%R�b�
�� ��0=��`s]c�Y1_�
 
��y��~U���7�Z��z<R�;6j�B�9i�L�O-Q�0ӱ�E~SL�~�2o4[��iC!\�qxꂲ��o�����f��jݾ���)�F�~��+��l?we��PUu����[ª�F�<��eu|���ӻ�;0J}�iB
��g����K�$8
y]��&��g%S����E��[/�Y�)�i��,��"r4�p��9�a���V�?����E���r�
w;���Q��3+��J=#��9�|���Rs�[��LL�1Ž/3���%2Y���av�0¸�(���?JIx+d�k���)`;7F�(���GvK�>��/���c}���
�V�-:�����p���N+F��F�2i�=�aw.���U*���YAR�	���4S�$�`"$��o��HN�o#!腍7�߾X�xZ��m0ҩq̏��OҲ!�e��:��n7�jk��q�R��������ژ��gWG���S�KS/_�M_q�h*pb�1%�L����~�>E��-��7��똡6��P�ի�<34֛�3?��\�q�=H��K}�K3/���%�����se0n���K��\�˖̝(%�z^Fȷ�=��X!Tog�DG���8�/,,��|�JV]��g:pﷸcە�I���^k�8%U�!�Qc��d�H5U_"3W�^����&��+Q���%�
)���#+��v#����D�8�4t$k�%����N�C5ɮ�ϲ�:���F}ɘ� ��h�H���7���k�z�r�q��%���Q3Q���Ց�ܵ4��x�*�2�zrW{3��*��=H	�-Itu;�qw��k~ڠ��[{���g5�x)]T�?�3��t��<���G�+�q��!�b�)�.�2ФK��d�~h�������sLӕ�"}��Yx��!H����������|�"�M���ډoF(�9v�fi������|5���X~��&��f>&��l�/���5C�����?K�/����)��—���B]�BX��;���,b���SY�i({J�x��hLw�������
���h�:�VW��֩ꖽd9�q8%o�������ND�/�ظ�a��V�yRm���k�Z@6&�W�F�Q�k�2к���*�^�o�DaX�o�Rt�咅[߷�l"�K-Z��ɡ
'�4\/��8�k#�|"�A�N��k
��"�n=D���Т�K��T?j�O��-'JY7I�Y�C�\��h�\�Di�R��PJ�E�jP�~0ڗ(Et�ԍ'�����J����!�Cq���ͣ4�.!�M����Y�[�x��i�aL�.��?����YC�%-$�D)W��5�j��\�T$F�l���s�";�lfh�t��5�9����WQ_"����ϑ�4�Da�i8��Q�Z/�ʠ�#A���q=eO_ ��eN�Q�#uU�Td�+�W��.L�I�y}e���Y�����s��h�m�����×'Ę�y�c���6�Y�>���<w�"��!�/>x|sCն��sc����\�pK�w`��*�tj�M��XT����͈�-�c��`��-c?=��	_���2�&��J	�4��u�n�o�o!u���b�r�aD���E�p���9���y{8G��^\�GU��VKj]��1���h$�^��{��w����}�m�<��
�lCHH��1< �����!$$�/$���#/��_��n�53�v�{����Gu�����W��ˊ�[��r/^��ݙ:���I�H���ԝ�๪�׵H��b�U��@�
�x�4�:t�4k��4��W�S�.q�9�%6KpR�8�Ѕ�E��T<���_�����!��N�����91\{�rE�Z��Jؗ�IT��N�"Ġ#b�*�qIP����oz�~Q2�
��@?�i�V��`�4X��lq{r���W�3�.�����as��[2*y�!��F���+%K65���������HD�xQ3[�LR�4S��+�w�4A��P�b:߃���[�l�z���5��o����D���
]5e|˻̈�o~N8M�c�&=[n��,MG@�*Ɂ�F�ӛ����|<%״�����3d	}ix��q4	�E�S�����pE�lN�P���^�����v/D�/T�4�/��15��M!~}����Ax�5�ې��MD�({L�dW����ZQ���!MWxH%����-�^MP��E���T�W�w^��	,�0�?���]���[V��v���[�&��'�2t��٥�:Dl���r���
Zș���QR�>gb3H��eF���r�a�7�OfA۔�x��e�e�8�d�1�$�htR(H4m���C�����1B�	SԐm�Ȉ	ڞ$qI~(;b�63GۺY�����	Y9��e�ʻ���,�����GN*&������	�,JIE�M���_n��8y$]X*�F4Q+i"R+�Q�,||��g�Z��ځ�3�/�ޕ!�F�̔{G�B�� �&әn�
T���l���g�en��5cl���;d��K��-�ֈ D�	��+��,�)�F�ެz)�����g�H3/�+o.�j�L5my�cY�
�}�P:��s�����BA|���#
DXS�s�|Y��ӈ�e�i+�������w{�۫��3DP���3
"�X+�<��I�$J���E�˯��J���r6��8�����W�l��:��f�U����ھm����![Gc�{���_
:���Şu�>��[�*����z*Ř�޽���&�U%Sq��}���r9`Y#�-�0/0���FrF5k�a�}���*�8�\;'O3)�$���W_bOD�涡��'����';���;f2�y'd#��&�1ӹ�,&�ͷ�({O=ós"*sq�7a��讝9�1Ơ��/\����Ԫ1@8:�a!%U1��*�%W�f��Q
��'��+"�bM�~��dy�mSZZ+��c�Q����bE���b���B��Vˈ�>��I�}�I�a����_cN�ľ�O���<��4k?->}��;��LdX �&9����{�{/�"�4�r���F�������
"����GE"Kh�R��A���S���k�t��#i?-)X���>���@ta�@����wEP��h��v;�=W�G��z�M���L���IRI4j�r@��[]`Nfv��%�GS���k�Uӭҙb����'d,��o��K��(�TQ�
3E�Ħ��BH��f}B>Ӌ5��wy�%�GS�O~��6O�E*M��	�2��|���
��.��x�p�]r���n3��hL�SF���v��Ϥ:�;�3��v��<��7�B�y>�x�R���	��Y��]�S�U<gt�#���`Ֆ;��(���m\�~FƒB�i_f�=�>F��҃&X����s�~�a�-�ѹ����Z���cڀ�z�̎��g�U����k�c\W�l�yJG[��a�F��[������Kأ��˼�S�Dӳ�i'{�@�s̼=�P���R=5]�S���-/�2��х\��x�1Y�G��ؗ�/Q��t��}���([�.����O4��H�?lN\�bD�2fW�0����4�x��`i�G���ľ���~\��#�B��3n�Ço:\m��cm�|��.V�G�"�85u�����n>��x��m�(
�帢fUu�E
�	��m�L�A6����Oz�Z�Q��>�b��ժ��i۵�G��st36�j|��6������#)�^B� ��_�h}��k�[���0n�@A�⠠TNn���`i���1��1��WP���n"�
�-mt�K@�쁃\�k����i)�JLq\,⸓�%OpZ���'ə�JZ�R�3�Ìl�k�����UQ�!��$#g8��ȇ�".�%!j�<r�'VT��,B6��]�3��j�q�ok2Q��Df�H�$��Y6dI���/���f3�Q��W
|^��jB@"q��m�PAI��[|��C;�4!��
��MU�����W:�0A����JUB"��_?}��yfCh�0�whC�_�	3��{��}O]-�/"�����ݹ�G�hvH�ƽ5���>�c��Ƕl��|�t<G��ږ�(ǿ
|l��'��)OP��'���Q�%�����xh�v��){�uշ,����-k٢]e�6�(@$�K2e�����-
����
W�%1#NKҴ������M@N_���ʋ�a�ma{�V4|D��y[��[yD�˾�u�������i�"@��0��4�-]u��\��ӻ&���M��z��};s/&�q���ss+s���ͨ`(�{}#�ů��3t�׬ͷ��9oQ��g���%���o�ׁ�W�ML���Pم�1���]o�����y��#�u_o
5F�lL��i��}�E�o��A�y���K
B��"�|)OnB��X�-ˍ�]o.���u��MZ��3�����(��(��tf�IJw]#S����V�Ww�,DG^�G`�����)Җ�ij�Ex�X^(6׫ݟ
5��p��p	wZôcv��_�R�>�1�l���G�
���"���rV�4���G�F�{�^�j/����b1�X6�r��cͲ�+o+n��pnk�u��8A8��g�����GtS�Vܺ����<�6��涺~��0�;���GY�� =-4�Ь
˅'��6�@j^(|��#A^�V��WG~9��3kdPW����P1���cR"%#=��.��V����2�kf��/}_����i&�N��ur7]U��j��H����ΨŲ H�t9Ee
VS�F?ˏʻA�dn��_W���4x�=�d�H�З4M���!'^�@�W�C��2%�,=kH_�Y�ףq��Urފ��틵�?��2Z�V8�J%˭U�}��)ʛbw*ʍ�وz=�x��^t���SɲH�B��c��#!G��2�c謬c��,�C��^Fa��e�!��&.�yI!o��m�d:����D�co3�����bV����RUF���̌�vߥ�RM��Cj��y�C>�Ñ#��r"q�8؆p���fr���%�bY�ۋ�%c����-��Bb�V��>�5*�l�v!��#�F�qCT�()��(��\eD%ORղ&e3�^Viy����5h�pYݺǎ? �8�
q��YѠG�����Ky��rE�L+��Jb2��O%�ON(Qu�}[�(�-%Bc/ky�#;���~
T��k^�ez``�Վ;y������1}c�諼�0�'�M����P�"��?0�gx�^2��p��F�</�"��z�:D�/w<=�x�������V����pwD~,L�����6��0pJc�
��'�H��j
�N1��R����p�v�Hbb4!r搻e�T�Y�tW������7�sgv}�!R�ݯ$�(���\l:1ԗ�^St�p}G�A�a-onԆ��܄��	Єz�&z�^��*�����W���ʭ�b��S�Pc?Y��$�?��{��j�?WqfM%��$�%�Z?o$��=e8��f��F�����K+M5��@6��rI/�@x����}w�]7��ak��b�Vw�t��i����Q��ў��q�
F\����)gJ�v�	Վ��d�bjɓ+���pE<�1�T��9����}�'ط=��~�+
w[f�3��,�~�*KG���L�.�K�?.C.�J���*�.,�1&�IC�D��jU~���E���b-}�G�V��ҮW�N�"��w;��DUTIg
�8>!�'S>��n&E|��Xpt�9.q�v�ф%��g��G��|��rP�ÇtP���1z;�3�A)�2�=��/"� �i�oz{4	�%};����c�X]�H�U��t)dKcy�Q�g|�1u�L����ñ�raɇZ{0�j"�֤e}$:��}���ʆ,^�">N��C���إ����ge�¶w�����`>�e(�\HX/����F������R��P'[�r�?���~��`ʛ��%���j��V�o�h#t��'�M��M�q6�"��[�|�v���/�?O
m���$�����gc
�#f�>�I`���E߼��>�xsC������:�����LV+�1�m�Yʜ��%��e�-���4�Y^�<�N$��p��9N�x]nh��G�|�{�j����?��x�-���E`���l'^���x��t�i�liof����ŻE_��v�ȋn�c��s&R�}��{p�,�!��j��P��w�Z����%�E
�36,DH��ڌ�d	E�$�vM+��Z�����}[����I�������U�w֮�2��f3Ê�w��/���L���45Yt�n�Y���[I�����Z�<j���
��mEZ�������u,�ﹺUW�Vp5�?W6h;��B�-��g3�\���u<�u�_��'�'���D}cj�ʼnDFK��L�ڝ�Ci%3{���4T������:�t�
ͳ���)8��A�9��՚�p�gLq�i��ݙb��9J�L5���*#�U%ɐ,��WC��7�ׅ	Q��9�)�l����~q8�X��o~�>я�{2����'�6��//��sx�T�2��i�����ŀ�$#����d�yy;aQ�S�L��Q�=]����=#6�2�m�XԖjcc�ڇ����j��YT���=Z��R�\�'*�<j�T�e	��D�IE�?�g�d�6�c��~E��Պ	��}$LT�=F&c��Q	�xz!A6+��?��f%1��*�9�f���텳/�_B�ae�A�^�#��C��t����-��=SŖ�6~�$J��~;-2���h���y���1�E�i���o�`=!lMF�!gM4�y�o[YِM��/�h��.��yÐ�!��{d�ț)i�p�؍ׄ_b����4#Vy™��/:L��%ӂ����-T���ڥ��*��<�,#h��铧]s�
�<�Y)��.�7=�c�չE1��p�铦�����ݳ�%�yx���S>ֆ�1���w/�aG�`�1w��ܢ�sA'џ������3�x1>��ɘE&��-��M�8v�m�t:T��T�aǵL�/g��}*c�y]U�)a��y�@��n7�Q$��lj����{ML��!�t�0�q��%�R�`r>7RϨ�߳�M�{-%-��b��۟�����m�/������[�i�[��q�	���;�8*��/�����+\�X�eܺ���o���`���o_7��pl�m�[��E`��<4m��iӤYko�}�)y�^)e�`�=''�|�St<"#T�� �����"�5��Z	bj�r�����b(r�zaŊ�,��x���-+��C;հ�hZ��9�O�ef�Xa��-/g����ƭ�G}M3r	mR2�Fon�}�5���
ۙ�䦀�,Ibۣ�R�����X{lR��l�ŏ�a���cĚ�c�ƣ����Sa\�e�S�V��bj���-�B�P
�zg(�y?󙘤3h+�ƒe�ts�5y�P�j�ɉ9����4*�ܴI��UpR��U���'f�����v���Г�!�d�%T�,G��4�e�V��/�gs1�$�+F��ݡX�.t�^3#�\�U̺���jb��)�v�X�#!�ͫ�;^�M��]󑥂�[a1�A���Hd6��y�"QN�q_x�7�_��V8�7Z��QӍ��JwEAuE�>��+���a����z?sg�<�@�:��ϟ�~���Ñ�"�Dn�(W��k�=�y�^��;F	0�E	�u8)���Ѵ��>�������5�9G0��X�s,�I��+V�%�A�&��[
s���*��FS�)j�"��NdA?�Ll��B(��l��k�4(�.��*�g�)۽��O��߉V�>�a���O�f��m8y��7Y%��Χ���ˌɿ���Î7�pݟ��4�e�8��q[y����>XN ����/�f���N43<s�Ҙ�m�IX��a6��w�a��)��d|�
{��|ne�)�=�^��r9l�j�&�?I�<�� _���QzT�:}�
}yx���K����H��4�о.�
��
�T+��~M�D�hIMC1�GV���?�%�2����ڀ}|�e[g�6�H-�|��&.��M�̙Έ{��_�D~9���B�S?U�K�n�F+�7�#g6"k�߰��ǁ���Rp��Sb1�ڒ5��6�u�F=�}�Z���xjJ�-Ag�%�?�))���|_0�gv���%|$�
� л"e*���LFp���I�DL=[���3�S�p݉� |��Ϊ�C&��1if���j�.��k��=��B!8�e�d��*�NS~��s��sE�n�Lz�}��ݨ��K��K�$�����smzN���9�g��}�~�����ҧޢ�I�UD�b�u�3l_���D6���Ȁ���^FB���R6����v#�AX�_}��"���C���.��X��:�X@l}(����q�}�X�p�H�C偎���0��6�S�t��L=�R��X���r��2��iX.��t����a�t����n�;��*7��Vw�3��<�g)��m���=2�A�~Ӈ�i���`+�V8$���ĕg�N��f�]r׀
�%��(��龕{����fY�wf2���}���2�G�d��M
�h�L�u�O[?��\�Hޭ���ҕ�MN,~29�HKia^��|��"Pe�;�'�nT�����dyR����r\0���p���h����/Om�MD�����pf��F'r[��
Th�t�67]��h�`�+�jP��]�LU_�MA
��#s��޻���ց��E~��
���#�H��x�?.�]����ܛ�k��r���'K�Z	��-Y&�Nv�z����cf����1h{\ƙ�!:�9�Q`٣�o{�����}�-�6���,^��?��r&2��U�\~
Q[�(�c��ӑ;�+4r#w�1w�i5��TYB�(�	1��9�,:�?�!겊�������v��R��a?r�YN!I��Ҷ���v�J�j�{���1�V��!Z�2��8�ffSJ=@r�n3T�M
W�u��ɡ��y�oh
�z�Rc�]1j�cĪj:h�F�^�Q����7D��BH�*�5��U!��k鸀|�›�m>�b;�����HT8�DP=���o�N�#��]��/��1��A�9j�+q:�g-C���K%{Ų�yd�T{1<��/T3�׫
���}�R(�1G��;�%�Y�>�?����-�F��|bI�
��A=�5�c[��D뺟�d}Z�s�)Y��}.\�9�ץM7�SSS���ć�ga���.9p�	v��)M���n��&;�w}t���������^��_���M�w�X���2/�������'���9�U-|�>CN^��
��&Փ׃#�s����i�l0���>���ƒ���H5O�x{��IbV�%U�t��y�y��v}?��o�a�{�c!�=d@n�Œ�E4�-J�O����H�_��<�3��E߉e1'�j��3�*�D���r"�I�0�C{��V���OJ�Y-��N�NJ�d����)����
�H`�f֑�a��ӆj�
�SegJ�����Ę�o��hƐ	N��풔 �jY��`�ߌ+���n�2�:����iz�n��}s�}��a�<5v�K�uI�tx�U�蒇����=�M�u��f�95S��ٯ%�b`��(���7�]�JO�s�����X������s܊���[�~0#�V�X��Oيf��2?;3�F�E���E����i���Fx���<H_& d��Dt�<���$�a<|uA��B���1e��"-�=��>��6������e	��ف�>	QsժH?}�����	#z�NtY��,��C��]K� S	��چu�Nq��c�k��b6;^`B�o��Y��!pЋ��d՞/��8�$�N��
&t┫�d-/x�E:�I��Uk�d��]�B͋3Ơf��H��n����LB�&S�J�B�@�Dϕ�)�&AQ�?�A���O���ch�G���;�Y��&��
cC��+'�������ٱ��8��Ǣ�:oh�mX���X;S�1#܉�b�����ϣ�諑xd2rO�4]�1a�����Hz2�c�8x�
H”�m��>c�Z���L�����5�)����q�N�^�X��� �r�L�c�<��*�&N��U	EM��`G�wb�$�JU��o�qH�jJ5r�(I�@DULb,G)]��<*c�L+��$Z"�D�DKH��uQ�(�O�/l�'2�Kڊ"�`)�4	F��%T��%x#I�g0&t'�"��K���Lj	��&I�� ��Ŗe��J}��ВI�Ve6��$�Kt�e&3���s@����y2�	��H�}\Uw3(��hIC_\dI���
�m�V�Ǵ�������l�>�F���`+^g����~��˖��� �:�TOQ��NX����S>p
q˙ӷ�/�F�ՠ����.�hi|�>��%��]�m���p�2j;���jT�T�J�~ؿ�lV�>V�Y3���d���Eߟ��苑Y����n�4o��4�Zr�2����I�rM�e5����{��v"VS
C׍y�U'���_V ���Z�'�W��C����=�C�7�a�NL7����Z��'1%UF�"}ݿ�� @>Vm@��іv)�Q��ѡ�A��qψ5�<�Dp*�V�0�T���}�z�����<r�z�M
��U}�`�a�N�\!�w��8��e�?��*���>�]�V�le]ec�Q�=�Gu,mI�~[�rG�u�UV\/MO��Lk����N��!�o��h��E���WN���RKp�!�T�~�m@��^�t��σ_:����Ģ����$)��n�@U
Y$�l�v��
�[���P���ja27��*�^:Q,&)&Ij�6�'J:؃�Dn�rٕ���Jddd;����H&����xiY��-���eD�<5j"���Ee�4�X�˗{�4�}���@r�d:`O�����%�?�=�$��(#$��z^I��_/��ؒ��W���9����w�w�B���(/_��p{T�7C�4�<���@�4D��!�<	z�?�B���<�x��S���Cjm��o-���QF���!?��
O����г�sqb��Lr��ӓf��G�⦤b�\�m��m�m�"G)G`�ڡ���ߨ�}�k7���$?-`�5�nH𴱖���?���fCbJ��sXpP��#��i�j�G�	�m&C�F��
%�y(�~4d��~q��O�\y�%��0��D숦틖(��P�9����}?H��� e���E�@y�F<y���noނ�8:�<��
�_������;6�{_ߘb9�����^��i$ʛacpj6�V�ڞ��h�p�mY:��:��2h_zW�m���R�_����偸~���q�=ʛ�^�q�9hd�C�6�"[9��?����f�Q���N7��h���8C���zX\�������}rR���]}9��E��J�!�`�j�Σ��f�P�/����t��qd���T�Ѥ!���G���6=�Q%|��bѢ����{%�a�}o��v���ϳ�u6R�@���ȤP�iJ��9��Lj�R�4KX�L�`��o�	�H�=y<{���sZT8�Ɂ�'����V|�A��1_�7aO����a��a��ل�ay����U��v��{H���r%l��b&b�Irh��#��6�3&�J���͛=�˔j�e��|�0@v�h��n��U�� ��f��PP�G흐
p�~�ٿl�O�v��~=cb���5�o����!�!]��#�@�5���2�����a���-��7��{�әb4� ����ܜ�=���c��"�bɜr�̡�kQ�*���U�'9��'m��|�'O��T������%�oƥ�׿��)�!2S�Zܻ����z��Q�k�C�I����i#n>b����Vo%�\4Y�&�C�pN�"=���/�||�v5���:u�E���Wm=<������+H��ޗ�t���f:9;��Җ�o�ǦK���S19��bx�"���nH�A�ۆ]P����c�Mon�!�17;X�� �řp.������"
',�J�1��TbX��;��4I-���@��[@ƍ�������A�#����j[�sR���3��^�yp�R�f�v[���޼)GE�Ŗ�]��,˖��M�� �3��8Y�et�W�ۅ0��1�D�0�X�/N�	8�uL���ԕ�&�@+��gc��;�8�@%O�jHk�4%���&_�7A�;P���`PCz�����d
���/��Ͳ�p�)�VEZ;�x֣�ץQY��g�\�A�M�̣� �F��Hт�n�7#F$���n*�D �:�/����&*�����/CE�ޗ�f��y|cB����]��q����@��[ϛ�&ܞ�ج>��t��,��@[������\�6K��[9c�?D��3�?,;��=+��=��|���#��XP������l���`�
��}��/+�%��w��u*��<���y��o�9�n���R�U�_�Yߖg�*��o(9z��� }mD���q\�7��$Q=�>�5���Y��€��=7V´`���&��>�۵��{?��br{sTL��h�P����i��E1e
�����B#<��i�M�7�9�mJsJ�ܣ��3����h�r@y�in Clv5�]1�����k��t05��[�ݝ�]u)��]z+fs�65�U�]d���ђ���{��MLSGoR�?��M٘��)��:�Z�Ĥ���~ЗV!!��Ȝ/Z���e�
ٝ�/���٧�RĤ�߮��#�E~�E�%���n���HM����* �'9�'�=�*�F�AA�P�P�6N�ޠ�r�%�1����A�h0��9}鐗�UI�)+Tg��o./�,n	�r,�y��XD�,U5��tE���mD���evYCt�>t�V���k&���E[b��Ⱥ�B1li�0]�4PJv\6��h���[�1�Lt��-Ë��Yڝ���7k�h���Ò� ���
��8zD�%[�����*����"���e笲�|��fS�U���-�cH��#��&5+��<�� +�*q]T�\�V�-�SX�Q-q�C�g��.�+;T�Lq[W^���l+˾����t�����h��S��ո�Nq�꩷�Ѩ*�DD�c�F���>����m�i:�=��SA,�-�}��� ��D�����zo�8/dj�g��ab�����ퟷ��~������6����͑�ؓ�~���w�$�ST�ԡo[s3O�&�w��ђ�Luv~,�>�N�L4�l�rUC�>K��L���߀$���H�+��=�賞�}�su��z�sk\����=>��\�uS�~����GA`=�0�8Ǥ�k �p�4:��o��Lj���]o�nAO�$f]�M�iEVDl*�������&�E�ɂ�G'��:�a#�U�(�)�DDIrEY��ߙ����� t�$Q鯪�mA$XO�Y�+�d�u�Fܦ���Ĵ$��8�R�$��H~�����b8�=���<���v�7֖��Cz��[hq��ӓd&p0�A�QR���F��'�����uȢ령GJb�҉2,
�9��eI�"A$�V��X�u}�0�J�@!�*�:�a[�MJM�s�xՐ�0��JR,PO����B�`����$��~	�h�F����1|�j*Ī��SՇ��<#XD�U���8�<�pV��?{��/��A�W#��&�!I��Eֳ�oΒr&�7� �4ڽ�@�c�dAJ4�����E"��"x����1�e�>-��E�M�$ ,�t���aўH����2�Y
��v�()jT���}"��_F�35�_�.E$�J�7SF����D��1�?H
�m3�W��/属�����P�5˔�i�v�V@�hi�y��<��J��Σ���(�[`�Y��O�wyTu��7��p��v��������Tu+���
8�~+�u��q�S\o�a������v�
B��3XÈ�u�B�?nՀzF�ik�ND��S����!��̄>�mZ��(BQ����g�V�NK	Uݰ�>;P�5p���9R„��0�A�<��B�Ž���ZQ3��*�Hx�
�"E���^���T��(;ɤ#�$?>3�1�t�W��T5_�C��ň��?�ԏH�O`Zȹ6�>9j
��D{���_���E��:[P�?����O���N�ڢ���b�q=��X�*N+�Fb)�dz6��;U�r[C��D��%Lό?N��a���6�\Wʖ�_�c[)I V���cٖ,Y1�Rʲ).�q8��b��?�D�T��{��S�E�	%�#��(}Kd]�t^̆V6��0yv4����7j����"V��Q,KYbE�o6¦(��QetTR� �FG��\���ãC.g��忚�l�|���f�z�a�q%f�.�I*/�
���x�׾:#�.g�,��~&��@	ʀ_�Z�=��5>d9�_��cy�A�Sc��=y��B���C�_��鼌�'Q\�DdV𗥴'�$��I��&�wВ,������z�H�Ɂ'_K�a!t<�2�	�G�&<O�J�H�,�^9B�2y�G��hn�;"�S��ܐ���kB��\��~�0x7��Wɢ��sG��3�(���'�����ޅr�	��U�'�H�e�D:���rZT�\��B�_C�+A�<x7(�m#��Vd�R�5h���ML��	!)�,�fL�/�<�����4ZG��@�\��	��4��w)$�z�R��=r��[�aS��Ҧ/�&�n�7���B�8��-{�n��~��
A8y��W����V����
�w؏��2�F��f�d+$�a��@i0���U���WT�q�!x\=xů�jA�T͚��Ő��`Q�S��Aq��7f����HPߑ�t<�}��/-������Vt'e�T)��]X׶m��W]9wm��6�����v��s�-T9g#ٴ�H!��@	M�S���t�y�bW�RR
9@'����W��+h��%��5w]�/��޹;З�?�i��6�S�dVQ��C@a�������j�YJ9��ؐ#bv���Nh�0h�,f����V�&�0})G1��@��U%\�W�$l�jX�2����CL���1*OF���ި�'��t=��uG��~�˫�����_���Q��y�ן�"����b�/��Rܱ�|�C�����G���>‫�	i	�s7��5��Jy=G9�OC���X��Q@�d+tkC�7��.��tay���,P��'�ly�o��&թK�7�������i'���΋)TQ^2es�9�ݢ�f�a�}����ַY��/�������S�p[�V��fp����+M@�v~K���{/�PA���?i/g#�D�#Av�Z�5
J
�]��)��>\����)�ը�ݧ�nO؅�{��.x�!&�6!c�C���O�nfn7aأ�-�@��7G�bY���`F1��U��l]�S��s���8@�DiĶ���m��}���p�&��~����v�ϰptd�&G��鎎�U�-:���bh	��l����pQw0��[i��jTvz�|�x���p����b༶>G��
�����x7x.�yt
��{�n#��]��\��u���a�W�Xcy|6������`������zw��w�����.,�j���5?OP>Ҏ�\�tG/�w(ɷ����V8�78���g	ϣaf9��B�3}2|��d��>����W�D�7�n�����k��\ۻ��f��S^�t?�w.��n�}��!<=S3{)��B�0�Y�)�2Շ7������X��w�����>�^��g}�\vJ	,b'�pd��dxL+�9o���e%5�B����cD��Q*B	���Z�A}Ns@.K��R���p�P����Z�?�!��\��U�s�~�h�X�p���v���$�7^�7Gz:���m���hG#��T�<�g�
b�8m�Vu�	�F3mH��t&�6�S��Nh�'����$Q��ϛ�gjGW{�*�VO�˚��i��$��
[�k�J�}�֙���夠�0<[\[�~1׌^?=)V�r�WW,Sټ��DY� S�7Te�8� �\zO�	�3έ��=�Q�����H�^8�"�NZ�駦#�ú����mH�%r�"@��ش�=	����B%L�Fh!%$�J��z��:�X1�N�+��W��^j�:�S/E��f�tΣ������E�Mnڿ0k{x�
\�0T:u7c�+W����M��TT�F��q-�c_��P��x
ndW��b{����ǁ&e�GN��u9Q�a&�Q��p�8�|pO��?�ƶ'|�e�[�ŗ��
�s�����)
������#� �G���~�"�%t��e��!���@�h���L���5�^�Ŗ5Hb��
��-��_y-��,��h1��)��Y�߆��/��7/�J=���ND���qF+?�|�2�	AT�Ć&,�B��A�\:&#$\������R:]J���T�W���^Rm�?��R<�&�}�Ӌpo���@��5^qx�p���Fr��������e���zѨ$���2���;���a�#~�w�`#�,�-\D<2�~��0ָ1Uʚ7pϢ��&��Ι۱����%��o�ٹO���;����#S��|����<�媊<3�
����o(�m;�oLhw٫��-�D�!3
}�2Oe�t�
O�A;/C�^�Q$7a>��9p7�����ۛr8�0P���vy���l������y`���j<�6�\�pj����I}�����-�-$B�1̈	�]���>F�Q]?J=y?0�t£}Y��h��1�#��*���cb|�,�)�H@����'�hO��'4�Ϯ}�OTC%��2U�{Zq�R�3�P����q��wI�YF��2�-� �l����P�F��2T@>��b�{?�����<W�VFW{
�Jvt�X�B%�](�!�
��e]|1������Z<��^գla�B5�TALw���p���
;=@**�W���(������B��@��Q��Xl�S~��^h1���o�#���E���g�x�.���&fǂ>&�O�\�y|����+f�
�b����)�я�'�x���MF��ɑ�_���5G�I�0�O��"���x�W�c	���J��u/s����C��LH)����c��� ȏEO
D�tt�emY�b�Z�9�򸕖OF��B������5x7�wY,~)��1��b�Y��7�g7�!,��!�<�s��z��^�f��"Ɣ�'��wL�WMY_���g7�ࢿ�\���Ey��'���+U��L����!��h�>�
�~���x՛'��b��VЗ�<��H
�+j�>ɠk�j-�>d�JMs��Me�*^{�Dn��Nt�Xz�&��n�JU)Ӭ��������e�������
[�ք��i}f7�q���s(b����!x4T�]GeQ���
�Œ�K����LLL���d����@�_��O�����IL*
��(��F��"�����2|%ȷ�c|�zY+��b�Ch#�$x�!���yO^x!�p%@�tt�>r1/�~�ǘ���O�0m�uat�%_̋��8�A^4����x�X�RC���P(�{�O���hW����k�鶽��&oa�_#�)?&��w?u���~�/ޱ����)�i�T�*�e�`=�h���f�%�n$za���LWӹ1�o|'��Gؕ���� �~�E�]��,�sa�u�Ŗ��aK9���e��=xr�Y���'��Z�V���ⰰ�I�Y2�ݤ�=��|������w,���n�O�h��ۗ�O38��,/?�@L�1,��	h�ːZ�!�`�*O�9�J+/D�y����\{Qn'e(��Ҩ��<��o�Lז�&ik+6Řb�s[��9~�P�MHHt=���@��KDFN<%�ӹ�oQ��Ϭ�R�D�5Պ#�C7h�U��(1OOɵ�:�
b��UH���۵�Qg�����-�K�]�۩�5�|��u��ػ!�8ݴ>D��!J$ȫ��F&)?1Y�wg��+����c��,���(�!�FMl��NT&m�!����L�X}�m5���%�m#�Rз�X�s�۴/�7�h�΃���v���N��4�~�B}��9�N`��n� ���峑S�V��WO=ʎy5��B�EW�I9��	zxZlγ��I��^ePn3P��
��ቡZ+vm��܄�M��u�f2��~E9�.e�(�D+�v�/�(�s[%��ёlma���ʷyi������$��׳Fy�߁�L��}#�ܟ���l�%�n�s�,̷҅�Ն�3c��X�`11�>��d�?�=��hn���F]U燷dR�C[D,$g2�⎬�y�F]��b�+r�P!��<�����,3����_�ߟYa,����=nat�C ���?¶G7I��G�5F�TN�l�""�]h����A6���:�
�$�5�	q���%ׅ���B�B���:PY�F������r4��NEF9���c��971�U�'�
���p�x�!��9���0��c@��<��.��.�gDg�~y�kFoJ�qK!�OŊ�離���]꨺+}�δ�H^�J(.T���MJ{�J��;���b�M�؛~�"[��~�hݙ��}�6�k�.v;[� �9Pmk��`%<���b�d��l��s�*��Ta�/V��z��K�k�|9�_�Y��>�{�]��F����:�p/>��k?K�Ǡ��O��g�N��V�������Hƃ����f��w��>�SU��S��-��8ZQ��M̻`��A�D�w�;�a)�5m�F�Q�5V��U�y�w��,iC�3��G^
jm.���Ԋ.��}?�q��v���n���H�<Q�����nR)���#�iu-=d��:z�}í��ٿ���Vܨc;Q�к}�;��CD��ַiI�TMJI$�KBBU=O-�!T`��Ø	��2��>&�'���_�_ia�Ă�Z�c��3�,s��?�ޕ�f���6�BǶ�����ނj⿁��_�8���Ȧ����.�@�5�w��W�D�T��2P��
�����[�E�}�����\?�&�W;��U��XwF�ߞ�a��z�鮓�u�Y�����Ǐ�HV��ƈ���U��8�uYp�Ԧn�O��c�
�X
Nt��r;X���|̐͐�����b��l��NJ��FU(I����pZ��t}�+��RFQ5�4T+͡����='��tk�f,f�U3M���Ğѹ����I�-���4����WX��Ȅ.��Q���>�����*h׹�W0*X�E(��������	S�Ne�[w
�r]V����p?�`�.�m��M�ܡ�Jr���L>pPQ���C��c}y�����Оl�l��q}RHubA_�R�7�z�AW�Fӡt�H��Ն/>	f*o��
���Jk�ri�t��]���J�E�;�9��M2x�PX�?�`���:=�,|гmX�j/�6ផ}���Tw95D.};fgx�BGɗ�B#����hİl{t�^�:�P2}\x'��w���"��I�&"!R����<�x��|G���r��ܙ��<C|̞������XR�3�ˌ��*]Gų�A��&���q�����d���q5��@'�
�zհ�R6�N=l�+fu�܉�h��$�>{)W��9s��(�Sp�+]��:���F�]c���
�?����Wb��I��A�+�HS�h���\�� ԡ�j�Bcdb����]#-I�k��tzd|��l7*�����NR���8Pߪ)���~`bbf�L$l�z��2�b#.죮�EԳ�H��;���2J{���/��JB�BD�A����
�I��aZW� �N��vs�
&�	-��y�m$Yk��ϱ�&����l侑ˆ��a�fR�D*�N�76LHR��c1{��Eq�Xb�zU���$dR��G���7�K/��y�?�=��V~,�Ͳ��
&w?�v���	�N��(������˦N�u���9���o�ɛ�Bn�d1�?m|k�'�c�΋�%*;.��� 1�p!nr2��)X�D#ݟ�
�%h�RK�'�.��J��!D	a~��E[�FJ~2�!���H�l^n2�$F��
���!�ȿ!��A�5��/����7�KV�xs	�5)�Z���]�&����튥D�����{у,��?K�ψ"�1��m�HQ����E�Q{?S����\䆞�!a|n��<$��6�m���E��!�m5����"nƣ_A�蝌"0:�|6[I�0��xޫ"��Q2;�d=��$'���&�x^&���ǝ����ꕬ�X�*ي�e�Q�V�r�km����?���c����iω�GUB�+av�e��=����M���g�Vdň*�,{.�x���Aw���Ҍ�\��k����9��t;�E��0��"�r`f [?���&�~�/큼��O�<Nb�F8��bF'�g��ňw�<�"q9m�X�-��uLĒ��p���S=B4������b�>D_+��Nj$7�ƴja.37g:�G� b)Z��%�r1�S%,
���
d������ͽ���W��h>O��gv�Cgxz	V=���m�F|G�����:ah+]ŷ�V�{�ш|�{�3›З�t~]��ȃ��P���A�k@\rO��>t%��d��a���5��Z����]� ����L�_��އR��P�U֗�	Rz��
���$\|�!eY��v!�]*��>�!�i��.�=UA?4%J.,A2��&e���9����Y6�!U�dlD�u�����L��6!�7SS��D���-"#1��j�.|�ܘ�E4dS����ߧmwhC}�@�	���w�1$q�ȶ�H���UTp�yY�9�yCB�	�
BT�䢤Z�D��7b��H%|]D"]2����-BrQЕ��cJʢ��?"b�y�|ym��ni ��l&"�#�/Z�m��S0C"r:�|�2Z�D����!���}L�|���o���+>�N@O�DI��U�LD�%-�@������`3�(�۱�-9O�Sʽ�!�O.]&d�Ej�����6�h̵�9QP���JC5���]�V����Ie�a*�Q�	P�#�ՠ��WGt����ɍ����t�W�)N��t>Ͳ��1tm~$g:���Q�3ߛ�O�eYoȊz�LNȊ��Xc���X��0����˨
`g��v��^��%�v�t�����ֿBw?�BQ�[���(��,��p��Z/��e&����kMΥ���p�^&Iʾ��I�Q+�r��v�Ni_u�:��̭�P̙3q%���
��J����g�ʳU�
��*ѧ'�Z�Ϯ1���NP�3�2R�b��+Z��R�(â�*W�
=;�C�~O�Yj�Ѿ���2{]���;azy=��ڮS�A�Ez9��0�2t����$8�Jb�j��TU�Oqs�C_�Frq��u�+�ަ���n���:��:f�u�k=�Dѩ��Ly�K9��Ξ=�9f[�h��&]l����c�;����0�Ɇ�#���Y��'��o��l
N�~N�$���&�Qʇ�d��I™d����b�����3>�7�/���r(�3�+K��&c�*�\B�2�`�<�P�(��#8�NJP�+~���*�)+,r�+�B�+K��s�o:ܹ�������5;G%�],�����GE͏�h�s�@��\n�2��a^;�k$,��jvl���(�����B?�斨5�]���&5}"=�F�`�D�9�5g!f\�DU����^�$�k��xR���E/�N��ꌃ�f�#t�Խy�Wy.\��sj�ꮮ�ޗ��e��Ӌ��h�,����,�<ބ��`ll�m��J �@�IB���7@B`BH�sC�|��B���yϩ�������'MW��:]]�Y�y*�H��j�A���%�\�4��ύ�R����Nq:�+�6��o�Əɵtn|<���~)7�f���b�۵H��κ���f�.��򆼑>bK����b�b�wK=0r}�3��ݨW�5��?����;
ΊC�
�@_gxV}~��vE6�5�C�.'fyH2���
���d��Y�z[tK?>����������{�=�>�s���m��=:�_���ڑЏ�ǣ,��Jx�p����Mx��x^�Z�U�1ڵ^��D���V<�:����/����J��X=g�<�ߡC��a�͗����ŷ�������|��B;�7y���ۄ�
�o����4�����Mγ�[�y�p9� .�3x��':x��CP�G9�����>(�;<o��^k_(�4�����K���/��[/�ˋ���LJ	�=(EG.�g�<2X��� 󮼘�!����
�������h!̖3���V+
����i`�S�no@��d�)D��fs;P�eBPM��I-Đ�~�|�b��T��.ȱ��M9�dΧ"���?"�p2"�MZz�I�9qӞcMR��޻�$��I�8�O=:"}����Pt�F��[sF��F�U>�U��X��x�M�q[�ܨB4�y�e���,{��>����J4�ݧ"��L0^;�#n�u�Au��Q:� ��m�x�8C �H��X[g���
N��U�jLq�ͻځh�r'3
���dݷ��:��3�Zr�+���֭��\������=�qz�r�վuh9�y�}&��h��(|k����0J,�e=�uxCy�	�!��
��-L˜�!��J? ���t��,4[���!A�?��2+��O�}]Q�:�����G��Q6Ok�k���Z'c�k����#Q芅E�:��3�p[���Ux����_p��lw<��r##�~6ڒ����Y��.�d����
����C�*_V�~�3�����<<��6�b�r���վZ^�b�ą�}l9J�+���5�����A;�{ᗯL-,L)F�)�,�O�q�TW��:�C�%�M�t~��,J�$Һ��,9�ۈk�T��՟{*�j�l6{o,�v�U��/��&6E���J7EM���z@���0I�4A�X
l\h4��G�}��/��R��Z�U��<�ab�<�cc-�+A�0��2<�!�;��1�%[/����y��2�����<	�d��=ǎ�il�0�Kl��Ś���H`lʛ�1���5��~Z�06�iuS�)��pif �������t�2ޥ���<�z�[�?�<Lk:,aX7u���!Y��)6��/aQa�s�<N���?x��'��µ��;�Nk�w�]̺+nv��j�辎����fW5r�$T^0����W�ͺ3Yw-
��J�=򽛃k����q�‹���T�f��/	���,���^����q�PG�]�9����X��𥭟�W�fn��^�k�Z�vuC��L����Ah��2�u�����9yٞ޷�6�n�A���E(1VR:B�AYT��#;o9�s���=�H�NX��3 f
��/n�QE%��[Q"�Jb":�5��**�ʈ�V��I�bx�?�V��Cn]�$ٝ����b9M*DTQ�5MIY�G�2ΦGB��z�1��^C���9��k�f-�{f6��g��,B�y��>�;���M/����)U���C>ǰ���E��gǴFgl�j�S���1��7����k�&��i����Y �pP*���Ȓt:7�!�~d#����'��I�%�t=�8W���<�m�H�
�$Y�x0:Q*��<�p����St$�������£��AO�ǎU�PƂ:G@,�(��e���:Xs-��� ��&0?��&8�i�[��!� .�~�:[�_��w����:j)H�e[1��#��h��>m(��ˊ5�F��+W�=9bM�/�&�ȝ�H���j�^�����
5;p�k��_�����f��+�=�~�ul���|~��A���5��v�-0F���J�1l���Aq@o@�;i�*�c��.�>��9a�a`������g\ �3��Q�h)�ؙ�QDP�T5�3�x4����f[��{#��F��߱��O}ꀞ�-}2�A
�4��<Z��'�!N�(c��['lg��InO��J+��3��*xXH&��:\���7W��a���ڰ�q��d�??3(^~
�CQ`�ϟ��3-Ƴ�y�v�>Rp?j"���r%`��eC!��^�뻯ݮ��E����.z���_s��k�^��_s�EIף����=��ьf���V#o8'��M�6f�5��Y:"��G�FG��I������0�o��/y��:�:�&����s�Y��YdV��:,�
��U��}����˃"ik�m����]�"/���L}[
Z.3����w�	n[z>��n�ח9�3�0n��s(]V���0%�?8���
zF�ε?�>�I��Iz\,;^�_gfLS�����{3&�v��wk��SN"�<���_��`�T�@o�e���A^�p���i�ׂ�-22�%�8�-���G�j�I5 �*z�R̛k�u�l�*޷��!�)�����T��Ǖ�yvDN�#g͸2>=:݈oq�-����X,���ҸqBOH�����zb�/Ix��N#�v+Jv�aYw� Q�W֒�\�^�Ωɚ�o���'X��E�r�NJ��I{�|�^e6r�Xʛϡ���χ����y.�"�1Vx0`o�0�{���u�G��Z��_�p��]Fhz̿NVT]ҷa��R[�bZ��8!�qYWr�c�;��(i��Pq<I�o�_S�y��4R���O���Ŭ�ع��&SWM(���Η𞘬�F�'��5�CU�]��NѢ;EQ��;��4ʅ]���U��j�;ύQ�'�A�{# ]I���E�:����h�Gxh<�=W
�-إ�y�R"��T9V`<���4'��X��tWV?���B�-1��<�SK��,�RY�H�f��'��+x���$)�A`����)*�
{T$!��M:	�I+
���_Q���,�^ev���N[�c�(b�*D#����y��!$�	a*��k�eY�GC�d�t��}��|܏��X$ZHa,���,�~��D&�N�0��L�BFC�{̀j�>�j��3ē��q�V�[M:�@2ԧ�-q��{��Ҿm�I�F1�����3�.�1|�cy�>aq	_��2��y�D��$��"!��zT:�(w���0�RS�R���b���t%n�+1E�$�Ĩ�E)r��h�Cl+%*t>�W�,�,�^&��e���C%U=�"��F�X�<�Bт���݀�~:#7��B��vK�q27 �vz-�իl8'ж��\�И1Zi�9z����iE��Ad��c�ޏ!K�S��.j�ӓ�;:k$+�k&i�T>�IJ�};��d.�R%<yd���d�yiղp��Ul��ѫr/�]ݩ��x�:1���<��b�,Ĵ\F3�a���Dr��t�^����Q�E#�|�14�h͈�s�z$���x�?@�ɀ�_!�TLwd�5+�h|��e�Ŭ�
�:��Q�~���цx�:���]�?)������`
�y!C筲Q�Bِψ�gV�Y"�T��g �q'0
mCa(b��2�@[$#̧R�!c
����B*ye�q�QҨP���Ba�)�Z.	&���D�hl2 ���~UMud�ӻ�ă�/�*�18�،��Z.�s���HLq���\	�%���v:K��T���G�������	�,��>�]�Fm^�7��4CD5�颲Ni�<�{H����њ�ŧ˖�ʯ�=DU/}�+��ܴk��������0���t�Sk�y��aYp-�`�S���K~>L5�5�N��Z.��n�/��τ�Ѓ�h=�5�r�
(���>�A�C�B-1=�yiѯ.�d��[<�Q��{W��	U���3/��N���N�ڙ�+�~Ԧ�_uz��$��۞h�zc��7��e�q�̓�(Q%����<�����W�
��G���[�]x
�]�OK쇍��Đ���`�5ᇨ��H���t�l�\�#l�����T*Y8�-�/*�L����E�$���RRɵ۷��UWG�T�6</�'�c~�pc|�hԐ�d8��5ّ5��t�����Rk�唢E�#:�8c��ʾ��=�~��lSM=J��"]I��c�����IK�DD�5B�l��8���
��E9����|�5��eB�rWt)���z�]X�G�nj��bV�fT�Ոb��3��I�U��(��U@ޚ�X(?d���iB>��4��l8|
�8��{@C�Q�EkO��JO��R�B��:��OA?Y6{���Q�b���%�a�� �텮Jb�����I�2E�aFjI[�K���v����${�����Iw�J��.�Ċn�L�f��D��d4Y*7ˆ�ޖv
Z*�=�ՅU3�pbs(%b"�ź��F�7���޿����U�4;n�R�N��-e!��%��%#�V$�T/BTM�U�&��DH*k+RԱ-��t"�W�����$��NYUˎ�dY��=�?���bgS$�(�����7��`1�>9�(T�zA�4���-	�
A�|�.���H��+/�W�9��<f��p���p�{�yѽ�ڭ֏NN���?���&ę�)�6�ydL˜�q0:�F���g�x�J%�垠h�]T{FO9����hG�v\�j�ҡ�65q������E�.�KL˾���&U_�%Y,f�Y#|�Q'϶��3k�
,��F�M�h�_-�3�]���E��6���:m���z|���l�՟��~��po��j��i��K�$Ĉ���|�8v�((�moL��v��S� �ް����*�Du�Y�$�Y�j���s�;���U������֥d�8�K�89c�
*�����дf��k®�pN�#����g5j,��,�HJ�ӕ�ɲ�X��~D����5@���G�?V���#ݶ�!�ԓ�� �Nv��4�%���g���� u
�Yo%���i}w�AP1#�5���F
�_Hd���.=+���6G��[������c�(�b5�?7�>LoC�t�|�rE}�mF�*�1HSB���J�Q3i y��}Ӟ�:ܴ�U��8~����}Y�I�4�dT�e_ܻwi/�>�F6齙k��O�F�|-r{'B,��2g��z�kX��Y����`��A��	vY�9�k��!qr+i�>�Ф��ޥOV�;N~Ȏ%c�C�y��T%�h[���*�$Bϣ;��4]w�M��;�{+'ܯ$"�w

1dIV]��n3nm�=�@<����Ds�0�#l�г��KvM�"��C:%`��n��&��$��h�!�?��e<x��9BZ(���eC*5���G5�F�!���v!����_�|�K�SV,�;�p�"VWy��j�{)=���>wv,�&��Aυ����$��G�=}����)~x
O���Y���kPQ}��`�/ٌ>nM#�#��#q;�ܧ���Ãڒ@L��͸��c�'a㸫o{�3>�Y�p��>�۽�{��Y1�b�װ�-�<߭t*�7���l�[�W�@�$U�'�^��/��4%�"�W��H~�Hr�BD�}�@PBVK�ȑɔFb6d�/?�(��^�k�@?B��<Bk��"�i�&2�c���
m�%�֬P*tD������2���]۹ͷX���T`G"u�H��J�z=�0|1n���|��~s�/4���v0��x�V��9�:_��^��Ύ��J��:}�4�+�b�B�a�Zө����U�L`��
�U���3�N�*0�KQU�*K�a��%>������q@6�J����n���k.m��%�?躢$U��dU���?T����_��ޯ#gBQ>sN��[�V��xz(��s��ϋJMk�8(	�@?���A��5���p�p���z�Ң��^m�']��v�� U0��*���4p��4��!@�ui��7
�`֔=a�.���	���cѳё{��wFco�Q�%Uq�b�ݻX�tZR4��`����/ۃ~�hS�����c
�
h�a��\n>���^�����Ȩ�F�i�]�$|,PS텧t}�X��{�L-�k��)^ݠ��mS+@���Qy䋛��Y��O�L~��b��FCH!�.�CG��bN]ZY��%�1���?͗���:��ʽP�����<w;�),ΠTeb�)�
63Y�cn�L/X)6���U���ѕ�ev_�Ҵ�X"���p�Mk�VW/	`��*�Κ�˸���l'&�幎����d�����������E�^+D�-�����AW��0
~��ן�Q�Z�b������u[����.8�q=ZڬR��<;�
���p���C�Q\k�'�@S�����2m�'�!}��ew���+���O�1i�nޡr,`��d�DJ��h��<)Kn��RF��k�����qU}o�M���ؽ���h�"�F{ˊY����4���R�-��SA�$TR-�CD"����?h���EXR���Q*�$���DʡC
2��i��./���@�%T�����Ѐ�:C��<���6p��A���s�;p�WH���>G�t�
B�G�L�)|N"W]E۳��|�JW��������t�o^&��*��kAs��B�U��$�V��	�
���%�; ߆���:S�.��܎��An�ԇ4��ihV����t������5�y:di�f��lu��++� �d����0#0��Qʐ�X��A��t�.�Ŗ�Ȓ~���i��8�0���ȅT����n���P�6�N�=���J:"�)3s.���z��'�k�e����y�"�,[3D�
�{�o�5����I��*�FT
�d�f�N���<s��i�������Q�u�Gh'�u5@/T��v!��۝
>��S�z?��y�(_�#�5�����v�3��c�o��y���/�_��$`��T�T�$�ƎN�ǧ�O�ڣYԮ�'�X*U�L���h��q�D_r,âR��Fq*_�n��:U�j�t���U�Q�QF�EB,sqYB�?0v�/�c#�8�\����K�e?��o͡=��#���̿i&SHܝm�z�>��haj�i;�T���x�fI��z"+Y��1%�����rQK��7,dfK�1}�jZ��C�lZB�)!YBS�9�6�wԈ�\����q�*.�0U�M���Z5-:`�5E�i�)P�oF�F�À��
��>p�K*�:0)U%n��IP��1�i����8�@�Ō;��7�H��;��/FX��#�����E�w�u#��_)�qE�H�E�~\�����O%o����_��t�/H"�����Y��Ho�4�T�f;.=�~�LD�fQF����)`�^���ɪ����m:�~��4B�!�[���J��v��> ˿�����B��ZxRu�V��s�'�ZQx�.n��FR�߯�/Pt��]�"�wQו��a��/������`�g����l"��6d�1�\D�.�NjT&-n{}��=�����5
#[U�<:����i]�g�q}�o�:�_҆�F&W����W3�u/ �����SY�=y�]x���tC��(æ������i�G�cF�F/���BI���,U��zާ�l����$Y�gG?���U��8�-ن��RI�~[4OM����gGi�C�Hr�I)wc�$}
�9Y�n�t�dT]�f��E�
�K?�br��cV��0�����*���H3v��ՠ/���T�T������\,PG�������Ǧ����Q-�;]��l�0���?��$�'k��u�vہ�]�M綂�aQX���p^x��‡��g8J����T15:�	�i7�~ќ�N�H[�Ml�K�MN�U�2J�o��~��T�2��j��.D�A�CQ�hݤ��+�E	��2�S岄I�s!ē^�*UHT�8|��ؒ�����m���d\��	VE�,<~�&�X�M�13N��8ؤ�!�e��R�&�,?.Z�vø[�ڻ�f��Q�T����l�ф����mˢ�2��"�/b[��V1�EJ|sӓ��(��FU����o�*J��g�8�Xl3�DŽۅ��Y�u�k��y���p+^���!���w��z+L`x���Ri��X@��E[��{@U�å5z�|U��%m_4LU5% _Ule���夋u�ں�$�=EK�rTF���<8��"��C�U�kU���h)�J�?Nt�%C�Ơs0�dg�"�0˘Wl�<�_���=�:cm��X��*�j��P6D
�7l#aF��u��KB����hf�Kc$�"��p,Q�U�Y�˩J!����6xQ���T��Ѫ9��ˍ��i��i�$K�(k�t��頾/���k�~P2�C>E��稬�VkZb��)��L`М6҂���I��'c���1Ø��$��I�f�6�߬�/9�{��1͘1�)E�2�C�����ŗ}u�����=��퉡��y4/��'L%�x>�7V��vx�����hj�=3���-)-K�u��2���|9.\Rz�ivfF��R�iZo4k�:++���ؿڿ���$�9[�����G�h�n��DŽ�$�%}j�9&$��5����o���l�0��F�by�M�l����Z�Fsk���u�i/,����g	P$zP��ᡑT�61N<�Q�F*10����V��˷���6E�A��7���1��k�ˣ�]�n�u�jΠT tpw�\~\5�&_ڤD+
�D��r*ႏ�����M�I�E�J<d�V]p��C�O�e|�SN�S(t�������]��3���+�n�_(�*��*�x`�l8���C�7Hi�:%� &�碃Vp�m��ƠYn,��-p�@�mTB��xi>)E
YVM%*�#c	��mEB�o�i3����4t�SJ+�x":]��
,4��m��D�L���*ߜQEO�a��ւE���	�x��N�d��x2:
iiaF��/�-��63�QIl���ra��Q��A��h:(,��D\���ˋW�l���h$^J�$��r�{)���`����^qU\�nb���,�k6���RD[\o��x���	z���•iћ��>_6O3<�F���<z#�fg��HGѕ���:87�<�H���`JIQN�Q���������ƃ�����U��^z
�hY�fT�9���Q��'�΋TӼ����/;&J��r���yTlƲkЙRX���:~��{�?vc�D����� �1�/[e��R�
�$D{F�︽��T���M�3�o�7L���H0s�m\��w��)��:��s�F>%����0�/�X��~f.�q&�_D�~�Й��f�a�,۸��Ef*��R�3�������	��#��O�q���I
��K�DT�l��[�j�`?K�̜�+=ť�4-�X�Gj�	#p��1|��Dx�Dž}����E]�^���j���N�%�C��sE
���ա�|zw6���2�f��9v��{��٢�a�f׊ݻ�>u0g�+�h�����d�r��Ї���#�/Ā�L᮸�3� |5��V]�)E��gVUG�������s���"����N]��H��*��>�A����z��`�-n�o@Ȼ	�s�FI
��E:L���#�X��SC�3�-q���� JP���v����'�V[�ɪ
�Y�\��N�;�W�Gx0��I0���������~��.���89KT���� �����|���v`}1�\]��܌Br���;#�8J��V6p8��r��9�j��	�"[#G�-g�s�)qq��J����T�ޞi
aW�-%��dkT@�ƼB������mO|�	���l\�����'��w붟C�kwݼ�ĉ�7�M-k|ܲ�g� �ϝXa2������Țr�� Z�i�0u�b��M��1���lB�S3��V�x6{Q�!w�xa�m*y�PӔ2��"z9b�5=�HF�<y�x<���l������t�'=vtT�E����N�YS�)E�s���\��}�ƚ
��&S�6�d��C�Ǡ8�)6B7��r[B�a�Wp�	�=���J5��S>��
ܿr��ey���[�#S]H5��Z�Y�d@v��}˒-Y�o��bт������P9���J���*U9\1w�(T���o�9Ckf����e{��6��mє���X��0>�C�N
��/H<"��jg���
�~��
���
�@������>���g�R04���M��@��SnGՐ�(/�[��9�ūp�"`\
g�0s="����;�T.M�`,&�`Ao�,��f�w*l|9$��m��XY�9=�ٖ���ѣ�u��,���v��"�dF3"�;������/M�;�
�R:�8��r���B�`
�ԯښ�YoR��0�\�@Ϊ��Y��0��QM��E���섬-��G���	"�����#��&'�Ħ� �壊BHSKa�p�za�A���-ʼ}n�O�#��"��t�*�q����L,�>�}S�%	�v%����l�A��z(W�m��>��M�|K�R�kDL[�����!���_-�,/�����p2"T�_xh
'���9�(�˽����uH@���uX@,����D~�p�B��^-y�����eP+�Ӊ��Lo=Nef�(�I+v��&5+b+8F��#�6�~;���V��r�\N�(��Z�{'ȹ���X����XP̵�V7g�Ow�/Z����R�M�b%��Q�������~SLGϸ�
B��ђ3֖Z>1�4�
��H%���p&.�U�tRBޙk#�Z��.$�/>,�H�=m;7wg�$�q�I�`���qR:RB�7:�8���dYR�"}uf|��jf����Z��*N/9N��\gݰ��#o�|ʥ7f*�^#���L�(N[۬�Zp��rE��Z��E͝��Ψ�sf�f���I�{�Z���s�#<_Zs-�rݲ8u����/!xr�o��%�XpUFI���?�7����U��&J
,�j��I�GT$�ͷ����f\�H@d���2R�԰�m�Ls�E��mIWGt��[��ȮN�N�!���1͌	ϴs��hr�5j驫
'[�)�OTi�JзRI
�>��j�y���՛�x

���->u������]�D2�u��}o�h�3E�~�Й���|�t�V���BĹ��$���5?3��L����A��M�n̷*�z�oB;�ϷD%y��Ii
@s�%I��ٹ4��lE�Y5fF՜3	��1��MЭd�}��ּ���~4<Qk����T�a'��i���
T��� ��?;׻ۦ���ծ��tC�Z(f��E���X�f[�/\+�(ܹѳ
9����;aϠ&:
�YS^�H|.�1�s�@g����%�8]N�k�Y'����"K�%���u�	��6�RD%���s��Qڀd[-K����W��lqz�����[�]S�i��
��R�L��E���F.5��[�;�Ht�qšvH�ہ/�i���޿<A��_�
�X~��6;J��
�\���>)�"�/~��d�V�_�{mA����}������zN�ce�o
6�,��[6��}Y��QYt�p��B�.4�լ��}�c�g}B5%�o�>�t׺����Bo^�yb��+<����˪H%�e,����m�LA>�qP�C5��¢���� �^�����?K��032;^O*`[`�?ӿz��5����{�H��!&�"�$���dG.��4�\�\��ܜ�y�T�I�}�].�k�8���_\@��Tf1g&�L��g~��C��r�}^��}�����Q�"U�X%���BcO��R(a�A���t�j�'ܯ4���H�WjV��$��LYV��J��[yW���a���)i
��tє#ǿ]��>#")�E�_E�~+�����!Z
3����4[������w�4෸�f�J|���-DD,y�âH���,�O���y�)"c��<_Ңs���<�Kn���9�pt���l4EE��.���[�T��lܝ
��<�6›h��@����&wU�;c�'v�9U�8�����L����)���F�y��o���lmO-Z�Ϗ���>�\p��[c�BLu���J�SV��Ĩ�z�Փ��O_�$v�4���I���"�����'}ˈX��Eݼ�(�Rc�2�Y�nmeKV�2��~��L|n�5
�'([�I����)^����+���R��)���n���*��~��">s��ls
��4��d�7��J�M���.�
���_؊ą#2&b��;���g��k�vl<�cׄ������?��w`1�~J-D��T^�!��}J�Q��k�<���J��ƶ�[,�s�k{cĵh��mâ�Wf�-�3���*
�b�lO�S1��H3}<8�m�N�i��֞@�6VZYJU�-\Z�W�li13D�5�]]k(Or�VY��5q���w3J��W��Za�X��D�z�<7mG�ȧ�%(�N��#�h9����t1�Z��t0N�������'�z%��@�Te��Ob
�D[݃�����B�l��ވ�<(N�S�MU�T�oS�H�/	9�
�T��h�I ��u�?��_Yw�'�r���{N�{��}�W����֓�p��\�Ч�d�	�>|������u�5��nc���3�}ױ��Ge|M��_��S8��s�]���T�Ƒ|���4a�ʆ'�.x�����8�"L 6b�la�o?�� �&f��y��l��m���ų��K�������,Jqa9�����lj��c��h�-E�"H�tΞ����������O˲hY�,��?�~��:A5.ʳ����B.,�qC~	��z���B�6z��a��@"eƞ�jǼ�{ʢ=D���$�;N�ܱsbbgm_,������5ȹ�������On�2>b.ܰP(�G�z(���!��E��]`�Y/s����R0�Y=8d3���/���t��I�%;FW1���(��QZ�@mnkv��z��.����&jţJ2�HR�s����^�˯]���L���r`�`q[E�� ��<�[��?��疠g�K���:�����^W�L֞ޟrH%��jRUoSI7$Є�N'�����k�A%�U�a��T��P�k�D��G�I�t�g�A�T	�ymD�,-�.����2���+�aU!���؝�/:�]�ń�ҳ��:]^�1�z���Zi�V��4�ಟ��K�z
�1M��|��oZWϗ�����g��(k�P����O�@��^��iqKq���dv,���d����;f�}mVW,Ê�3�6��)M�1�Aѳɷ��MGڕ|0f+n���\�Q�^{_�ZE]u:F��Z�o�����E�Z�~��g�F>oD3z!�h�t:�
ټ>G�a�#[�A^�?`��y��
��&��3Y�o�.���O�sI��0���ggv�F���E���tt�VR�0A��ڠ�|��4��x��6�Ȁ�hZ�f�P�}�}����γo��h�k���]��B��B�L�/��4��!�D�3JоQi����6g���iA��B��{aNz�pj���Ca5� ���V����3?[��Ӵq��<���!M���h�%S�#Ks��H����d<�l��؋L��&"�l�^3���h��+�
���cz�ϸ�pQw��h��{�J/NK���dr|�"M/�c�X؉��h���S��ld"�d�`Ң��n>�N�Q��gӻgL��b{$Fo^�餳��C�lgy�a�ŕ3����x�v�� ʅ�)�g�\�o���}��cl��Y�0�=�֢љ�>�٫�o�	k:9�2����
 (�Ӹu���>�������-agδ��!B�Лި@��,~�	:Z�m�*
�D�ӄ$d�x�b���iq�����&x�}d��Z<3�k�:��L?�	Rq��{�^�A�D+��3Ù���7��z�_�~�ׅ�Hr��\�?c�+#�d�c���	���G�f���a簡-t��$D�V�K$|Z=������X��~U���Mt����ԴJ�EB�Lyr��{L�s��;�����~����%�N$bt���_�������G�ʑ��"N0�&h�Dv�~3V�%�'���S�)K{���!�E��	��=:ysF��pYh�4��9�-4t4>5Ī����>��dY��eK1�V��kr���EuD�dT�o���V��}yvAƚ�#2�(��.�N��V��x:��x�̎�$�����h���F��‡��s�8����`��׀lh�d

���ji��j�Q
֣�ԃ���A�,��%����4���c=	�?���xM.�ᙁh�����`wa��W�*�K����+��2��eŌ��N��N~��Z���<tg��]&�=8��!�f�??�ڐG�X0NB��48�5D�ͻH�H�Zoh`%hM�
���?�휑�E�����R4L��e{�[%i��䍜�/;���KE8D�޲�a���\��qvZ�d�]�Bb�4��p����`
�`�(U댘��Z���PFx������˫E"�ܔ�ŔH�}�U�o�^ջ�j(!����g��ٖ��3�/.���
]sI5�쟩.�]n�YF3�9�L�b�
 ��<�^4!C%���Q��2Z�Q/ћP�Y�����PH��c�(mv�!=��a��R��eK���/f�;o}ͫR�H�%&��<b�j�f��1�g��Ͼ��Z���-)��JگW��t2Oo����\�Cr]l���	�6��y�������5=Z�<�;M��	�Xs��<�*��ž�$ա�f�8!zu���3-}��]dHH`�n�����:0#k�P�K��]�>�v˖ g���	3�@�B���@��(p�^�
7*��<�vB
�pC�Jh$+�!G��U��֛�5b�~T�l�ʤ�]0E;��q��f[�&�8��kc��˽�
V��BZ�˵B�H�������0MM��f�	�!�$��шk�M��,�҂<==�?�l��c�3����R,ُe{Y�n��F�8v�d���Ç'3�5�U�TC�̈�D���22���EX$���a'�Ylن 3�������U�Vį���ۈǍ�5dV���%���s�_-�S80���)?^��N��n���?\��&�^Y��v;��>L���5����qL��K��=���̌��O�N��iT`��v��:U�á�t���Z*��H�M��J1(��Wl��L��'�ڢA��!������I�v�A��~gUX��p��R�ס����>�y�C,F3��p��1�!�9�X�
�Ɛ�,�v��3��twA4}�\¿D����V"ݭ�IbV�l/O&RZkT�W4��.*L]8oh�,*
+�.ف��i�č��;�&�^�8��T%�Y�-�Ƅ�x���B���(CN䔈,�j\&I�����
�D�,k�*
hjQ���%M��G�d��R{���IY��oG
s۷�DǞ� ]f�۸=��.��W�R:���D�piU���`�w�g��M�3���x�
��~x鷘!D����E��TLnBi�)>�k�@�OOi-%��R�t�I���D���#MZAKk��Z��iy��5G'"XND*ɒq�RR]��$�zJ�z�2�
�ӯ�~�~!�$�0��ɻ;	��*x�ߌ��/���<*��\�.��Y��4�^V~Q�o�ok/*K%�9�9��ܞ&%&\��i��s�:��ط��QG���8�Kpe*7�׻P(��:��c�7(�<9�R�6���"��'KO�~�TxK��QBR��e��!J���47E��A��y�{�ʾ�͵�ZS$�@���u~+!� ����}9���N,$)n���U}ۜ���q#'��ڛ,2�
�d�7�w'�|�+��N�rW0��+��� f��)xW�X{a�/�	�8�����{J��>�'��&�$S�"��1Ս}�r����tў���5�/�iV�*$eQ2%[ѵNε��y�c�e����b���
�(��N�
�6q������R�.�B6Z�Mq��tqJv�qѻz��;?��k?��_�((I����V�$`Жgx�3B�yP �x%�NJtZ�=2_�C��"t���iuz߭��P�KK9����#݅܊�~����l��u�/w-���U��Wm߿�ݻ�W�;�v��j��R)۽$,��%�W۵�%ȕ��}��}�^g��1�E��U���D̕���m5%z����s�mV΋�ғ�>҈�zj�m�ζn2.�1j�P�u�� ���!�(Z��OE��pWƐ�C�!���r���N��(�y^��ɪ<��}��pڵ�Z��)�`�q�T�-����I��-EU�M0�CΪ�@��v�K����K�W�EY�S�.9t�mW���b��s,;�2�wH+s9ɳy|���q�ƓM�JG�g�Kn���%�x|��Gń�e	��IlK�+���.���R��Ҿ.����]���q\�dEj/d	w�}����k����_+�Z�2�X†��*�U�6��?��"x����Ψ3N/|����DGdG���/����O�y�w~��9WK�^,��x�R1�qd�\'�T ��~�f����ɾ5��W`�
��1*�]�6����z�.��!a{���6�gW݈$F��k��g�j�1[��2#�N$ډ��֯0�&�:�'�Du*��3v;��n����%Ǒ�_�j�#�3��ǡ��@����Y6��xh�I�~Y7_3y�54��Z�@;/ӝ.D���&:�.�1ɓ"�1KS%@ı;�H^=Sӏ�5f�>��3���z������{���kg�T��3�E�?���P"�l1�xXcF����3[�7{J����~p�!����-6ARف����Q�I����a�l}�f�@E��3"�h1yv���#�ݛ�JD�4���+�]?���Ql1	=�˸�s��:K~IHU���.��V+�^v�Nwe������9T�+	��Tȕ5|nzV��+�R�����F��Wf6�u��Y�,���xIH�ºKYe���?�P�H��G��3,AG�9@��A�X���&�=0��@-�,!:�:t�Y�8L�4�
6ʍ�Z&�7q���H�j�3c�b��$w��r�P[�$��"�Ӧ��h\�<�	d{7h$�a�8�Fi����'RS�ݔ�?�f����Y���x;�c�q_�(�}��^1�a}V�ܷE{W+�С
5dy��@�̋9��
(p���m�l�*ǣ�5����O�;j���>���޻R�$J%��umv�D�M�L��b�^:�&Œ����8I�_��V��?�5�d:`�	�)�e��lF"_0�~=��	
g5zw[Q�?�vؽMѾwt���L/�vܙJ�2HWc�084�Ik-��Hu�Z�L��io�Vv����^F����Jz��MZn<u@���짵U1�O�2c�ė�EH~�1��ݾ��s�6�rF� �͵|��v|� �M{?|ML��!̂;�y?J�,f�+�!^P?������Yn�-2'9�O5���Yh
��eEq2�̏X|	4���g>��s+#����Y�R��n�:����MA%[e�U�0T�[��?�z���ɠ�2��Z{fff���e�ހ��)�
c	�<�t�朤����d\�[�Ỳ��r�Ǟb@]*�T�f���&-`���XL��R圡 ��&uCSIT�74�O��j�aQ?k�D���-��}��5���|����=���9��&������̢M����g~���82	*���'�ē�3���*Ѣn$�{[ёI̕I�B'E�:T��Zk�$N�Nz���;�;w�"��Sİ����\�͝��:��	T�fQ�PɈbcbr�Q�zǶ)C5�=�9��uk˖��T2t��u��-��aX��
w
�	�c����q�벩
C�ڝE�7��sf��9 ��Й�5S(�������_3#'���B��H�:$U�Tv�[bV�2)��ɐ�'�8l����ۋm�V?����ػ�"1�.�ys X��<P��M��Y���-SǓ����t,�E[�l�-3++���)����.�?�2#BSЯ�`�g'�}��ZC�c��d��(Or���%�2���WZ+�|x����B�!�33���燖8���� O9���L�={��QE�K)�MS���'�R�&?_0�)��2=�+�h��vڷ
4�K,�� S�/�+��1��
��7�����x�jM�O�V��6�Q�p��N,uVz]��bo0���?�����ŗ�g�^�}�Ơ��3�7�m�1���{��t�L��6��C��fx�0:��
gs
��F���qZ�3���tͧz����~m�����_�3*�k�w�]�ο�q�N����R��R'�\�=k��s�=�U��"*��TV��׷gH����D�J���v�*(^��aƏ	�o�P~�B��0z޸?�w�Z�t��D�-�Z4���L$吱�b�Z<�&�ۉ�
�Qv�����y#g4����Ү;5ڔ��9��k�-�gR$2z(3����O��ίr#	�Zh�}?�εwF�Mp��gt�r1^�z��b vS
?#a�`�1���(��H0��{�YB�Rwi��=^�w��Z�i�rOl7���bh�
�q-��f�o�'�x�D���7���|�ƫ����Q���n �L�p{�y�M7��u76W�5�z����{�W������B��e�{�w3�0j'O�[!�Xf/�l��A�ɀn�K�������(�jHm��3�s
�z.MUMK+�\�RN�E���J��P����6�c�~40c�ւB1m����I�x����C�:��f�c���=U�xn�-~�_#kV�#�qY1�py����xq]��b���9	�0�0���K#W��|Jmӎ�V��?_���-C��v�"�@98��D�=�_g�B�=����^��xċ$���j~n{6���␠E�Ʈ;�5���4���%ʰsA+����j[,h`��	(P��C�V�G�5�|P{���sp
��w *�)��g�d��skqr�!,NS[n�}4@�B2ھ���"{
!�7S�xS|:%6N����[�߮�$�2��L���� �ά�Y9J'��g������2�hi�����*I�]}��뮪o'�Ze��ٟf��:�F�p�������~�g���(��֖����w.Mܻ��,}��EwQC�V	Z��w�L���=���?��E�尬���dֆ�������9�z��[�Q�z{�Nǟ��P�j�P�g2C��0@*@<�z#>A�e�A������h$�JD�z�U�H"���S�Zr�:ӥS�2��[X�K�/3Qh�-�0��}]�m�C��@af� �yq�绨��3�8������,tt17��+w����v$EՕ���T�A��YUE%Ҩ}����y#rH�ˑ�Sٵ�6��}��n�����Z�vwMLC��
�P+"�R�>��ڪ'�dO=�zӃ'�`.�"��ē�(���y\�fM�D!L�M2����}3�ܥ������	��ͣB�=!�a_%�&9���60�XC�K��������t��n'*��tOtnjj���瓛˝�Y��q�P��������p�q~���:y�F��Z���۪3���)<�47,
q*0�����Z��C37u���`D����U�Sf�<������Tm�a��+���f��V��i��i^Rt%%�e���v�g/�J[Y�I-�Y�Bm:O`�Aݹ��!��f>������I��".ʙt���<!�'$~��#6���	P����U�lF�X�䁖2A"�%њ��Ia�Hﮄ�X���b܂�-]P,�ف��6�lڣ��u�/��/H�%,wד�d,�o2-a;���~i	�-9�å��,��z
��{�eR��9%m������@�>�+��4����
��H�v6j�nG���%.�j��5F�8w
�OWQ�J�n^�3��[�(��g�n85�oG��NV�\` �S��rxt��	�;G'w���.{���5fC75Z�O�9P�wxlED�M&a!���C�)�#��������T�����Å���!��Y���Q=s�)�k���h�9��Yy-�dі���Ӌ���
�R��ck�/!j��g���Z�����C�ӕ�o�u����@������ς5����#�
��4��%��;����V,���D��|G�9䜢<��H���׿.V����_�g��wit<^����{׫���Y�YX�lP������\g�R5,��N�$c�ݔ���Ú8��[-=5$�X�+�+�Q;����FƧǭ�z�s/lFKm
�ҁ�peb�މ�p�$�D��O=�Qr�> ���8ya�E������x�c`d``�YZV�o󕁛�nt,�
�o���TƳ@.P��x�c`d``<���o��T�2`^�Qx�}WKn1��p�M�Yt��(Y��;��2�%<G��E��I�ĉJ�'jl�1�D����܁��t��;�L��.�y��X�5�Yv	.q~�{�U�֖�~�}��h�A���9t�������U����'�s��x^�P�bo7кh:7n�s"���9Wa�+�崰^ݿ�>fkkׅ�U}��Qr�9gѱ(:q͛b�a��0b��ޏ���"v~�Og�-T|#/��t!'8����$�w
��Xt��p(�����~�{�["��pF�{�W�'��I�$qo�k�$��8yj<h����E
?i��"J�����p	�e���ڌ8f�_˱A���7`Z�i|w3�GD���rMbn��7%F,ᛈ����/�W
���*n���Ơ�p>�N�&s<�����XgNk�޹�7��綏�q��ặ/��<1.�A��˚��[����[���g��al�j:�V}S�+�G�����+ʋ��:�����O���T�%=en�=c�3�F��.Pms\������\�b��I�Zs@����?����XW�W���To�ܛaܩͥ~Gꍌ���O�_��]��k>ܺ:�Q?S���\j�[˫���<1=����pW=�9j\H{��ܮX���|Ƙk��r���4P��7���|�u�������x��)�=�U_ߓ`������h��#��tn�綹x������c����jW:>��'�k�����}*�ǹQ�,֤�|�Z�k�w{=t���]�����x2���4�X��r������0�X7Aۯ{wfr���j|̾��������o����^/`\ԮK�oű����.o����RkQ~�<���8f5���׋��͜j���L�\Ö[�kȧ����z����n�[>��gփ��^�(��g���Ic�u��$=�?m��A<�R�S��cd}��:I�ՙ9V���upt�Eο#���4���>�w6�٬�Ԛ��&��Ǹhn#�f�}yPLi�蹏�Gë����C�\��1�3�S�>���k��s�����x�e�{����}wQt.��t>(�LL�L�j&FM�0��TS*I:����(�6Qh+�B�"��mڴ���v]�z��y�g�k����I����"�jP�"�J+�(W!����c�bKı9�'�BqDE��E�.�)`����Y�0�J���1�����GT�zTW[�z�܈Zxj
\'̄�'��m'�����4�O�]�X��<�8U�Ӝ9��=2�g���Z}|�F4��`)�h�J��Fx���Ƶ@��"�8�o�M�7���zs5�'��ٰ$��r@G�> ���#Z-�X�:�ϔC��3�w&�m�sMg�Ϣ7���j���N�vζ����@��<��m6��;��QN��-A~9��q6��ѩ6�v!��̀�h�X��]g�:��E]��ʮ�ݜ�D�K�*O�;�ù"z��W�� �Kݣ�8�����}}�KW?��'�|��q���o�����_��z]��2��+�V(�+���@�q��"{Ej�,�+Dv�{����>�s��0�}nn��Z�<0�xG�8���Ώ�y����)q�w	�W���h5��zs4��e����qj���3��	G��&�����dߝɴ_K�=���u4\��T��*ǩ�\/�i�Ms�np����6��t�3d>�ݚ��L��p�rg��\o�~-�2�]�Y&s�o��o���[ݿ���n��dqw��N�w�{������8���}��MX �{��B󼗾{i�O�ӳȹxz@>�Y�w1K�!����G|g���{���܉��g��et�C�'h}�yR.O�����)5O�x�
>W��+���g�{��*������p���j�ט�f�/�ϵ��ҺN�uz���2_��7�
8^q�_��k�o����u{�x�$�7����f:���-�o�E�-�U[տ#�w�y��m8�ѻ݌��{�|_��߁k����>P���?��#���|��<}����O��]��%���}���4|a>_�m7O��Iӗ����kk_�i���{ݳ���k�������3�}��V���~�{����G��Y�D�ϴ�_�~1�_dtHF��<,�_��7�w߅#r�C�?��kc$Q�`s$i�Hʕ�>���,?%�cr�@$�N���ARa&���H�+�#��6Db\I��
�+;S��*��,�U{��Uq��T�s#��w�e���&�Z-��	�@߉#9���]
���I�ݑ�\���_�Z�y�ǩ��2p�/�,��!ݍ�E�X��#i��d8ה�f�6W�BM�NπU`�%]���Q)�֞������6<����H�h�ZIۢH�ɺ��e�^��|6��?��s�e?�t��<��Ǔ3�w��;ɹӢH.�%��\���b{��w��eI$]y���%��x˛#�N{w��{��O/s��R\���{g$}�@v}��Gg?��e���@�����/���)�q���
�c�=��)�c��A{"l6W�wH#X�Pz��n
��$ý�s8����jo#e2Jf�̮������h�F��h�W�����1���X���]&�2zƫ������<�h��I�'�u�y^�n�;6E&��0ս�*��=o�s��0��2�av3qΒ��޴-��xn�9�͡�߉����ս�ͽ�M����&$w�'�w��� ����z,�s�����{����~\��_D�"�?�Ã��b�Ӵ�������R�<*�GwD򘾏ӾL����	z�pf9ާ��aM+�_i&ϸ����<�����Z~�}^��u/��,�z_�:�/����^��o��3}��W����k��F�7��>����μQ�f�6[������۾/[x��Vϭ�#�û���u;?�݁��y��i�a.;h�@���C��;e��;�	m�:�������~�"�/�MO���k:�,'{����k^����r����N����͏�?��'�?�wP.���!k����W�-;�����r��_�#M�H�ّ�+��|V��,���H+�߉�s#=.�Gz|����i�H�t�ÑV]i�^p$��jL���HkEzB&l�����T;���w{u�=yY�u���qJ5p�T}Oki}�
ZF�P���"m�w�Mq4��"mNw���H[��ʹV{"=#7���ZӟYK#m�tf�۶̋��/����g��/���Dz��H��<�@]��H/�Q����wx����+#�*��<u[i
y�#�.�>�8iO�^*��G�W�}x���"-�Y ��?�e��[+�]��
����~�9pg�E��7����ҙ!����0�~��b)�Q|��g	=W93Z�h���R3*��y��a��cy�K���9?~I�܍	|_#�k�83�I�'�m��fa�x�c`d``^��A�����|.�x���An�@���I%R!5E
BbX�&R�HnB�,���,ءV�r7�g,{ڨK�F�8`��CpN��_h�@J�x������p_�����+��F�A�]<�w���p��e�
j�p�N"�����5�qoWQv[�먻c�
ּ���3�U�g�"I�
>�;t{'��	>
�૪p��+�l����tj«��k�t�	WQq
��ww�7������a��)"�1��FC49�7+V�0G���#�Mr�F�ՍaS���y���{�=��-$Sr>;��#>rE@w� 
C}`���T��뷸�ǿ�W��<�w�K��;ū�^������������w�N��vga�Ef��E�����_�[&�n�%�y�H���(�)c8��̜R$���԰0������G���5���p�yx����dV'&9����f����`6�֘�IdY�GK��o���Xzz�
����&Y��>fW�EW����M���so:!K�.�Xx�mZ�������ᙅ;��vV�8��q;̤�zF��Zڹ�0;�C���������������:�}�i�ZRK]]��Ui����������W� ֤���-��=�1#�.6Ħ���~q�8R%�Ljc�q�xq	qIq)qiqqYq�8Q\N�$./� �(�$�,�"�*<q5quq���8E\S�*N��k�k�������3čč�M�M�����-�-ŭĭ�m�mř�v�,q���������������o�F��n�����^���>��~��c�Ph1S�X3��Td"�8(JaD%j�-��X�����A��!��a�����Q���1��Xq�8O�/'/� �(�$.��ē�S�S�����3�3ųij�s�s������ŋċ�K�K�����+�+ūī�k�k������śě�[�[�����;�;ŻĻ�{�{����Ňć�G�G�����'�'ŧħ�g�g������N_______��������????????����������������R�T�%۲#��'�r �r$��ܔ[r��/��Gʣ���y�<N//!/)/%/-/#/+O�'��ɓ������ΑW�W�W������<Y^C�"�)O������[;Q^K^[^G^W^O^_�@�P�!o$o,o"o*o&o.o!o)o%o-o#o+ϔ��gɳ�������]�]�����=�=���}�}��/�2���r"�2��< g2���d.yP�Ҭ��v��d-��\�yX>@>P>H>X>D>T>L>|�+!)%-#ϑ�������q���	��I�y��H>Y>E>U>M>]>C>S>K>[>G>W>O>_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_~@~P~H~X~D~T~L~\~B~R~J~Z~F~V~N~^~A~Q~I~Y~E~U~M~]~C~S~K~[~G~W~O~_�@�P�H�X�D�T�L�\�B�R�J�Z�F�V�N�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G���H�$"E-jS��ԣ>
hH#Z�
ڤ-�G��:�����:�����tI�]�.C���D��D��+��Jte�
]�<�]�N�k�)tM:�N���Ztm�]��Gק�
�������t�)݌nN��[ҭ��t���t&ݎ΢��t�#݉�Lw������t�'݋�M������Ә
Iӄ�QLhF	��QN��UT�6��-�0=�H��C��0z8=�I��G�c�z,�K���8z<=��HO��B���LO�������z&=��Mϡ�����z!��^L/�������
z%��^M�������z#���Lo�������z'���M����� }�>L�������	�$}�>M���������"}��L_�������
�&}��Mߡ�����!��~L?��������%��~M��������#���L��������'���M����5%�T��j��ꨮꩾ���u��6Ֆڧ��#ԑ�(u�:F��SǫK�K�K�K�˨˪ԉ�r�$uyuuEu%ueuuU婫�����5�)��Tu�:]]K][]G]W]O]����ꌵ}�F���&��f�����V���6��Lu;u�:[�^�A�Q�I�Y�E�U�M�]�C�S�K�[�G�W�O�_�j�*�&j�"�j���L�PU���T���\RuX=@=P=H=X=D=T=L=\=B=R=J=Z=F����U��������Փ��Bu�z�z�z�z�z�z�h���x�_Vq����A�h��V��J��/Umt�&q�v��K�r�euX�M�
"�ZU�j3p�zER�a#�qV�^��u��I����O(ȱ�<խ Ƀ�*s?�<K ��l�R�seY���x~R){�$�}�^XDy�M;O�T��F�z�\�e���3��/U�T�Q�<�u��ZEgU;�S]�j�g�'a;��$�>Ty���Qշ�<���s��K�:1�Y�ˁSJ�|������B�Z:y]���g��ڎC���ԟ�~��!3]���oR؛J�0�F�҅7����/��ćU�Zw)�"���Ǧa��3�K�˗���QZ���!�q���bFKŮ`���q$zh�s��]_*�e�`��^���A�M�F�enL�ǥ��������'ڇv�\�y���*u[*�,�yZ�ژ}�P�����85�'��O෥&��=���=:b�����l��̖a
~���/���%���<'���d��/MS;&�w딺�k�M�򢈳� ������xy��^�E�ƕC�l�,s��BT�n�<����"?��N�v��+�hѮ(�N�e�`h��9X���Ce��7�&!��P�Q�$��2a?��қ��9<�Yce�:Ċ^�gy�[n�������)���ޛ�N�|���Rg��73�� �z�2֓�7�y��i1.T6c�����(�+�X�
�И<.��uۙF��c�N�o� ��x�����iԫ�%��x�1|;����Y�o'If��]'�Y�`�ىv��!�Qf��˪��3V���ζu�Pxrޚ�mF��c�J��R'���F��9�
�4`��r�u뮩�m�Ƹ����d�X��S��g�n�:���`“a���uٍ/rq��-%x�z��ū#������q�n�&ح������`��/��n�0��u�`�W�<Ntv���鼪eR\ۚ�c2Juԙ"�
d��8GP�s.�,pi�Jf����D�+u�,�i�:����>+|�7F��P1�
V�e`jx�	ʸ���c'��صaQ>����1O�!��+:��.Ai���C��Ա���Q���K Z��#.6f�u������l�6�)/�D8�,h h&6^�+n��-�>�/��
w�IN������n�\�A�N{F�b��.���2��_��d�A�#lJ7\b;��~7ƾi��c���|�o� ��"�훌V��tZ���^_@X5)�d�H]8p7��d�`��G"��:Si�gfT�q=�k"��~�W�;��Nα�
�^��~��FuU!C/1g�%u��K�b}Z�a��S��bZ����?O����
�P���p0H���'�8֡XU%�'���yg�"��0�˰o%ČN6�Yf�6��S�
�f�ջq��܉�>�)m�&�]"����*�6x6�w"�~^.:L#qa�$���W��;b�7w$o�9�tܞ����j��YK�����^���>D͑W�
>����]0#��8`2"�q1ދ�踬M4�e�A�D�2<�oH����ԯ�)�%����8v[0�FIntțț���3�X�vJ`�F��Y�Dq1���hp�
Y˰�"�`K+]�{�HkV#��ȭp�.�43S͹tcEf���Mb�]��w'x�
�i�L�Vdo{��3]��n��%L	W���V�d��:�=��6y�/�c���o�;j��	)xۡ��k��m,���h�봨#�ю!��L���c&���Xo�:�*,�{�-�2�)m��C�F�ץ�ԘV�:��hW�z;Zϒ4N}G��3�3Al�Rf`�$>�T�.2���;��)�!���Af���h�wUk�]�B���8��=�eG4i��^��|Y�\�,3���Ӎ� v"D
�������#Z�-�X��ˆ��2�B��TR�����������3H�9ѷ��4�-qѳ�B-‰Y��:F{���vl�H�)���rQ0�Ðk����y�C��nb��Tw�Оܬ@R����؁�[���{�e�ٿ:�\��:f�
+�A�Q�ybYm�aO�)§�a��Ǚ���l�e4��g�|΅�#f3'�qy�m4�e�.г8i���;����yQD��*qf���Y�6u�dGu�a�y?m�`c<����,��ؘ�QD�wE��[���,s�;�E����S���9�F��a�2�?�XN���w�a
jH��ɩU��2�[�altC�޴6��t=��]{��éua�m9#��n+�O���Z�}G�ݙ���n�*�-@��U˒�>�N�{�]=`�Ge5>k��L��?���Wl<�&�s@l��aáǎ>��ġJ�pw˘�=�q��;�w��r
'f�E������`�u���w
A���&y����4O&VDL�^���w��C� 1��q��<DN�
�X��fg"���4֦;�~�4���_���r�C
@C�Y�\��F��q]��:cb/��iC
3��{1�G�
>:��̽��XA�
�8.�RK�w�H��
��'G���]��V�1��	��tl�ۣ��1�pH�5Ύ������Is�ŎY0q��]f���j;��Lo�M�8ӷ�'�:���:8_&3Pr3Z*�y��1�3��*̷�K�Qni��Uų�js�Pm–M"6���W1*�Q�r
�L��~O�/?���x<γhG��F�=]�B���ޜ��
Tad��={���|�I�%�n9}ܠ=K8֗���4*Ӵ̯+��;5"�� �:��ݪ��&�P^�U�zD���>7�eND�>�7��b�v ��?m��Md���qbyc��ݻ�17�9�yg��<eڝ�l��|0:�����8��"�.�M���y������	�E#��u��s����`���9*ټt���o����t& ����|ڝ���:-:v_�NQB8F�g�V��އ�A^p�m�c ]��Jۋ6v$wy;�)��#�����
��m��b�x7f}acE�؀@wO� �5�5~K�>7�F��cˠ�J?�S#��׈�V	+��[��L��S����$i�os�!� �s�z�L Q+�`�Y����;hP�c�娍=�n1�E~��Q�4e��N���
.YV�9�w����uA���E��+���sC�ǽ|[��p̫�QР�D�m���;��E3y�鮸"� B*�� �A(�V ^_���;hSO-��\
�Q+�^l��?�l?�fTX��(G4�����Y�n��i;h�%�4�>'�ASݳ��E�m�����7[�5���v�~L��n6�R�}�p;W�����S0��K�þ��(���!�ۋ��	�Fq�����~gZ�eZ�7��:�P�;�g�0��֍����b[+2�J��ؑjG���
�P�}+rs���C�{��M��Y}����x�/bt5�����D�̪���.��d�n�V⧹%���F}{���^��ˇI=�r%ō��O`�.��,���d4�Oz�Ƥ��f�,�p�R���ԜrQ����@!���uZ�J�����|=.&(��4���,B�lÈy}��'N5@��n�����.��v
�^���g�_m2�آE��I��N�1�`м�)J�b���b��)�u���r�]S�Lm�#�e3�A;ʑ�eˠ$J��1qى�K~"W7����h�
pE�qds�Q��̳���m��1gk��ʐ>��pTK�U�2d�M���&S�A'p_��״O��~7�kC�ɭ����+ۍDZҳd���9��,�y6p�l���R��.\W�~���P�S�
jZ03�V�'7[��*�ۣń��ɔ?D���Ix6FK:�ˆ(;�B��Qk�Gj���g�jpwu�2�m,?�5z�~�X:�%�g��oO������惢e@˯�ܒM�,��O֙�E�	Ƙ�����Ь� \�#&ѭ����9��
ߐC��"�x�:�u�y�G�4�Sh���%ʟ���46i�v�6Le&��e�
s#������2{m��e��O�4��K� ���e��ʮ�e���q�ȱ����?�E�Os� </��1��)v��ø��R��x%o�5tгX�Ha���B��,$�V˶��6��|ω��_O9���)̧mx+�t�������	kd�<sm�l#U�u"B@�ZS�C����kճˈ|��nص���D�˘�\T�����D�b;�}�۵�#z�L�K�3L�џs�uJ� �`�r�!ǯi�,��C��m#�c�{^:��
`�ۥ��,7V\r,X�l�1���ݻ��%g�5Y��X�v�����;��tCpP�Eյ��jx7ix!��f�>�Z��1EE�J�R�H��S`s��J������ncu ���m����~k�h��x1�-��?�%q��%j���ݿ!��;�\��(-��6ߝW8o���[���4����QP���R�3`W3��f��O��-�b�͟� ��L/&��
ݷY�?����.�"����foo�
�l��~����n�v� P�b̟����u���W=l���ю���,?N{�D���R�1���8�B���:�,�:�x@���X)��D&�g��:�-㡤~��_��9���v�9/1
�v�'U�cp�<ڀo��1�,$K�q�-k؅���K���Ke��Kz:�E��̻t}�a…sQ�3jG�r�<�).֛L�L�*�_%*�PĆ��{��k�6M֭=�mv�¸Ǝ�$%�1installer/dup-installer/assets/font-awesome/webfonts/fa-regular-400.woff000064400000040654151336065400022306 0ustar00wOFFA�
�,IyXFFTM0�qqGDEFL*�OS/2lO`A��cmap���Ǡ��gasp���glyf�5Fn�lhead8�36��hhea9$5�hmtx9<�T_tloca9�66�Eˈmaxp;, ��name;LU.05�post=`I��OA�x�c```d�	�9`�c�U(}G.��x�c`a|�8�����ч1����Je�dha``b`ef�FHsMah������0�4ՀZ1.R
����x����K�q��>n
ϳ3c��)<HP]:u0�
��ݶ�C�0*��Ƞ�����,a�.i�A!T*�^$,(|��pf��I��Ak��f�/��scL���
�q�)4��Ng���䚕���x	��B^�비�(W�q>ɵ\�|��q7s+?�>��_����\
d���F�*�d���R/W�M�奼�Q��i�QW�h�F���И^��X��S��}���E~ԏ���d[r�6f/��6n�m��}�1β��XOͳ���y֥XKe�D吜��ڝe�Xw�cZ3k�e�ց�u_��ƞ�7l�}��JiJ������Kt���5�M�N
t��Q-Ũ��S�:ZC���S>�����8�#8���؀�1�UX��w���0��L��[x�>$�nA#��#��E"�H��ܻ�z��7�N�S��r�~��P�ɀCN0�샿���~3S��x��}	�$Gu`FyUVeUVfuuuu��wW��3}Lϩ��jiZ��nI�F	!�VԆA�A�����l�V��Y�1�l��ˀ�~<֞����X�,T�Ȭ����a��33"##����_�#��?�;����\��P� ™i4�ꍺ�,"�^-��8�����@_����M�~oЎ������%�%��ıdn� ���k�&���O[�)ccʥ�k21<���X�5��E��8�n��Ϡ/p1.��D����]�]�X�����a�1M�I��C�n�5 ��w��L	w���neD�MN�wq񽧜�B_0N?q�}��X��F��φ�g?z���wX��w�޽q�\�;ƕ9._������LaU땲]�;�j!���=�z�P��m���ܭ���c	��n%�5�j��JVؑL����?���ʝ˳�˳�5�V"a��B��x�
U��+�ɇfiN���+����0Dž�5^����IE
�*}`�>���������_+�)}�B�}�qz�����[�E�����DԸ
��d��ϡux� W�*�.�
���}َ�.�5�Ge8A	*+��5�2.�-�1����9��(��UzDOcܼct�����Y4�u���<�<��
<��1��1}�wT������`��/r#�,�F���I���B�Zw�ȱ�����Z�R���'v��텽���]
	%���q�/��O?�.yGr�d�0=�3	59n����E!�I#M 3A&���r*��^,�րU�B��E�H������ŋ�
7���!�l�Μ�$m���5޳By�v��ؘf���Dz52N�QF�/�o�vd'��#�<�,�Dk��k���_�0U(L�8��(��-s���wÜN�̚�0�\�wJ�)�#3]�6�Ɏ`�#�"� jD���:z"%�m&K�����7r���UD�Rxܼo�d������ar:%���ר�Ds�^�͟�|º�0�͙��v����3��7Ͽ<aӎ
�i�D�.��S�������'���=9���+�!�R&�<�C\�Z�8.�d^Q�S���{��x�Օ��ۊr{��d���Yn�,��cH'
�E��(0�h�4i���]$��	�HS�ê.ˊ0�L]!JB���®����L7q�㤌��%B$E�BK𸤇��)$J�z���F'�K��&p�4�~
p��z�Z�K�W�f�`ܪ�Eh@���`��Qjz��v��I� ����n�����S?���|����cW݀J�p�T(HҎ�nY�|��;�/G��=rd���,'ml��%�_`�*����#���V);���dR��!E(�(p1\�B�ᰛw.I�bQe,��Y�I�>�����Oת.��p!�?|��ᩱv�#Eux����]����y����f���G������N�!���8�Q|t�i���fZZ�jtTC��]�-��m>�5�jn��ֹlf$Y�|~D�G�U}��E��"%(��_�J���T���-t�;��Qߵ��NGUu�J��'�X�1�o�?O�F��7o`��5`��PK�����Z��䷞|���W�t�:���>�܃#�*��A�)�u(SCo�óN�ߛ��|�ʘ���� �+�[�?��r�_���Q��{.k���J����ZJXm��4�/_��%oN�~�`�uDY�ݱS���GaփG�l5҄%�ec�y����Tk.�2Q���#�[n��ȥ�ؚ��^�����極5N��a�}�
�۵��<�<�.g+=eg@6z��I�,������W�C�w��0}�Ю_���gv�R��w(��Zf�_,��z���d?�I��sG�$���*ł�1u�0L($Q��;T����!�D+A��܅�����4�-ѐ�w�'�K�cAcnOPW��ă'��zm��}�-�%��E$�f��5�kb��E1�h��(��/��o칹>�\7ߘ�����R�cz(���d~d��TƢf@%�5�6=J1���>K��V<J�Mw����z,u!z6��� �7~��9^D���]
='Hq�L��TX�6�)N�7
�h�
���"��W��ƠOMAt$��1- ���Ύ�e�����N�f�>`_J�H�Rpl�R����:�*��
�`~�א�g�궜��ݷX�D�ڦ�ׅ�U
a!��|�bBI1I'2�h��:��|@n�G`*1;}	x%�Q��p-X`	�Y�d�̾�Y^@�Ui��q�w͇v�~�NJ��/�������H�ݣ:Z�6)W�cc���S>Aȹ�y�6
�m��s�0�~�iZD��-�.Fj�h�3Z��P\p��aGE����E�}]�&�D�G��[z�W(H��M�ue��*'��{ޏ�*O���k��\���q��
CO��8�
^��:�/ڒ8�H�&U8���M�в���W]��Nf&�$��Eզ��㪠��A����㡱2ˆF�N�jHҬԠ96�.��"H��a���33�t534R�M��tS�E����s����aDɄ�5�尝/�Vx������ځ�ډ�Op7s\�"�J*a�{Q��-�
�5#G��(�б����v�F���)>��ZvH‹��9�9���Bq=,*fT��M�\����T
Y"�s��RԸ�VVtu!;l
�,M
����I@��i���gf4=7�����0�Pc(��3#��Y(�Ĝ��ͬ5A$5�#���k�T��0�����Q��N./4�(�EF$�Qu�{�E-j��E-��?�����]�[�%do�H܌��G��5`�����@���8(���>,d��pׅ�w�����#U&��
e�����\_6[	.b����(�A3`	:$Jd�e�����R#f���r��rc� u��@4���Ӛ8��u���8�/�3~�n�|���ol� $��2Y7��]�Ԫ����y#a-{F�����0ī05O��]�/��|�ð�?Q�d��0��x�ͯ�U�C=I����Ȓ'��u�U��gV�v������F+�O�Pi����m�+c�zb[���kkb���^P�1�9X��^�\y����w#��|#�珞R
C��V^����K��'\X��m�eL�c���,H����x��k�h䭷g)�+�Wʋ|
�t
�Q�L	 ��B���쩄N�c$Ne��h={�0���1��v�-J���ȡz�AG��B��l5HHH��F�3�V����ـ�"�5��(�B�œ8���1��;���¨E�G4;���%/��Yb�rT�b��'�aR�#�C����x�/IK�x-:mq���l���㒘'$/��N_���9�,��J�CW�K��??���\�:
?�;��<�������S0
D h�;
�
�$�
;)
p�0#���X����\S�����i�U�ߙ�� �|?��S�=���	U9(�*���;OhQ:�A�)L�2w
M�وN�y~��#���Cܭ��{�<j�T:�d��K��;�4}�7�m�F�J9��lg
5��W�)�L.h��@�k����t�s�Y��L-����Q
���<wn�Yb5K/���c잾�3�Vع���t�6E��mDW��F{u}/�%F+b�v���u6�AR�(5�<��s��.q�[���ܚ��2Z�O�)��N���Yr'�
~��B?y�ӂ:��ԅi�m�u�}��9�M�"z�{�a�ݦZ!v�;�EV?�`�;v�q�����c[AO���|���;��~{�c0�(����A�/��U�����e�:`'e\�b3`of�7�c�D�q�&�`��$;�3C@)���0��[��d/l=S�V�
,Ƅ�akx�n�mL�m�w�
q��n��Ƚ��e�܇���#|\��"ֳյ��/��V�'>�4	���fJ��%��������Լ�њW^ۦ�w�M�~��s�k^�ߣ��zo�]?�E������V,ȓ��0B�c�)�F�t��nEǘ��@�������|�i����5T3NQ���'z�#�O�/(!-�����A䵢P^2b���'�4�s\�'���ww�t��R�7A���ś�A.��G��<�E݇��e��6��|W��VzM!�臝�c
��l~7�3�e���څ����&.z:��oGh�Ccc
-J
�޳��҉����.]�z|�0�9s3�VO�L撵ҕsN�ܹti~�Y$�����4�-������(c�@��I�R��ɹ��v�bv�ϝ�S�́�O�A���s	oQ@AVy6&q��ؖs��iL�Cuq�J�o��|��C7��#i���&���El��4i�{��U(֭�:�rq�lT���J=�
���K2Ʒ���@�C}��D�K��-Xn���0��j}o��}��ֻ/��wSނS��m�}��3
�}�M>�n3�����`�{� �.F���i�^�%B�jS�_B�;Uc�n�']wܚ{���;�Ujg�r\ͳ�<9B<[J�|��"�`ޫM�ҟ����d�X;,R@^d�x�˟�b̷`j����sS�
w#��4N�g��
U��@�*�F�hH#J�/\5%dixS��l��*���	I6r*!$L�6Sc���rlP�Ɋ���؇�H#A;t����!!��Um�B~I���g��t27��,Ո^DH*��;��5�(��Q5f���UY�"D�C�
{H�ږ!�ǽNc�?G�K��s����Qe'5� ��J��Z�m�E��0��t�~�m�j�F9�S*��C���T���x��h��+&�,��ȖB͛���mj�A
e�z)_�g@�3#rȐͨ��],��:N�:�S�v)!Fٲ*ù䝌F�ZX1b�h0�!{
/d�r�
Y��@dG�[G��#l����1/���ig�TY��j�2=�A�Ql�"):�&�4�Bo���!��+F��Ѥh̳�$T�^U�ȑ�
��
a�‰��WO��S������`���}`ԭ������õ��7��/�>nO�>�
���צ�Db6h���d�B�Z)��:ȍr�z�ɻbN�V"�[A���;��'J���-�E���֓��QË�]�:��,��|��\�k�+1��,��WQ����PK�]�+�P�#�o)�~�5^�0�)���3��K������=��Q��~��$g�ֵru6��^ǽ��"[yʾ�_̃�D���]�3�xrK�-���%4�s�W�m}�OS7�y�������

n���]EW���wA��b��J���ék5p#c�u���"��FI��B��TÚ�`�8���T�
`!'H�>P�	��<���HѨ�TE͗�a��L�c��R$�G��� �I�1�I��8���lP���e�ip��pw��p-�bayq�"
D1Y
R��]:	4���D̫�Sy�	B�WT^/K�ʃ%(�w���%����ehܔ����5f
���0T�JϷ��p�sY\� 5	X�ע������U�@�[��Ym
,�!"�)���Q�(�@�Dꂎ̣X�BcpNG�ux��a�_��Q�/˱l��+��j�E�q������5%��� O��^�i��ۚ?���
K<����A����}\�v�XK
mf�&����؟�$#��a;��j��r��	ނK���LMs9n��an�_%�mD�5g���;�c�����pl�R�����
5����Z*��J��7��$�iWJ-?���I���`D	�
e)�R�����­�B-j�~�5��p1vk*�HH#?�S���>ui?
2�r��
-�2�@�EYz14����K�T�DN
��*1ݲ���L�|T^�H����X��XD�jtgT�c��z�-�/7_]�Է��
�n�?�"5]�S��aKP�&��M��y��.�9����\���
�Ēiy�Q(n�:�m�9v�由����DA�A��M��?��<��)B�W�1
O`�i;&�W�1�F�m6j��������c�!��8��c`{
��0L^dP�ˍ".z>t�2
�4v���-�$:�L��G��L���w2;�=CC�h4�V�/V�ef�>v}-�_�m�-[�hn�!/�?�>�z�D��
��X��>��E'"9��E���8/Z��*gƍ�Խ	1�L>�Ws�ջ��E���F:�|�Ѱ05g�	{����]�л^���ѿB�	��Ƌ��q\
8`�z��n�]��Ж��E�kZ(�(��	ȶ��mkP(Y��!u�ⱳ�\���N]�������=_P�X�i<vE�_�sɞ86���AJ��=����:6��/��jů���nUk��U�K�W9�]�+#���~Ni�Yݼ�q��;���'���`�uL���?>�k���D��J����yn�����K��P]j����{�7S�~���Ck���H;(}�����W68�j~O�~�##��dm��!v�gG`ԍ�l|��e�e��I7�T���μH�I���zcQ�9�eJ�������%��+�ꪪ�?���>���V/+!E�R��1'왊�̤�t]E�d��R$%^Q��Xv�?F����V�0��hjOs5?h&�M>@�O��&ά㦂Y�l�:C����
�Μݵp,�42W�0��X.<��%EU��+p�z���ϊ� i��ۙ��AQ{r�+ܡ��s�K�����_������w�%�A��,�f@�M'��%��0�֡�(
/-&���"���(&���TU;��h&�Jxp�z:w�<:k*���c��nf*��J��ӝ ���XM���;i�3kY��"k�b�@�J��Y�����*�1
ԛi��{��ఔj���.�@Q�M��1�b�>}nuV?��68�s�kf�4�ѱ��o�/R���3g.�9�S5��(7�l/H�C@��@��s�̽��Ui�v���P��u�F��ъ�Z�I�P�v�=咢>'��*�+n��{���X^b��ݩ�D�HѿDo��Z
�2�uU�i��x�7W�R3���F�:=����[�M)�i_���Y�-_Z,s��F6�6+lA]4V�Yk�/7�/�F?E#�^ �j��aj�����A>�`��o����rN���i�d�)Y��/z��0��0F�1MJ�l7���fɗ����a'/b�������$r��8�J�]vJ�40��t�<=]���uѻF�>�_=t�!��s�ޜL�y���ׇ�ps�[�\t����0�b������y�P�l�;6�Ʌ;�g�2�����*
��
��G��U��H�g�B��l��2g/ٱ��q��l>a�H�s��y\Bo
M����R�T��������Twd'���q��_�
�,u�B�,$dB���"bQ�
w$�k͸J��)w-p�g|����:4b�e��Ѡ[�\�Q�,=�
tw�A�Ri��CSRR0��5շ�d{(]I�����`8�%:`5V1�%���J�7��1i4yֱߥ��n7BQ��9�����_��8L�}Z�T�������������u�� *:��[M?o|l��X�X��eaH��E4�lx���E�@]̀(-׀`��и���;��p��̈2������7�ٳC���ܖr�J�x��A嶠jKD>�ZD�?�*�S!�}�b�����T=�f��q%���ƴ�Z�)~��K�|	
��iRC�1ZR����9Qӱ:0�(�&�G*��n737[+��`n��@�D37�
&0��p�)�,3f��I~2r�(�u��ܽ�?IO��W(Fߢ?A�oˑ�_El����t䳁��C��������Ӳ�N7?
��@d8���c�RQ�c.�nl��џ��{�i,]ۡf:�چ�EڧfG���qِ%��>U/T��{ZyZSÀ2ļ���q!j�p-:L�)4dNc�ĥA+.�F��R��� �ܠᇾ��a!���JT��cUS�1!��e
c��(��
�و\�{"�VD4.#;#���"R2RI��z�P>���׵G4C���SD�Y]�S]2��	�G��<�_�IY�9�Ƈ��� 	׸Ƕ��i�0ץ�3����T&�כ�S�-�RϽ��γb	�0�:�+��	tGz?(��3�=L6Ŵ�l��D	�+��A��DjI
Q�a�����'c�e�Z8���(\2�?�G�+2y�3�x�	��$���URL�ު�a�i9�V�_��zVH�^EAp�b�^fY����ar�*���8�kv�VC�+��;K��Q��wH�`^e�[���N�?�G�tWtd�Q�k�H#Q��b	+?L"
H+[��T�8����.7$�k���#F�>�h��mf��Y�H�c7S�uR0�<@��F-	�~((ء��l5x���z�
�U�M��myT�v�{���ezk��թ�ƉPJ�(ʲx�~gJ
���,#��Wh<��\[��Ѵ���s�����s��e�����
ѽә�7�}��L?��6���j,x���`{��~hk�pM����>t#������WM�YS��uY1ez��Jk[�|e��^��j�9P�W��]NOwV���K�x#K��6M���/+�X����4;u�s��1o�*@i �a1*w�M�$�tLԨ�D2I��KX�T�)�=�� t���Xk��0�Fh]!͏c]�k���)]�)�l~w
%��4��M��n~��G���x*�n�R��݀�H��.�:�/���.��*�B���kT���X'
�X�7/�7�
�M��u�b;�.e��z�@���d��{�Ȥ��%YFR��Ù�e�P��:��>�݃���9=oF����D�;T��%t`�_Ck�Wƹ�������e1�/E��	>M��U���q-i[w�t��������3u�jYf�{Y��5��VO��R �S��z֌$�3�\�(���R�{�l^m�"zR�w+��!����$�űĭzZ
�%����AX	�e����k��N���Ǘ6�H ���
��L>r�Vr�P��2XBJd�k�){.���N�b �"j."�+�ym[2A���S���E�Ğ��@'���H�СTN��
6o�P�L���;]@܂�*�DCʺ�X��v�l�HW��/��
��"���iӍ1zX8%�WWѠ�cM�ੇ���F�m��F����F�6�q@j!�PdZn��	bӇ��j��#��p���&��uT]Wb�Hh�/�dRwѝ�>IT�&�H"���	�����~9H�`��K�ܝA�7�S	��*&����@�ݳ��,]g�� X�r���8�O+�bB��q1Q((�tɕ���+X�/�m/�C��H,#˙XD��>WN��f��s���-�]��-��ҁ/5S}�X��3ݿ~��6#�$�d�u���wg�q���,��_����)`l�����J�%����l���D��M%�CÓ(���]򹼰�N��Μdk���V���**�K���R����o���թ����c_^��m9g����6/u�l�/�\���)�,hUaҤ��ڏ�or�,�����v�,�lq�B��cҨ8ڱ�S��M�$�.�aq���24;��u7�h>5�8]��!E�Q�[�����>m������,F��ȰD9t�)o�mw\r��Wm�X�f:�}s$�R�"@vx��V�m�!�s}	�Q�_��W��OT����<�V�̊��£j�:V�hN�k����4�nU�m�2�Y����W�vj=�7�>I���i4�}q�*L�/� ȲQT�� ��9P��6��Q@��΃Q^�A�y���}^������tNj!��xL�'=���'M�4"m��M�޲�d$��#�걕9�J���ě�õh��+cW{�g0*�3
�x���l����`���~�iګ�%c\?��Ͳ���}.�
/�ٽ�����f�s�
�q"0����!��(h!W��5�O�!C�<~,�7_l^:���=��k��9����144$� Zn^(�m����@�T�+���Q��G���j�g*�>�Eڙ6it	`_���T��}���c��&;��۷9CSi���K)&�Gs�������f�׺u��h�e��f������>�1�>�K��	�e_u�`�ӟ��
�ճ��:1�Aۼ�������n�;��h��N/[���g���+c�,���������t�����}�,�M4�XB+���Ufݡi��d�����|P|��M~Ef�_���;����ݮE�˺��޷mzW++�o}G���=G/�����q���#?�#~�g/8`�%Y��R�pϸ+�)��])fI�A�b�i�F��ExE�.4�o:�������/V��k_���*��j>PE��4[ѵ���J��߹���h}��ֻ�OE�Ǯq�����+��֌�
���!�٤U�"
Q����Q��Y��^6��,�zzI~��̟S��K�y�0�G�yT��M��|RUA�yC@
��/�d�������v�}Ӂ��o�ct�+n�m�nk����y|�‚�ز'�V��R���%9��~m��E����ڱ�4�q��s�U}!�]���_��7�^���t|��(u����ݱY��v�6��ݗ@�N��b�xWP�kOj��j��(�U��+`5�x�X�������XX�%�I��[�&�S���ioh�>�]�4��FѪS��vw�Sy`?�+�na�,F��"�$%�겢
��XUT�%���ܳ�tp���j�lc�(���U�	�j.ELAVdZoJ
8�4���q������&2��a��n���'�_����9=��a���}~S�{�Nפ���[�=�U�g=��t�-��'ҝ�����Glϭ֗vz���K�g~c���,��a	�k�7�1ky5s#'��vXok��w�7o��<�g<]�w�m�tzQ���ŔO�i��PG�$Pf�3JI�0��Ȃ�2��.�������G�s�n�WrG��?�ӻ�I�2Y,�Ҩ���R���Ε2[x-��^vf�1_)6��X�(w�J�3�w�H�ڮ��w�gsH���2S�<��19�ÍX��/��6�_N���+����Ke��ґ�x}D�u2�γ>��A�����
��
��>���$��g:N�q�
�b�A噃��R�/�,� ~Q�R�,���U��f�9"1�_Ŗ�؛��ތ�T�b���Uju\��E�bůD���NŶ$�c���A��( (�B@�&��|��Ot;]%��M�61ϓ�h�����l_�8`u=����1i��F���Uo^�0i����Ä~"��U��\�Y����S�L�[�^����*���NQ:�w�!�w������{-�H�R���~M۟h���;뀠��Գ���x"?r��:��(�������B�9��}��u�ܴ���V�U�c�� O�U8�|�n��3B�$�
p�cF�-��%#t@�-�)a]�������W}�������B�ü| 6�#��]�{yx��yy�VۯH�m�m_�;l}a{�\���Đ�1^�zP0�5�m�u:(���A�$B�$"�*�=��{����vS�qWq�qw����>ŠQo��o��|��f��<�����;F�;���y���0Ӻb�tPir�c<[��_"H���3���5�h<=_#�t���)�m���v\y�R"xt�Ι��N��T���"����UE��B�ʅ��#�Εa�Ha	�H(3��1�T��h"17��Y��tǕ�Hš+��J�ٛUr=�^���;� uJg���
��Z�
�WG�K�[��׋��g�_oϻ!���a���A�y0ﳒ �1���aQF�[����v�xŝWdc���a	~HcYI�C!^:�
��-I�V��D/���=��s�v��yH��(���a��7��\��"Ow!�?�[4bOo���M���D�6v:ƻ�p��wܝ
k��{K�cZ�����];s��߷��De�WR�i?�x�����^N�ss�`jfn�w��x����tpu���Ln>�-63��H\D3
|6�Tc�G�3t��a&����, ?�H��R���lX��o���x8i&f��fD��?D��̾���٘P$M�	�5MR��Es�ܲ��~�e��&�X�5���o���w���?�_�������4�/�)(*C*P�S��I��(�Y�z5��-/�&7���Qn�4�C�}���o�'��T �]OZS�a!��M�̇A�!]�t��Ɗ�U799�!�N�l���S\w����q�K�n��Iu�Bp��1��]�����ca�H�J8Ǹx�',=���@�t�$m�cjё���.Ӳ3X�I�ږ����g���$�<�f4j�"=b���`X��d͝�!�lðC�c�(`�h<Q��l�D��t�;D����<��-k���� X��U]Pu*h��
�1�AY*����H��W���c6|:�W��I���if���{�A��-���Į�2b[I�u����^��OYP�57^^)��6��x��C��F�^aÆ�'f��*8	�fB���G4~�
��ӏ��L�*��'����ip�M
8Su�8��4\��4��g�`$2�h8-ټr\wB<	)��!�?=5!���'������Lw���Mwga�z�t�vy���(Cf��1�̜��q���i��
�������X%�3�O��=i�n%��s��zȲ:jS|w;�Q	Xϵ(�e�a�Uu��B	�/��8D�ʐ}��0���-oB6ȏ��wq~[�Ŷz�v���w״��9��p��C��#���u�
���܁r%���F7�m��p?�ʕX��l-uI�v���ꊽ�ⴾx%8�^����ފX��ޖ1K~~ll~��q�<(d>�4F+8튋[,?�54-]�mQ�-s�uw�t��Ϸ���Os�[����eكuRs�G����^U�m�>: ��'�'�X�=	�@@�����=���s�Z�;������s�S�
]2�����}^�w�a�+pS�V@�&�[���b#���� ����ݾ/P>�qn 3Г�=%[�d(���,�D�X̌l����l=�
-�j��bOt�~O�c�]�@a�c��V72�/����K���1�������펕��]�2��ȻA�cc��-�-�<�g��l�D�/T?�z��7��I��qI���{%���YQ�z#�_�{��Q��^d�|^Tq�fR��x�c`d``�(���o󕁛�nt,�
�o��'S;�I ��,
�z~x�c`d``<�S�7@��(�&��	x��Q�
�0}Ω�Y�;�Q2St@�
��;��G�ɉ���g�9�C�LK�c�Já�Q�RS>o��y�=f��+/�+��v|�M���P4z�q�ս^2�����m�
��L+_�+�\\?}F��_8��d߳�ݴt�]�J�i��IwR��U��g�Գ����yQ[_�@|��n��*��b���H�*N�b�b�	^	�

:
�
�:�6��

�N��D��>n�8�(f��L�D�L�l�.l�D��f���Z�h�D��h�  h �!
!J!�!�"f"�#N#�$$j$�$�%%P&B&�'
'P'�'�'�(((l(�)$)�)�*N*�+6+~+�,J,�--�..f//�0,0�1 1�22p2�3�3�4:4�4�5 5�66Z6�77bx�c`d``�Ű�������$��3$��x���An�@���i+Z�j�Za1AA�D��JY�AT �rS7��d,{ڨG`�`Śb�8B�-���@P[!Dc������o���9N~7�V(㵰�9|vqK)������³��q�y#��k�w�%\u�	/c�}*����Vx��/�k���*]��/�䬘����E�v���Kh���3x��³x��	���/�s>
/��
/c�}$����Bx����k�|�#E���Ш��*��F��&ƈ�q>�-��q�ou�[�3�zsefȽ����)9�m���!��ߋ�@w�(��Q�pr��d�߼j���q�o-�Z^�r:zH�
&��/^��.G���Dž�]��毲Tc��[��LEi�Q[MTu1]=�䯝�_�y��$��I,/��u�,f8���D��ь�-�5��Br���r�Pw@�e;��Gz�gzh2���:�"��ў��bKu~X-�2��:�}�0���+쇔[�d�z}�}�'}y]3���{���'��3s	9��x�mTgw�6Ԝ$��d��.��ޙ�{�$W$N A�e9�'w��C�M~Y��l?G�	�Y��b�#����Ή����t���衏%,#@��a�c
��Q��c8�3qN�l��sq����b\�Kq.��W�j\�k�:\�p#n�͸��6܎;p'��ݸ��>܏� ��x��1<�'�$����x��9<��"^��x��5��9�7�&���x��=���#A
�rp��JHT؄��A�-̰�9v�!>����3|�/�%�����;|�S8��#~����7��?�'���Ĕ�i�T�֤����4\��	ӛ���ӂ�i�,��܌/HG	W��Q�S2m�x�&m�,[ܥ9��i�t>J��2e�U_NdQPi�&R����#��a�[^Q�T�.ҡ#�LL��
Y�D	Si7Oӵ��iTI^�H�,7�}	A�����T��^"�yO�-Zқ5SP�E’	���"��$D�K]q�İ����K�f���v�([�[PLiKK0�ݷ}��w�V�rQ�mb��>����bZ�۝�i���@��6`߄��
��:��.bm��ȕ���R���z6H�i�q�E�ˬ�V���3�ҁ�h;!1nf匔on3�3jh�$�[��Y�rل[<%ٔLd�>q{(�a�*+۸��&���K�i��#i��n��)������#���D��u�ڂ��phE�L�Q)
9՗�V���C�
e�0hT���G'\k���#�w��6�te׏�Te�5�XB+�;Ѭ.�W��ڃ^݂U���G�Nm��BVm�Y[�LieW��K#���������f�,�{�<�vK3Z機�xi�l�|������V3RQ�K9��ŔB��i8�K��u�^yc�Z�M�_��;�u�;~(�}�P�����J�ys+ץ����h�}V�z�=�i�Y-�)�ٙ/O��d������)���z�Yn��AL�/�Hψ���F�Ml�d���/���փ&c��6�Yf5m��W������zS���

1���M_�:�~�FM��m󾢽���m��"%��6���5��P�=ݶ��\�kU)��o����\$�vinstaller/dup-installer/assets/font-awesome/webfonts/fa-solid-900.woff2000064400000221154151336065400022042 0ustar00wOF2"l
�p"IyX?FFTM`�

����:6$�$�, �%�_[�@���o��+�m�+��nz΄;��(:L#<(�nc�DԔcg�����+Y���_�}�$M[��
�*N�B�Y%�RIU
S��L֑�k=����xZ0�f�ps���|�썈����̂����V�^�j�\щ�4�޻il�7��֚�BdD��n��Z�Y͊��b��n�������8���}ۉc�kE�5H����{��FDfoJ��c���KɓhŌ�7�3O�)�0mD��ؿ���:w�}�u{%�D%*1AT
�I��cs�8m�?�c%�#�H���
��K+v9MH�	E�π�h��VW<*�=B�ٞ�c�1���)�}b��ñ�µ��|�������@�a6E�.��~�ܿ�m�@�Ye�qB	&����[o��k6`c�1z�A�>��#���QR���P��(��D�3�<�1����>�!~n�ވ�o�fި=��2i�o��ٔrV+Ϟ�'F��'���~>��
��\�K(4�y�0��OL7�B:1��]�ՓӢ�5�.�ňua</����4`��`�5�vM9k1[�42���NE_�����e:��(%9�.K��ݤ;$�$��OE�iG���1ۘ��/�+[�%꽀�_���Jm���4Q�qP�>4��hgZ�;�%`}��;��94J̘b��n-�?�\����%�Y�@Q�Fb����-�w�2\�(��`c<�����a�e��2ۜX�k����I���u�Up΁����2օv�^j��x���h���p����yo_O�n��D
(��^�{���dW*�*`x���De�h֭�B��KW9�ߚ5�C�HR�n�4]���� H����嘃d����sj�K�N7yh�0$<0!p!m6��q,6��ڞs�e
�1i�hl����ZU��U��_U�5�K�ɶ:8�� ��E2���:�p���
0Ȓߚ �e%�t���æ�7���%ύ�v,�&L!T��Hx�@{�`p���4��Y�ҷ�`1u8S�/������O��3��[k��b<�OIs�T���$�%�խ��I�l��7�p�7�=⇪bկ_`U�@E�@PAJ@PAZ@�EP
B�M�v/�I�읕��y���A1�2!�jѡG��	!�n�<�'{<9�6�S���=�ḇ{>�BU��P�X������ $!�B!�!�QH��X��(��E�Z{T�!��(�0�ϧ��D�M�U&�tq�}Kz���͚b����M:J{c����`�
+�䯮��\�e�g��T7��DMR�y4G���{I��z�������,e)%��8�\�o�L�̽G�C�RH ������?zx����,
V�"$�MvS��������-��Hq# �8�*�oB�Pd���>~��;n1���*�{àv��ID�v���=�x�5���<yJ,���C����ʩ/�z��U�;p�_$�{i�W���Q���r�i
��;�C���x㗗DP/;LC_��M�́�A��Ӝ�ob���e�L��P�˭����l�Wl���G��[7Q�3��g_�eլ�~���qޯ��?\!�'�)H@�y�=.�$'jV�L�~~����?Uz�/�G.W��ܛ��ɭ�.��ǥZk���~K	���\q���⼛���� [e�]nҝ�h��Λ^��]�� N������c���Yq�	'�NL/,�m����=�������������o��������Ƿa��}��x�I3A�(t�@���{ ����*��醃�t&[��:��;	����Vk
z�{�_0���s�m��x�����uM�]�7�m5}��H�֠�#]�6bւ���X)M&�bV�X�:C��;��S�Ҙ��,x��HA���v��>Sn:�X}�Ğ��n^f,�2���E���*r���$#ŖSڽ~^o�+������k?�2Ec����x)��;}u�ᘲNͼeב�3��>t�r������n^>�|^v} U��������x�D8a��H�?��y��H�8R�`�ڷu�ڦ��"K�0�=�\/磮�4�TE�xE /x�#�8a�KX�E�o9�n�G�k��H���s��֑����S3�x9}�;o�Q��_��)KbWyJ��\�64U���1?}��v��y�9�e�,M��q�컸h�0�JY���w��Π�?��.ƣZ!ʤ���[�g�����Z*
�����8�M'�Q��j�*�L*���ŤY��b�]۷���+{��Ѡ�˄|�͢�a1h�V!���<*�Fy�r�}���C�^_�c>?Kd�o�nF���z����"+��M�'Q:!G�XQ�^|.��w��>�s_ԛt3��D7	��eN1l�	R�$GI��f0,�ψ�GBl��QR��/0�X��+��6����k��;��i��T�^��=�@)?�]���@\���~[^�g$R��@�+IO�ib���
��L#�]�$��	���5����:�����-��0����8�j�����N��W�M��a�RL�b#�����Ӻ*��d��N�I��%N�|��I6Ws�/1��J̢NL��~ۧ+%߿M1g_�XМ%��E�J]p�D��`X�u���Ѹ�`O�mڰT�z�?��(�S�`�!je�<,Za,joto��+����e
���YG$O;_�\�'��Z��i��j��=)�)�-|�H~m�YT[�)��M�^6O�ږ5OK�1�u��wu-���m���+��[pţ���1l!kc���a��>:`�d?��[uˬVoa!�Yg��X�tM���Na1+�A�, ����^��`벎��L�a$I�mʵO�0i��h?Z�v�3̉X,�;��(�ޏ㽕r�7*y	�7|�op�\���&d���WK\p�v�B��'H�wt��(7���n�H{�Z�lQ�P�6�~yrv�3�(@T��3��P���Wv�8�����5�6��*H%[�������E��V3�$��~�xo+��
��.�	z,3�%j3�3�]2ya�E-�� G��N�}=�?nW������b�@��Z��*��a
�h�o|��맣��V e���w>��ƻP`�sOI����z�{4��D2�Zz�R�`ܔ%�Js��� ��*��D�
�K�b�NE��!Jب�=i���vх�i��ʊ1Z�6��5سC�i���[M+��mX��ld� �I!�'���y�����O�5S���M�L|� �GU$�+B׽L/��xV*~��;DG4��	?ƈk��n�v�$�Mp�0�?Q�j��/\���[�Ż�)>)����~�~UJ��C��R�&n�f��xA>S\Cb�؎�).5��RH#�푣2n�\<����?��khS�8������p@����Z�h��Pb�L�&/��%���Ҟ����_�:�z��d���(8�ݭLjJ�;q�i��VJ%�ն���Q��Y�1���b&`S����I\%Ɍ`�C�c�����g�g��[�Č�”��Ն2Bت�CCg�O:��i��ݪ��TCj\z	�{�|�Ģ���m|Ф"�,�̈Ո�'.�h�8E|�q5��ѡVN�S���E	��N�2@���#-���_ܭ����}W
�^�C�IU�y�#�`�hDN 7���<:��j{T3�@��G}�k#��-m�m�q͕4�h �9���3T4��ޢ�YyT_����.�6�_Y��4���N�H�ͨ/5	U/�ګ��O�I
"����b�Cr�>7�{V��Et�YK����l� �<Y�2��;�C�����4��',�A��:猈G�|Ҷֺ��W��&�I�d���zFK�B��@�t�n�����_���HS�N/P���[q��P�9�FИ&C�=Qy�������e/�S�\���JD�h��ђ���ap�7�K��]3ņ�Q�z"4��+i%e5���	cҎ*��A�b0�^A�|��w*�̚��aj�e�����Z����x!�����|�0��uU#KS�G(��3U���ts�n��+s	�r��K��,ǖ�U�(�w1�S��$�h,��xR?���;H&�O�U\����<L�Jx�ʉ��;y|�DO�_�@JS�o��"����%[��8��o��J����rX�E�6��%8+3���.�C��I�=��]�/+e#`�?���e��y��Ω�,Q��=��9�/ee��Ʊ��E ��/dY��Y�x���B��@T;����E�9��d“��?��f��G��V\�ڨ�������Ha��}�<5�נ�����iކ�'�YV\Dl�В�r>�(N@F�7�r����֩"���ï�a����VJU鶐��4]}��U���r<���E:S3MR8oQ���i���{[��a��T�FQ
u���G?�F|�\�a�یouK�����<�hH�1�(�����$�^�8� DRG��:�_�1��u���1�RGS��VV�'�G�q�*�S����4)�h@,�%�s��i@�#š�V�u�(�9J��q>=NZ��f̽��4��AVp�T�Y�YO]�I��P�`M[+�:bIx^Y�ō����mDa(�u!s~U��D�w�x�*ᑭL�����z�J@�9V�8p)�#��`e��U��j�V��V�8�iY���hj����U�-�d������h��4�?�@��.j��4����8�;Ip�H&�f,z�!�zb3�1������KE�`N�eKt���i-ö0��J��N$[��9|p
�D��|Q��c������̛�	)>>��x�n��Wɥ�d�<|aleO]_1G�Ш7aZ	d�ݛ�"y�5<OVi��E$f����|�5�F٠�bP� �=E��q�=9�1�P�����W+MO�K�gBP-����G2RҒx��
�˨��K���_yon�Y"2
ޱC�ɹx(�×���e��%���4}�?9!���"<v`�<9�8�M�N�����\.�����E�
�J�N�2���V��߫���l�(J!���i��ԑl��h�$�h
)Nw��a�+4G1�y7Hg�=�v܊͈��[��V9���t$w��蓁�la���`��<h�B������^�-J�|��wJ^�o��\e�~�m���ז�*���d.�F���*������2hF���=K��ߊ>`}I��7.�FҤ����E�u~��n�+jf�G�gF#/p�^�B��$��-���t
���\����h@�P+���E~�w�V?�S�G+�O]vڦ�{x���/t��O�{���c�81m�\*�u�
(g|�H��G_�j�w��� �a���I�$��('�[|e���4�fZ��2���1l�	��<-�-!T����|	�
�0�Tyi=T���Y���f�6ñ�<�C?�i,��
[ȓqٟ3��b�V
xc�]-ޔe"Ǽ���S�&�Ƣ袥@��j�j���5�QsC�3�-�ě��ej��Ec��J+��������I�6W��иs�L����(��I鍯!�H�
�a�>oy�Kb��Z"n��x(�/%���*�b�<g��F=\^>@,*o�y"��=�>�Y��q\̣':����'Q��2���7��#��u��$���;���'81Kx�b�}uA9�<}�u��}�ŸtU��, �cؐD\��Injmi���ô�N�`h0C��,h��2e!=��T�B��eS��@�B0��
�qz�jK���o˞6�����
��
�k�a�͋��ղ΂:�J ���h����$��8�~��u�H��:���Dn�|V��a
���-�}�;���?i6�(����ZH��Z����6G5�L��"q��o�q"�~�u��
E~[��� �~�I��}s���;|���8��WѠg^UJ�wE)
Z/�U�.����Pe�c��a����8�(J�=�+�i��$��a)_1V�	s�W�J*|��@������7>�T4����,>��qC�23O�`ȖWO R�c�#���0_Rmx�C��j!wϓ�4c��]��)̾��?-����K��'U��<��(�����#�a�w�Ƙk�.ޜQ��h�\��KSxN�� ���US �͕n���!�T���Gu�����T���b2Z"w����GmLE�/�W¿ ���$���c�kI�1�GLջf��8@��r�t1��ek����AZ�I��x�v�2r�#�� B�Ȯ������;���,<�?>D�\z��l�Z@���f��>"2*o���_`H��Z['3�}Ss���5ߋ��|�������Gc�ϵ����Hc
����f�ϑ4��jB��N��q-�<�v:�9ݧ�X��-�醜��C����@�� 4�#��HB9�00;fJy�#%)�ioa<p�y�#��iLt \��v�a�!�ށ*��O���JAWXu�"�"(yp!/N�A�{UA1m�j.C�!#��l9�r�𖻱�)�ZP��T�LG�9
6�H�`9T�2��d>;Q�:3*�]+�'�[��@#9T�-���������byaekc�4�o�Y��Ma&��RB�ĉoHL�]C������� &Gw�Vj�V�b�Xn:�g�!�%����f��0�u,�Q��O
�Ɂ��>CCשcO��?v`�b1itT�FB�*��x�a$���1�•�����͛�O�-
��x�Z��w�:#��<ׅ/L8#�˕YTb-i��ߑ��|A(6��[��Y��0rPG+�,	��`�u6 ]w	E�Y��6aD�!)�6�Ycaf��յo&$�4d�m5�{k��#n���j������7�B��c��4�qh�X�8�ˤ��G��Ȏ��oc.�PTM$.^R'����c�
��OĠ�/܂��!["��mqsD��E�g���wUCױ	���B�^�q��Eb2&�RJI�C�� V0��ݼD�<�F���Q
.���R���b��(��3�SSi�̣1�\[�ӥu���0Q�~)3��Xs'�L7�qQ�~�T�̤�ƹHf�I�[ӹ[���%5]����I���XX�����-��guI�_�J����s����T!�0-&.��Ьx��T7R��rbrV�0Ѩ	z�m��}\��0�\R��g�5s��5V�)�����2��%95ȇůlk%��Q����Y��D-���X��w�>%���8���O�Wz,<�X7*w�0֍HC��t!V~

�5#h�nQ�!�Sd�RFk!�+*�)ă��L��o��L��p�VW�k4f`"�p�πa��AP��S��i_�j�bW�`=�K�/H��39���r�k�U�e���6I��yVϻ�7�
�rҴ#T�TI@U���t�ȕ��^p�t�"R�l�y�F�-=,�rCb��%��4�����2�M�=�T^�}*������aı}�ڱ�ƫ�*�%#@�!NB��.ϵ�=�:��P+�5�B��ӄBC�}HɎ����vD~4>�4*GP4(nsR���΅}	q�N���~�bH��8�f�S�T!:!lҚە�B���;Y!�|����\�nQ�`V�6���4�m��@���x�����^"�ZEC�I֏�@����zz;ۻ��ȝ��÷o-~�ż�pvf3�i&Hb���&"Ze7�m�2A�
��B\7�0v#c��o��U���ayf��Z�LK��B)�j'XH�c����Ŗ�@�<���K�D��j����vUd�K�&���y'�N��]�IY�w:�t�s'��'�)Lg?R}�/��Nr��S�黎}�/>�f��c�+�������!	���M�3螽���X�L
ê����ëH�]7�_������M\���(��)*�1$����~wpM�py��K�ѥd�/&�&�\Rc_*C�T�ѻ>��=��)�+g>�*�-�����o埣	޵��Xڗ#COR;�#Mh#��i�k,Oh�H����*ޣ�;[H��Un4���Q|ת����_�T�y�]ϩ�L��C�]��V앏���S�X8r�fɘC0�苏��w5���e쩆h��u1��@�`�P׽��vԲ/X2Ħ�H!0�-_�~�B�=I�r0��p�cՀ��<�D��;ʾYQ��x��P�Ӡ���Z�CJ!
Ռ�y1�(�bѢ0�?��M���8��������[e1�!#)t�f܄��~����Yռ0-x�[��	ز�v��,�i�bN�>��J��p��\�q�Ҙ�e(��T�FE��� �.�~�y�d�aQ�Uè���X�_���j&��c��2��2?:�R�l$�d���&�������̥.��OP�P̟����&���\��2QH�<D�Ozs�n[�5��6�m�?ѩ�Ӧ���_S��5����zX`���ZAU��:p`�9=0�`��Pgž�?S%hv�q	Y&1o�]��]�3�Y�]G���Ƴ�c��$�[���Ԧo�٨o��N����Z�JCv��rT�~��vE�/�_�������Cz�ڍ�v���~�v�^>���bN�{.�n�b^��sP�0ċD(CX�‰��A2��R�B��!�Y�����.k�ª��ܔti75������K�;wd�b�Ӕ՜4D'䞣����Yw����m�
8��^\��:��[;�qBe����k@?m5������Ì���]�2�y�^=�{p~T�Yž`����5¼#�on�lv�R�/�Bv���S�x����p�D���F��EH��<���\�)�H���
`���50�L	��Z��谥�as��������1��v ���}!�vv�[W�v�LI��gh\�Z�m�"\�'$��+̟�չ�빘�,�"�n���4��|s�j1�߲�a��J��ci`G�%Վ1lD�G��	ƫ_���S9�@�]�)�N��;���&�"w��l�Q�/����Ph5�d>�oW���ܻ/6h=��#z֖�3��ռ�Z�>�n���N��W�H�h�ڼ.F�'̔X��<O��=G�ǨO�p�iR]�Ք�DupK�V^��]5�&�t(Kղ��vv�qz�|�^�,��qg����+IȈ!-��|�!r�TA�=�4eR(�����E����1$��t�S3����"�H���c�;i�g�Yv�$tE�3]2o����J�
�Rޡ�L�
�If���<�Z5/�c�Y��������)԰��?T�ק܀��#�ݽ���J�Y���s����WB��L����*��m�~�@
���۲r�D;�5�^$�c宦����T�[�q*o�2h�}�����?XIy`��-?�U*ݟ��!�a��:)so�E�'�֎#E�]6?A�����k�V$�V#k;��Ў��h}uK]c�M���Mg�9�N���)Q�)j�3b��,6Uh2�YҐ��3�ǏVö2��!��
�^4Ο&���:�vBIn�9lJ�l�F|}�������p�|Q���K��uR���'�t՜n��n[��a��2G�B��pi;�8��gviB�F*�#�n7=Hj��Ѯ�-��z��g�Z����b��v�HLS63W�W5s@!%���6��\���5D���I�����
{!%ےS Ju�U���VK:��K�n��72�|�4��Z����r���I֯��:t���^I�=� �����N�Ѡ�f"=���$�d!0���bP�H��z�Wtz��Su�#��tI����ul?�c`'B���J�f�h�"0HM����N�k��)����w(��w\%�0�&���{b�)���l�`[�
�o�ߞ][o�D�]r�o�z�0��3
N�2��I&�����#���&���Խ��x�
�K��9fс��L>�Z������7$e@6��?" ��b�{���5:[N>�t)��Z-�ZZ����z�Ji{^��.� �6WV�u�傣�3�!i+������G��r����@��O\<h�R�|�"1���;E��*�`ȥ[g���6Ξ��3���t�jQr	��!��~��6c%=E����Q�?�I��%:I���&^
�EVc�P't���Q����R��@mJ�1�<}����z(���M���L��&��S�k1bC������m��~N�8���6ⓗ''"JO���]��y{5�}��^r�ԍ=�Z^	x�9Z�B�T��^��J܅��'�� ><����1:�8�VSIo([�o%��'(�P�d�D�(L��J2�6��<������~dKL2�X�$�qYk4�>1�X�����L�T�Ҥ�
�Uھ(�Q��z��~���KC�#r@�����b��z���<!���ݎ�x�d��I�ZA8cy��n�[MQ
Y���h0��Gka�p)�bK!�����w=��Y�#��ۃ{�di)[&��M;?tU�W��nR��[��^r�}P,R}��.�����zG�Y�^u�<��z[~/�#���:�=y�r]��(U�����0��'>��8p�rk�YM�Awjʔ)ntevn��[�v=k%Xb����b{­��?���ߖ�����m����3�Y��}'2~|8�̎�G
//�N�J�7B�}L���о��8���<���v�3�`��ݛ��0%�0y"�%F�H�*@�+3�xs�=fW�$9A@�Ǿ�0Fa[ʧ�Y-OUJu�"x����\��Uh�4[-�Ze�\L�}v�Ah�va&�JRG��x
̡c1��:B��qgP�Ս�_N�A��i�j%�E|D�	�C�X���˛
�1)��8XvB���0��&eH���N@��߻�Y�`���L������_�h�)gFf�+���B�QI؛�` ?�����=���/�qx�bxVX1o�/��da������FdX	d�G<��f�1���Uڴ�g��f�۟mj���һl*���Y�B�n�q�s����Z�v~|c��73&U����*����9�i�qfH��g뾶����7V��xB)/*��*}=2t(>�cq�ʕ�!5•)�{� YZGX�y��5��	��a�)�7.zN�%�|����������1�&\܆���_�op����zJ����]�1�/�!Oֽ���yF߯#���[<k�R-�4�K��<.�+�
S���-���,>.�����1"�\��$/�aZB+�J71
]����}gR��#|�h��f�ؖi�����%hL�H��ޚ�L��+��Wش��WHա��L����p��r��g��M]#�	C��`�Ӏ�co}4ӣ��^�;��b��Na�
A
����(�O-	�r���-@�G7Pc�Fރu+�N*�2�6.��#�E��NbWD��\
�Ԑ�d ��݇��,`j��E�f�vP ��
R��f����]�$�+���tnׄe4a���˶��xI��<G����n�f�n�-Q��:��}	񳋤�/�\�,��'���h�N⹛L)"M���&	U�L���-�I�4�e�$�D7�T���=̶'^��ݢ�*�,�M�d�z����c���)�/~���_V��ion��	�I�mג�C?=9r�_�Ĉ���bj/5|�n4�]��Z��L��gw���'L�o�8�U��hCi����v�/Teۊ�m��+,/��~����yr��H亸?�a�0�4[����
B<N��zC_1Q"�.>��c�IY)�p�8`Ql���Lr�"4��0j�L��c�6���'P�Z]��$(V=8m͔O�.l���bz<���|o��6��W�J���������w�p�c_+���3���'���Z5������zh2���-��k�
]O��/�����l�G��ͯ�2�.w���v!�����Mh���J+�8'�,Ol'K~�n��SS�#5�o�i�A��0��h������b�h�&qbV�id����u)�.���u�܎���qz��WI�XhT8��̶�:�t�Зh���D��oK����s��w�O��*&�C��S�'+a�반�<]�8��M����B*9;YfOJŌ�Q��5S�e�˽j��?�r�HV ¥&�����!"����J��x�-�+��\�=���rH����
��v��ٹ5�f��d�9S��[��N�_錨�E(��1Ŕm�8�N���~3{:��h�~d��cX�^&Vo1�w$�ɠ��(,�0O>���.`W�%�l���c�7����R�g*�f�)�=&�lFb�X���>c�bn�]z��|XYE�o���d�ߐ#w+�,��D��/W8��t��Qiy"���[ݦ�M�\�N�8��� �9~=��p]/�DQ��[��_7�hp�t3W��n�Ъ��j�VK8y�e*`��O��v�%ɣ}�Q��#�t٣���_�!E���
6�h�gm�ƈ)B��RD-�Q���?��Ov�J���+Ȗ�n�(���{�-�<����f���[R¥Z�g�
�t�HI��G��P�!r�8Y1�Sұ���#Xmv쟞(XA{�6��bp�pTv8|�g⚨�s�0��)psx�p��[�$���%�P\�"��$Ĉ蕆8Rw`�V"��#��m��W��<ti�����9���N-� ��Y͝�Q��[X���\�c5)��v��l�����8�T���F0��E�"�N�C@�O�uf�X�0�|2���5:e��Rm�w�@�1I�1��Eg�r'��M�B=&����n~ύ��p6Yn�b)����'n�%�:c����Ԉ4�I�Z"�^��<�3��|��k�PW⺲d_�f���@JOH�����[����CD�!�S�_�r`��F����k��}H���b������T[�B--+5x��L��ivZ�_�߬�b��(�@�y�oZ&��L����������ڧ~�96��m�=��K�tF�f�Y�Ze�7��,Q�ߧe�%��I�k9
f\�Ak��@��k�e2����)Q$c|��dK�W�Q����d�x�zDM�)�b�R<"���
(����.CǁBn�BGɓ��kJ������h�� �ײ;�
�#=Oݫl��P�>s�fߒm��r;��J2�My��;��#�*�`T�=	�8�Z�����!�6�f=����Hд��
�h��"�K��;�+��f�q����m��.�e8j�q!��@b�
ϥXS䳞��ⶩbv6s����'t�)�ŴŦ�tW�����osi���s��T����'�5�F��+0Rx�9J՞�qn�@]��y"�x�<�¾f�^��+�I���������{�����f[�B�e&O�X��$�":�Ֆ�>`M�n���e�s�MH��<F�:g�Gx�|#9�^��ȉ%�G]�:�]0�/��v��
���~\��$c�8CF����WkZ���y&3���=��QN1������v<���X�z&�����&���g��í��թ5�@u2Q�3=���^z?�6et�e��go���$�."��L�i���.�V�~���T��&`s��vI�+��l���bV��UҪ��2�6"0Q�3YE
T(l}��/bv����ϣ���
'��`�7�D���F�-��N(�[��:]GH���F;-(>�'q�g"�97�T��
�U�؋l�Nm��'��퐬�]�3�tJ�	��;Ts_��c�;��4�0��A3���X�C�q��nc�d�N���	8�UQ�b`J[nU��}�1��c�9޷�n~�0��>�JQ��쇉WI�g�r��ѯ���UL-�$�a�|�dTG`|�G�P7�����ά�����ҳ�����;��(nO�����eZ�.�kM���U��&�yI!&�w��H����=]4�z$@��E�žO�*�Qݽw� �9��"
vm�����(V�Ó<G�3a1*=6���?[��4�Tg��&���.���B��E}4@Ƙe'cDѐ��0vf����%2� �dFkJ~D�
lEs�hK���
A�&U���'Bx����T�1�z��gs�te��lԴI4e�D�e�֒��pOy�1���1�;�@�r���q�.2|~q����9kZN�J�ZI�w1J�@�'h>XfE|!p����N;2�u��1����LWa1�sV�)�$���&�}	p���h?8Ǖ��b�F	h������1�*����q�ǽc$Eet�`7�`a�aoOoù�<���g��;GmIφܝ�������Ȋ1DvY��37%�˴hÐ.YbE`(c��2�AnLz�肗�Z7��׺�UKq>���5r�1������Od1�ʀ˹�2r$�����ri�N2�ɬ|��@�U��#
,)O��U��-X/"͢���3֬�L1���kV3m4ʹ�8� Qi<ul�u��Ñ���A��˕4�9����oNj+�	Q�7�ML=�8���4��ϸ�j�*���������W�n�	�
+������)Q��F&����(��v�W�8ފ5V��Y/6Y����i^�߽VI�2U.y���D��6�|���	O6v.��WO�_y��rj�J�e���	�{�쇟����c��֢�C�7v�(��K�#�y�x�z|f�k9*VHM�6�lS�)bJ�4>n�;j�E��Ov�4�#��զ�H\UGj�V�gЖ��b����G�A��B;\���!�:&-A�k=�<�{��0h'
QF����ʻaQ
;��c�o_�Ӷ���BLp�]�Ƙ�[3�	~G���!o��k<�-x�ҵ!�dKI[�%;;����q�����K��s㈀������A嵳�kM׊�I�	mkR�(-�5�e�a@��[>�g,_�s�OH��S_�0n~59���ƿ\u�}�:��\�zN��a��P��}��F��֑a������/���{�@�\]�=�1a�s-��fuhq��BmL$ӂZߏ�k�U2���2���
u�ׅ[��\t�ɘX�
5G�q�T@m�.������(�g�;c�C�ߔ�{_�:��/
�������~E?�~cf�N�_mj���
�Au����v�4d����j�1 C��<���'
rf<�������:M�B��"�{<�c&K�"�!���s��XV�Ĝ
^T�d��ҕ�k�,�!���Òxپ�F���_���/�i�/t�
��f���j}���(U&�m.�b0�G���R��ւx!�Z��^Ho��ң[�1�I>r�hX��$0���Z��.��M6ů9�^^*�Jͭld�<6-�>O�m��+����d}���4���XJ\�1'�hU��U�^ڲ���wLe���V9���z.y�4����Q�ZrF�ւ�sy�.���*)H����u��(Qe^�Őҏ�t�9��1y\��J'�ęs�o
0�$��]�e���-#�
v�(��!��HR3���C���X�?M,L��e���\�=q�7r��lլ�����\@�J�8�Q��0w�Aj�����(�:
	JK�65s��ӿu�ֺ��S��ّ�T�
���gl��n�g���{�*��;�5���U�e�Na�8�|�%�':��#
�����n�a�A��jR��:�PV5V\��E
?X��1��3��O:�ğ:'�U��|�*.�	�#7����ilV�%�iב��8qa��n�]3I_� �����¼A�N�
`��ALq���+ioD���3c��T2wx��(RCeV[\B_��4_�%�U�
�2���dBVy_&8��E!P�`h*~�LQ��.���I�s����sیpM�Z�㌣�!X^��\x><<6�+�]�,Ϝ<`8#�x�3�O�uy�0�l�J�n	A>��~�0tN���0C���@���OGv��u�1�43��9�}���ހxE&�/����>G�Z5����w��#��;�� �����m�Iiu����o��ljn%����iݐ�e"b����k3��.������(�M��[!=!��&����[�v̄y������c��աm�*e��D���kF+�G��[��H��^��KU�7��*��a9�����"���`r��܍]tkl��a�@�Äռ(�
�#�'�0H�.LY�;bJ�O�������`�U�l֞�:��PW��I�]�ٳP����:�~�F�縕�0\�[�P�_������v&�]�tG� &S�����V�`H���� �ivE�]2�be,��{O��\�Ϯ�,���_�����TMq��<���(��>����ٿ?�.�5�H�����͙n�3?C.��t�D��S��"U��v	�\-��{�1>�^�NUH	G��]�y�Z@����C���I�ͫ5x��'�r�g���-h�d	C���6,C�������q���)({+ي�8�S��p`%�ZƓ�V�)M�F"��O'�M.,����7�����.�]��W@O�D��!�r���kSK����:@��nIt���v����y\�t�A�FojP�US����9A��h����X���ٙN����o��Q�5�G�N��T=(��:�z�wϞ~�-���ZX;M*��kGM
����=�4�o�)����*�����f�t�>b��I��n����r&��3Nw�f��H�$,w�F`/��*VI#tه�M�4��Z�t�z�������#G%��K�:M}�s�<����5p�X��B�C@�N��`�:s�z�$�a���]c�Aȧ2��=��,���`,�C_��BO[�GL�M0T�+:�&
����3�p�p����T+���e�~n�, �/7s��#��n'�<��,�K��ɺs��7,�-�7�F/���#fwR�D-�3]�e�B~��;ϔ�skp��pg���2�r��[�R�(�w	��:�$��'L��CE��O�3�i��/d��uL�R|Ҕ�c��~�G�s����^3p�]x�n�M�%����ɳ��}�P�O��̷C��?4�0���/H� �O��m����K�:�5X�*KE0oܼ�C�wI!�f]�j��'H��L�uS��)I�s�]k�U�8��]e�3XS@Q�5~�HBpv���$�-�6�.�C�/�"�iD�S%&Bn]�QV��ܢ���WO���G�	��������s�z���r]#�����"���6�V{
�%2��-&#]$���/Dl9[�&���=�صL!݌�wRGZ%a�Љ�C7V�Ϟ�89E=�$rJjLI�c��v8��0���z\lgI���.�	�q�ؔ�>�m���-�ahC3
�k��(�NQr82���B�������g�h}�v�P��r=�}u��Vq�?��^�{��2�G9��[(,�#��q{�C�B�W�]$T�~���c��+%������婀�fh-��d�(��6Տ�3��<�e�G�3Gp;�r�
�CL�P�?�pچ%wp��;��;�y�����Lgnl�g��s�f֨I�z�Z��=��;�p��IvU�㥤z��g$6}���R�6�:�ܧ�%k:H(�|vNOy�֕}��u�3�L�A��L�AI�����-R�*��˜�ywT=�%2G��Bhx�MP��ܗ`-(+zN���Ӭ��mD�)а����6sD��$��E����UB��Z�P,ޜw�Gd��!<�\�5?{ea���EL߹yn(��C�9/��'%�tb�ҡ4$��I��w��d.G`�"�F���1R�%旛�2�u7��J�C��u�)m
�0��5`�'�ߙ���6�f_����,Z�@sf ,Cl{�e��b](�5�46���JuU��l������9�d ;.q,������%��g=1���� c$���nE�}�j�g��v�/S�aY��T�!"b��\�6l�s�؏�`��|��lV�1�(��pi�hsE��s��Ǹxbb�}�j!��@��6�б��-{��
�]����T�/A���U��{5�����ˆW��	B�,��	6_:�5�k�U��fJ1��2�$�0��	A���
ߴ�W(W-C���X����Q�~�����V:�x3Q�H����{y#����O�nj�`����Z39C��VD��\z�0d�2��U��v��!��;
kk�1�7��%Dے4���F����{@(�$�K@v?�X"Ȑ�"1�E2>���o$���&c�y��$��C������s�2J5s��H]�߀􄠷4���6ރ���	�5�:u�@6v8�U�?�R=�o��x����t=F�ΐZp��1$T��>޲��2�w;R�u����+k?kHO�lMy\*A�0��O��y�L
K����2�_��s̙�4V3�Ul^I�ҡ�㥺�:Y�r [��i����/WU׳ߜ�U�J���-ٟ�Et�=+��~.UE	b,ϣϊ(i��T>&�b&��jn�+��bBAD����K%�(P=����"8�b���T�"\�q��&��J�F�}�d�WOͨ�ST�dV9�U�� �~�5֒�!5�gҬ��=��Re�ݸ���
���#��4N�e5_�JI�1�M��^\ ��ؿ^����D�n�)[}˭03t�M~�Ur�5�r;Ƕ孚N�1As&CbрoHCt<�'�v��>CA��,�~,MQ;�j�I���h1\���?9ҩ.jɕ+1�H�t�89�B4�U���ٰa�`���������m�:���K��2���������WM��O������m>#W3\bf���m��qEɣaWg,1��≱�
�g�:��c��a�1D��/��a5�gu�9��Õ��*¡�����)E;	~��r'Bt���ղ=|_[��ҕ�-�\� ��{�K"?TP-�q�2-܁ڃf�F�y�Կ��O���w��M��L��g�J��?IP�'t���ue��u'3 �0n���u=ā�Z��������L�}��]�3J�)J^��� ���M�u�M}fAJ�5dy�6��[�!�Wj_t#�� ^j�I�r$K��ձ]��bnN&��:�@PXA\��d %������:[L/�R��N���QO@�0����&F��Ǵ��/�m�B̖1eKU�� �$�L�~뽝�o�4i8L��ݔ�K��-t/���E0j�|s�<��9����<ɞ������jVİ
�5C��)U�	��jO�nfE��=�6z�r$Z����<�z�t���Y�S:��\�/���������<���_|Gi
��7�U&��: M�"�m���%�V���4u�}�6���`	��ǭ��]jY�k�է���
�6'�3v����5)
���
FzS��'F�7SQT�8g(�5���F�b�O�Ҳ�5~�nz�80WL^R��u�D�[����/��i��J�)�V����R�ulPa��0	w1p��U�^�w�c�� �V�pxO�m0��ͻ�����Za�.Zi�
��V���!��LT��l7�Cى�4���C�~dZQi���*�N@f�y�{��D7\skRtJ��.��>S@�
���08�u)�ϰ��ra�:"��x?�fn�Jm�L�f��
�l���������n�1��}d�庋�8��J����٧�s�P�e�g9��$���h���Jz8.}�dg���js�B?���r`��<�t]��H�����YWx�
����Z�m��~��v�a,#��3�m�.�<��U�Ȱ�qA�lC��i���ڦe֣4�k?܇��§��M�r�;�$��
f���f�I�缾�ժ�X�5�(�g���5mU}��	���T7�GkƘ�㙃q-�8��nZ%U��M���U
������Q=B"�,�u`����U��{\cV	�u�
W7ɘ��x�0�2��{���uWe"�萎ҷy�۴��M�jp	�	�Ȍ]�dLV�~Q��LB~~�=#2����|���~���|������$g�Z�}(j��W�G�GxWJ�̐wf����f�-y{�56HO�2_VÝ�)5T��2��"-�
�j�Χ�Θ��=l�S������yv��_�Zl��:��OW���빜[��@%4F�V��G�q����aݮ���?����sz��Qm2���q��\�)�:l���}Q
�?��J]u��!�K��d�<�0P��榎���4&)Ğ���̠�+ѸY�yL��Z��F$�eZ(��i.��vIZ��"��m/?;77-3�S���!Iƈ7�
��SX�uD�;���uy׎u����)%�Ҥ2�r�X�Y+`�$F�9�u<�Gk�/r����$G������L��iA�5pX�H19��P\�ct#�.�<���83lD��ki��,��`j�@��+Cv	iT���&�����XL�I�hX5xoψA͋k�
q�?��3FV�{�\̐�B�Y��b�yVö�G���Dd{��k���EÖ�`��~C��f�a�S�գS猗3�+>E�:`6�b<���U�zκ)QD()fI�$�E���1�nb��V�r���%��D$2��S��<�3Em�ؿ~l��댎��?V��=t��O]�vN$��B��]�NL�g���sp�G�Uk�о;gX��5�0�--��EGy�I�ٰto�I/�Avk:A�
U�!j��yjӑP'Q��E����Q��t?���X�z.R
��kJ�����i\k�C�Q4rF���N�AMl�J��^����f@��ƚ��g)1J�aM��6�[b����D���`R����7?>[KU���T��w�e}+N�*��-G��9���w�)_���J�������h
+ɋ(4l�r��}5�A�(V��l����B��j���L��n�N��[�dq��>��Mb �Ey;͘�=��D�;����9Ty.dXgu�x45����JL\GR�rL7eT�'����R��Qͭ�/������1weas�K�b�"X�J�i�m]'v��H*�T^J��_��)�s�ܷ�\rݲlaC8��-�4�dX�_8
�1�X2g����+�R�}�!I]�??���ç���`]����3/���φ�^&K�����U��,]��;�lw/�ۍ���9݌ù'��{a�[i�2��ϳ�?��J�4��b��F,�T�ڧ��#�-�蔒�Lc���jWĘt2�g'ݴS��v�������ޕ=��'$���>��N�U^-�ʗ�n��Kd��������պ�g��Hk.|�z��w��Y<��H��9٬E�J�$�K����.�X�W=�Y\�[9������V�5�$qؓ?8�y�l`�-���H�T����2yqR�V7`��<�Pڊ׎_܁`��W�6𦐣�>k��������4�D���N�X��'��k��φ�K��F�|��y�7�d���,�3��K&�v�v�z�1�Ak種��?�����&zl�Y87f�v
�c��D��&]�C砷%g��s}��p�T��{X�ή��!
�H�Ϟu
JDy�)_(1�27m�Ϸ�U.ʣ)>ڼ�P�suح*��ߜt��~��k����b�h�5��f�~R̦�6�s|9�
|D��j{�U�{@�dp\b�"O���L)U'��c�yWۥH
��e�\�Ċ�WD%R��*����,2r�cƓ���A�,'�
��	c-�S�%�?�*�.���ڦ&�hہ����.
\��s�eF���aa�4�����'��ۑ$�bq�%Ez�H%C����T灘�6�u{A_��nM?�/Z�WV:V�e�&ͮ:Ѿ���ەX��|Dz���
qֶF��� �0:@�aE���h�����i)�4��S3��3����2�A~?#_K�8�>��_������-�-#5r�P��P��J	HL������Mr�b�"����0�H���@�M�c}�!��:�Δp=?ڙ�5%T��>��O��i��h�Z�s�G38P��ͯ3/�΃�Z�s��BlRڶi3�Q��f���Ю�To��QS���J���s�`#�J���gNQ����:|ȶM�B�UK�v��>f1M��]��
6|�v��Zk��y�w�ч�%!���x�w�/�����DSD�(��%L;�8�N!�GX&��D�f�kq���&�׬*�.��aF��9m:ф�uv�j0sS����s��L~0}CbR7$��&Œ�~��A���!�#�Ɯ�_LQˎE�RH:�\�;4�Tmk��n���<;�E�`�w�T�_Y�
�ޕ��o~y��8�f��tdUw�/�AKs6r�?��j��Y���Q�s]	�Rz(9�
�^�`^Fە+�6u@�\-�C�%�광�uD��Ӊ��a	bt%v�9ȪH֥d�7N�r6K��e��o	u�߯�cSh�Y�����dn��L�ߍ�\p'7�?��ϴ-��OK��5̲�܋Eɥ�(�Y�/j��¡��I��M��/��<Qg���K�匣��8gqqVY�L����h�-�Z41yct�¹��k㱛��)�ސ [+Ⱦ���%	O*8O��P���n^����HS�; =�7m�6]I�{
x�o��#�9�署��Ϙ.J��cdFA��q@U4��N��03*��;L���)dN�*RD�eDm�I<�:����=As9����r���d��Q������_�Sᕸ-^�V8wI�`nAw�4Pٌ*����ZVm)"5�&-�(i���u0�d�zS����	FBq����H�v��5����}cz�,���«��۬�J���L_%Eg�=̛����\|�
�\;BL󪌅��g@)f�my��V͔�k�:�u��V���Mrf�Qf�O�~q�/��s���&�^��x`8�
���#��9V�{�ư��p�
��j�����4W��ea~Q��܎�����G�o9��y�A����@;�AS�p�UgY��׈�2��u��tD-2B�V�^7���A_��2�I��<BebG�c*��?���z_˙�

ߌ�G���{������Q
IJ��[�L"=��!C����_�t{z��ۚ����t±������7u�9��
�t������'T_v%s�YG,���|d6ڦZ�?1P�(H�������a��r�U�fM�N��2+���-�i��J�w��X�މТS��nh����� ��hÉ�lM5i%�)���׉hAC��V	�u"��ʬ����2�n(/,^�.	�\��m��F��ji��¤�Ye/�8��C�뵾��f��i�ƒb�I���ܐ����m@Eo�xGT��iUͽ&&�e��V6~��$�T�9:lm�Osb4�+1����x��7�<�mx�J}�ȑC,e�w��'-��ŐEQ!��M��x�[�J&��P���j4@&t:���\�S�Ev�u�.khp�3��+i�_���)�8�0�$
��i(a�a/�h�+���LLU�7��DH�Dd�K �����!n(M�g:s��Yl�.V5~�@'��hC~sq&r�
�coI�Qb�R������g�-��H����E�4B�
�Pd�jb,�CȨ
��dF���POG020�L7q��B�dI��%/1�DDؠ�F��P�J"jc���t��4�@L;0h��/n�Q�iԶ�K!�xs,LJ�~%ti�F�GP�*cɥ�B�4ThHNF*S�Qm�CH��Ĝ,�y��rT�J�gݜ��w�]���W��r�?�sQ�"w�T��n�cQ:H��T�?-�X�Zl`�U/_�����%I�ʖC/i8'���@9��.ؒ
<��ηrVS�f�WD
�!����l��˗����N�Ƥ!}Ծ�s�BHc*�"4%��^Q8�%'����cý�0��ˤ�?鏻U�͹�yH��.@�y��چ���#�qU#"�k1*=�,�f�H@a2�Hxa4`Κ .����R�,���J,�R�K�����[��A������2�iz��D+A"�Z��h�*�@ם����]t��#h��ʽ	.!�]�X�iS�5�G�&�ĸ����b�T���V��[�Nm���*b�H��oԎ"uq`�=k3�c�KF��iIO���<�V}���! �I%�����؋�����$�5�I�k�?�HkYY0	���bf�)O��v#�%
@����h�c�FQ*ϰ�=ox�j֎��i!�a��K�Η�BNK�&-�I�ڳ�V�t��H�ʃz��4i�6���Tq[&42Ҽ���#��*��e��W����-L#�p�kDxJW����\�M�G�Z.ho��w��yENf:|6�q��M�Bޏh8d3<5DX�f�%0c��;#C�DWw{goO�:$�4���o�G�i%0��q<B��{��3Rs�Z��)��'�.#��Y[���j�b��ѭ�P�i��W�����؁��ؿP��cљ)D_Z(+^���v�
�\&�3�t��u�3ʢv��+�M��-'۪Ό���)�V!=_��c��L�@���L�r.�jӕ���g%.8:�k����
�c��`��`r������Dzs6���Y����4�������}4>K�&��������晖2C+�x�{.>��kK`6�'�!AґQf�r����>���Iʧ�BaСB�K�Z]��<���z�w��e�b�m�>M����N��0S\̊�E����+>0��/t�̅I���n4���{�b�ӦNX5#�rܼ�w��߬<�J��4��+4jm$2ڀbi?@��x9�sC�⢱�sf�Td��V@�nL��
Y�6��v��6%;O�Z�Q��0�a�D0G|�P���o=|=:���#�вj��0K
�ଟf��
�_�8�t�� `�H�A��P���6��#�>x���f0�� ��8⹈!ȕ��J5��Ɋ�J0à;�U2(4ce�S���q�\��0"�e��A`i��/W��������6���2Mpb_��Tw(9�ܺԽX�mV�
�k��PII�&{�J�	jkI\\���Գ�/Ru���/�����l�,��y�N�v�2ؿ�U�U
�3I%8��O��5x��&�)Pc^��|Bµ(�ӫ'^�ü
�!���>C�������Ob]�d."Ϫ�����,*�6:��ho�I�J
N=a���Я��6&�ty�l��r���c�LG���eh�"�ۛ���K�W��<V�Z8�b>��'$����VO2{�8��� ���ߖ���=|��v��� K_��@��Z.}I���7�5�ZrJ~�lW�Ӊ7��TXr�����f�~�[�\� 9����^kk�Tɘ����~́K��\��A/�
v�^5�'���w��ep�$Q�j47]<��dEEʞY��?a�w)�ME���<G����Քp%���%šڥ�Ow�N&Ol��J�@5-THj�c��8�=M�؄{3n��Ռ���r��
���j��ǝF�^��,oNCc�QR-�n&�.{�Ћ�l;q�-i���L!�A�\�N��6�a��4w��+���S����Q'�����`uǶ^�r'S�3��ѱ���c�EЧ|��M�
�r�����į6�R���94�_ h��q�U�4��iq�J�Ƣ�x�ރ��)�pyB�B|��w퓓��Z\RT��:�ˢ�(�ŏ����n�9�L	���r�]�抙}�x�#x~o20xֳ5��,�_G�Q��};��|/2��<�Ŧb����,MQ���)H�+>�I����"�Eb��'��x�1��x!k_����,V��h���_1���Y�Y�ԯP���!����I����ijߨԓ���,eD�us��=G(�.�-z��b����\�AH<WF���)q'Q@t�ނ lZzB���F[	�9k�,���8J�����Xy����l�� �Ɗ"�Ub��J�8�,N.^E̔c�`�:���'h6,���44�
bw�t��
�����tm���Qǹ�ifM���uN���S��4���-].:h�3p!��Z&�<�^z�\#v��C�5�m?<PSk�2�ǚ��6ަ����9�#�'���4�<ZĔ�M+�a�nɆGM�Ҩa�S����9���ƣ�Gf��c�R��S�ANh�Ps�}?Q�XP��a�.?"����*Z�=�Y�c�<3�S����E�/1qŐ]��x����2�cI����n��@L���|��gr���g�Yԛ��>�"��� ��ε ��k7c4�U�5<����Ru��z�Vm#�Ӹ&OmD�J�A�z��*��%�Y�Q�2�_�V'iF|?�{`�_ݾ�(�3��@!
���v�
�0ߒ�G�-������n����|W�f�fU�g��y�i�ط���B��
�S�_��I{r��8�E�űc�B��Lj��e�X�1u���l�i%�k����V4�۩74��\Fj�
�<Q=CW��4	~ޤZ��~�.}^�-�/q0Ȣ�Z^X�C�Re��}e(���j�0�ف†������)({��_������h5AP�x���F)p9��9--��4gͅ#m�F�y��%��5��+'d����ٜ��\�3���_��wy�I�LJQ9���F4	��^)����g?I�η�[b�?j4��h"�\1�����-i���b������&�y_qu��8�K������|�w����g������Pm
Yf�H����(Ҭ��1��G�U�'��{�$������eq��1��~�B��;]�Ж��÷e��������p{��E�����AKى��J�����#�5�M�Eo�Zٓ��{�)���wc�z��ݏ����@$�F��D��X���c�? 52m1�11�8�«��J�0��H�7���boKn�C>9)�@FBz�o�y�\t�P�4�(0)���H��������ijSp�śユ��>�QUOu�"�����
Q��w�D?�wuͧ9Bme#�Xe49��aW�	; q�A��t��NE�J���v6�q�+#��J6u�&o�7����s�?J��j_E��aY��e����,�E2���0��Z/�d��8��l�O�E�J.M(a�t��
�Q�f�w�ʓ��)��N�@�c����V3U�u�va?���6;�`�-�k�wj!g��w�'& �[k��<T%���)�|���.�7�Ʋ����\Ir�6)@:����I������N{mm�_��H՜�Y/�:��Ib���$T7��ȁ3��X��T��MD�����2�&��$g�Ƅr���r���S�)�,sP�֡hnZ��
�4�N��e?N4�����D�p]�G���CT�WÎ	]�VAyL�����go7���kQ�y�eF�d��)"h>�[��i�a�+y�V��0��_��FA��q�	�bf��3J�t���Ł�nk^ ���0�[Uֱz��X\"�~�������w�kZ
�"��a �~�NV�G2�++<�r��ښ�-*[u�Ԍ��U�u��?�^�Zk��q�ZS����)_�	]	y���ݖ��&�,��a@�e�0[2��S���7�I!�'g
{TفFlX��B	%+�i��ۣ1��Z���Č޾=N���@��&cST���96���Y��SO�sh��ضa]���F�g��͜�W��K9�l���DY�f�K����=����=��j(O�̻������+9�Ʀ�+%���i#~��\��ء��Dy*I�������l��J���0`��1��!6�"�P؈-��N�|�L!5?)�3V
���Am��$�MFIc�>�X�$w:�GA*��k�k��kd⡿�;�
D	Qo�Hb\Le#nX|���R�#�KU�k���g;i�Z������~p�:�y�#	��hl��ع�Ƶi�Gm�۷�]�^�Lj�Ƒ�r����-p���>���f�y� �Pbb(��/�d@	�]W����݃ø;�kG��}t�{g�][����x��}^�K�':��娵}iY���4��7�KEx�?)����h��F�BpFA�
�!�V �a#hC��M.�EMO!]�ʅ؂���;��S�W�…;��`勺�~��e7,Z�ک�Svgg�kިR�p(�Ⱥ�7��І�b��HJ2��������B��J�U8��Sa���,^�^Y���
SSq6\�N\�ܼ�ٙ�U\^[uxʒ��R(�|�؍ׂ��ZO�YR)���Ö뱤ҳ��e�V���xctXY�a�2k���vl<� 'D
b��q|+>�,��&,���Y���n��uf�|ʸ���IcᎺȤ�m�.���
�n56{
<��t�P��M��f?���O�=e���'�\���=>W({=�id������W`3BRm�U���%/q0��Ԗ�c
��
mLi�c��p��|x��%'��?�±9\��n(��N=#�U�ݺb�*�@��(���q�!�}�T����*�M��_6�/���;�-�	��~�uA��^	u�1Ż'��;��Љ~����qo���.L�*!��`}��y��:�k,M�%'�%`'��fM��l��L��HCb?�6��mf��
�4�L���	)�AM��K��t���V�w�(����a�[>�Yr���V�ӛ"]�E��4�H�{qH��e��s�;���A�"����1v�*lP����^엜�8���	Zѩ��F���*�S���˼yW��0o�͗��.ԠITP�~��D���>�LE�`�O����'i���1�إK�^���a���ôS+���[�G|����gτ3T���$P�J�g��C�h>e�O=����*2�$���"̋*H� ����F���*u�:����R%TDDY7���9�YT����n���{��}�d��
A!>v�]O�P�i�n�P{��v�^��R��.��#u���y�
�|���)��B�{�KW�|�# �5)�?8\S�K~���G�c����#��'�?���N�/X�ɇ���2�7�A l�Z<���2|�N�OPKpM1ؙط`��/�� ��F$�iC$Z�^�gX�����x� 76.��f}��p��ˑ�/��q����5ڞI~�˿퀱�DKh_��N��(�=�APMOJ����,��L��L�:�Tr��,��'F�/�묄"߸�-��#���V�=Q�}T�^��R��[���8����Xv�0:2�Ԡ{ˌq�MRM'-�~�c�<cҿa6p��6-m3��:��
~ʨq���;��y5��dp6�!!���㔜a���c#C~j���I��xd���M�1uj��P�:�1��8E�f��JkJ���ϫ&���47��XUhb"�6���f{�h�Q�#�����@�ͦ[?b@<�0�п�6�a���
��:|q� hڝ�>t���l;�35:��V�tl�%�x1�6,��u�����c��Fz�&�{?�@W77j���4�g��<hZ7�KÔ��Z2�j�=ϏZX�S��O�0n��8�2"w��ȓ�'Z4�-nէN��6�
c[�
�,�N�jf���3�{��uA�2i�Bg:��!#�g~�ߕ��o�L|+Õu�fh�9^d�#G��;޿f�^�/���>`�f�)m�`I�����c���4�D�v�Qĕo���E_d�?���$7����O)1
B�H@�l��������"23#�x�>��TQA�o%�'�I�q�{�!@
��昔�C�)��d�Ѽ{�K+)09s�t�aE��]���hUA�E��_b����tf����48l
p�?C���kC5s��;A/)V�)���a���^��t�R�'��%�Nt�Jn�0����-������3���'V<�$�n��:2{���b�5x17��N1�u1���iR|RT3�样���2�is,���n͢�H7�w|�N�a������
G�d��B&��m8g�e�}}T�8�otӲH�RcV�W�Wq��~�O�m{�-.�����#1ɂ-d��	���Ơ�?.�׽��=��(
ٞ��t���E���6�'9�
�i������0òB[�Y�F��CFI2�
��VV�C�Y�s����K>��7{���2X`Xg-N�l�:�h>̨orr8�Bm8���ah1����Ga�0^v@�tL��x�5���B�k��~5Jbs!�_�^�疃�ed
�^�Sb�|��'���6^v����,����=�z��{7�.75h��w�,���n�:�L�@˹��=$��DS!�-�~�]1�&賱br� ��±x��.Lɼ|u�:u���a�bT����V�KJ�6��`��T�������ܣn��k�V���W�j�ܥo�6�C����{���	���@�m�!�;-�����Wq�q�<2F�����p:ʶي!�Ĕ��Ƹ�9�՘�Sh�A]U+����@}B�EѤ�٧�6Y���+�Ѣ�~�6��	b��1��Y�l��M�cs�f�m�`I-T򏂂�}y ����7�|�O>��K��ֵC?�Q~z���>󏃄�)�k��N�ݩb�@4�E�\K�,I�b����2`���(!E�h*��U�9Hi���^���.� �}h'H��*h-j��i�!�a�����~,�E�>m�i�1�4�]��� p�6[*��,;Y*'���r�I�,�m˖���P�1Ta�Ė8/Y`�f��>lN���&��#�d�dü��])�>|��y4Z|1"��mnj򪔹6y/8�}[�}��W�כH��uyy�o �oM�ī�ח��_��;�k��K�{]yy�
�?V��	�ڧ
eD�d�
�Ζ�i��ءO�qnJ�C��6R�ʤ���h�����[����Y�Rs��8���7�[���#g3h���dh~�1\	=�@}��wB�7���,�|?/��x��H�*4��"��(t��5��yF�H�
 ��L혘G��OQ3��1� S�H	�y��G11�Z���+�|�+ؾ��y#\��m�)�VWQn���ܑ-܈���5�K��j=2}b�^ֳ�ܖ�v�	q��T��:aʔ���V�FS�7L����e��飬�]�_��$���xϾְ�z���o�g˞=-��
�&�x��Bn�$-M�\O���^Ih
	Z��÷!�s�p�cn�{���zo;�\B��ฑ|9��L���$$E60�2�)�����4G�FޚNh#(n<.��9�wS��&4�m[�h�?��Q׌ޘ�P���֚`0`�?O��N�b���E��(�50�
؜����	&/��&�̞j8h� ��ή[�$h�ʭnԜ���.!ßH=�3b�f�u�~��W�QϬ�o�&(o����+W�����M����g�<����^���l����Yq�������P���M�e֝ ���C�p�Sp|]��5�=��ѐ���XXi8�}���u��'t���%��c&���T^^�}��Jo��
��7�ֆ��q��Z�X���y�ϕF��}�n�j�N���/}�̃�r���9&�y�Úg�����%�%���@��Qҹ��l�r�Y_sӣh�2��8r�5�L��^�h��|���fT����c2�{���2�c��d�!�6,'�Q{� a�ø{kh�>��4NQ8��&���zS�X�� �(�W�����t��[K�J��Y�R_��+{!+e�1��-I�.Rr�Y��r*+�4X��F�jIi���g�{�>�@��D�*�LN���K��I��o��7��[��hWr��ks���P�(|���Q<}�C�:��	
�(F;Y�Y}��9��"w�Qx� ��
��
D�䜕ec�=pVVV*�Ό���Gwy�2Jx��G둊�H��’A=�,�]�D�jRb�o��T��(����l��D�Cy2�
8�Ů*!�n~bްV;�_ռa�͟Hj�ۮ�H:}�N��釛N[��s�,S��n��>�������Y�O������8�f�dMpj���%wș��J`D`��n:�
m�:�0��P�ް�|R�G��t�wkKRKc��ʔ;�?�r�0F���iu_��Vw�>�s2c?)13��Ҷ��˗�� �o�[Rl$�Պ'��s���;��n��{�����W���X�v;쇏�
|�X������R��*�⌗���clJ�Oa�u�G�~����J����
��ʆ�)�Ţ'ԫ�� פ���ۅ���o4�WDa
]ND1����h�VB����)�Z~����q�u�h^�C��Ɔs�
�L�QȘ��k�t��hTT~�	T8D5��d��̘�?Q�m|����}��ӫ����xqvL>7�|��8R��
��Gc��O^��=$�3�����rgn��&�	��n���L�s/>6973���>1�����!���{=7�l�\
�^�_|3��I�9�=�Y{{ng��x4��Z���m�4�Aq���m�ԩnAwn.=Oܩ<�Ĝ4(�#�*w�<<�WO�+/c�ܬ��Z�P��<@)/�#�X�K7 
)��1����b�k=�'�P��n��e��:��ȑr+M|U�m2�N�f�q~FN�Ĭ{��ml���'iU���b�¿'��$�eO����2�%�Qzo��Dd�G2#��
���v�̂�%���,�ܜ"�{����A3ם%�Fـ�TUt�-I�n7��*�4Æ�Re�2�(p6�u*�6{N3�V*�m�����Ҙ6���#Y�9��WQl���N'x�7(�-96�F�1(䔃p�/z��I�0`T˕��K6(qt�D��.�#?�q�껣�J6��2*�&�'	ǚ7d�-���@�r����/�DQs����|�@�1��}f1�Y���%:����I^�c�#�{jz�n�'~U�"#l��L !����s��ת8
v�骗&�HL�d&듑���+<�-����`>�f_�[�F��}�+�4V����}�w;�.n6�fF��zX6.5$\��ń�a���O;Nbg��z,�"J���{�~���&�K��_z����ϧ��^���,�u
S��^o+KM�����)��{�_�7?�cp����V��L�Y/Vz�q3X���K���?U0���T��U,�t������%1�U�ª`�j��u@�Z�+t	�ֵQ�L���jDi?,Mp\�y�r\'i�8Q���0�r��Չ%�'C�+e��^P4�`����s0&�����?{�M��ϙ� %+�>��bS��PB�Բm�Γ�"��Š�I~�P�AV�'Y�G* (&Ƴ�Jnx���U��Y
���\����ha��:v��n� ^yx�ka;�㲦.9��i�����_�
̗�/�%�b;Li�l��%�Ǐ\#��kS���9�	r������ZxXG˶_��fTӤ��jwi�˘�h�!�����$�W��&G��;�
֮��vT r��NA/G�)�%��ߤ���5���I�rq��[f�l�P��}��%���� }���V����ޗ2��h�k�h�M�f�xx5�[��:��N�Avd��/X��[��]%N����6驋��)�
PѾ��8]�bD���g�c��N��W���ۉ����bP!�r�G��g�?�l]�$�-Z�
��Z�(���~��~m��,C�={�ϳ�m�d:�c/,��;\��=�G��/z�Ӿ��V����S(*U,g,hۢF��}@�g�����q����HC��M�ͯv�*4���?鸎��}ƹ��T�xL���>�*%����?�0�%g�%[�)�ݾ��"�dqE�I
xݖ��s�h��>�I��z]xՄz��_B��|2LQ1�\�񭷃�3C��4��v,���-߸[�������oLu���l0�7�}O�˕�ʌƘr��ώ��\�gCa�fr�.2��5w��ܻ;�f��޺�nOa
yl�X
h���7�Z�h}udH����������S!�� �^;�i���䪣>� S}���yaɯBْ�_�t�Z\��j/��-SG���4n���s���mu_��+����;_�%�$�.��C�~��v��B��K��T3�w�iW��?`6J�-(��\:w؃u9�i�dF�I��"}S\Kl���ҩ�

C
{�tK&v9r���\n�eO"=&�p7��I�H��*�S��Õ�0���̊��%'�AL�*ÛZIO��G��~~r$��~���4/�9���3�*�t��q�[��&���	��V����͜�׼�b�s��+:��
�1�eL>6>����m?A1{��Р��C̭'��6���#��H��g��Pj�G��q��dN�"���җ�	:jI�<�4OA���f2%]۶I*�:��
j��!�+N9���/�5ye$�YR�Z
��	�U����@eb&fqNFL~'�����
G3�	+�o�;�c}4C�.��PF�;�\!��?�X�s9�%�Z8E�`3� �2T/�ɨ"Ѥ.���|��5��]•�\���o�Ŧ��/>�^
���lΔ���܆���������.��Q�}�5"E[~���u;���*Uy݂nI������2�OQ��K��T�IQ~^ٺw5[~��u��m/rl�����ݼ�{�J�v2�!�%���p,,�?d@\s�3�A%:����Ѻ��I�����X�H����T8NN�J��'�⎯�~bzʊ�~:�=ҹC�ġ׮S4�#>3���q��h��*�V����D�6-2��	$��_i��Ղ�)���66��)��a}�����UXj��s���}�J�ʕ�J2�|��M��]L)��><�v�6��&�m�JiA1\~Z��!�����;l�~;r(���#+�,nmU*�Z4��^I�ʦU�ll���h�����9)�H|’��Y�'��sR���RG4�G�_gDp����B��1����X��)�T]�i�$�.5]{kAG�Ďb�!1K��_y�����h���*�R
�n�-��h��t]&�zW�Ykf�q6�'��p���{�>����
-=�Eː��_���A�br��Y��Ojhp����V�a��'^t?�'X��&:+iB�OK���/�!$b�!�&��Wn�̠���9��-ǽ�L��et�����[����f�I
G�{,Gl<�ڎij���t}O�J�('�����F$WT��k�_`VI!����0UjX��,P	kDZS�b�PU0[0ΰF:��ɢ���?E�?�$���-W�)��ɋ�r[7_��nC�Y.�qÃ��~-��/ԵI���I�D~��h�%?Dz�s"�È�����y��'��/-өy)_�e­k�v ��-����i�,��a�k�!�C��d�:{�ךj�$���) ��^蝉w��$[i��LW7B���+S.SL����p�h"1^��/��b%��D�6�p��yZ;�n�|,ǙM�B�{�8_
Ə�_4�O��O����䐿�J����2�ѷ�b�F�����#�	�!�-�WFP�<U�٦�8���J]_���t��a?�Ç�ZZwG�D);x�4���n�A�H<(
��6hy$���ĔH�q�cd
us>�|��)�YS�(Gj�5�/(�
�x�����%��	�9�'�mڄ��(�Ea��;��*����d]��`��f�+�x����]��gɆc�%��K5g־“�9��Po�ģ������:0��%N��S���U1��p��B�~�T[=���a��x�#��)` �~?O��[�]=9T\�\69��:�\���|r��ط��?tr����ֲ�Rk+��P?C�kJ��O�~~y}XůQ��JV�Lb���Ͻ��r�hkD��)G#^��}�x�jM@8D
�F��G��Aw�S�'��O��(*��K��p������я~C�3�/�$�ih�j��d�����fO��P����uOX��"��b�^Oa�/?��YI.`�aD����18$\����4<:��������KX�C�"0�j+��)�q	>�4��H�{��婜���{y�z�J3R�6�6�P���{OY|Ց(ٶ�R�]�BD̗��0�G��?K$���%JWO�֫j�G��!�r*+���6�B����JU9=����p� c�
t-��3���d�nl7�� >��n��`\��|`�ț�S��@�u uG�EF<~J��)?0ۋ#�ps�3�!ܿ�}��2(Z��a�W"��2�ϝA�:a�_ۄԺ��e�lG��sO���x��BA8HD�԰H�6�jqy��)c���ޚ¹E;����-\s�⇭d�a�<�_b������	�r"/��۟(&�붨��d�(E>�򍔉C3�jU���T�7[ف�;�U@� �酸�\uu.R��:(��Ř	�"֊F��7ˎ��d�
s�:�N��%�o�6s���ܻ�{>�X3�D&�,�H糘|�d�lB	�DŽ����	�6y��=����\�k�܄��%�D��ψb ��R��f��6w-�6���{�5{ZQ.���p�)}$=��U�{���%����i��tnly��/jerT�˝�Qe����r�ٳ^�ʣN��7��*�pl�����\�!w}��:&��W��n{x.n�0�¬BQ�~aD��m��7��Ni�k�,����'[{�qw���-��w�/��.	�������LY�^34��U�|9���࿏�0>1�K�z�Wxe���|\>�X���/�K�x���!C]��b�ES�}�2)�{2��E[��i���D���ԇ��7or��~�>{�{���?��[�EHn��@n��8]m���ą5�u�;��>�e%i���ףۉVb{�u~��zC��~liV�}�Ӛ$&�I{�O�L��~���"@�z/�<��bK�fۛ��T�$ED�t�/p�r�4^n����|�9���Zr�[ȹ�g�MC
������a�S)�b�I�p��^���~y�<C_1q��q�S��-l��H�h�Gb�x�<�U�]|��(畑QQ�3�B����]Y6kq�s����S	���姕Jj"�'�O�	{���6u����~�Wy�z]��*�pc���ry[M�3�DŽN���
ʰPs�X�R�)p��4�J��RS���a�K�ޛuG����V���z)7�0~YN �	�Ȅ��W��R%�<�SĿ�Έ1�<WL�9Ӛ�'��rC/�J�t���R����m�QU�����l��i=��
d
�4�>[��0�GU���l�a�k6Y=#�)2F�N�B
׫�h��D��	ȊXF9�d% �v_��A%G��a��%X/��0z?���yM_�)Ut�+��P�k=�u��{(^���Ey��m�c��SGT-6���PLvozi�f����e3��{�\�Ƀ���s�ꌍ3L��#���t��h�]�\i/�F5c�fqY���&Jl��7a%9��H֕�}��3�w*�T�1��������2�e�L;F>���>5y��.�BU���d�6���׌�X6jn7C��W]��N��m�b����Y�\��M� ���5ɂ���;���K�J����>�*ˈ�D$�#j%F�4 $��	��q�d
�G�G�@��F+(f�0(b[�Zv7(fX�:Һ6�z��,�W�eͯp�������J	=��5���\�_Ə7o�X���s�`��3��a��i�V{Xa[�gN�.���I�QQ`��Oc1`m��I�rr��Y��ng���4�:/��(PA@����=�miny���៬���Ͼ��ɫXI�``k%�[Ao&���֎F�����x��
�⸔��r��:�q�p�^KG�0m�Ad��i�;-R�
0���Q\]!ݼ�j5�h��}�$�G��Z����?�<����ѴyƟc��ϩ�yH-:˽{���B�ݯ�Kge0A���e=1�j��蜳L�v��]،����Z�2�HhV�9��c�

�����CK���'M;�Z���z\$�G��5�z��~v���Dc}f�W �\��b��}�|Aꋻf�o��g��o�r�o6��n����.�D�iB�o�F vЁp�z��
ujN�]���5��p���!SB(ׅ��`�Ъ���)��f��&fކ*���i����I�8^�������u:}Q�0�9�"�eq�32._ݼ�Ҷl��.gd���S��(F��C�Z���v`ȱ�)������
�P�?��T��𲬗rM� �6��?�I�J�V��Df��s}�j��8��J�R%yĴ��\�a��Է�pK�TO�[مî��N�QUn}��eX�'g_�ӿy�Bh#<}J�&�N��
t���i�5�C[�������P<���G�Q|s����F=%u��ju2`�'���5EΥp~��q��/ �
o�-��e��
f`�i��"-M���yi5U�G�~x�*=Mŋ~^K��Iȿ�}
/�
L�ju���A�^�?s��vovpJ=����XR.���!����!�N�g_�>]G%E�h�������|1C3X���ث��9��D1�����M�ph�ڏ��]�8{ϓ��I%�͉�2%nQ�����nP��E�>�c�	/��^�J�L�_�H��K�������}1C�nJ>���S����n
އ�ڝ�Ϣd.�8f��/�C�`�9W�q�����k����Ny���6�8��J@�'�F%���/;�[P�睷��o�.PW	�wJ�?рݴ��N區���^~�&lÉ�ofHI�:���}���f�2\�	����S�o��]}�Ν��s��\�Sج}��M�/9�����#u&�|Hq��;�v���
#�Ʃ��kn�xxH
��Ӎ�Z�����'�7��(�HTZ���0J|��KB���z��s��6�\h'����?'U_��Zdj���!��[�]:��W��s·�Յ����Y?�,B�Y!��5ѷ�"���rK#��̛)�k�x�2^cƍlGq>OI���l
AFhΤ���u�C��t�-�J��Î�DQa����'�(���‰�5��*�O�t��	��<8��L�ʯ)�@�U�&f*{ٺ��ng_�)�B�����Η(5A�x������1��%�LS5�G�<���A"�t`�E���gk7�п&O��U0{�m7�/���$0{<��q��-��`p�cP�B�[�-�qi�Q��7�Cgq�t�~k���H�)�#�����?
��$\���kD�9`��pNR�Ϫ���(���:�0���SnJ����	�S7���T��Nu�^�~�Eӗ����9��u��[���2H�%&���׎�K-�1T@����9����G-vsw4�χJ̎����C�K�"��V���yk��O�ӳ��?�+�����C�|�H7c�>SΡ��.qRDz�-'����Q4#ZD~���I��_�;����Q 2;JA��2��W��
<z�Ͷ�Eq���֪�IP�F�9���S�`�Z���Nj�"�=,F�,"��F<S}���c�G#��mf��H�0cp��KS��:OTI'��4	���>E���CY�a����w���rd�} 6���m�M�z� pqut�lr��L��+h)�|K��{�9�ac㵦��&Cu�9�&Żq
f��#Wn`}�&�R�͖�c^��٥�"�k9>b�:��7/�_!ޣ��T�b��-�.�����ܗ↚� 7
J��Pb�}��L��N�������
E9�u�7@и��V�����ڇ]ҋ	�W_XCD9{�;:�й��f��nw�H3���w&w}�Q����C�uvdut��X�����j�Չ�N�r�Q�/������'����ƻ���<#L�96������O�<����{=~��@����=u1�>����!� �c�M�W[�o��}��:�V4��A��0H�y�ؗ�H
\I^��	�¶��HS��lB�b���ye ��`B��JЧ~t��᯶!(�6�5"�1 q˦�
1t�=,f_����(O�W�N��/;{�V�t�􎆻�*R�����ڤô��H5�Q��������wiN�V�/�M�z��ڷ;�HK�(�Z�g=Z4�8(d�0�yas.�ܧ�t�®���D�(���N�G�P�Aߐ�]j@�VF�b�]g�8���wW����!�‡��q�����1�S������:槮��8�*�d��,u�n�@�3�)�{؆���Y>��ߛW �Bi��P��$hQjK�W��A�z�rP^<h��7+��'�����Du4��OL$�@�z/O�����`,�Y�����d�k�+�k"/1�G�]C���,�z�w������mt��UЮP�����Cܚ�LMH��"J�r��P�J�w�����}Z�[��ҟw��2��:e�cG밻Ք��h_��YA�OK;�>�٥�/F4+���MFEe�ϳ$u(|��,��y:@g���n��չE;���~{��Sj/����4����#F�`�yzO�hW�Ć��H�kD���i�_��
;��ܨ�9�s�r��Lx����R.J��U�v7�s�_�x��[Ő
:�;J[�2��W�R���q�Â�i��N�!A�X��U��,��5p�XK׬���4F8�����c�D�͞\�e�A2p����H2��e�
UX���n&���)�?v;{���:�9
�{|kœ�3G�Fg!�61���צP$���j[7(��E}O��%�]}�������1e��,M�3�r���6��	���u�ɷ��z)H
/�&s�eCH�P��q�9W��^C��ޝ�ؓ�{��t�|L�_���M?�ϚQn�t��X,�?+�`�l������?F�_*�ْ�UES������]\7?<�Vv���P�ǘ]<��Zc5�E��U͕�����9޳�y�&_�n�bC�@3����ȗ&-2�QP��B\��'2�1��/���C��ק5������k�J��J���n}�#�)�Ѫ���Z�uf������7���P"�G�4l�f���%���@f3{�j�R�e�*�`XS;���
K�Dyb���zTl5{D�C"����E~h55�:~��?+�(Hɞ�i��@v�¡D��r(0�d�&���P�F�Z�s@0҈�oI�
�ꔧ�1ͦ�f�in�/>㨵4�����I~�j.]E'u~!r��3�&��_:?���hC7x�G��*s�{uGҵ� jx}�;//�liq�B�awkW���;��~m��v���<
�������앷6��s)0��������
�g�g������O��g~Ϝ"[��0s��]���*ؿ���
gfe*5U��k˦d�ELn��vIYU�LmF��@�m�T��j�Պ���=ɾM�"��<Ic0��m��N��W�_��y5U����y�ǹJhaEAK����I�O���|pSݶӪ��3�ߠ�j
)����|~@��RO����IZև�r��S���,m#�X�l��n�e?a��"��M�5��#U[���5+�^���w�P_얃`����OL�,L�0�G�D���2�<r������5z��澑�±,��"rC���*
��"
#��O_�9����c��,��A��#�s}��m�g)��{�CP�����	��2q�5���c���}�cI�$F�xP�� w�ZD����O������g�aD������Ik|��ww#t���s ��@��,��K*�؈��H��K���e]�Y/�I�|[@mq�c�ĭJZ�8:=1uQ:��Ų�_߃�ټ������颧i(�7�l��f��9��@G��w���:�Z�i�$�m*k^W<&�@"ⳳ��[o2�(�7]�<.�}��FP�V]c�%��4R�3-������� qп�,�n�AbJ�:�G���cǰ����U�s��x��9�ey+����*j./�̳�M��r�O��?�8!/��|�B!�裧���]�잟�c���L������a��2C���A�g�͖��A�`r|��j&���Y�Lu������tA[��|�38���dm��BQ�[����l{3)x<�=�@E ^:�6����/΢�psjv���5w0��"�Ϧ�8f��Y:U��q�9�?���'�l�����i��X����S�̵�E�����z��Z�;q9E�k�w�x9��W���7c�r�ʋ΁�����*�긎���V��1q
�lj�/x2��~�̧�F��Z%ܥ��Q�t7�/�K$��(��oH�
��*��@B/���h(&)%������^K�~33= q�G)�C~B�M�ci�7h�xl`���h�K�d-�L��2Hb�z�O�Kl'/��+�t@�L�Ϲ����)Y𲩨w׍/��P4qEIw��X|v��d�����'��-�#�hdZ��EN�Em���y�MidI=i�#������%.����X;N��c��aP��]��V�vx+'��G�8�dcG�Pr���ik�@���48�v���_���#��IuQ=�$�Tf�D�Τ�J��5;�WT���<��/�����B���}�����1-�y>�5݈Wy��i&>_fQ��ќLv��i����v�3:��j.4h �����,�Ea%'�X@C���e��V�ؘ|lxL��P^�����rf��=�pѰ�]�72��p��tr8���q2���ܕ��t��i�a���q�ܜ��g�Q��ϊ�g�[WY������3|�nJh`�5�ml�@HTCC[���ݡ�����
ц{ꂂt�
�x�R5�0���߼���{xta��Y���Xb��Ç�s���x���>uP�ߥ�U�n��h�?C�L�)���M�uk���(��BA(}5八�ox�u;�ȅ�裙�F�P�
������ds�t78�	j}��ᑌ۬ �$�Z�y�}�L��>�n}��q<�U ���W�;HQE{����x̄��V�ɉu0�/�Dr�mʔ������6��~(���V�z�q�\Fݲ��r�?(
*��{
��$���|�?J���Zۡ�'`��:S8׋A� :C��ųD��\xF���i��i�q�QHN�3F��O���ܬ�
sw@�����ۡ�a����bP�|H�� f�����7A�h8�`%s+8/��_s4*�?����q�2q!]\[J��L�ɿ&��!}Ze�[멊�p,�{l��V�,!�w���e�U8��S��$�(��J��n7Uf�x���~�y�]�����q��:34��d|`�}�i���ndK�+ۂ�:�J�D�v�6�8�B�y�{�#K�ig�`�����*�@�<�/C1Q���n_fIy\�]��/O82�σ�>���U�>o3��ߍ3��e�2�t4�K������6�L�V��o#
�˄�ZP�B��tM"��n �X4y2Z� ���p7B�-����*�/YA���+������,��r4lͧ��%�g'r��먌����U�b�`B.���>�+ÔQ�vlӦ���RԚ��h=ʤ��:�"�U�K�����!�}J�3�Jo.ϣ����TO/ł\o%~�ԧdQ`ӱXϭM�����l,K8��,�'�R隸����������.����@��	��1>�}���=-����D�H'�h�ϩC73���|u88�W���Rv�|��8��d�bUƓU����ȷ{�Ha����ˆxݨ���
�v;�k"��i�:]:ՊV��=|s;�>�G��Y�ǯ� ~(!�j�'�?��+���)"�ඈ�� �)�m�]��+5�hu�w8�%�/�6�l�,,��:��Xj?!�3��iQ�X���5����U�����>݅'+N��%��Y�*��e5w��@����l�!��U@NGT&�4�)4si�}qV3rr�Ow�
`k�w�y�B�]wQ�ky�+���Kv����"(��l3�����'��fP#�p�j�X�̯Z��ڙ���֍ԍ@�o�k�d���Zy�q�1���������:m����E*s.
����K�������y�u���XmfQo��]�6�C�����V̩~$��!r�K�I���4	�N��^�������9���W��K�q���j���>��ط ��W�
=����/�M�Q�%��y�C��s;�,O�U�X�X�؇q�|i����!�_�q�\��oH)x��� @�,��=^��}���7ox��n3�kϢK�[ì33*m�ː1q¶߲�U�t��5a}I�N��f������:tҰ/�I�����$F,]�����3tO�Z�@���0-e��6_\�.MPY�8��Q�N�l�H�C\mï��Q��'�;�%GW�����B)�;��
�K��5Mr�<�jj@M�NJXyY=� ��D��i/���$��6M�T@�GW�y��G��A��p�P�n��b\Ǧ��2Z��S�VP#s�^�3<�MŚQ1S#CNU��H��fTo�+���ϲ%qS�5���X����@�}'}R�Y�x��)%kB�@�]��	�O8z�P'��e�稓�b�I/��Qa��xPY*lۦSZ�[O8�3s�_r�=P9q��}�R(h!U_>�:rV�
I���>��
�ҏ��h��Ei	:Nʇ�n��v>�JP�z�WY�����Q�gX�yS����2 ��H��r��;������ �y�<b<x^41a=���qw�:���nkWL!!�:L��br`���|�ב�v|�ȣ��p�kG��iU/����).;ç~Vl4����Ŧ>��?9�(�VY}��@f�bvᮜ��WY0z�v��'eWk(M��
H�t���SFǿ�9�|vB��$!ǟ/s]׵l=妨��p�B�N��;I�g�X1��E�V�f�V\6%�w��mu��N�<�ΰQdt<z�1��V �*���.����獟2��Fݩ�
�	��t��H;�5k~��g�vQ/��L�L��uq��Q��w��Ǡ�\����Fhc���xL7�T�}NW�AC�.Ayy&��B
��ݫө@p��5Qyj�qq ��h���g�w�o�*~��dfx睎�΁f�&�n��W�I���W����j��k#�85R�uT������Ô�g�B�㓵�Z5^�nTmun��
+:�,�s�f]��Z����aHTѕ1����u�;���"����7�4$/�S�e��?��N|
M$���PWMZK-2�W��q�s,Q�4=8����������Cr?'jru�:�&�6��C��QmW�?��պ�ϲ���)��f�Y֮��֪��ՁIB��6����1m�e|RQF�wE�PƗϻ:������oD� �tV�=�߿�
l�1�-��W��^��X%����5���'��SmP�σ8��wg�zFn.�^����2��:���5*���T����Hm-���ke׍��uo�Cq�͘��*�ͣI�_�p��!��������	6*'Ȋ(7���"T	#��;��U�>��I?xP
�`j$n*um�ޗ��\���@����WE8���c�*v���.Fؑ�N"ɉ_��)���'__u/��w#W]'�w�L�;�j,v�mm�����K4D��y(�,:�}t��飴��В��b*�z�2�?�r�\�/�|rl�d�*S��Z�ff^J |�R�X�hj�k|~f��.X���7�NL���E��g],�N��~�C���2���4!uB�L���]y��x����D
�1���i����;��$�H5�"G� ˤ��f�ԃ�;R�V7~�����D��TcB��,����]5am'�K7'?����Òs�^t�ztm���|׌~�W`]�%�HɊ�V�̣NJm���5�vt����{����L&��*�-���R&���d܋ +A��D����[C���^��\��lw�����1ᷲ>rǯ��h�²;�4<�Q�:��ø��}L�ʠ��"JPPUՒ��9�EWN���.w�ʞ`�Z�A]�ccՒ�� ʢ�+)heL��.K�i���:Zd���T`�B�y�r����cm�aiє���O�l���zL��:Γ��
���y�Wؿ�v�KA��!��8hq�=��`Fs����2������l| ��
W]�qZ	�e׹���Ϛ�	��s�v�K�����H�}Є�6
t����M:qa��9��J,���'Ud�s�ʳ�#�,��������OaP��8I�^P�4�>���ܖ����Z��r��ۇ�jV0��Ym�Ӂ��B�<MW�(J�M!��r����VĹh~u[���3?%�Ex*X�L�q�*��=̛� Ҽˊ��@��Y�E�O�Z�b�q���X'^�ʼ�_X��J)^Ù�bMq_�\���ʋ�D��k�}Y��eb��!�� �f�=۪�Ռ'	�ֽ����2����~��zg���)�����п���������N�B@�d"�S�)?�%�4D�6���R$)5
zi��-;1�P�g��
��hP|��>�㿃&�hϪ��W#$Cq��o�`��'e�1V�
~_Tz7�tg�\PQ
;?2��=��w�W_8YG��G���Y?Ky���A���m��>r�S.���;M�L y�o�zP�eŤ~M�Z-�������I�>����'{���K۴��~+زC��i���'�pw�������$�>\d9�)��0�%���g���Ց%U�e$ty� ��D(����=��� ]+M`P)�c)7�4�V&	<�r�\�U�3�;ه�����l�T��$偹1l�����t�u�8
�EV��G����q:Z�/w���V����*{k��C��_K��H�(Bs*����_�I�S����,&ެ���(۩Q�x#~��wus�����ݮR�[تn���>���٬j��E��ޝ:%�����ˏ��C��脞ÍL�����
3H�5��Wdf8H5�8�Ą�6wR���\]?��t�gr�V��=�NO$a��)a�a�����cg}녵�AB�)-#�t�$E�e�JJ~4��8�Tz�M��C�v���^鑇��]�18%&��~��B= �c�{�,�����gD}��b�
Ҭ(()1)�]�Qf��X�zH���2���**G�)��U����u*��׉��ѓ6ˆ+�ٗ�L?�w��1��
YLnC��ﴸ�X���Շ5�j�/$=�&�������>L:ϧѢr@X�$�7�~/��J�/X��vOr�EE��ʤ��b~g5�z�]e��|�-�5p:i���=?�9��/��&�eFzs�2$1�;Q���3fDkMߘx*����E'k�؉L�*c��
�<E"���ZMX�/�T9!�C��{�Wԧ����(�		���Ԁ��&//�6���.5$L�d��5t����Dr&��z8-���.#4l}��R��!�g��
-'�@��d�T%�~��J�̨��	�����[��>�3fRut;ї�{Nwٗ�N�uK/=~	�S�-zq�O��KnQ����|~�4���tP�������%]z�\�l���:�����5B��:��k���]~��>��-��S��"-�9�����j�"Մ�Q�Q��BZ�� �8I�$N�5�'8	��O��g .[#����R���W���5�#�7̯�Z�DÕ�{ľ���є:\���T0e�F��+�A�:�fz�j��V�U�?޳�dɤ�
�ق�r�o� �@����PM��s\�<
�ĜVO���
༸L�3��IZ��)"oZ��Č�S�ڸm��(4�/�+*��$�2ʠm�㤾���w�`%ik�^RW��b��Q5S٪F�Mܹ�����մ���3�h���X�!�AAnTh���Z�>�y������~�Z�Z����D[�B�Ej=����W�s�4�ۙ{K64�����=�7\�q�,3�4_����QX��j���� |E��Xҙ;ѷ��[f����l1�$gE�g���u��H�����O^��F�q��?ة"�fD�I����6�-*s�V)�$y�]��DD��A�o��r=�*Q��K�F&x0�k�_�\���*�*�n�5��ы�'8&��5��?Vb`����\A�p�*=9>��㤃q�5a��e����r%�'���[ӽ<�J���E�c"���Oܫ�–��8�J�r�S6��[%^ǃ��4�t��2?YP\�P�B�	K�x��h��4s�8�L79�|U�z��OI��l�_��D�7��)6����[����J��G)�A$���
�A?`k.���H�}e��鏊݇Tޯ<�.~�a��@d^ٺ4
�d������l��[�'3ΟԎ>�e<( ���Ы�{���PgQ)���*��ϙ;�7b���P}��rI��~�;J*�����L�,�d
>z��m��vdP��'�$�o���3�M�NuQ2����JxB�u4F���ӎ*TBm�?=�s��0M���KhN;{+�p�18�}g9���uJG��D~>�q�ݑ~���3�3i�[�� YǕ��	���]�ލ�f�	��.�5�yzG�W�;E�o���.:�Y[��N�#x�]�l��hd�z�b�Kg�>�ӄ�j����Ce.�P>����~A���I�
�S��͉�x��Ex�
�_4��U0�2��I#��
T'�VD���g�BF
^,��$����wx*�◁Z"�w��Ύ�$�d+�ۚ$�]�ۘ&�oE���K�l�ld1��Y�I|�}ɞ����#4њЂ4˕e�g������^�1��r�e	�B�̉�}��_��|ECK�VOj5�kVs=����#�0Qd%L�ծs�C���ڃb��V����XHf�0>��Ebt��Z���U�T/��J`ʽ|�SƤI�f�E팩 �3�<$p�\u~d��<L�u�ьB,j1"�9��w�+�4�?
�d�Kx�cM�aIQ�a�,�"��|yd|��r����-�e�{�U�����U�dk	ش���k�1��j�amڼ)��7�9���@UMB�(@���(�i. �fW_E>_�|��>cF)���uf0�V7��"��A����*�����[������Zd��a���榦~�~�
r�A��@�$�0h$�2<T���_T�\�uy��
���//	3�a1�A��=]��}|�_��%\d�Y�JDsUe��S�Ra)J��F�U���(i/��H�����LpGF5E&�L`�H����Gƕb��U�ak���vc�A#��h�჆	8�7>	�����l0*s���<z������/���{;s5�]�ߟ
����."S�԰y� ����	���������~�`$���J�
�[��w�].�&�b[�)uG�r|%ϼtI�lx��X6�f�(���sO��er
_��*��\��j!�^⓼.bW����W��t��q�)�%г�T�B\��5�ռ��Պ`1�N���K�j�5�"��c�'�j\�}Pw���Ӗ�f�������:�>�z�z��u��՜��skj�����_ mZQ�����)e��7�|g�[~�[9s������ݠ
r���GΊ4_Ga��>�����lgT��ּ�,�A����c\1�t�ck��w��gY�_�}b�8���2ߔ��-�".�\�p��|`�_��q�J��E�=nlʇ��7B�i"�xc���Z���f/��l(�W�	�]�ڳu��t9�W�^���W�U�"LyMN
� ��IA�E�=X���>�P��z3�J�?ڬ'n��=vFl���o"���h��������Ѱ}�X*�g���Ň��H�p�x�؜����r�L�9o�^
�Hz30���'b�Jz��|�Y�53�A�Jq�X��u�hϲ����g��F�d�6A��$���Ʀ�Q�ƞ23
��v�/)��<Z�`LV�Q�ݯRRlw"��R�����Kf������R̥�X��� >���*e���ׅoK��	�O�m����J����D*7���ˀWڜ���U�����>b� s�0�3J(�	�butqKK0D�P菉���:Ŏ�z�~,���X��K%!r�����JmCf����M�"S�s����P�yk }�G�#}��D`�F�k��D1�T��6z��-���k���5�<t�����R;׾c��J���\[����c^5k����ɥ銲q�[��Ou�Gxs�Wf���'�'�o�ȵ!�"r?��}�,,8���Tq&Ҵ����
�H,�M��
_���3zF��|u����:߲�d��KEr�Y��W7��HY�qg���5-߾�;�J%�B_�g�Ť�FF�eu�Y�TS�:Ew�!Y��w�ڧ0��>nA�)��/�[uLt|%8�%z�W���2���M�d�e�O���gt�.)l��e{Sz��Ưc�ϛM�ꊀ�(��ݲ���!����	Ţp3iV���c�$�&��9r���[����um���F�Oc8_� Ilyԛ9��I�����2��hKȇ�Ȭ�zt��z��Y�n��%rw�C^�gٹ�\�!����C}�-J�j]�fj�I8O�¡^�5D�<i���1����9�m���ryz��ф�r��2Vœ���+2Upȿ)Ck�V��\�t����Bs��MQ��}Z���L#���
����	��F�d�̌����+7��r�����%F�?Dɼ�B��N�ЇVQ�4�a�Qk
-�����8l��9��b��t{M.�	���~���D�D%����t�!7�u/��J�:Gs����X{����b�SqA�(:w����~����q��^���R��3�30��W!�WR�Xs%��*6�z“tq��������
V��@'��)ΨzAp[/�9��%P\� Pœ�~�B6�>��a	�o[�h�[��_��6�X:랺K�p(3��v![q�cc��ᦦY���lN�!�L�k.�ҷn��wBw���H���|��/Ux�~޺�VZ.��H�z�i�L�v�W��ĵ�=C��01w]�G<HI C*�z<အv�|��U2-R<�`柦R0)��e��hu���t0k$&D��:�y�Cxc���q>Q�7��1�8�4F"=&�'y�T��ȗ��G�=�XZ8���:�#��b]`���8`JzrZ�T�I�$���?7>GY�����%q�i���6/���%]v������[X)Ǒ������+1�f�O�u�,�]�6߮1(�Ҁ�q=��,����f��@��T�V�B�:� �2.K�!T���n�����f�o�`
���:�ObWC�֔}��m�EH��<�!��n�>���#%6Ô���~F!(�LdV��`#�$8��˅�������ˤ
�����(#~���V��f�"SFK�0f��I=����C����곓�EI�����,�O���Tw�U���KCM�k%%���a��g�B"i���m^�?J((<���@Pi�p�D��(��)�.�H�I$u����&	:���d	�J>A;��P�X<=���Q��8
�c�kMx�gXE ��f1�츬��	:��=��\Q%T�D�/P��\!�B���5��Z����$ҧ��Dz��D��C��~c�*���FF�_��N�0y;$�r`����"���E���yH����4�붜�q2�-��܃pyq6�ʇY��L������U��{wf{ڽz���t���$=T�T�{�zg=��g��X����7�x�77Va��g����ì�������?�&��z/��Gp6-����N ����q�!̨T>��Vܛ��Œ��k���R_����fykWK�.V�����~�b�?��VZ�]��Ti���@n!6����|ha��Ip����Í�������E	�K��1��O���dwK��[��VO��V�}��󭉕ǀ)t�]���t�I&գ�&�g��nF}�"��(^N[N'-�gQO��UL:�%|8���:-W��	8tg�
�&�C���?�9�C��s
��y��w����(G��Bj5�m�棶��4.��xdZ��,��Dp��k�.�a�(�=�Q�C.��ְ��QP�H�Va'8�7�"0�ݯ�'S)�<�p�]�7��y3�M�����x?1����݀�4,3�S�z��T���ua�F�ZtU]~���v`^�%:���AWj���/�	p'n\��:�G���R��p�8�5J�1܌�hlE����&���5	��`�ހwy{%��6�x+x����������6yǶi����%�;MG81�+7���Oq(ӳ�G�E��̭S�)R`��]����JEObU�,�,bKD����h��h�'�2
ܵ�!`��q�EzvGΪ[X��i(��*��7y�'c�a$��<��P5����V�fPO�\�L"�8�W�o�!!\�1g�S<R��D|� �`
1>[J�G&\O� x%e[]�O�~�9�t?�Oa��@sH)p�嬔s��l�}��jy��o�I��sUvX/�����Ƚ���hS�wƄ2�-�I#駺w��vWލaN���+�^v����7ژ\��FX��4&G�͢G�Og�'��(���}�b��y�;��􍁧�ͺ���*Y����QB�*;�P��%��s��1֝�T-x1�����P�e�l
��-<��*�WZ����X�XO���OT�X�Vy�׶��9Qؿ���[������jB��J��m-v��L�w���Y���LKs:=�0��m����ow:KK}������>�Z]?��~�m��|��ٛK'����~�5�2/���3���%R�a��'���E[3t��G�_��>�_x�p!&�L�O��18h4����v����Z��2A��p�w`?�##}`���v_�j�-���]�^B!���7������O	�\�5!�������>q]5��t��C�{l�R�ˎvW��xiJm!�&�E�^�N�q��{)�~y0�x���L���|(N7i�)�ܱlT7����&yqr��.-���:��k'���Mz�_���1�x�}�_�I<vuK����%�z]^��2c�n��A���\��#Ld�|�3^uury5s˸�Y�3�fOyŒ�ög6��.�oמ��V/�W�5�°m�
�@^>R*�?qetVр(��7W����46�C�ɾv��Ҽ�FD��G<0����z�nI�!I�x��̲?���`���p:Y���L��}R�䘶��C�~LN1�A�=��K�����%����� ?�:���}G�>HPr�D�����Et\�Ž�����`1
~�˨
A��Xh~�~�oڭEK7�r��n*����_�a7W,0Gw�ب
�u�ѥ��
�Z����xI7��_f�i���9-̹P1�:[r9������5
���O����.�}�Z}�dɿv��x���#�Ҥ�K�
c���
�K|a{�M\�8�&�b����nP�5
�e9>=N��f���%Z����w�z)k�t-vآ��P[
��s�~!��Vqa�o�t�+�h}���wo��T���F{L�'47'%�3{���t���;a�O�ǝ������^��d�˒q(��t������5U��Z#�	E�?E��OW��xs��6זG�Ό�x��p
����r����A��lXy�N�6���I��S�H�����뇏�	��A��r�:��^�����]J���i2��M(��d�ǀ,�Y9�Ka����j�|kT��NAa�
i��e������4�P0Hfnߙ���o�B��PZZ��m]�K�j��z�bJ_%�5z���ﯳ-Җ�m��C,�f�#��x��Tt+��x�^K^ݻD���X�~�q���>�0�O�^��/�(4��m�S��~���9ĵG��ދ?u�m��w�
�1?
ꏌxR	,��7<5�6;��r9�3&d������3�]�����/�($¡6�����)!��+�_EP�����M����*)W�[q�th\�c���e���qIh[J����閒 j�u�JA��憉�Q�н�J?�$B��)��g~�r�����D��6�H\�.��:ڄ�N��.��R|���|W ���C�x�<B���������򶃴���j���Ki�&[�ɫ���e�mlr��W��n&�pi�%O�O��ۂ�yճ�I�=�p�y�8q�z]��y%l��cW��]��Q埬�^�D\��2�4*�֙<��y�r�V6�?��S���=�Ak|�(,JT]��g�b1���)��X�Y:�,/;�-��U"�
�5բ�`mgW�\���ಀ�=�͟ڌ2�'��&0q��I�Xl<�y*�p��	p����Şd~�6c�|��-��2�]�p�\/���{C~B
��	Н����x��fe>�3���=�i��l��*t�߽{�yE�VX��/���\���U�%�C���7�8/��S�'P��V����S�ba�i�Njڟ("��@;�.X�8#p�vy0���\+{��l+w8|��r����:�	��b���@��6�dDR�x+��qU.g��+��}�����2<:3�� -��橪6e�V��@��v��{�$���4k_n������䪮�^�9��f^p��z6��NDNν����w�y����s�s/��ـ��J����Z3��W_�/]i��0!-l�/[�;Kl"����u�u�3Cr9
��'��Y���{�:�}��R���̚օ��y7��R˶����c\k/]
K�����x1OO�f�!��'Uqj�(���WAR��(���A�Т�&�����:2D��6��ي�?�z�M��I��[�Te�fsn�����m� 1G"�(\�`4\sXtC$��}�=V���B��)%�^λnA��(�y/K�=nroW�J�Ԛd�{l������(��=p<�+���o\��ʐ�yz5%��(D�n�?��A��z�ӗr�pKJl�r���b�#��>�V
v����l�?�������������E���0o�n��*�/�������#b�m�9�W(E,�_���L�s��w�������u�J�*|���pE#JT�W�
�(��j��0P3/'��ߙ�֬MGݼi��g���sZ3a`vL�R����}��(�k�O4 Y�S�V�;h�Q�
Zю�]ґt�&Su�x����(uPl�E�vལRύ䓝x�|�{*>^�j�nT8�u������"���l~�o_��E�9)8Z^t�׊�-�M՚E�U\[��Ȯ��V��EaP
���@��|�c	��W����Y�):P��l#�,$�R�n��z~�^��8��~��l�>h��\��,)VP�_߇�",:�`��i�6��&]���đ��%��1�h���o����A*�z2M�e��>�*ø9u��L�3Y�'3c�C�>.�d�ӤDmYf
EhÃ,�Λm)Woí��m]�}mj�X�H���{���ۿ�����4��Epdr����q�r�Q��5������-�O�x��	/��]��@��+���A-�E���#p�1?o9Ġ6%5RN�
�������^�ޔ��f��w[���E&�f�� 12M7�қ�5�|������8�B���G��Z2���'P�D?Y�x�P�(���K�䉝(���K��?P��W�P���q�I4�����m�y�G�<`�Ϲ7�
a
��I!��t�]�(=��`���(F�� �:���ƞ���"Sk<�~���KW������� a(s���F���.r�6>�{�٭$�VC���4�S�Ԫ��h��B7���҄H�'+i��?����O��g�����gg�ʍj��<�O�n��.�T���1tyzzn&	�,��›��ű�^r�Gv&pѐ�N4(H�׫����}�5ߞe<�x�I�1䘢H|��M���O�Lf��������O:�79��RR��_p��[�Mk��m�������7x�S�MK��)��d����MD����(D��.���Q}}Fc�o4`���J<m~d|�A���ˠBџ�(����^.%Pݕ�f��T����\�b��Db�|����%s^G8�b|d$	��KU���G���Ҳ����A���-��-[0u���FSV�L�.UJ�F�g(O���N$�ѿ�Vd�C�D�J���CUx��x��<�����̼<o��_���:N�9>m��$�ϥ�.���:�=
٢�Tt[i�nEd��Y�I��`[)u1��i���$]�e’�^��'��7A���n�;���&ƍ��H��5��X�i�h���&��.���vIz��^����L�w\v�/�`E��mg��b�

�@k���Z,��N?
k�sY�2s���R'%��l�o��wo��=s��������6��:�4��[�[A57o2L/�׷��\�]�����/�>�܈�c�3����z�-��_mI�Aƛ�����7������A;�B�sY:7��?g��a8�V���*Ga*�p˼��-e�W�e�%b����<c�13I���B�#;�mSZ��R=.#�}�S��'�������������ޢ�6�����#9R�<���W�s�������Gr:��m�6�R�E���!%w�V�HI��$�g��n"ʺf�-�	�?��)1����_�UY:��! 5�t�����G�z���b�
{,b�hb\O`ZHp:���K�=��sD�'/+��IE�����I���r��0��Y�Ca_��#h�Γh.�.���Ѻ��3gn��ѡ%�+1=��")���G4�� j�j�N��Ʉ���Ğ���f	$1�l�U�@xgv@��6��F�
�������t�w��rכDz���HͷG�|��I��k�>��qR�l� ㇵk�r�3���tK0a��΁W�#M�=%��,6\�6U,ޥ�[R���e�e<Y�s�꿮��`�a҂/�Z�7{�-�(<���|6Os��/H����)ϷS8�Kd<9�mSt�o��>j�٤b�yp��9� Ǖ���f߂�.j�uTOe
����7�R,��7���[sN�����||���4�PV��D��\Fx�	�D�>c�6m�
!�t٪�.n(H25T5�M�w�"�3�ê\60+���H�!a<�<ݝ8�C�k_����;=m`���Mk�Y\k�*��&}ɸ�f����L�rܒ����[�[���;j�\�#A�M� ��d�V7��GV�(�s�N�|�"�!?9�@$��p��I�ƃk*�2y}i�EkVg̿#���m��l��Y��X���7����I8Sp'c~�����SP`��/^���U�����P�ž
,&Fa�w��q�0�ƪ�ϑ%��`�;��(`��4|TSC�=��,&�h���IF��n���68GQ|Xh;���!x�7<��M�����n�\݆��"?M��(�'JU��EO�D(:~_7�3�Y%��w��o�!C}}O�5�Ѧ�#t�y}h��QVC���f1O�Fe(4��n#�Δ6�~�E�m����X��Sr5O2ȳ'���m���}�9,��(��o��|�u�?� e%%câ�Z_�B��Vb)�� k:�G'�H��IU[s8S�'o	ܒN{*'g��@=$�V��e0[ �Zz$Z���+���툖+@Z���*�]?��
v�O.�H��Ƌ���c�YV�׹[�����ǜ��䗡�?�+
�j��1�G7��[���u��,�ΣzuO�E���o�q�\a��Oc���r��,��o��)��1'��“1�"�NO�C����$��{��3�)��x���<W�dq�Z��3FI~E�Fӛ`A�H�zq(j"�m��'����@l*P ���ÑAsX�a3���̃Hs�ΐRD�E��(�֔�,��g&��o��JUBͣ�0�����#����B���V���qؾf�]�����lY��~8cs��YA*����Cj�^���(�+�dԷ^��j�W��A,8��/K���e���J�1T���k�6�i�I<�fߍq*{�IU�.������֍B��u�I�6��nBd%i3����,�鴈���|����#5/Xr��2��Z2N3l�Y�5�h�K�J�dV�������9�#+�@Z�+����#�?��#��]��8b�\x�C���d�j�
�b8��Xx�ZO����`=5�r}@RMH(����0+�Ԡ0T�Kr�bz�
�
�m������&fS�XF~yA��<;��,��X���l_�'}�{��k��Ο�f�M=y���f�M���p8#�Ň����`+���
�X[�q�������!�O8���4��g�mhgqK}֖2�0*��9�c}XhM��)X��k�ي�A|p"'��}3.mG�ǏWWF4���>�������\SęƧ����\d%F�V�9C֒���#!b�ڗzA�����W�W'u�9�]ܯ	`O�/ij��:�_=!76��%��3C�Պ�PD��Dυ����+%Qӎ�|�G�w���ƴ�$�ݟ�h�È��u����}b
x�Y�Jy�u����"*���8��$�QY��cx�����moy�7cK���`Y�Ό��W��
	��́[K'I��q�@r\D��J_"��E�8�,NUC{��;�;�#rB�7�e���y�G%#��Mi`���U���h�۱xW�o��l���_<��}���R+D��J�)��_�)��ӥ������\�AP����f�h�blIQ��0���颢9������Ɣ ����Ut�-`|V" �.2�3>d��;��N�U��`%wh�o�`��b.�o#��:A�8���<�0H�>n��nS������G��ػ���?:�M��Sg�����.,��A�����֗U�fћ�=/�'@����T:U�����j_���M��R��@���#��OQ{mt���
T�k�e?!�6�ș�UAD�Y�Ӟ\�����,�x��ݼ�e!"�\V���6��W�W��ѻcI�b������t�+F��Mů�����a|���:l��x��[I(���`�2�Z��<�0o�9E�%s��mT,FP������bD�0����0&ea�q�H�W_�l�,y5Ꝧv�1�*|
G�����M��Q��p~f;Ϻ��-i��6��ۿ滳v1��Q�[i(A�r.D����Ơ)�z8>��5�
�KM�҂�c"�<wRCe�`���ޣ����.w<��KY�\�*�)��@����������gǼ�U��q������.�`#���D��f{��5��y��x���@�19����<� �M�	O��$��,R��Z����L�R�*�X-]
-Z��J풉P���@EEA�d��f�fAz�f�x�o܄*yL%���;��+��*}|y
EGio���@Tp��ډX�Qwu�Ml�x��Q�<�h�K�Xm@d�E(����5�fL����E����`���i�*���33��VF�m��*�IJ�5ٷ�@|�D��6ԇ�7%�^�w/�'�p��%��;��+_�7�i�,�܊��t��1��E������	��g�^����V��kZ��$���չgyܕ[p�W���S�`��7L���g4�!k�,w'd��YV���V�+�D椵�-RR�����m��Z��9�qZn�*�]�2�9�rm���h.�l���-KK�&�.W���f/��&�FN�4���g��aa���B������uU�+.ܽ�<<��_���������w&<}�|�*CU������0�Kȭ�����������m�0�d���V��6����C�Th�1��S$g�]wl5��Q��(?��jF�qg�O>�aUBURݒe�x�	O�L$dMә�yo*�fݝ��l���U��{�,�ٻ��.�0{1��(:z�Mz3���o�9ʕwbD^x��r�T+p�Z������`O_y���Z1��zb"��w>���a�����ǵ0�}�K�s��*�O�7>I��q�W�V�1�.�]�[�'�OG�x���*�D�]ՠ�]Y������!1%��G��"
_���z�*gQ&
�dt^e,E�k�����"Gъؤ��(mιi�_�I������z�e\ӎ������I�H�@�޴I"�…c,<�IK����l�9���ݠ�ե
Ņ��S[�\���exF9��H���F�<��M�K��IA��@�E��	���s�AS��E��3��l�����+}����H~����c�]�A�DrA��րC�⑸���`r�׾w窓���R1HO�: �DR�O�N�ġpr�	�	���߇vn�=GVը��r��`���w![�IZ��w���w�}q�p�9mop�,x�<�O���Ƃc�y��$I9\���4^}_�G%9�o��6 b<��`z���^|���,`��A�O����K,����
�9�Id�V�e����M��^?�VRJ�%�Sl�=�N�P�����אHc�0e��x�l�1����h1QN����?:���_�>�tp�	���5��Lyޏ��f�B�<�\�5:�g֓'nYƦ��!Mx�����}�R�OT���x}ݸL�����c�^�Us���:�47���FM��	�o><V�4�/<
�
��N�ھ���س��[�0C��2��6m,���ݏ�ݔI�S2�3T1�_UE��nXkLgZ^g�U���c	[)�[A��g��R�-ԊG��⩿���Z�D���p8��al�RC���NJ�W��x�V��;<H:y�=��7%�6�ߗE<�ܕ\�8��@+�W�ͳ^�D��1���l܊�l���a>w��E٤Jʺŕ�4��fjay~c�i鄳�5����g��N�\��Ux����H�#��O�.�
��*�]@C��\e&'|Μ�L�6��r`~$;�׼��g�8;�g5΅!-�
��i��g*���Z�t�q���3a��	rmc�s�t%PDL�s�w~�p��u�͔ι�7>�/�YA����%�������;�^��J�8<T�;
����EƗ!�t�A��*����4��5����p�Lvhl�����m�m5{~"-O$t�#�~���s���n���:��eN��`:��w��]e������]T���~K�n���T8k����."�u��d�����O�u�}CП��W�U/�*.L�D*,[����0���#k����%A	�U,��̑t�Ii�C�Q+�D�<����<�[}luRZ�!t+�r�I-�}�N��B�d�cT��$H����c��{��y��Ҭ�,�11햇F�Q�r�Gix�E���u�aN�eB�Ku�[�T�#|�_$�r�!U"��z{�o����k�/���:�<�Wx;�z��B�[��#(԰�3q�~��Ihk�Y�ڶԊ5��bB7ޒ��1����Z	�٦E؊(����7;i7����u��_ޔ��Q-ј�ʻ���⫍�����C�k�.W����Hd�㫧�I
�Rl�>�.�Ý�~��s�v�~�/��ɸ��+��vO;C��
���m��i���p�������911�N�����g�66��\H���y��A9`L~�y��갸bB�5a����)f$$"�(4�%�ؘ+!JR�D3X�^��Q�K;V��N�k�x����T>�L����LGչ�wJY��$�D�뢷�-�f~:�~1
%3��X(@����ϳ��;]���s���2�O)����_�NOVo<�D$�דmc��-��>�U�ț9���N�S�<���4ɕ����}�?�Ti�)�=*��D���ɓ�%ʴ5_JQ7��@�4}b��/��/�y���9�����P���P(���
�U��2�$���n_X^���;N��� '2�sPl,����S��U�9���󗳌�QW
�����!�.:
Eg���)�����48t�g{���4�)�ɭ�Эd�w�!2���ʶh�K��(�هP��;Yivv����d��WKd
[4e2��O��TV^~ޚB����Զ�^��.���*�,��b�!�D�>R�n�O�R��
�$�A��1�KJ_�n����QFlDi�0��}�l��Ɲ�6��<DŽ'ٕZ��M�W�q����7����÷�X���Ċq��R����ݭ���:�I�/<�m�{N�&/z9�mT��1e�I>��7�Mh�#�Õz�T���-�|b~�[�n�[���+M`��Ǒ7���nI
)'�T#qg?+��s��6A�Vk�M�Kx����Ao���t��畗0K�ŞyuGG��><{��DŽ,a��劫wRds��y[%-��X+<��J�<�d�v 0y����xb�ן��D��+���"}Ёm�]�
/È5M\d��|cn������w�T%���$��ۣ���a������a�A�PMjz�_nb��i]�����gF����ۓwG�%N
�f�}���~а�6��ǘ��e�G���K�_�uY���k=&�:{]�G�^5-|;��D"WeU�*J��9�:N�2—	�`�7ܣΌpW��Y���v��QP����L����Ĉ_O`м&��K�4���G3޴͢���a��f���V����F��F�H�%��fcNj����is��������X�Ц_,&:�2�sC��`p����H�����=��ȿ���_9�sD)��`���Ѓ�'��<�hn������m/|�
�⠉��g�艾_tU4�0䨹��l0�vGZ�gwM8Hqے����}�-�f-�qƀ��n��j]��0{x��$�3]�TMe
%B*�ȘZ��ή(D�w�6��{={�p;��bt���7�wػ
�Mil4���[��Vf�ר������ow~B1C�tbH;�8��^��ꢳX���w��1U��C(���1�Hм[����t�6Z����u)?��j�����&)����Do���R�����Q��\�.Ԁ���D<����0Z�ض)������E�W����lY�*�%�&Ej�~��Vi]��e�����M�K�V�c���m�g����R<L�,���=F�B�b�	��	;3p�\4)|Tan�Ǿ$�Y������嘔X����<&]���_��yU��&��q<{cs� ����ֵ�6n�x,���*�U �e���ω9-YG���H��"�����,��\�,����%�;��dƐ��T���ZY$V�n51���@o�y(gb�WԂi�ʉ�}���W�{�B���f�]L)_3��d37��T~�\�'���mVkq��V���]q37����l��<W�$�z�^Nz��(���QsVH�)�pʙ�R�\=���5Q�I�d�AӰ�Oe���P`�_*�y��Q��ڛˆ��A^æ��)���x�Az�gb�a����n0{��M���x�JGՙ�Xm[+h��J�����l2\G����:�NU"��6��eT�b�ؙm/M�u&�"���~&��υW?_�j��Tͪ��4Ί͙�IJ���y�zo��M���x�8��db
y/hV�_x����	�c��-�q�&��D��7�(�SX)�!ڿ�k9�BVj��Rɛ.��ٳ���u�Mc��o���.����IC�Ѩ,<��0��q��8M��"����eiB��M��eA�K��۠%��7E��g��,H*(��7���X1i�� �As�4���8���nB��r��q��/��C�?�Du��(+,ԭY]V�`M���z8���S�&t}�`��8��iZ`}���i�=L
]1����M��>ˋ�l��-t
�!�/$O���46=����,Wpy�LMv���n�q�m-x�KG���u��E-E+��@����]c^��|D��@�R�,Ӽ�N\2��U��Ŋ�*�
��vy�4�N���2;�n��Zrfݗm�Y=Zm���4��Z6�)�+�
Qs�D�MH�}
O�H		�k'ɡ�^A��gs�r߳���	�n�\l�^����9��.�+o��i��̀`��4c5�Eݧ
��z�P ����!&g��!���؈��X�d�O���&��ì���V����bu�T+J��6��Nj�k���3/���I��RQۨ���O6K��7B�E,<�/a����o޼�@b�>B7���eW�(L�� ��h�[)j뒵�)����K�Ѧ\��Q9C���Zm0���$���)�vyF�K����>a�7���D/���0+�'J�=����`$6}#a%D�C��))�&J��;0�L+�
�P��^D��Ճ��ͳ��h|��O��.ݳfQ��>@w��D��P��%7�'�λ�`;�!�����v-u'DWy�b�lw��bx���Xlt9.	�H���8���	��$1Bk���kJˌ�ߋ�Û�&���5yP�GĠ=�����N�Y�h�U=
������)�	`����(@�+
�%��N����RS+*!��S�d��ҟ6_j<��C��'���_�W���W��{.=�؄yY3�[�`�U�ʢj���Mt���)ptvp���Gܠ�O��#(U���n��X�>q80��|Cv��2�Wv���vV���mle^B����n�x���3߾�\7��b���Qr���������M*��PP�	�0u��
��:��{K�6e91��{5�f����t��	ئ:2}G���˺���T0�f�*����cP�
�5�h��e��:_�g>�M`�V"��w�
�ӟ2�=Fw3S�Ԋ�pC5CC��`OxT2��n�3���l�:�m��q�$��w�>?]_�6W@|�D$=�ݩ�	!��v�'(_����F�t�k4W"v�V�i,���V�ԝ�v:O��N�?�m< !��G���2}t$e��nd�#R��3�
*aƑ�t
,%�t����;vq���z�QXw����+o#(����`K�x�t���i��Q�׵�W�НOr����b��[d>���ɕ��;�9w��E��cX��Նܰ_�]����&5�;���>�ap��p�`���c�xG�X��ծ��Z�cPӊV�
<:f��A�M#&mHr��
�=՘�}�})�L�/Q$�@�y@&j:�/��S=�Ume`����@�1:�6�4>��`y�f;z\@�P�K��9�d��ӗ*�,�Ȫ�q�/�S��o�7��ޮc^`y�=��q�[�%�Z�iefpW8�6����j�n����*�}h�]��Q�Vd��z������(Y��,C�̕���f9B;�"�!�vs=������g�������㆒̤���
0����1�yO��6���SC�ю��k��=FGS�xged �i�[����2D����;���2Ŕ�L�'���F�ڒ���F`�)T�F���<�
;���Z�Bg��P}�J�fw3:�Q`���ha����e��E��܊XT0rz���x����N���f�D�ϣ8g�����5��`�f�;2�za[�4�U��p+q5
�!�y�Wt:X�����6Z5�ʿ�o
���zȲGp� ��/��C;�m��}���7�_G����m����헣���w���4���Y�(
u~�F;�,�eaJ�l�{,3o,ѵ���B���0L����8�}�����٨�?��w�v>~n��'"g�ו�mJt�{��CÒ���2�NM����vI��5ka^��%4�4���zs���</T�V����YھIx2Z��d��L_X?6i����WۊL~����~���i�l����ń!����I�y��̶�/RJ���jr/И!�0�YMk���`Y��
"��\���,%R?�7$�=��[��̱�Z�Bݢޫ�!����[�l�u��b�&��)�+�f�g������粃9}'S�q��{�JD���Q���S�#_2�1aĀ7���
q?v��K��p��n�B�����y%R����c�2p:u�(1?���4]�s�e�+�s���hb�DV�7r�r���5hi?���M���λC���6�m3�]mdM"v)����`�~�%�[��l���_�2��
�R�i���Ӫc%F,?9�u�9��}�#�Ip,9�m��q��Lh<�;�#3VķǤ�c���rJ���v��̭�9��!�9<V��G�
��";T�$n�T�5�E�#GO"|�����X`[T�J��
�f�6�X��ٸ�g�P� #���c�E��}�n�8Q]�$w���j�y��9�)��ųg�d�q0�&<M�>ڀP*/̡�n�ȴ����UM�~"�{��E�@ˊj��x*�~�{��\Q���z��+=��f�Xt�T'$��N6��@Y�u����[Z�K�s��[@�e80��)�w�{�k�EdLS�3P2S���coހY�hx�a\+`!y�b�w��C%?��)T��iGgW⫊��|�
�?�N�q�o+����vS^<ɇ���V�����?���~�Ug�'�67�SkWWE:�G�)p`Q
��1�v�г)���D�ձﮰ��2�����:
����J�B�X��
�	�`0��`18�!��	�d��&��Ŕ�;o`��4��鿐�<}5�u׸�9?��	�F���)���H�2�V��a9���GF��&9=��sy`-�""�(��=H���!�!N;zf���.��lC;Z�����Y�Y�^s��7��E�cnl���X=Z���S�2D�E7�Vk�Ի�1Ka�n��O�80��0�y�� ��đK�K+�n�z �!�V�W��3⛏����gY":�	�ݫ�l�=�L�
��ml"��|��(�M�k�<'�uŎ0O.�L�Ж���sH�3k�_���^T.��w[��t�j�B08���…��lckgOQ�U�
Ӳ��0��4ˋ�����q��uۏ��!P��N��`qx�D�Pi�Q�d�9\_ �%R�\�T�5Z��`4�-V����������9;��g�`�p��h��xA�dE�tôl�� ��$����a��e���n
gqx��ىH"O���&������B�X"��J�Z���
F��b��Nbsm5�,ݏ�c񧼑��`�8�xq�y�%Id
�Fg0Yl��Eb�T&�R��huz��d���j�;�.����!P�D�1X�@$�)T��d�9\_ �%R�\�T�5Z��`4�-#��������������O��� 0
�#�(4���$2�J�3�,6����"�D*�+�*�F���&��j�;�.�n,�#LQ�U�
Ӳ��0��4ˋ�����q��uۏ�X�\[-��"�
�4DI&W(U�Z��՝t�ǃ'T%YQ5�0-�q=?�8I��(��i���ӱi^�m?��~ޯ�!��H:��'Id
�Fg0Yl��Eb�T&W(Uj�V�7Mf��fw89����{xz}��!A1� )�a9^%YQ5�0-�q=?�8I��(��i�~�yY��8/���A�dE�tôl�� ��$����a��e���%�Z�R�\�T����$��_���n�����$2�J�3�,6����"�D*�+�*�F���&��j�;��0v{���A0�b8AR4�r� J��j�aZ��z~Fq�fyQVu�v�0N�n�q:_������3B0�b8AR4�r� J��j�"<�DUp�%N�[�oA�9;=>k�P�}�4]��+`A"�U�9甚� ���A:�K��Sgи�O�x^-�M�z
� 'Y�ޤ1�����n���6�P��yD�Қp��h�P�¤�q>J�N7�65�l�K��q�
�9�j�.{o_�������
l�0�Z:�v.��O�_��@F'�*�6����/��
�H�$g���O���ռFT���I���U-nitT(KIK{��XSbkڞl��
�P�ҡI�傚H�\�Tj�J�ŏ�AYJ�s������Ri���ԕ�
D�3ͬ�:�0��kRK����9^�{�TQ�0��<RA>Y��
m�~�퉂�ɻ��Bm�U�Ћ�*���n>�Y5���Y�W�%tkw�$����r��"��_�8������݇p��`Gd��^Z��/X��.i���QjMAFZ۝�tJ�w{�!3��I�r��j�Q��V�
�k�8����m%�nW�g/�[<
�!@�c�|֏�G?���($+ER��7۱�Iv�[��b�<=
 ����Cؐ�=iO|m�}p������\�ĞP�~�Ȳ>�[�~sݵ��F2p%zyT7K*P��'�6K�3��\��jn�ֈ�5*�ϩ҅7���0D;f��y�z}s����mRθ
{���\a��1yWu�}t3]��yU^�oڞ^�� �D'���b��~Hw��g�ƛr����/nz�
;[X�}�B9��Ѱ���n�$�E���R�N�Q��$�V�z�O�j2���#{j�aO6���H�C"鍀��� �A}���a@���=��=��60�T픺[��B=�v�o�{M��_K��a&f����G:ʽ��sn�k��/����{O�@��4	��(Gb̍8А���|_��^L#U��<�����Μxo�x����sBW���
�z�m+T�9�ϟL"O�+�����`V%�����v���L���i���,���߼hg��)�g4��B�:�EF
J�/F颱eNU��ݎ;��Tr)��4�2cvu�A�C�B�P�k���<����{~�QŖZK(�>9�N�Q}lv%��ȟ��|�5s��Pڣ�F(놥0/p��ϵ�('̻��{~�>}�$��?0e��4���<0Sc�<nhn܅;*��7ݸc�����6��� �~��t�=�4��`7l{�{$s�(��0�S�FP��'F�u���)���I\���Fz%g�B���|��@��oJ�"��+jsc
V�Z¸�n���d\�{$�0/����!��prh��Yz�8���6�����I����"s
�H�#.�U�I�j�X�޶�|�u�,.��(�D�qx���7W�4
2��̜{��U���Z�V�)�؀��ma�ma�ta�QH�"n�Ѓ�%&R�1���FǪ�'ĭ_�E)��Z*�8N�)��:Hr�<�qM�l���4�����n+�f�	K���3H�)WBs�|j���O��*d�ā��D���̨ L1��8>��=9�����d8#����HƔkfRmAy����F�+�T7fh��Mܢ�^3Ì��9��S!D��`�T�'�� �e9W;�]��T�� ��i�"��N�Q�w���G�	+����&�Lɡ�y`�LC%M�Z��0,�i���F�d��"i��WD�d٤bK�Et���%�1Úf�N#�x��_uY�cؤ�;��|��s@t��9©&W���E�ەN</�
$��rÇc��9�ٌ�p�ם�3�f�LlY�@�'UǙ8|1�vPN��T�_�R�:.L9��Ԥ��$�*ĉ˸_���Ql�	X"�Z�W!�l��ZP���i*�"�;-��gڃ�*����H胸���#D�.�ɎgE�Q2��ϝg��X���y_K��_%-�|H�m]8xT{\q(p��#�!���{JR�
�L5��:`��+W}���5e�,�{���{��6�Hx����U��osݪoc
�\��\ɨ�[������S��t�~�9�;�X���PF���K"5�l�<��*`����\E�s�t�+�,��?�Y�lЮ��0fX��y�
�(mn7�!G���$0���-O�j�m���q_|S��c��' ��x�;��z��|i�[�x�˩S�MbojXL0����GD��bU�P�o�|�O~'}ρ�c���U�Ҋ9�->���Of(�9;	R�����[����(a\��������](���k"~q��ǺR�Kw�82���&���h��N!$�:
s2����"s��q�t%)$1��L��
7����_��
ΐ<�[�T=3�o1�6��/�
*�\���:�k9���h+Q�I7��B���%jőf�>r>\��k�������F���j9��P�E���2�Ӌ��Q�S8�tA����{��Q:���.u�U�+�i�0;;I���Xj{́��/��oXL�ّl��tqa�����o��ѨQ�i�U�<u���h����3����1������N#(��9K��k�x��6���]�4�A
y�BRR��*l�Pi�u`�g��~/��m��c`��ې�=
�2��~���F�K�mk�-��8\"mO6��U�0��H`	�f{��!���~�)�B��JD�<��Sd�Qu[�Up�����)�%0��o��-E�I+q��Vobm��U�å��*gRnT��n�z_?ԧ����B�#���7��eR�*���%}�m{>1k׉��4�J����u�@�y�0p�@�'0s����'K°������uE��Qs���?�ś~`Dݱ����@�����2��Y�~��Ol�U��T�.�)Us�?�3�}kb
Ow��?�
3*x(FOö��'lB� �/nB�9�(ux:33�^`��kб"PZ�%�Ǵz<���(w����ֹ%��"���sj&s4�\�>x9Z��%�K��f�DҒ���ѩ���[��Qf\�V���^�wÔ�b��$�{˞h:��e��*u��U��it�(X7����zj��L��,�h��b�,�\�'�CL�Q���=�rdڭ�����2�j�K��AwC���ܷh&��N�����7@Ƀ�T9�t!�t�z��QM�h�͂!n��G=H�xwa�_�qW�L؍Jzj�
�6�`t���㱊\	m�M�i��I�}�0Q2@�!��e�'};L���=���
���>Y`��t���ֹG*�d�[6
'wf��՝{(����Ut��+�	W/�-�q��8�pA?�A�c�8Z�l��(�ohx!p���܀y.�t؞T���n>b[�b(T�4Y`�$����
A��W�=Zge1�h�F��7����(vJr��8�H]��[D��l��2e&Y��	�E�	L���f.�S4@��£.�@�(�h��
���R%)�P�j�����8H���G�<���yKB���m�w�D���z+"#�w�F0+q�O�h���$Ћt#&hV>���Uz��4��F�^L���5a:3�ap\R��P��J�\��R�Q%���Y?�W,<� �p��/����ь�Gu�2,�M����tn�e�Xz�+�m�����b�\ơ�.U�z%��>���H�@��g����ƾ9֚i���cg�jİ�&���
�f�G9k��7���	P��y6	?tr�F���fV�`BO������bk�v�͇!�?>U��n���}�+��@د�U?P���2p�sr�Z���I��=��/����p�!�3���~-��ڄsnm/�r���z��ׂ��9�6�}�2�~ׇ�_uQ��W�
�@��s�#�V�Spg�%���x<OJ0`�m(�'V�6����/H�
b��W��(8j�rr�	����Q-�un�hպ��yY��?ul�0�k�����#:m�TX'�Ar������܈�����7�'�F���֭�5퉣3�Z�Y�fydIP���ޜ�!]ҿ�������)����e�l�ı�&%秘C��Z���L�d.�L�E$���*"�ט��P�O)kH,�j�8L6%���J'�ʝ�p}�Hܐ�F2:�`�uo\�F�<��~�n�}b�4*2E%�%�mC�V���Pm-�1Y�5':����g��#�|
0��q���?6�?��0�w�IVUFXe�8��,��Q\�+���Q���+�Ɣ����
�1����y�tRO�}�'�r`qξ�������tf�%�DW⍤;]BL|k)��	�$KL�sK��G'C�'�!�Uv�	O��&(r�8v�����[����\J�2#�#�mH�4p�˕1�!���圌��@P��A���q�txB�L�)��,k���o���vá3F�`��+p ��j.W�H-��ؕK�F=���������C���02yj�)�v'Nɲmnny�����`8�S"�2?�B&C�{�.Xk�P�07)��>�1��r�H2k�\<6�8.by�E?�hX� P*�=O�installer/dup-installer/assets/font-awesome/webfonts/fa-brands-400.woff2000064400000214660151336065400022200 0ustar00wOF2�
�XWIyX?FFTM`�j
��$��I6$��D ��[S�qDq�t��x݆�yjfk�0#z�D�Pd4�8�o�����N��3��o�(hfjB�T��4F�(�慵� �N���h�0��Ch�Y딽\��<^Sc�F�`�85ѥuɯ�m�����"B��@��T�,Q���p>"�D�6ڮE�38���1<�l�r��o�*I�8A�SY4��[6pϸʲ���ED���JK+Բ���y��?���\rYl����O��{_aS�{�F����}����>�/bM\
������I��hP��ހ�\9%p�$���
��Ϊ��]��rȈ)�c$xp��{D�Q�'������Y2�}��Ҿ�6�(�%2��D�R�?P:P��R��A��R*
ݚ@Uh�D��O��?`�&nL�:i
p�jh�b�;t���v7�
�r6��w�w���Iܱ���]�$@�
Q<$�$��F�ZV�xi�
m�րB
1���{�>��А��ʒ$T��t�
������\3�9O�!$u���w��~.KWRI.9�����r��)И\�w�-\�Es�~���,�o��r/�$�T5�><��Cϡ���]Z����vG(n0M�M�U@`l�`�@�ڃ�Bqö����h��
3�AUU���g�Er|
��KM��:����[U�����A�rxO��<!�7jq<��',6�8W��
$���Sp�� Y1��L�M+�|c��d�I��ٴ﫤�Uv&�˖i�˶��%[���{
?�tڝ��{l8"�h>�}�վ;�ݶw
�LY2�3l� ؓðg*�Yl�˾�
��c7<D��0�������pE�VP)�J�����QIk(��p���D��f����ْt��m����߮�V@���$����U��%���o�gS��_���\�!��(���}���@I(Y(�P���i��5�����~�OyC �R�!HyF�'I�$��nC�B��v��6�ڢ�2�՜�CM���R�r���P����_g��Aߕ��a�2v�廫�u`�B��]�uXQ�w��#���) ��\�~P
�A)(iJo*�fL���h�/)O���S`k�}���䯝H8�gw�7{�R��m�i�	""�H��[��_�v��P����J��u��A���W���	��m�����e�]�w��ԥ�����v�*�e��+�"��<�=�hg�MB"�0��J ?+[4����r����Ff߾�\]��ϡ���xF[|�n
����	�s3]m��?�q˖�@��l����'�u��#�p��d
43�.`dt,\Jfly�`Ş�'��`�� #�7�jGY��%�5Lm;�j۾��4�ΐ�̼�m�-Y�b�M�vH?����z~�I�^’�����l���|��������_���~����oԝ�6]q׷��}(��;�3.�Q�G�q��p����?aŇ�I��SM=M��3$�fr�1k�Y��	!��t$Ը#�ƍ�SXI���>=�l���+j���`*!#���q:)^:]>6j�>��bz�3ʿ"�[|>��[�}�e+��7v��)�?�~|��J��C�6�5�S�D�yr�q�A3>���ك{
YiI.�M����ӟ��>�Qڭ�!��cߖiڦ*�<��т���p?�/�g���檸<�g�*{�������C���^v7��]ȶ��l5;���e�2_0����&��c�ϐ�@�=����Oߢo����q���c�c>�~"�����?|JAL��R
 I�|�~%�/�gz
�̨��P��ф�]n��b�b�\����bEm8�o/ݓ}�S�nyabg�>�7:+�O�㏼D�|/�K<��<�9�V�]�H���?�	��A�LV�1��~�4ql�벛-a�z$g�ˑ��D���hi����P���ϥg�V���#��ma�	�I�Wf�C@���ؽ���z�t��|T��L�S�il
hܩ�J�Ҧt���^�D��8<��8�\�������h�Z
��uh�LU�o=���.a�Z�i�}E�Jb!1�
�4b��$�}ږͱ!�i�M�p��a�7���ր���"�(�����=�DVV�M��چr3��uYv0.�l=(ʰ
k%�{�[D��|жc�ZS��̈́��G@6�W�8޲�y�
f��%+W����x��l�c��m;�ԓ8:TY"�"v��rN#�&��YV[���1vS�Z"k��l�K�h��L��z�	Yk����x��X��~!��cބ�U"�V�z��	���J�TC%�
bů|֯F"QHQ�/��޶h�� q��Њ�wl7�Cv��U�y��f��	` â���UU�E���ﰅ��ѝlo���|��V�[U��5Mm7H�V��d�'+�$&{���2˺I�T�I���VcI\ �	
ڹy�U������ε�kjtgˡsw]��I�1��K$�H4F�[��@|��(D	vOj�V�X�Q
k�6ӫv�ȶ��\��\#��<�p���Pr�T�T`1�j�*.}g������{2;�7�T"e��
�1p�l2�(�r��@�#����s6�g�]��p߭�~�ߜ�H�n�D�4@�;��$�=����+��~)�z������v�1y!Y�~���(�2"J�Nv66�\��I���S�m���$~{u�a���;}�Z2l���<m�l�FG�w#�뒽h�aߓ��P.~���������,,I�=�8�4�~���>�S�� $�6�D�(��IG���.��I��A��"WʥC7τ��+�D��{�,�l�;�v���קc�9���,�<����1|--A�Ղ�*�ۭ�wֻ��x�>���#�=[��d��u(�ز���`�Ѻ\Y��y�k[Ǽ�W�r�l�\K�n�	@P!� �.���7n�i�N��*QZ'�P��U�2g�����j�ǀR��I�3G�:��.6;'�ZN^ؿ�E$Z��&2%�r�` �q�ʛ5���m����z����k��bO��d�,k��&b��W�A���UN�˔q��[��;�Ptba��(C�/�,i�	�a�l�-���P4e����K_��>~��G5gUB��<��x�*���t���H�S{�ՏZ�w%0�u�b���G�S�V��Cͧ��:�I듞5�v�O�G'b�E�|��>Qq����쏂�9]������S=�*�;)VVlnh�N��E[���z�ٿ�Y4n2��S�w�R�N�>ʤ�}�6����$I_\%Be��	Y.��H(}��{��f31�T+eF����R�r�;����M��-�3����CS��}f��@�}֖�7MW=ĩ��8�)�U��+n@O���Q��ht��^g�
�nO��sB��2�ř�Y	��4�.{-�JꕶC�{⣌Ex}��~`������6�kR��B�A~��!a����F
���<���hf-�E�60�Y��̉�u��\�Z�"nzʐVP�U(9i���!g�D�D�%��b�l��*R�!��`zEu��m��Hg������Ae�Bm6��s&�aZ'P�$	��-���
+��i��h��[��w��|;�|����%��|��,�����)P����u�v;���H>cdw8�G}W���t�ٕ��MU�(���cۨ~B>j�f�"�61p
Q��J���T�`)�9�ŨO}����*�Ü�A�(���b�/\w��X�4�o��T3	�~u��f���Ü����GHJ�KQ`�)Qv��Le���A�@�k4�N�HH���C���et�2J5o�L��j}�"���t�|㝯��~29���<�ن�-uB8]��bߝ��6
a�ps��k��W�5���{����K�&�����������~@僢:��'����vb����v��Z�i���&��;jܫ�O�Fh�@Ǻ�t�Jز|�!N��N~O���(q$閊dZ��X6,�n<�u6W�]��{�Ugq�Ȧ���nI���٧�3��j��bR�-���Ə=��,V��զy�72����AD��;h�h�6���o�
2L�^�C���C/
N����\釞����N�Vy��nQ���^��;;7�x���檧X+
��W�i�'��V�DK��T�ހ��������n,�9�}�.��9Л��d����}�ۙ4+��j�w�pw����D$���6V����� �.	�Ŀ�s̐��79���	�6��[n߄�ixz�}���5����=2����F6�����x8��.�.T�м�# @�S��;L�H�ɖ\Lծb�Ke�1+|��qM���d(���?�U�p����}��	We;���B��њ5%X�.aX���h	�GȻ)ҡՂ�n^�8�@,Հ�R1E�'E�Č�޲b�םq�h�6w�z��%uŶG�F�=���4�u�Y^ :^b�qj�<��E%�ܼDp�T����/�I���Z,���� V>�7�Vr< �L	V>��b��L�-���H���G��Hr�7sX�%�Td�G�k�S���ūB�'$��u�R��� ~��V83�2K�0
�Nrj�7��05�>�N��ë_��ŠZ}62ұ���e����v���}2�'���Z�!��Rb{��'k��t�Q%^��aP�{T=?콍�Rm��J��F�0B�91��Z�E�XP�$L�uM��2�6���-N�؜V,�υc
O�"��#x�E�|�ÒE&
�-�n6x���i��7�'��L�����V�������_��`�[M_����0��A%�Η�}���b�/A���F��I�;���(�@|��������>��ǝ��G����Uh4�$I����o�W�Po��FE�p����3;�n\�7��[��'���!6��{m��W;�4!�7�������v��� �������s��+�+���%����n�8������;?�p����#�ɟ�R&�5t�p������m|t}lx;��j�/Ų�N`oM���)[�r&*��S�a��J(`g���A/��F3FHO���RR��.�h.\�?��k�c,ȗ|{&k@�|�JE3�T�{�=0&�"g[V���
�7>�$��0�V�?p�M��/����3�1�]ZR{�3�f���.a)�dCE���\�9���w��{R��?3L%��M!�73k��V�	�6�G#h/$�7R�v�6�u�B�nbpn����j�S$,5u4nb������R��B`��:�=+�1E���}�|6]�����w�db
;��c�Sl�V��/�^��5�U	��%H��E�*� �����,HQ��'��qƌ�{-3���h~��I(�l@	z8		z�}�\� L	�ɺ�͌�&t]6UȽ9	��aI�&�X&B��A:�3S�^�J	��ɣ���))�ɱ��0��:O�M{����%H�h;6��מ��=���/�8�iS��}ŕ'�).�/�ɉsqVDi���6���k}��<2�1�c�YO�$�r��޳�}��~v&��f�RC�%���!;�MQ�/1ܿ�r�D�HpJ�ʪЪ�x���|�o���� .-o���L>/b�b?�����,���b�aOꝧ��v���>y�"{}. ;]�e�y�_O]�`���v^ݶ��`�:D����w.�K�ڤ��	A�2؇8�Y"�7��J��T�e}H�u$q�����l��b�p[H��־�|�Sﵩ�E�"�us��l�S������#J����p���z;~�tm�\&��;
�ݤ��n)�K[�Ňq�BUM�����$��Ϗ[nB�F�,Χ5(Usb"�&��ˋ���xҾ�o�_e��q Pk�\�:����Q��H����&;�|���q͞{��넊m�R�5�Z�6���?��	@�)��	$�&��wq�:"�bV$}\�2���Hk\��l���^��_�U+���ys���>ȁ��9+�J%��0�n��=gj���W��(H��oo��nw����?�-d�w.o^Tle�f�O��c�/�~rr�W��3 }?��F�I~��C�g�d�p���=K�ޮ������<������V���b��ߙ	��[����4Nݏ���nk�
���F#�.��{�h�p���ލ#0x�LxG�6,=�c[ņ��:٣O��F��tt4Z$b?����g�_�7��ƛ���S;�����<ds���+�
���7��	g1�js���	}��_u_s�8�c��<�-���»�'�V��aF�����ο���`⃁�BG���Uk�s����1��ѥn�
���`ddq'�J�Ǎ�U�����!P��N%̘�;}jh�@�T ���Oz�Ø3wW���?
F��V�,��h+܃Ɏ[1Z�.Aq���%"�^ِ2�y|�diBE�skP��qN�$->.�2��J�L
;�^��R�=�i���,J�/g:��d�]�ʏ&P��?�9
�'8M|<n�sg\�]v�/]^�$���e��-������fAZ�~Mt!)�j~�5�0���t\���{�x�i}�lY�����>3$1}����o����̿R���'����.�"ݥK�,7�v6��dh���]�(1�2pOT�����9��!���֑�}�,H�x!�F��c�~��%V(q�W���H�O����ʂm�f�陡�;�%�ukH��D;�;�c�9(��Gr���9n6�w5�[�t����Xck���v��#Nk�eb�*"�ߦ\Tv��]a�.U��ʜCr
��x�DEXv���>�C���PX��D��o�zY��~/�5G�-�'�S�[4c��80V�s'����R]��������������e�S�ܡ)D���m���_v��yT�.���Ƙ616�s+G�����.��!�-t��������@�Kn�� XQ��@.�x�I8��Hs@��iGTj���D���!-|(��eP�����4��;��)r�/���W�h3���_Zg��r#=�BT��b���.�jd�	�>���(Q�)��,L�4�$��H(4������3"�6������5~�/&>��Y�E:�FR�RV.X��w�Nh-��Ù�f!�3X��@�����ho�|���L�4�`�p�s԰�Q1^�T"�%�C>�
��^@4�3��i,!IEa��	-^��j3��9`�~�A��-�'���
���9p�lF�
��g���B�9q2(�c�SlH#�sh��VE&pm*��7$p�[?�!�}J*R
zһH/��+��Q����A2-4�u���������g�Gkp2�N��i�f����B�V�r�>p��a�����خZ6�M��z3�`���3�$Pr]616˘z'	LmE]�R�f̩�(��֖8.n��ƙ�<��H\ʲ�z�د�;�D�ѝ�Z[������:=�o<8^�'����$1*������|б�@a��|��0�F��ugY�{��V�$>\��*|�i�xj�]a�)��X��߃*�~�)��o�D�S��z���1P�P�i`S�T62�tu3��˿X -i��+`Ųe�����}39
�Yt�%�R�����O_�I�+���ۉ���hT��Ք�������uj��?$�{���\�;�
:���-�1C��v�b�
A�7��e����؊I?������G�d�.��j�����4�����x�Q�bie'�o�Z|���~�i
+A�N-K����H2q�U:�ı���[3����=#���Iţ��ڰ�wQb�)�ic8�%�՞�N���ˏ��MOt���ʽ������u�TWv�Ƴ_ߺOx�K��V�ER�wW׿��]����Tў|�k��9�|i���]b���y�r��9��{�lZљꌏHH��d�]���3rF��DZ^X/���/�OnU���>UR���3��K�jU
�.2�Fd}Wm��'Jҩ�C�![r�3g*&gfX�[�~Ph*!Չ�
��_�ȝ���
��g>���2VjF����=�l�T��+�A�J,m:��^wN;��4)Y����3�Q�%IQ��B@�a�Փx����O��t�"%_ �0�y�ׯ�&�������k��2�A�K_�kcT���-� ���C��=}����XB�_gYX��� �6s
�xNΧ¼�CGt���}\�(���a:$���g�%qC���p��lG�Ybf���0�ag��дp*+���e&+&�x=Ԧ4�17�hv"�Q=�W���[ɴ�V���P��+针<)
��U�<�p
%�Ti��I]��ɨ�ʽ�>�/XEc�B��[�"�m���{k�qp�qb��[pn^��T?�y{<�[$-1ܮB���(n"�d��C�Ԑ�/'��C9�A-)���Ÿ4�z�GZ����i����?�"w�d�:S�^ë����+�/�����S�(A7'{���^ȟ~�W\�z �q��E����G��
�����Nj�`d��h�|�	����v]u�Qw��F���fh=��}���X�l/�ln���Cs��$
W���R5"l�}Җ�C��n2��Ki�dQ}D�dL��닶�T���FRHx�����!ֺ�8��_!�O���W��#��>�M������ǯ3�?s?��/���x�ãz��y�P{�ѕ-B��xx���Y�/h����}8�.Vܕ3H�3���8�˪:�V�hd�e��DD��ҰZm^����l5��Q-�
=����%Љ�5|��ɭ���w�)��vQz�Tn;��8I�s7�Q
	�RR����c8L�4�g�]sئ�e�`P�k]�N>�I�	���v��$K-���4��b��(rl�z�
�n3TR�W��ϡ���%�v���}'({�w��B�:T����[����Ew`�Zˠ��)���滮�o5'�Sm��a��$o|�$�>#l�z�!~8|#;))��2L�闂�<#���[,mp�<������	?Iٍ�q�����/��#��L;B�� ���m%%��eٳ�q�t@?=��{��O��E@�'�?����8$�:��E=�?���;	w���^�����\��om���9������o&(��(��	(�v=ɹ�{3�.����.�
��J�EZH�*�<k���D5�+������:ϥF�UT9�HO؈�qdF%e)��r(����z���$JN�����5R�Yn��Y�5I�~���luuXC�l�l�y�Q2p�f��O�Ћq��W:�!��h��!�w�éA�
g;��(Z����O��U����7_o8��L��D0<�T�5�j�1���4��S��ZN'�?P�j������Y��j���v���£������r.J��b���Ɋb���dzw�q��h)wk�?��xo�'|@Ĝ�B�K�����,�<�V�6��@J��A2
��܃G��+���*6���1Қj�8+8�X$��;��b|�vҗ2��DN�ꈰ:s.��'{_�l��M����e�mأ�^(�X�v����2+w&�r��Pkn1`Մ2��-Qd�쾚�-�l4'���`��2:����X�-��H�p����8;A)��	O��G�5�D�1,��
������ڶ��=l4i��c{Q�&��U��;Ǐz7����P�J����29�{aM���I=6u�͜���8:6%���(|&�)�*F���-��.�XÍ~����]��jM�#0eJ>���$M��SjH~��p
s�]��@�1vA�5\SC��h�^��o�i7�RO+��Y��w;�`<���Y��ҙ��>r�Q��:}8k���O>� >z �Pm�nk
�ܹdž�u��AB΂�\���`:�1�L�^I����\]+�בc��/s�`)��j�B�#|�g#�$F-��gw�1�?zb�;G͘
�3�u�)	Gn��'߶
���&Ns0�z0��pyyi
����ի7�c9�Q�N����,��%��Q���^��^�/_�ҟR+�`b�U�O723j��B-�f�N��Yp'Z��cG~NJѨ��=PU*�>���Ǖ�a�H�I�[H�_^2���u�~T��7�eKM���kb����+�N�k1否?}�>XB����>uv��ᣡ]I洏�gG�Õߨf��������LCÜ/��7uJ�mp"�������DIFP�—K�]DV��8�p��q�j�T�M�k�߄7aό�v�?�����Fy>W~8�pCK���z����
4�I�p4Б��h�m+�k3M�������$W)<���2�a�UIJ�8��/�	��d��|2�5�^��.P�lV�g�g-��cf���WG%��`�T��EQ����G��R���G���@X}X��\@9P�:a#��L�� �wY�C��\�B_�
mR�2Ps2���1�3KxC���YVN�����j��o��Vim��T}���a�:�!8���"���2���W�Owc��j�8�����Y3W�0�X����*uB���~p�&utNM*���2�%���l4�0��Pt>͊����"r��l��u;��o6�o9	�A��
J���*�\��x�S�ݻ�‡7�
�Z)�n�o�~h��Fl����g�-�X݃躀���A����)��3��3�ӎ���O��RI	�i󛛸���9K�D����_�����2�h&%����ۜ0�u�)�T���aL<��t�Y�|+{wv�t!Qʶ���?%sV�|%�o&SU����pP��>x�=���hp�
=�,]��g{�]ʜ��%���]���'����g�$�N�q�M^ڨ��Ԭ���
�h�!�N�L�Z�	@�ZT#�S�\CK�_c>�_�~̏8Β���
1�ƇC��(�A�6�>�ѣ���S�Ì��*�Y�vm%%�ŶL�L3Gщl����U��щ禗DK1��Ճ1�YD�%���A%���ND��?M_ǞD�CX�‚����UǮ3�'\۬\�ߢ�(��%d������6��<=
�'r�0�Lq^���H����k�J6|��ּ���zI�B�c��֌!�G�8��N�1���
�%�1��8ʕd��8�R�\��}RB��k����Te�1wx�)���q�^���b�Q�J�j��b��Y�x�i�q�A��0�N�H�����E]TaH�����xkD���Fz@uF��Se6�y~��z�56f=q��,_r��'�=lN����6�5�lqG�W�
�7�*�/��4�軅/��@��~�Y�˖����z��jD�+���Y��Q->�_��}��l� ���j��ü��jX���g�����E9��'��
w��'鵘S��o��D�Ꮠ�d��2�hta4��̹:�“���x�͜�"?���E~NH�/�S1�D!������嵭2��煜Z0����b}��I�^DE��H�,�J�u�*,W�#_�l�#��$��_tR8�̺;��O>��^{X�?"�g�cE����b�O�O����_����{]+6L�6�/����m���+Q-�E�9i��Lj���Jh/ճ��|2�$j	�Y��B�"�����7�K�C�vx�E*�^$R/�P�K�Žʙ�J+��Xps�)�jQ��Z$mG&Y$;asQ+0$�;��\�A_S�3����x�#�.��,DZ\sE�A�A�_�.l"o]�<��‰��sѵ�q�!��a���Yo�M�Fڣ;�r��b�s!y��_SGG�#ut�s�Y����H�O�B�X��� ,� �0�2���P�`���6�����$[_A��O�g(�n���j�
�ο~݈A}Z�OT�O�͑�J9rz�t[6�(�;�n��|k}����
�6��)|�f�4���T臝���d��NG��$'Y�M��%���x������z6���%�(Ŵ):y�U0	 c��J���7��p�|a���L6l"�
���h`h��]ҢΜD$�n5!��ɚ���`?�F"J��0��Sӹ�~���9Y5m����H��6]e9��7����sJ4rRQ��֦�Zj����P\���a*�
�_�J��H�0�+!��y/w�z`�R/�4f�9z޴FJ�c��/N�� ;���[�W�~�������
Q
9��r��ؼбR��P���:j�f�)�P�N�>�P�oy�*ҡ�YR����⾅FiJ*��<�������h)A�����ܪ�RӸ������;�*�*�(�$ecpE�R�t�)�TP!xJȅA�pD��7��M�o���\�2���Pv�[�&�X�S�4���ç&b�K/����	��x|��_���dv+�uC��d\�aoU����w�6C��s�~�Į����i�|��_��;}BX����M�{�6'������/,�h��G�UN�$i��	�
�dށ߽wF�'bVQ�~ȡ�"���ivjh�����x�w��&�~0��Ii�g��4d,p26��@�����0���/6�J�3���n�}<=�j��Hšc��GZk��oG���4�.�!tQ)q�R��!�]Hx�s'�H�N��q��V
œ�D�ĆUk���GB>��c��Z8ó�����������<�O��K�a���٭E�3l������za$����	���
���u�@���J��F���G�R�q�7\;��py�j��x^�W=�wysfWq�ףb3�[��fʷ��԰�}��i�J�D�3�
�����zy|#U#�YGN��4��#�����p��&0?ݖ�b���+���Y�ҿXor�e�0Ǵ�P�J)��*[6N���.t�2��~5-�_7��yp����'w��']�o��ed�<9���}W�J��"+���&��(�w]~��5]�ZFJ�{��U�#��)��Ù��ϜT#�W��͑��r�~��8/�	�y��έo���87]_+�<�a���H��J�Gy�Y��L?�Ӈ��Z��Uz
k���2��g��Q�"~�jӜ�^?��JYqT��;�K�b>�a
�(���Ȼ�h*X��)��E��j�Bk�Q��:�5��*��L���s��Ү���"<�)��L;]D�,��A�)(��^.[�j���d�5��j��|VDָ�c���c�H�6'���$/ќU(����bU	�x�y�vq�s��?/צ1�O9�7.#N��J�R�8�*lm��6Jah��Ք
C���a��w�h������:�bn~�Eev*��S��%h���)%�⠠8D,�1)�"7P���TSC�&�H*8*�34kr�3�e��BP���}ⵑ���N�B\8�i1�z:���FS4 
&;�ܛD��@2D���"	y��9�Z�Y�J	�iB��.g�Gw�@n�aRg�(&�E!<��ǂmT��- l�*��@��2�Q�'��z�+�~�����ڳ���h�h��~!Eo��_�U(wr+�%Ϧ�M�Tՠ;�zg���5)��F�t��*@�nb�oח����-�d����e�l�p^��Q�f�)����I�o��a���(7�^홿�`�D������+9վ�1�`w��D	j�O��wQ��Ez�E2}t[7*�q�1`������(P"��`D���"�.�%�{qu�1�Wm!��<���q�s�G�����38Q(��`�î\� ��="<)�ůtj�v[1\0��.\��ɵ��Uh�w��b~��CͿ4���ys���ŃCs��b�{G��~�xq0s���o�K��iB�s�$�=t��1a0�>���L+�-BRb�m�2;�o��
~xi�����H*��5�PJ1�Rt#�C<ݵ��ťq'�q�/nI��Rm�KUe?
rd�In��!K��9��
}p�o���Z)��X�K��&�}nt:�Hf������R-y/94[m��B�S��آ�
ǣ�5�K����Ȩ���:��S	&kb.y��%U�3f_���l-�=��3��yFώ��&��G	"T�uz�V�/�z���H�D)��2�Y�F���UΞv����Hg�I���m�����#����C@�hq=	�5�zP��%@�Iܩ���M�($��+�<2��;'r0|Lʄ�4:�\��2.��'�…�0$�8�����@������0��]���c|G����{܄�x�X\Wڼ�-?��V7��Pv�B�.'�"��@*��rt�>�����0��>��ܬt9�%;'+յ�����մJLʄ]���R*��l�sco�&3�E$�͔��R��}�ʨ���0���eS�EZ��2ʕHF�)n�`��S��:�?@�9e$���E�b�sZM��uF���?8
~����]����S`��ڙo�]�кc-B���R���`������J(]$�L�~A�d�tnr����r�7��|���])�/�ɃQxI��|�ˣ0yM ��=���vz��*��؝�k�ymc�Lt�m{�������p޳�	]�Hu>5K=Ȅ��^�Ƨ_���w��u䳣�D,��ث6a<<�Ç��!T�
�.�v:ς��
���J���@{Z{�8t:�
*M�����8ċ��
2�4�@]u8(�a�/���䦥d8�t���������?W�MzӫO�)	��A�#j�՚��vJ0�>&!i�+'�NB�J�|.�sL�@FYǬx������D;U�HG�g�<� Ib�;�6
c��D����R�|_}�"�e��wĉ��O"[���%4X���3��D-����jq��g=�k���2�BV���DX*.�bӤru�Y�P�^K�L�I"���%�Z-:����R�xl�7��X/٪S�$�W��U�?o�s���UT"����b�r�;<���/3�')�Hx�•�BHU�/@і�Ӏ��S����(Rh�9A	�p��y���q�,�� �z_������X$ �D(n�(�(�*��@7��֬������S����8FX~�4���f�g<S�v�kdW�)��AH
�G�\A��
rJ2%��AJ��a%Nu�<|�G�
E>�XR�A������o�-�@	ܻb�ґ���J6�]=�� h�4?��e���
wU;�L-�IN�Z�JYmj �H�PrO���@���h#mJҾ$b���f��U
�-P4*�
0Ĥ��r��f=_9䏄ńիB�y�!Y'&ݧ"Պ�q��]4�U��/%��*
K�4W����t9]��$���Z�t,�r��īB���)Q�&7ul'���K�z��67�R�$���.��8�U	h���X�r��v��n��}k2��M�������CHs�5���x{X�z��3(/��ɺɚfY��lPP�U��с�k-ɥ�:�%��*�K'�oY�g|��a�ߦ��]�x\T��B�8���U�$�L摡Ƀ[�I�|��Y*@+�*��s�=��v���4��X��<`���l�E&4�àթ�֙��]�JBTY2�oU����+��te��2Y�Ԩ6�dahu��C���4���4Q~����
혰h(����Q�$áӫXs�E�|ig�zÓI�ʪ����5�|�4���A��wP�q�&�Kŵ��=�X��l�1D���KT�vNb��n;(�)n�p���&K彖�����G��.���ɣ�K}�<�8�V_�Q=\�]�����6�3��c�zi���^��?sjڵ\]]��c�<���b4cK���X��w3��u�A��Y.���E_{_5"]����i�$�-�d��58m�^�~6�l=���dS��0D?�C�����b49���?0�t8�9����5M�5!8VrZ����)aB��Q�-��<� 8�;�6��%`A�s���޽�^�$n~n�l8�x`(���1��N�t�N���IWi��/�; ���r�J��-�Ww��P6"Dc}8����kD�l�;k�uQI�y[5��s�F^�u
_<�QzU��l�Y��f�ch������$�W͸����	E@>^c�ź�B��is�{�r�c���q�
Ycŋ޳Y�r	��� �2ܐ왘]0�ΰ�ibvEw�j�/J��ǭ3�k?o�yRz@լ����C��v�VcxnyxՓt�g�{��0��.g
[y���[3{9#���ts7,��caFa��3�ʒ��u\xR����_Y(�A	D�
hl�S�j*���=k��y��Ȱ}��l3���o��$صi����	�D���]�ۥ�•�� �@����2�]x6��/��zs�����1Ϡ�b�K�)�1Jdo�ğ��%,��@����Z-�J?l)O{�j��)��e���cy�H{��_�=��������k6w�,�ͽR�0���R��	'(�v��m}
aL�D��x%W���߹an���Yy�A��l��N�(�j�蠭
���9��8n�Q��R�탎E�Z]�p�PF�����? _��gN[il��
͊[�қ�s
_��02	6J���/FR��N�
]}�|M����sd��XJTG8�[�5���t����!\�zT�5�#!o8�n�R���*-_�OڒnR ���o_��DX�TG�f�]F��x�V���c�� s��ٻ}'�Y�}��RL�W���3��{�g1vn�k�/YR���4�\�ᓬ`�ey�~^;:%*03%���>n���xf�j���hto���|؜�-
+O4�2~���3Y�%���<�Nw�J���/���N6�{~|��@E��z���>�V�n�RS	E�S�NN��0����}�EQ»�p��)7�9(��00M=Sx��W��/�,������w��P�5ӳ�V�W*�.�"8vt�Ph?5���Vk�	/�X�7SU\K��4M�^�T-@t�8�/�Ds�Y����`��Ż�P��ﶶ��i^�|����I�s��+�D�-�\��yv��09^&��4��se|���iS��z����������˺9*D���EZ����H�%������<T��� Pk�j�����Ҁ���)?,[�e�����Ojc�j���i�`F�D�IH�**V@�׸S𛼻 y�^����Z`�c��E~e�9�2ʎp.\�P�ož
"�r�`e��c#]��26]g�Y�����~x�^ͷ��v�F�k'�}ؽ|��������i�(�|��~�'��vt}-�z��Vy��GY%�d��!&��lp�
�ݭה�ڬ��^�E}Wf�>])���|p:,����f!L}�Y���k�������lp����<U|%/Z)�ɔ@#sW�*Ru��t�
MMK����E��RSo��%�4�h��<NW'�Wt%F�����8�}'��1~�5��O�|���/��No���8˪����U=;���<8�F�ѽ~�:Sy�w8QV�T��4:�2�mv�Am
�:0��u��>�W)+�fu\di�Xp�d֒��l���$n�A�x<u��fǛ���t0bMU�������P\�,ര�>���$p~<J�+
��ķCG���\2!����E�;X��h�M�8i��U�P�c��pcL��ð�9ut�c��&�G_���q8�/� :�*��|Y�;1�0�v�U\���=\���[[媳GUkk���*��-��"-7y���6	k6\||q�h�ܬ�'װ����Nǁ��I�$C�T�(B�Uo��{щ��n�bߣ{�<oT���hU��V��ع�V�I}�Щ��]���M�&E|�����?�B[�y;���
��i��|)���o�G��aox�$��8���,���!�3P�\E��/��8
-�s��I�����.��c2Ҍ�v�i����>�+w�~�RJ������D��5c5��,+�	3��)�v���]�df�v3a�6�ؾ�.���ߠo��=�枰�?����I	����]!+F��c����*\EUZ�d�pU
l��9��Y��� �%]��*�a���vb�������A�q\Hrg.�?�8%Kε>�X�l9�)�O���G·�ӗ
_��b��7�ՠwne����ށp{ό�"k��j%�z����z��f�ͫ��WK��h��”-ɐ��4;��%�M�d�g��c�R&2~�e�d�)���#��*	*�	�Rȵx���:K��i**ٝ�g݌M��]�(!��y8��7y�_���G����U>p�a�$��zj%KQ�Ւ-����]�&}ir��R��<��v'���iϞ���3�����`�J��׏�!P"j?���u�UkU�>���P�'�7Nf�l��H�@|�xT;���a�=e.Vq7��{�[JT�� -<��I�GM%��S��4����M�;[nFt����@Qi��P��n��7>׍7�5��f��m��F�
�+T��Kpe[�Ww����͜x��^���'|�s�T��mf���w9�Xc�����~�\���*�<�7�KP+<����V@^Jo���WzqD'����R�<Y���}�a�S���1��2A�*�[���6(^`�H�"�R�%z`�C�$�do}��'��q��y�QG���p���럻�爇��|�_ŘZƎܭ&&�&4�!�@��傽��
��ș�i���<��eb8��������f��֬�.�n.Q�w��1k���r�5�wq���U��q���X���c�e�?"4��t�
���	6ӑ2��</UO�	��$l�4��C��RT�c�v�;���R�M��1n�Š0'Ts�E 
��ۅQʎ�%TEOt��2��s�#�3�2�S���`v��&�����e�R�@��N�,Ͱ7m��:�2*��-?bӢa)�$IHZ�.F�9�b��+,��X�?���fX�&���]۟=ȏ�1��JG�f���\�7����z���$�p�{g��{�<F�9�
v8`�B^�<"�HH�J�aW���g�E��B�gC�B3G�-�����!GC���G�2�9ҭ�Ʊ�Q�(��	�/_C1T�(I�w��9Y0'���_C$�Y�8Z����rp�_kP4n@F����A�V�E�_�Q9�/f&Cz_�ZR
�~��xM�(�=��ohIT��%bkI
�E�Lb��-��'�Hl��_����q��Y�c���t���Bq�M���_>5ʏs��-�(��=��`�,��#Ϧ�bAKKP|w�8���t�q�?`����i�Y{���2�*@k�7����h�"��J��i���N�T�Tf^4�z��K����7;�
��Ū��I�6�*<E6��T*��ww�l���N�❠͢=՟��J��C^\΂R�Q ޝnN����ԇ��ų��si^�L<��kdɐ���9g�_�?t
�@�������`���j�<E8ia�������j�㘚�<�ir«~Oӭ��Z�S)eLhV�Q#�W���Q�<ʯM��q����%N᠋�h�kQx�{�
�+�͍�~	��8���JƧ�	�@q n���	��r	H��M��J��V\U
t��A�J�kA�^�>��˲�M?zV�&�*��YknR�e�mw���i�Ͳ6L>�`k
��LE���,�q�zR�
��:p?��P��בֿ)�d�C�]b���k�T� �3�شk��(�Nq=Y���dj�:d��Xi���6k�>ON���Y:cRD)�G�C�TÁc<ē��!L�ȭ{H [��va���>:>c0A}�x$�/N���N^�+���h��+߮h^�-�
�~-	�e��z�?�[�g��X3�=�u�ۺ
)�5�G�H�q���T�Z�8���-Ox��V.rS�t
f<B%���ǂ5
��켖ʴ3��;[!{�Cʹ��qnJ�j���z�Y�����TḝO�`+�.��N��8�S)�#�w���e�n��*�gg m�0��<_�(r]��:�	0�������IZٕ Q��Z���ReT
��2KIG�1@��c�m�Ƿ��L"�p��y�3���.э%�oOQ�7�zC=�,�MF�@������!6��Qx��r�SFi 3�;������zz�#���kuu�r}2п��5��&�X�Nkԡ-��J��aT�z�
�ߣv��㺭l��N��A��I�H�L#
��N��-˹�w7��g��Ue[71��Y����o���J�U3WZ��|w �對1q�F|�J|.Sa��9p4=���x�1��dO�wZ͉֨�������tA�0�z�?;���h�m���
�I<ƀy��$SLiM���o)4\YI��g媔2|�MWBQ�r�ϷB��N�����!gg�o�U�~��#wbt���#�緺^�C�D.�'D���GȄ��8���b��C�-�0<��cN��W0��J�P������X�8lȹ��l�R�iul�'	@�2�L�[�'���0��"�{/�H��
�O\�
�U6׮`��]Og�g��P�KD^��E���h��&U`��P9Yᦞ�g���N�hP٘��~�`h��=�]�=�2���;)gJC����� ZU/G\����_3���r���Ѣ�KW�j��t�ڇS���k�{Y�'%Î�����R�桟��}���̧�4�	̯b��oy�����%�Za�ay�oI� Q�ĵj�����j֢\~g	%��X�6�ԅ?�J��"�R�p�0��)FCV$7�:�������i�&�ٿy:�Y,�s�I?Hѩڊ�:�@��R-�-=�� h1!e�9\l�-�~o��I3Eg=�$����C2�I�֘Bט�K�N��C��|���#����_��a{yn����Q�G+pv�dn���9Q\����'����*�Q�6�\��{Ns��`�F�<�1�|��ݝ �{��^�Ds���i�{��_��iC���9�<���Khm_�]�
/br��e������_��n�J�{8�Vm������㧻Of��|���R����L
*��o������e��"�%_cw��VU����Y1l�f�1�R��/��)Z�Ò��K�'E�+'���iZ���3�Š���Y 9
�w����Z(<���� ��0�y��~�Z�~A&v����	����;�j'L%7R�8�N}��7{�\�
N9�pg3�Ҍ�}Wg/*Te_Q����y"\KUpU����	�dM��r��4,��k��r��.��tp>j�&)�ٰ�q�dQ��n�ߺ��	�Ђ�07{��W��V��c���|���ɘu��EW�o�u�UR�*�i/@� M�6�/�Bȧ��U���x8�;F��G��CI�+���ʂ�퐯�&��+?б|��K�'$,���E�T�f�����,1g�6�t̆���-�oa��7�[},v���Ψ��	���[7�@��`��܄����w�r�[ݴc�E��_�o:� 3!zb�1D��	"���Yڒ+6M]G�T�i�o2���`�Y8����-�fn�O+)9۸�E���2�aAv��3��������Z%�߽�|Vd�#�&Vu��́��e�ٰ�73�J���i�Q�W�+?�f��"�)�]QL�N:z�g;d�?�#�9J�A��2���=|n
�ް8^T_v熂D5Uua��/�W��,�G��\����	�n�]፶.=���LS[������-���������B8q�ɺ�h��X���e���?�
�~m�(h�N����1%t�x���͐m�E[�����>��"}fF8ܪ���U��Z�l�@��}-i*jX����ޙ�m��a���hN���ſ	V
�]#]')����<�Ǭ��mc^.IX�>����BWǎ�Z����~��@亨ȼ�
����y�$�z6��-�����Hí�"&������Ϭ%��+�ҟDL(eE˟)|dR�)�����Tp}�����/�f��ą�s�֥n\1�֪޾y�GYY6x����c�?��U�<Bߕ߁�]8�c[�����f�p�ъ����3�)ș�Ss%�q���F��srmDܵ�w�9�Y�ul����nE�GW�o�[��v����^9q7{,���� �̊��Ml�A� �HŢ�-��c��¥��Y���~Œd"��<�&>���s�v�䧻T�`���nd�]�P��,m�a�
6�%@�m���7n;b��a�I��v��L����dc���u��?YYm6������OO��hyOsܿ�^�9M��7Ν�g4@���kW�<����s�?]�dj��?~��I�Z�
�$�M��)G�r��`0uH��7�
$�sxVrF�d(�U	n#h��HC&�̟�c��M�J$���G+�EJX9�*�Xy�Y�O�
\x�]�z0Z�2˨�et�)�&�:�J�	�j�ER)�20�6ۓ}Y��
�g4�B��}�
�!Ɍ�0a[7l�I���6����,��=?��$�4��	`��?y=Z������a�@6�$�sɰ�=����\���:�-+��m��k*��ao_듭���Ҽd�<�@�%V���f	��"�ȏ�!aO���9U�-�C�Ӳ]�gE֍��e6e}BkZ,lI�(h����f^\pK�6�2\���05B�8�ܩ\���\�b���Y�1iȪM����S���V䤋�
�5h!��!.�Y�/_�`![��Gt�cr�-��)OT�d%��e >5eZ,��q�}\/z���ʏy�2���.�%J&Jci��4�B�D)��9�.zB�Z<�$q���p����rV��ҷ�¦0��MQ�8��
�9�N�8�h�^��ڠ
1Wc�G�Aȕ�3�WPm�Uc���4&͏Ъ�
�p�F=@gM'�Z ��AQ�A^�ĺ�# ]pҨ�
�5�w���v�,lZ8gw,���
�U�����إ������>��5Fc�0?=ӟ�ѭ;���“��i�&�ƥ���r) m�;����0�vf��>�4/��B
|!�s�te��K/���g����ߟ[~ż�-��18n�E/9֒����������@SO�׊`n(س�A��19JH�,j�h@Ӑ�h����\�lJ���3a�Ͱ��H^t��x�]�'�y��?Ɵ�:j�
gn�d;W�†���/7�8��k�s���Bi��5���i��x�`��)ד��]���ő�/�b\��%c����1��*4}��_5-�����.��˹YUw#�)禌qUY=7��ѢE2����`��õH�'@��f��W[��j/�eQ��:������Qj����l�%�4��Y����,)�n�[)U�[�N��~m�#�I�
�c�(P3n3\���$k`;q3�t�̉M�����Ǩ�ᄏ�Q:�А�v���M1Ȗ{/����*��5M�����A�+�8u�!?���wST$r:.y	�]Ǝr��4J(*���6h�_/�����j�8�ɔ�q��
�m�����_��>��������S��/-|�\3'7O]nci�A'ym(z��<�#	{�Vw{Ng8hS��Ȉ#6�hfU�Ҭ��ϻ����P�n�p4KT��X�d�G���qB��H��_sH���.N����tR��%��Ǭ��l	���-峐y��S�{�-�jFN�R�r�Jt�`��e���N��q�m�~���~�Lø�LW��\�0a4z��;G��S����ذ��8P0�OqL1�3�g/�uS�N�$L�q�ϷgF��:����ݶh���;W��ډ>ۓ�&���Q6P����)|�g�����2L�٫D#Ï��OO�\�����7�~l=_ARG����0md�΋ W��
�d�t.�"��%��e����5�G5���k�Ƣ~�ɲ�h)W�Vo|JX�>YYi4��1��q>�^ �����	�	s>٭s�T���P�G|�����[5��p`��/�@�5�� �X"n�z(i\��:	��Ɩ���T�2����
�H������:�,J�'ɼ��@�O�����5�#��6��>�D��<G�/h.Ђ��*�i+��Ʒ��)�-��[pR��װS��I��{�W™<&"�0�!��d�P�:*��*)��+zkM�Ԡ�I.Si]��*3Е�|A&�k�Q�?�yꬌ-�]�����/*�4�ǐ���ݬi7�Y��h�fy�Ǯq�n�r��+����<�9ql4k�����������N����e�����S
���H�;�P�Q\*=��ΏDv�n��#[���!��,e6�=W#psd���>W+=�Y��6��?�ڠ��|^��o^!J6�c=��	�fR�<5�U�E�t���dC+vQ���E�@V�3���N���np���b����%�g��ܽ��Xg,��V����f(9�8�AU;�oJx)��"/22�s��&�/��5kQtƢ���Z�L���h Ɇ'�xD�S�o�l�
^�5��Q1��a#$���w��-�oܪ:!�+yUF�k~9@�~��Bo������8c�1a�ı~���ǘ�KK�J`߅�Q}��)�W.;�� �K�:я�����(w|3\9w�"(�;ê�-�/&u.�����n�Ī��pn x���I�%N�/��Y�-���:q�T$�R��Ś1S��Tڰb
Ff0,`�����"�Xf���&����� o媐��aخ�/`��&�?4�N0~��i"@ڢ�P�2-8s���S[s�!�ɴ���cTQ(Rx�Ĩ���]�3Ms^��
���H��-��Ti�:�ȉO�inϏ����Ib�ɇ������:��5�L��Y�	��[�	r%"D'�L���G`$��I�a=J��bCn�B�Q�é�����sl���E�=0֢��i���^�l�d��t&��U�+�h�8���:]M��ë�OS�yT5��ל��n�yIU� h�R��qC;{��]M�
$N[�lӎ}Ұ�@�1AT���.O(*8��J�(�D��z�b���)�����@*�4�h�ЂŊ`����@_��(��	?[1g�i��|��o�.�V��1�hւ�^juyB�k�0����Q�"�mC�\��Qd[�Ζ���f�����<
���tSoH*��`�L�1)�.Y�T�������<������pj\��~�_�VI�|���K�K8-3���.���U�)ۋM��������r%:�Cu*��%�.0w\�Q@'F\�
=OƱ;�0��&n����fY���iG	/`�#[�#�e���Ø�'��f�p
	%�s�j�V��T�}6X*@��p&3�-�I��bΌ@3~���1���	�H�H�ҴR���M�ǔo���Z�"�FnAu, �	—�?W�5�S%Ľ�F��r=ʗ�6�W�~T�U�!W^<�i�r��+�pt�	ݑ�g���a(�XqD(m�b��W}������Bd�T��Z)0�����1��r�u���\�,7��HIk%c鐭�|`,z�:�Wh�R	x�t��S� �C��� :N
�9��4�'P�6L�t�|���(Q�O���U�AxݗƵ|I���0$������4Q/6������WW��փL��^*���D�+��A�,�` x��avlDƽS���9����}��Tuj �M
�m�
Ys��;?��x���uW��S�C�8<7)��j��7�,L���ɂ�WsĶ� v8$zo���]3�8TiM'`���'���CԼ*�8mI�q����Q��9�CGeJcL?�"n�X�+f#��gVR�j�P[��L�`(�E�aK�n��T:����$���°8�!�Ő:i�#�R3�g�!7;`���Zh�П@���L�ָ�1�����`*l��������J0���'#���`e)�N�pc�W�C�p�>@�&yo��*����)•-��]v��̹�(8�!Sӯ�S�Px�;�hٙ�R����+����Q������7��OCT��ig�[�*=^��h�#S:V�D,�#�U�r�����d�G[E;�'M���v�}z���ƺZ7Z��s���k�E+P�3��2tXpvV�
M�k�p�}��+�O�Ws��	��ܿ�\b/�#�t��g��R�g�V��s;�칹T+K2��Qg�
��-�F�?ԋ����]�&��j��CU;>� k�mux5|��7���x!�6�7swX��o�M�ɾCu~y�ȭו``0�R�;1��rL��ʥO���k�ҝ�"�r&����rUNr��b5ۚ�]�G��U��4o'�ƒ�-=J��q�7�.�֚|��y�’���X�H'Uͦ���N���*���Y_�CX�H�@����"d	'e�n~z��C�'�?�̪4#Hג���l�1|4|��@��Z�6���fJ�Pp��3�.�~��4�i1��sC(}�������a��A�d��+n�
AkXu�e�Z����
�=��u�M3j��YUi�k�I�[���N^U�#Z�������	*�!���;�uvd������O}c��)M��04�~��pPQ�Y�8ǹ�+��)�9Ԭ�B͈79�aJxa�ҹŸ-n��@Z�$wh�
~�ۛ�Sw��L�)F�k����u�C]N�d��?��8��4 <)�h[Xo��H�~��:�����n�im��N�r#;�{'�a�$�|�>5f��;�<�I㕼��Dpٕw�8\8J�k���|y�����ۈ]A'�y�"�p%a�ԊW<��@?�ĉ4���暑B��dI���XCtf�y���[�LKx�d���p�J��5��3D�(�s��C�!�X^ߺ���:}��O���}W8[�e)q3�iu%��_��H���|����"�-�8J�plh@��Ę��{�@�����P�կ�'&���i�a���]�X��1��dF+��~Q1��u���/��V��cԏǖ3�����������^NL���DOɫz �A��$x��):)d�t�$�/\�W��k��a�R��qXe>7�M��t���Oh�tR\���M�u�S�+������[Z�2��Ͱ���D�XWjCp�>
�*.&�]*� Oc#'>���j�:���m�q,�է7���"�bJIt�Q$3p��c��wĭ��Q|g��b�@P,-ۼ³7�n�w7W��l}��N��BT�ɤ"��C;_��[Xp�;{��2A2�֦��)�!�#�D�����Ĉ��NА�P�jYc41��")F�E���d���B)v�BA�]���d6)Ճ0��
ޞ�E���/��6JU�!0&iX�(V[-H�_樨j��.�a�
�e��|�ĕ��qԆG�|�G)��:�#[��jG��7�Xݶ��(�	�� �;�'׷w7���E/�Z�.��u0����4�E|E�	[��l:(�Ф�����G���k�"�OF�SЦ:R�2yw�do��|VX��lfO���`�t�<��eTQ��TOk7�|�����w&t�c	@#��3�\�Ձw���K�/]]+�;;��q)�tb�b�ԣ���£+/�N.Wa�(]=p�gDQԕ{-.U��N�a4p�C��޽������C���q���!4QZ7�w#!�4hU�]G�o�L�-��ӯ5� �:$e�ŕ���:b���^Rև��6���YNS�=�7�/+���IV�=x|��.XL/�.�B)������;�@����)���9�>/C���R1��p��x�B2�hLu�G$�0�c�A���^N��x�&�4��Tj�Ѓn#z�2�0��tN�/���Ƿ��dnɨ��tB�Ֆ�C��%�?���0?|᭠��O��+��Rw��,6��d�X���;oM�%bǩ�냃e��zA��1^>��r��IT�Q&J��7���	�J���x�\��Cziq'U�.��;h�iA���5'��F�A�"�����y�eH��*�;�VX7c���g��bb��G�^��������,�d�'����h9=#���XaH�����0M�!��z<���J$�U�֤�eD�/�$n�F/���5�f�m��^ԇ|��.��?|�[v�~>8:y&�6��Y(�l�!��Jvg�P��	5�n���bWJ�1X�A�v-�e2 Q�4~-�ظ���(S�ŕ��m���d"rzc���c���7�����t��O�~~�R�v�%�h� 2��:˷���,��
�jb�D�XZ���vUL��K�NM�����ѵZ����N�L*G�������m��bEg#ҝ���H��"4�CP�B�n����Y�,5oW���+A����*��[f�N����'���_^j�����E��Y�#�Ƹ��H�}YE��r�Њ}�h���>lz����
�ھ�<&�U�!h=k�#․�kc翤�iMf�/N9E�?̇���j��s�����(���]�k�eɎ�����gT��}�i�6�&5��\��0H=n0(��m���<WS� �gxStU�ٹ>Y^P��Z�ɊYbp�O!���
Vj�#�H�7�QT��FMo<߱�#(ȸ��ǹ/��o
����qx��Q��	�YeZC�ϗ����*�o���J����*�ETQا�O4u�0��2(T|�#��/�坒i��㗖FL{���M������P���vP-�P�0i$������3ɇ^�@u��N�9��b<�qd�|�Hk��G��X𹛐$�G�*A��`$I��IN
I��>Oͻ�*���Yץ�6��65�ot5�*��{�� �ORBO�"��}�t2CO�kX��U��7-��mB�	U�F��0��33`�[`;�`"d��>q������V���V�1�/L�z�A�O{5�L$,|�l\BP
�[4.���P�1�(�[7�L(�I7�Eグ��`��Sz\j���j,0�<�ZA�$���{�~X:�s��u���P��[�}O���g=�'�{./_���i
L&��5&rX�����_���l=a!�o6[�p�qp�W-��-���ޅˏ�M�n�`:��+��n�����B���H0�Ό�Hɲ���?KQ�+xS�z��ޢv=!���Cawp}�.ע��C�\����u�h�:��+�jCY��-Hl4xr����I����c�>TeTQ�4f�@z���2b{������k��;H��hρ]:	�V�4��~�:�2��)��;�.�I� �&����L�=e��z��H��'����j�r8��E�x;�o���z痛M���������^�Ajb�Ȋ��~�&�l��z�"�z��A&�~�oR�ϑk$R�Z���eH`��k�.�Φ�0|NecX9����Xi��
����M/�-�Z�D�؁�86ƩX
ؿ�?���LU��+�"蠭{w�>�täǍ�F����f#�O��@��-~�?F�v��R���.6B��G��'�Ӽ��U�Hp,��ĝ��;<!�B���_(GS��^���T�Py(?���+>߄Y����{�~��K�C:�i�j��h��KRN���Ŭ� y�n���������/`8�1Qej\�*�$��DO�g�zN3��ƻ�)"XCH��t�q�2���e7%9}f��'��G��4�����*fG��u���~����J w` qN�}4@��7��7�`���q�o�k�t�_Ϥh|��؜E�\��R��1��_�c2(�K
�&%W�s�b
�=j!Ա�f#ٓKqK>���/^Kλg!8���C�
��_q��NmkKe�E�t����+$�iX��Nē
_�,�<P�UY��
J/��k4o��?����47OJ?<@�
4qr`:$�*��
��d`zI���Ql�Nx:�`f�?�ˈD�[]>����F@���I�Ǵ�6���t�	�,�����6���6��4�ӓ��X~RcaEn��Ll0'y����q\�W�c�C��:��
��1���ܪ{˲m��(���L�<p	NW�TV°=G��0H�tT�{�	��
}�IJ0➱��4L� G��Z��"JP�yv3̀ea=��0.�Kv,g�8lH���%�x�Za����w�T�3|�Lp���F�N���O[�K�����όE��l��3%�%�U;�f����?��+��PzF�)�|���;=�g(:�b';'=B,Y��\���Q�/D:�l����)��X�^Kp_sgN�B]����{I��C�+̯=|T�Us���`����G�z���81C�ۉgV/��X{v<�D"#�:�I���_�ZqRz!-��M���4#-3k� M藺8uQ��BN��؋�n邵^���ӌe�+��hž�Բ1b�s�s�OQ䖡i�7?�+�	r'2**����Z��M
s���7�%� ��3�g�ɡ����  OVRʃ�.ae�"�J��g�-�yC=��
��`t���?-���NZ����.M��� �(Ně��B;���~��ziPhH����2��v7`q�ɩ�4�UdqK�69��5�d�_�%H����bun���f���c����?����=�/F��ӷ3h�e�g��'j�������S��30���b0~�R���cf�AZ�
�J{�7f����VLV_�丯���aZ�X�-�<yH}p����}T�+�%�(�D�1p�Éʔ&��b�l�j/�3���9��-p2l1�,�X�T�w,�I<F�O����}w;��/h~���=�z�l��H���X�<#�(g�8�6R%�ߕxߌ�а�0o��yALh�Se)��q�Fp��mm�b�=�=<zTc���P� �ANUc1S����q$�F���#�N|��I�^�A�S���h4D�mi��f��)A�"�MQ~�Hpx,��!`�S`X��q��5�h���$�R�}dd;�A��Ɉ�;i�sR�G�}Ҥ/���ݒ��o=/zn��d��uZO�M.�<�d��ZL�U�=�d6���YQsnœt�*b�L:.�k/���1�-���Ki��hw�<��s{0t?��8�V��.���u��!Q=�=(l�h�ϫgc��ޭ��/��H���~�e\d}]}�u�J��Z�;���l)%䇀�ݙI�$���F�Ó5�=C�!	��/|Ռ�P(��,=c��Ժ�^"V�3���f�
�@:�%B���CQ�a�����$�y�2����9����d�gh����q�}&�אe���a�.��D�_O?B *~bK6עL�+OLl�q�y�̽[�I���v��l���~2�z���7&�=,�zɔ��:���Rg2�R�'��RNb.��r7��u����W�N�SFy.���`��ls_X\<,�އ�����KMy ͙"r���W��tNu߸ 3�Au�UO£�������O�(.�����V~�
��}�F�\�b�ko{�p��Œ�M��u��k����5dh�%��|<���b���E>�K�����#Zȕ�����b�â�CCMIM6-�p`!��O��^��y
{|��Ȣ���[n��H����Z�UEf��
��z�B�F�h�i��%�7�`���cc�ќ�S�J�S��…�1�mJeiB��ͪ�����S�&�v���¥���R�4a��9]/��f�F�L嚗b���	7���V~��I���t�{nΈ2d���4A9ib��,�Ib$2(��tkXc<P��s�V1�d}�t�1�z��� �uS�����$�f6/Y��0�R��)�%���(�Q
Y��<ڿM�8�ό�#`�)
%a.3�}�3@TQ�����g�\�777gWEZ�⻾��"0��K(s�S(�fen�h���"�)E�e�E��S�(5<P|"�͂
���"��"$��k�6����g�J2/��uֺ��Ѕ,ʮ�l	�|j�a�ƹ��Iq[�dFұ&�c�82��Ș/�V��]�Դm������D��I�Sߺ��}yo�ϸ�u��p��
�r�����4ʧ�r<���|tpK�+@Ljn
�'1{^Κue���$Rm�����Ԛ@C��E�s�ƍa��QhUl\0��1���[�ۖ���S����x͝�M��zJ�bK&�x���굊G��D��u���G�7�)�T[V�M�]({M�S���J�GYT�'��X����U����7����Т�&�b+[���n��������:.O�����~w����┽�Ƿg����!�wC&�+�ʕͻ��5���-�����s���"h=��Ќ�B�KF�c�,yfhq��+�����rӏ�X���Z�&����	W��ca�H&�)z{�^|�n��fC.���a&��)ӀG�':c� �яe�g\x�`ԏ����?&�-�p_��j�P�k
���w�cf���e?0��f~��B������iV���N�ujZ��V4.�1�Q���cQY~��$�5���mѓ1�ޯ>\���̰��$�Ux�:M�R��bw:C�1�/D�8'�8���*s�CC:<�PF����9ȸ8�
��p�����5�>*�U����v���23����gh��7��Q%��f��N"�J�П�7_��^Jp�B��d�ō�R�I�.C�? yU�,%��p}��%��R�I��B��1�o�g@�BW��f\�T"Q��
OB�DP�mx�Qq��`��2"�GTԙ���;JǍ��bN*�˓�{{儀�����'6��j�b�Zǔ8hϪ�?�t�C��B�7��8I�Zp9.���v�l��xs'6���%��~�9q.0�FOk/!C�/�9����Ngb��Q��tr�����'�,:�kC��^�p��AGrV��د���?+�Y�eQ�Y�>g4ݖ�ܒLm�"�o"�\4�5�&�I��VT��
�C���
�V�Rkժ]"ˍF�o��Tyل�RmL&�P,a�Ѕ%�Щ�I�h.�2��w�u��fmf��R�Rή��	Ǐ�"�'��d���f
P.�IonN�
���~���
魾���b�k`��J��v��*�J"��C�R�y�<ƹ���Ƽ�]W3i|��
�`c�BЪM�|�=X%|�5#"+C�J�ߙ1��-sEY�����£�C�I�[���n�9�TOC��D�{F
D����/	%��u�!!����d��B#���SL�1P�>��k��_G,6�R��w��EO܄X�[�52N�R�^/
F�ȩ��v��c6���*n�/f":QjGF`y�u��{���su�z���qe�fE����(�N��.�Lv���*���2|�1�`�TH"^��*M��A���<��"jʘ�E��8�T�QTDT���'m�rJ�U6� �A8@����
�0��ח��7M��MG���L�Vz��=%:D-2��f[���#e�)5lj���X�|�JYk�j�N�8l6�Vi\c��R�Q�#���7]��>�+���t�ơ��6�[���hqOO�xc�s~�����=�[�Vb�T�c�4�����!�]��vO�4�$�
ԯ�{��P5��L)_O�.� �WV�_m��+�@�wEXV˰��
�G�q��d�a�
J����4��GqQ�Q�%BJ�X��2�i�T��2��QR���5�d����Rަ�_(�n H�e��f[��VMRT�HC1dezv2-y����O����o��̟RJ�"1�p(���1�މ�8ѬJ����+�y�l�wi�r�Q�m&�Yo�K^$w�����^���)F.&,�"y
��Ke��<�A��C���)n�.�$�hc-���)ɓ�х��h�E
�����G	3ڠΪ�	�A���H��c:��=�*
�}.q��#�����i����i��3ԺO��R�9Ht%�.v�9�E���5yg�=*��niF���a[[!U:��*,����aK�Zm���ط���iC�+�1��`�A�f�>��7u��tk����&Ϩo��XhU��ɳ8G#U��.>r�h��la��+�B]A�q�X�?%��f�X�Մ��Z�:�9����~��_����%��*�����/��-6�5��~`w��XL�;�5�}�����u�F)�e��s).����#�s�
�!� �`[D�,���#
v�9t����p)���˓��������Z۽�V��<�A���8'u��sL���\���6s�TR{=Dl��
1LyDڪ#�FNc~HV�Ð���ˠ���}�1�P�,�09�-q�e#����n�FrX)B9��/K]^�7.���
k�X�E�ǘԣ*�� ϳ�Cq���s��"���\�3�L��RxA
z��j���
�²�_J�8��=n�
ͬ��F3ul�^�<L�N�Y�!A�m�arqp��
�1�f��>qd�z��J����cJ�Y,W �S�?���g�XhL����F��7"�8�N���DJ=��GL�O�7ݻN'z��&����������%��"�h����Ӡ܃pK���;�z���c]nf�/��M�&<Vն��`Ws����*��
e �v�gFEc�-/;$į'�K��($���<"�0$�g�����D���4"���:..a���CW�%U(�X�DA��,b&e�?����Pܻ���E�h���Ҁ
�f\
�]e�f|�\P�Fa�mZ�w/��g�o-fn�|
<��^�Fx�K7d�yuF5�.���w���<Ҹa��E��Ȱ�Zm�����(�DN!�`_D6��U�@�8�xD��b�DX�$� QS1�*��ݧ���R1*����
ԚE�G!��^	��m�@EeQ&��C#�ʽI���$WF6�m��5�}�ma	cJ�NԎ1���!}����.9@�551�HXc�^V
9�$��IS����Q�����u�ل8�)3�H��t�³��%��@l���I��$��M����ů����z�����tw�p'fK�M/+��]/jhLխ^['Z)e{�_�m?m�n�AWgJ�z$���~E֚e⃠�Ay��?�l�CC�{�O�yT�#{{#�ȧ�ݰx��~�9�#'M�|.�\ R��7o�����z_��Gm�L�,]ZY�O_�2����|'�j-*�2��a;��59���rы�(��hP�91 �F�!:		���X�6�)�~�������1���e����c��{���!�mț��=#��ӆ��q�����A��~�8�$������X⧆Pg�hƉt��|��×|�-$E����KT.Lؚ+\xY'�u>#s�=(\I�,�d�����
�{!;�+�H?&>�FԱ�Rb����솎�H���=|2���wl<�:�FVE��z�$>a���Ԯ�*,���V�٨�6N�,/���]�5�g��R\<��^'�=
��(oO�U�-޽cؽ�x������38�� r�P�A�m(�w����e��D�$��p�@bUv��n9�`6v�l�Qs��V����pVu9wP�J�ϚFg�b��n����3��Ó�9�����r�)��L������B��G������5� fJ��x��@��
o��z.<J���C]����y�R����3���{�/u�m��Fб,�N��<JV�g\1�\��ȢR�G�R��-��Έ�TtF�y(�ς^L�ų�m�Ɖ��}(qzF7�#��zpt�_�%���js�fI�f幃p>Ix^;�ߌ?R��Ac���2�˒�Hħ�L��o ����p8ً��T� X7�k��z�E(�rq�K}��rl��b�ɿ��\��_ꉔYˁh�xX�g4#F��j�هzK�}��`>_u�$ w=ӏ�K���6y#;�[�|a��P��j�쭌6)���aǵh��giV���e�ׯic�
h�+e4�������C+Y2
St1���k�C���P�v�J��
�k�6ʄ1~r�T�Pk��@�t�F.R�������X�!����:bU6�Wa<���RЏ�J�.�������ZĒl~����s�֖'4C*�)1a��C�f��
N��P�U
\���� L�[�g5(XW�+�q��`�	�]����l$!�ǣ���F3�m8��R�oW}�^è��|��ϟ������Յl�I �1�����n,(D�'㘹`-O�@�A�Q��
�Lvx*W�ݪ��-j^��2%�,�d�X��έ�A�E%�K�`�����io�B
MK��,{�2λW,����?��Ƀ���D]޽�l|>k
�1l1���p�-�#�9�(VW]�T΀�)G&O�Z�vA�����rMx��)�,߷�h����HL�κI��vk4}��%kXG��0j�����tS��8�"���s8�Y�3`���H�"z��m��
`m�`Y�@Y� �k`����mmu�G-RJ�!F���m{{ӟ�,��>!��֙�O�f'6�%����]�!fO|�K��#��J)�a��.ۇ���k���}c��Y�����L��l�����h�w�n�HmiIMk�t������UR�s���w���۹�s_YXp�X�싘��vˆx��HǏ4v|!� aS�����I;��c�=�	�����ugZ<����'�)w��[fzg�Gy��3�ާ�C_�ԟ��o2囵�j���W�1��@!�F�ؙe�'�j3R��"e�(3M�!��@E��t/���|�*7���OLa`}_�r���P��qqw����i�y$.��|Y�+gm��o���R_[�-8�r22..P��[��@M�f��St)|��_%�}���Dm�V����*��n��{˄MA��8崻�)w>��N�n�����W���/�yAO��u������\�)p|�8�m��s�k~�Xr��Y̱��Z{��c:��,�-�g���Hm�&4
�
����/�έ��z��� 1t�~������=Bc�逘=��!��B�B�xF�d��%�'	��#�<�I�&�&4������]�;;���c/}
����r��o@�HN5d��"fe�<�C(�������4
D�!ap�����>Cb6��0F�ePRa�'�m ٔ	�y���Sd�"2^$ؗɖO唦q��&X8t�(9lk�ߗ��Oz9��D�{΋�InY�;<��'��a@�b�j�W�B�Y
e���rd<@F��.�|Y��ߏ�9]�i|��<���T	�U,�bjߓ�"�څx�1̮,��th�L� �f"�0��?~�V�s�\��~�ى��pm�/���57��6J��Ս��V�mU��5���ʹͧ�
kn\�;u}� p����/jh74��}�}���7砀�N{�M���eJ��P����N�!K#�c��Hs��Ǧ�X#�qX1ֱ��Xǽ�[䥀�O�7>�,��/�<qwb�=��Cn&$$ʞ�7sFs̭	����U�����.K�Z-���*�з���Zv��X<�&�+����/�ާ�v�x�1/�iwf�4�w����A	΁C�5�8�HR��ﵧ����*��U)�~7��۪������i>����K��PK�=�{�C��5
���s��֌D���(�$�ϪM+
J}��]��f��(wjt1�/���Czo�e��dy��gM�/� �f�C@����O�zjK�ZA'o�ܕ7��.���h��p��K�&#��C���f4�ڇĬV�P"R��­
]p�YD�;!*��������S\U'��W΋���8�˅�r��޶tjE��=@���I���9���,�����E�&f�}�Ј��4�������9G�U�R[�Q9˜ې���G'w�O��I�w2;u�d�\��L��i:�BT������1Q��R������΃�����ܝOvub���t:Yh��v�rl}�j���+x�����INL-Qhv��"���&$����h9�Yp�s�7e¬���� �7�wŬ������NnWk.���2Z:C0.	�䝨��J�=�<'.��}�+J�*f���m�ЛF�D�>�x�V����~�jx,��l\��V��f�(��0Z83��v?�-��`]��X0sB��<��	����Q��.L��`0��57}��^-1�YP{�۞��	QїW>)�ewv�m١�������Č]��I�K��;�m/�qgo�W�p��Å|7o7~�����1��N�A��[����B�d��5\a,�!���')�ǜ1�f��1��b��q�n0ޠ�$c�ՉoB�?��I�h�t�F���U�Qʲsy�����440l�Mߝ��8���bS`b�V��\�x ϝl�2=P�^l����Tj\��zι�/��h���Gh�M�=����6�$�h�5�3>И�N�������/��Ú�)L]L�N������u�p~�|!�e������_s�n�Tqt���`uXtx�C�:>N��C;�Hj��m6/���{S�G�m(/�NU?�$�g��p��=�g`aT�8�j�ˆcv cn���±Z���v���obMr+��VQn�9���%����&ސ����1&�3��.*��8����Z	���<�U�T���bm�V01h��R&p�y"��o��C������'A[m���l
�<>(h�(�{�K����]:jiPP)*Cs>SR�7��(�Q���}w��J	<�笆k*׆�G���t������cǪO� �yt�b�>��[�f�I���IE�࿭}x�9X�6Q�������v�j�l/F������1��U�U�y���^�l���8{�4V_vo���y�?o„�m(���Մ�ݹ�%�:�lB�m�kTg�n��,�u��M�W!���_��dAK��/�ԅ�*,~<M��a�`�(
hT��s�8X�T��I4�q'?�3#��w�C�K���9�2��PmN���d�NC���t���ĸ�_o\%�i10��nDz;F]�=��+���t�׀�����ҥ�\�fU�f�R�h�t��c���jy?4�*9�@�)�/.�3��ƬZ��s/t�nb=��`FMj�N������m�B�ʙ��?r�ZS�0"�T�
��V��Ku�r�eƭ:�����(��1��O%a{���5,�;�"�<�tf*�ս�279�;��pl��c
�P!�`��zgSR�Wа�_:��giA}�E��t��|#A�3f!"���=�
�A�DR���X�G��`q��@)�ذR�"�i���F�חh���(�)�g�Gp�ۮ�
��ΒC��ɜ�}\�V6�"!^1��f�j�L<��T���kW?7�)!�, '�Xtí�/df�gC?�pe���s�w�̙�@˷��L�oJ)g�߿`W[�j��5%�[�NI��3"�]�Lnb��^yģ>o���p�Q�T����Η��Z��@@��3W^t�.<~�P&7 ����,Ǹ�x��.k��Yf'�g�u��oK>²��+���@�����6�ϵ,i�����Щ��6ka�AYm ��`�.�z��ia/�#S~��>� �XY����>{��i�?jQ�U��Yc�D���/:|o/�����J��6GD�@S�"z"��σ���s8�k�h��w
~��M2���AOӮֹ���Z���R�̲ɕ�:褤B��?X���RA<^gi�`g��J�� t[���Ř"���vE�rt}L��e��x��=��Q�1ZD$�C���IO�c1�6�ݨ�&?!iO9��ۿĶ̊h^ƵHY�['L�9S4!�~�ip�?	ĕ��^~��d�
SI��l7�;x�0괔���cSN��Y�i�K"w
�Pk���z^�T&ee2x�`�2�f���q�/�L�\7!,b��)��
�w�0%* �C��o������AC@s�"`�@<0Xh�Tȫ�C�H�I�^igu`T�
��#<������
�*�ʡKXi4�pR8�o�gL�<�L��OLR�#��B��.�-?%t'F m���>k-�� ����f�?0�Ǡ��SyH�ȟ E��p\ҳna	˚����Զ�Ĥ�Qi�1!�|ܙ��FB�&�u	���G�X�fܬفL������K�MhΉ���q����r|��h�ZlEn=�B����!�)1!<gW��C�p�|�,�zV�r���"�3 �e�>��B��y<���E�i��U�Ub����$x�9�_$���b���(u���c�
&ϓp���<Kы�-��
66��9A�?ٕ���<�����&�;e�?����nk[�޾��|A۔`K�Œj��e���oVJ�ߡg
a��
"L!隆	��K���%T<&J�]p`�Դ�q[P� X�>Y��BJ�=l)�O��)��N���hv6��.NM���+2}/݄��-w�:�
�J28�8r���54έ�w�!e�~�WN�ߙ�2�Q��}WuC�b�<S���2M1H�+>y��%�*�ocpN��AL'i �� p����$`�r�,"��	j�U�m�*0��)�2I��S�E?S�Ύ⟌��wv�TgH|:���L91;��>Ƌ����¡P�Q����f�N_�Nwl'�h�VC(�[�L<őL��B �d�s���jrU��H�ϾF�O�զ�FH.����E_~����5��N�ae�l�Sc��.�ּ�EXJ�_�<�ą����1� �j�2���ﱹ���G�c|pc4���A؞ȏĥ�}��M����N)�F6(0v/ԃ�e�����
8�xE�:�@0$��ʟ8;�r��0��)�	���7W<ڱ���1v���ig:,5�����;"ӱc�?6�O�㧥�Eg��)%�{1�q�N{��FmS=���l�Ф�]�f�Q�ORڮ��	���9��5����9���|�&��%t��RCJTŔ���\�[�`�~w��`kx�UzA��N�X����}�UG�-��44�:��.^ʘ����T[^I���H{���u�f����U�l1�E�yv�4��\�9���Ӻ�?]�r}���LM��5�nc�b躕�r��b�Ĕ�K��D.���+����[H{��Tbƞ���?z$�x�E+��A��V}���c&6�����=��aA�q�$�|e�Ik��Lo���%�H�jA2eA�bŷ��b~@���R�ԍ4�^#!���C:�-+�:fj�.����i!@oE�뎒�J�C�3�JF..�D�y�+�������.�������6��*�W�Ӽ���(|G�?�p�/?m%�i"�B���\9�-0����q�h�;$G��4����&iP�iY�䕷ֆi��ձ�]��w�6��E%OgQk�i��hƮ�v��(�+�Bd?ԋ���=�1rls�Az<Y&�Od���o�O��������]$�X����׬`����b��vRjc�����rt�[���)�4o��(
Ϟ�ڴ:4�	-�mX8�EW �AY6�^3�L�HtW���b
F�G����0vI�wQ��k����"]�V�Ba�`�h@!�r�Sؔ��vNa|噸��\��0~\LlD�6'!��y<�`��%����!y��Z��-o�mg{s%\(?!aZw&S&B�<@K3|Sh�m0���|�X\�BK1�_�9�_V��5��g�i4�+��ӊ�<���se��q�r��v�g��
�qEP�ߜ��%��O-�P�E�`b0�|��螠㚏�����gb}`�Ge�R�[r[�e_;wX���kT�S�J�1܉��4���b�
H�X�71LL}s��(\��'�W���l����`vf�����-߁�?�-�d���LQ54~���^����C�NgO����nJ��tP4�)����'�	���
�e�;�]�ֲ���fTW���S���b,���G
��+`�3�2u�w�w�_�~�f�~H��͍��Q{`g.�pS�֞ti�Sl��kTЫ���KH�YC�Ư-Y����vr(ߔeM��5~B&���K��EO�^%�<3��/�فQ/?Μ��NT��Р��T԰� .��w̺⵳4�wε�8)H��§�94:��B=%��侃��/:��r���U��"�81G5��)P��k�A��>.��1P����5�,�%a��p�c�����?1핏k�c���6�:Q�����TL#�-�<�r�T1|0^�@�f�͢��%j��׹h܀ \�x������vDז���`�Z�,�[�M�K=Ρ�+���j,ҹO%$�Li�U��]�l�L�}�|rN�"M����1��ѥK�:�GF�1Ѝߡ��g���0ta�Z/5��}����p�}��Ш߬3'F'$��I*�a	c�N.s��k�q.�VAx����Xr��������bsY�D_Kq����_���V5Ԃ]_I�X�y� ��Ƿ ��v�`͡I��Y}N�Qʰ�c!1��!@"Y��FoC�x|r�y��z5�Ô�������r�h�lf�1 Ā��]����Q�	V�D�g��z�׀"{��V'��_/3at��\����oXHX�e��{��pR=�*	~G'TxL�4#`�a[�9=���`��l��"g$��S-����"��'>D�Ի�Ҡd�+�:ڢ��C�?U�9E&K�s�_4�U'7���p}���;��5a4��$���.��Is���Ov�ܼ�7`�ӓ���A��kEǡ?���5w�/�.ӧ4�c��]�4Tt�x�"$����F���g��z�=�ra�[�fn>yI�r��u�U�b�Ń�<����$��]�P�i�:���@Ɲ&<nك-�j���V@�j�����`M,�MagfX���d@�qqp��n��ԐD3�%���3�>�
��%�>�N���]�6/�Yiſ��� pi"P��Q�ʔ�D��Q�A�n�����ӎ�
k�6�҇�n-۴Af�q`'y�L��I�-�4Qng��4
��O�t���$sA�<a������cL��{��ܳkG��+W'�Ń\^��7�"]}a�vHq�d�xv��w�.���iEt6�_���{Jj��4�Z�&<Y�����mغ��f�veD2����i�OZ��mȆ���8�ؒ1/J��{�wQ�e�}��d���x`=���gf(��K
ٌ�t�6�-��-S��)629A�W�R�ݣ�2���&��j'��H��f�Y���T򿝬70Q�J�R�m̞�F���sqǂH^��,J@˥T�ݛnn�*N�k�]��}�-X���L����>)�N��_�!�f=����ub��ۙ�[>�a�cXי���S�����¿�{c6Kv"Q�%�q9,3.P��4�gpQ���q�ˉמyۮ琵9�D��T�G�9�y��]˦4~q�&����"!(2�sz^a�M�L�&��S���FF�N�I5֛(�(̀�+q4�\��[ F�����n�t"��8���I	�]�G�2�3�pĩh0&�J4��q�[��D�8?5C��MT��p�ϕ���b�}��ր�x��X�V�FZ3�Q
�g���<�[�"��Un������Rx3r�g�*��	E�J̖q��>�Ђ�}0���`���b�0� �~�B��F:���m�]_y��-��9݆�K�<�F���L EA�e�ϗ�r@	�Y:]&2�����+��~Yv�Π�lHl�h
{jڠn��BQS��Ӗ��*>Lk"0Z�? �����WL|����턬�����:�Y��O
����}�#�o~H�n�.�M�Z��>
p�Q�;yJ@c���=_��M��
@E�{OM=��im�߅�5�:B�4�AR8�iC��z?�e�8]
���0�m2���*�´�	�",�f�%w��W
�?'���,��aB���
���%A�|x�fq���>+�B���oT�3�
��"��76�e,��^��tt���^��8e�wn���Bw��!�ۼ��#����qʢ��$�M�y/i��rhS�4	��S�Vu��KQ/
n����!��4M���?1��|ٺ6��g��6$aQ��b.���e�$6g%�[�q2��Dޠd��i�"�whb�e4 M+çL�����G�ŘU�/ڤ0A�ӯ~,��94��,c�KCr�=w�_Fϻ��D�p-���B��������\���/e�cg�߱2�o4�];�=�
u
�RR��C��X�A��2������:�I
�ɘ�7O�Q~7��'����}]s�>F�/������Vi��ůٱN�40�c��M��8��w����{�f�0E��oqX�=��MH+>;�e�E�+ZG��3�v�ž�5�f�Y��3����16H�G�YN�##�٫#Ł�^�{�G��J���o#�ƶ׵J�#H.)��Fv�_�����tʼn��B���d�L�����H&�����KC�M�ձyp�n��/�}�1���$�ua�}�.� �&�j+N��k������^t}���5���oj�Xf{{$͓�n2lJ�+�2�;�� x����Vw}��"�)�qr�&K�}��Ԑ;�$V�"�Q��x3u��8Fy%B(!|ٜ�C�sd��+t����)Jމ�x��.;���1��0/���p3��}F-T�r�o�͚k�Sqi|�X@��R����
:[����H'�8��%����I8:�F��&}Q����ۨ'3�=)��'�.��>]e����8M�`����2=%�� JfQ��١̃�D��gHl�JH.�m�.����H��-?�P�l�\��B�!S��*z��2!�8)�Eދ��萟z�UN�%�ԞfI���m��z%�<Mx+k+ȏY�����;k#@�/�f�Q�5�e-�/t��)
~�|M�b"hx��4a)E�;$���;��(��j���-X�V2wą���IB�K�k9~-�M-�v�A^�Z0g͂C7V��3�|�r=�Q�-B�!�|�ٹ���y��Ĉ�̓.K�Da�� �7Jf�ذ�
��X{�"��v�m�y�c
�LJ���f��@�'��`cB�O��j~��pV%'�ys��X���L40�B��A�: 0��d�(T&r��sbݴ�T7�M�K����iK�����^[���x<�����aj�~ԙ�3�Cx�/�M��r�$8Շ5P��j�D��A��9H�N�>:%�m�^����w���F�@W�7Urs����U)����C2�O���a!EE!a�W�i����wm@C�7/_ۈ��>��gN�����C!��Ҟم�9}�*�]fUQ���0kMl���Hk¨�9E�kq2'�/�S"ג��0�yp�-;�7�yL�Ձ��	uֈ����1�kR:<���*z�]+�}��	o0�H1=?��1��|rX�l�ݞ�����;G�e�,��܎�����l��]ڨ���L� �K��2��h]k&���_���Z��uH�A��'>��ܰ�|��zB�a��"d(���V
 aj̩�(f�z�|рj�D	�̃��E?�X5�Oۤ�"�@Q�X��v�峾%F����#@�/���\[4��I��z}��Q+v4�u
~Jm�Q�<q�J�;�1#P�8y�"�,�~��Y��~��=�=r�&��>cT���_��u�h�"�9�
�
�n�pd"�61���=��M'4���V��Й���b�zCYo��Y��c�G�є�‹�H�9	�#��"�o��w�Ƽ�a �8��Ҏ��ʃ��Sre�[؎Z>�"�$��,r�p��<e�%{� Je���b[���;|�J����i&[6�R�7K%v��'�?k��,~��ӭ*+�rzK	]:���'D�D�'F�~���#P����V؍��(5���
�q4M�b��`3۠�nIP����!�#2�w�p\0L�z���;]��X�Re��Z�8���4t�ٸ�L�f�,�L�d\`�0#���|�&���&�%�$1�sd�B9w=�2��dQ�&��DiL�}#�a�b�J��9�1�����l�P��v�	B�
�.���.�'e}kԻr��)t��{���v+�iaP� ҏ~q1�<�7��=#!�'#_Y����heI���������L7w��x��k�W��p����U�G
3d��l�F�p-�.*�LP�'�����5�ڃ����
gǐ	�>���S�M,*�]�?h��0��\�J�N�#F-F�f+�h��ϰ��n�����C7�>����$Rv�v0�6l��j�r��,R;�y��	W�3��j�WĤ�\�y�% ��H妨�l�����N��O�g�um�Ui�_����$�J}�c-�h��GN�/O���B%�4���R������=�c��c�l[\�ʕ�홵�f�Ov��e�3'�V6	'�(Tܘ�Rl���V�g�,�+DY�5O��i�� ����q�i�ٷ�r�߻���9�d�f��+9����9.wͪ��l�N���'c �Ra9y�'��kHS�b���tg�J��GQu)Ӽ����/�/꼕��������c�wΘ�U��2/49b؃�I9����#2Zu����^0+>:,�tPRc����%�B��O�0�nFIɌ⒙Ɨ�����
�ː�:�"��fۆ%�w�����jp=N���7[��Kv�]�Z�a�O0�}�.C�I�u�:G}�2��`|���y^!E#l��t�]��B�az:>��h_#3�]�z꙯>����G;�����:����m�?ck�W���.�{�0.�����t-^�I�2�]d����w���'�N�@��X�E6ൿOY��/��U���U�|*�;��(H�vC<^��`>N�K6~_;���h�9V�eN�����o����[Y�Y�留V�(6ڗ]�����+��kǪ�r�d����2��0o����?���>;�Mt������@�O��B_òX#��C]�ۦ�=���?3����p,�S�?�)�/�{����/>w~]��j�Lp�
�'����Q�ǒ����R�Q�t��`�_���-ݶ�*���Ⱦs�H\�(v�W9�7��=X7���ɏ�����q�9�R��Y��5�6��8<��Y�%�t��ʫ�Tʕpd���5m�!~�H'�h�B�`�ma
�m8Q�oT��B��
�xlJj�팝�TOR6%z ��:u��{�A��3�������U����(S���t����g�V_O}��>"�VW>6�&�|�ϥ��4�z�B��I��Ȯ���X�M����J�E�g�8���{�%<�A2w"�A�w{���)|�!7��V� ���o����Y޳��)�O�Q��1ʍ��b��=4�#^���y����陫Dӯ��8����~"'	�|;�2&@���v@�5C�0T_v�����O��
���v�dc+���]��	�H縏������|�-k-7���¶z)�r�A4��2$)�R^�,a�g
�W`�v�s�M���)W+�*uX�3�?�V}��h���e`���y�7�����Ex�oxz6�;,n!��Q0S8s�ۆC�G�`��i�׊��]���j|"��^c��{��F��\)��/��,LbŖ��������O�G6T	֖̆�w�){��$�	�X���J�W~�w�؎�[�jp��t���#aQI'"t�Z�ˠK��T!�֠dZ�{�;̀[VO'��nPI�,4@�;�� �b(�a�(�j��7��t%���k��<�m�Иsa�w@�87�פ�l��dv}/���(0/aJ~B�:!f��@
!�C�/�u��|V��ѣ|!&<aS�_qN�-YB�(�X�v�]~�����<J�Hkm��h��U˯�_�MLh �Xp8
|��${i6����~�y���ߏ����h��B�/	��4z���������B�)���	�XfM�i��^D�؎	uxA�;�z|�տ�0����,�Z晿�vL���ė'v�|�������c��2p߽���b�]�/?�[Q�6��d�Ԃ�	K&�8U����A�'=@l
���:����vJ2��k�@9ȉ��d�Ѹ��I�E����ݹK�����P�.�D�3�~�-6���B_U뉣�i�}a�`��_�֫a�-�#_	��q�
��jfݖ�fmcN��K�^�g/�!a�ףp��4A��t�-Jok��iᴉ��{�Uc������
�ڶ�
��%��:e��u:���m��bR����:�a�?�V�I�����<$����|�1{�ޒ�s�7���99²?8�����a�j�+U^R�)Y�9��\Z�X��G�ZLsh't(r�}���*Y��u�[ +d��@��
YYYj�gs�͵
�O���b�J�-�;\)�d�o1��}��+	��2�1�__�-���*o!ʾ�	=���Ȃ&�8jh�	�X���J^��gZ>R��04t���O�]|+x,DQ#"Q�h��Gn��������s�Adx�1�Ӡ ��~�B4��~�e�?%}{n{�.OTD?���"Jz���u==���U]L���\>g�$�'��R;*�ŀ��NƥVt�G�K��51��5svX6���}���ު]�0$���q
eS�>R4?��ə��z�#�z�ܣH�Q/�Q�j�K��ȴL��%ɤ4UyyS�4r�p�5]i^K���.�7�Nin����ӧ$R������X�;���Esfߜ�e�L�0���L�O	f�t%��u��Sb�*�N��`�Z~���,>�Jef!)��o�o!�����I�/8�.���E��""	9ݟ��B�$?}�JyrǚJ��[nV�.QV�WL��:m� w��*3�#ؗ⼝�P��oy�J��3�ۈ�^:1T�\Č���xJ��ǻ*�1RWl�U+���t�_�=VW�Cn~u�i|ͯ	o�ހ��#�.gmEt�X���wrMJƘ�i�䷔��������8Gm���65��c�����'뙍2&�7�҅����,`:`ir�����h�#��
x��AJx��E�XO�BV#h����Q�E������Pg�~�TF����23'dfL��`p���<aF�Ж:���0]�0s��jq-W}j���]�2|�g�8�3�b(�}��w��i�W��w�����`��{l��yh�d�X�Ə�EPX�|l�
T&�ޑ+��.��XO���f��&�l@�v٬
b�?��9"�./�uɉ�i	Z��f�pGs��za�bh������'��b���������[y��j��H�mM
´~X3��6Q�ƢM�5
p�@'����?5�4[�%v�B��������O���.��[�g��i��-��n�2㸫_��˪����t�L�,�0;e��+�$
������1N�T��wr��jZ��c�۩�4���s��l��)���8�1�d2a���vW��n�}�߽�V�^N��Q$�%�+�ؿ�v��ӳ�L�8Cu�?q��r���[�3¹C�B@�z�u�v�;V�=�aӫ$&.�P��Y
��H�4��m�̋̅�[�ft�mT9��/��琄���a��<�K�D(O+Q�B4EP/�:!�E��#��h̀�zw�wSJ�Z&E�cd��'���(Dy�\��n�]��lsS,�<M��9G �XM=�$�3�bcq�O�-k$h��?$���Z���(a�+�|l�a.��W�h��N�H��p*ZP8�3װ6�	e�7�ee�Av��쿁��9��ɢ��=g\|�H�T5f\�
�N]�]�]��y6�G���1k$��%�[�����h�1/��<��V�9
��GzEZ*�Q���,0��;�v����66�_|�W�E,H�A'5U�[Q����u�U�\��JJZc(]]��b���Y)E��86�r]���(|~a��k3ݾm��Ǯ��3*�#^�}!D�g?e�go��M���G?�5��
��Z�i�!��.-��o7��<p?�|�'W��:��G�D�W`�������un�ᖃm��x޵2s'�C�9�w�*ݓ��"չ?�8D˹CU�@C�� ���5��J��ѥ܅��#�sg����\�H��dG�Á�[c-�E������A���ʁJ�F
8�#��F���ei��\���4�����Km İ)�{
/3
��������w��|˸�9����,�vj���四W����=����?���9�<̈ZԺ7���69C��F�;�6 +/<�F��ξ�&.q���5�/ns�'�=X*`��b�`¢�-�V�v´�'�Z����*-͉i)u9S_��
���JR7�զ���hI]�4�%�^�����o��
������R[.�X��)��D+զG�L5�"�Nx���onu������b2x$��E'�mR~}��TE;a���ݨaS�ay\��wt˜�`B��j#EЉ�X��[,�O��*5��Z�<+f͢G�A�3\�
��)�+cr�1!3#^��y����(w���
ݰ\A���+�^��I�WY~���� ~A��,d��#+	M[��y�UQ@�,6�a��l
�z-�'|RL������h� �<a�jq{)��
�r?oOX	!�8OS$�����=�`�"�ߔ]Ȍ)	���&[氟l�p�w�j�K����bl��"�q|��]��]ec���"����,Ց������!	��pSͰ�ʙ#�R0#&,gj�
�˪�g����
i�M���~#����vv,��,�cq��6x�G���Y��5���W}ގU�w㘤!38��V_eޘ���0�C��u�
�I�T�8��
0�H�"�c��W3E",�Gr�
W��<����
�%�g�y����<�e��+ ������nN�V�#��X�jEٔt0�t�븝��21vJ켒�43]����h�u��r�@pA���sjvx��'k_Pj�����
�\��@ʭ�
����Lʭ�
�\O���I>�Dߢ�{�<����rD���/�	��qaO��#���	��d�W����Nr��+P}
�̿(g�(�n�Е�
����W>{q99�C�
� ��0��oވ=x0�>���y���hBnzoӵV:� 3B,�ߞ�F�qvg���Ry�,xB�o�Z$&������*�W&�CP~*i�����cw���.�44�lM*��r��)K	�<�&_�s$D����F���������68:k��:L�>v��ƽ�|�����Ċ�xGş�sЇ�|��?o��6�M�r��΃˒鍍X�$���˥��
&�����A�rl;2�,B�j�*�zS6��H6j�e�n=�K�{�=��YJ��l@K�/$�����h���>�Q�(t�<=��/�W�)l��ωc�՘��c�u��;�qb^%l�H��oϤ�h�$�M���xh�R�\"�ϒ�)��R=Y��[GZ����bZl�/�"뀂3}4�˅��1��]8l����f!���?V�̛HX,��X�$����*��A 
m��
�־�mO&U�0?q��5��ES1�����'A�6\�9��%�͉O��rB��<��9�+ ��<#P}9`�	��@u�ñ��W�K�c5�0"69�зz�M쎽Q��n�%9*5����i��;�}�c#�<�;޶e񏣴
`pc�L������E�C>B+�b.�^�g�UP�u�7���U�S�E���c�
	�ہ46�J��/,D��::A����3�}#TP߮g�҇p�ݎ������ɏF%L�NJ�Yl<
��\,�w;����TS04Xo�-k�&�ɞ�ܮȢA�FE0AQ�!Y&�&��@�>9�B��,'���L�I�˧̟w:�>�/��Dmg��1>ܚXp��ca9],	8�~Z`Zu�bZ�ee
�f�,lL��0�}�޺���DŽ�vU�+WY�����y�o5R���qh�ߜ����5�E�����
�)�S���'WGiR��^y�2s�g��]އK���r3�.�7��_��F2��GKr���[s_Uf�TO��z?�x����ثH[�;vZ����i�*]a�N��CmP۾��A�Ftt�,�:��_XiD�
��.[u�zJ�Q�eRPn^{����\6�Y��_1[&���8IF��_6�6�\��Tᢼ�G�B����o[��K������zݎseB��1Z�h�ߓv-V^���2$���ONXm�tE���
v��e�ڳW�f�U���vm`8�i��h��4෍G%�(*��{1�蟃č(z�I�
I�lz�܅��L������Z�P��D�O+ ����_�
�8�r�I��G���18TeDI3<53<�����C7���� !7��I.�y��;w��ن�۾p*i�ssD�'>�UC���k˷g�o�oqf_�4#s
S��
��d��$V�)^3a��t��!�l�1K������E�
����C�� �yz
y���:ʞ/ږ�&�ѐ�rp���n�
3}�����ƅ�V��ˁ�4��1gl/*�K
���-���%�9��إ�$5��֨>�#<�E�z�".yC�s'�.9S+��Mٝ�
M���Y�$���!4�����}	�����cn��y�捛&`>slfL�_0
��F-LZ��($������?�ɂ�?ݯQ}�̼7����X�8���
�5�.��Qa�G�\;T��>e�l�g8��1�P�$9($�O��4H�wn�t��y2� �?t�y"Ӣ2�Yd^��(�X�|��΀+zD�eu�j���36{7�RD��*�%��>��)8�f*�,E�>K�3{��0��l��|a��Z�V�?[@�i��U��W�[,n�%S���g�f�Tkpb�jN�|��TBQ�
(��mHK,�v�xhpU�8i�0tU��;%�0Q���(E�	��MjFf2�:���ΰ�6
�EcG�TR���9L���"�-7L_VP�Es8՗�"6������U��%�t?6��h.�н5���-����:���~u�j�RH��D�VZ?ϙ�Z�P����3�?�|�?a^JJC�bJ�����щ;V�:^��:n����+���<��:����l��q]���f\f^��kW�^�I�[T�C)�1�e�NF]s�vw��2��UCM��b�e���p]�1�?<>�J���Pס�ޯ��Dշ���Nh+��~
���\����T�mգT��=��})�]��\�.�)Q�e�m��9{��r6A�9�L�%�x���R-��\�P��RI[�EB��S2'�`Q�<X�N\��<�F�I(�+Rw����_�\
S)� ��W�%�bD|��Vj2,��^c�N�[$�o�h�5|�~�Fv�)�J�{H��{�Y�-�j�&Ka��5�����l���G���B1��x�,��W��ݵ�!]�:{���>2L%R�׭�x�5gz�w�Jdy�߿��<Fdgr.��k1�u�n�����&
��}'���-�ˁL��C�j%/�,6rZy��(L�#���*�b�UwҎ�������4�n����͢K�b�k�|X�֦c�����1��@��U�H�b�Br%���hUf����[���(�
?�Ɍ�'��X$�~N�8Q0Xi�#T<jKt3���֩g2!`K�!@k%���J:�u��2�2y��:���>`�.y��__��`l+�v�I\` ��o�3��U^:/8�G�y+s®�o>�azG'��Dc3�ًT�-vw��vM���^˷n��Yz�V����zz4��[���te���x9S����4
_#�1�'U!A�"ĕ��"=8י0'�f�8�`U'����.tE�"2��K�Tv6�F�w9�p�U*zdwD7��ŗ���9#0�/A}�N�*%��c��xΔ.g_��!1H�'�3P�x��W��E�Ӓͼ̙�T��*��������
qx��C}��]EX^���F�A�Kw����G��[���aB*i@S3K�	;<�(�F�^N\Ȃ�~/@�����0tHg��	������ŕ��дܘ@V9�6��� hT��G�K��X��ȧ�o@��]ęu��0qP���@AYb�@�~��C���x�����s�)�{��o"z��3YzB�S�᥀�;Ux���}�X�a��$�L]���3�r�] �݀
��k(�0QK��9�:��Ay�I�G���4�R�kL�������y�5��|�W�<G1�)Z��$BNo�䘎Q��&�_x"���Z�� J��S-����Ч�2���L��^�L��IT��E��Q�F(��(�z��3�}F'�t�./�G�)>�J�}E�e�.B��G��9��X��o�H�h33Y?s%���}ƥ��7v���,R�ܣs��MV��7����w�o:X��+����d
�9�9��kO���J��E^���b�����2xU�K90�L�`�9�*�;�CM��9>"n�8N� �K<܅�t��4s�N��{*��׃����7��EB��$l���`����]��?�qՉ9�X�.�_t�����-�}O�U�f�y���X5��dx�0IE��D�,c|�2g��-6�����4�R�n���/�[�ʋ���h��w��S�F��S�l�K=�"
�Ⱥ�ɵ7C�!�@ր�{8j����5�ŠP�#�R"}$�2�K��a0�7�L��`���Y�˶O�o�w�����3�_&1��9;Ð���<��j�a������=a}�5��:im��O��R�FiB����􇃧c����Lf�o�Qǡhb��SE�����T�C����1��FC�t㖝��m{4Z4�<���1����ז{�
i�H����|<����[�Е�6Ѧ����	��t~t�n��T�_x8�uEeӱ�'�Y�W���?��nۓ��v$�|��h�۾��C�!�Ҥ,��ԏUH(�.6i]�\�MK6E\���c��m�5�(1�:��R}��(��"�p%���$�>�����b�nRM��y���|���.2�4�&҂,��Z�SwF�-��4��l�c7Tj����=�
|;�a�o^5g�6�$C@�����dĠ!A����o�]��sY\�>i��r��=B=�]d������6��l�����r�A����ݯ]Kx�m�?�{��M<�詋hj6Rg�t��6�
��_�k��.�Yϳ9��ٖ�ς�_���E�ܫ��N��˜�ˆtui�7'3<�F;�sxnF��g���ǥA^V�W|��6�M�z��3���
���͡"AT����Ⱦu4��C��
^�s��������)y{nH��0��7N�Q�.�g��;��&_�T��7�u|���Tiu�~p�Zq8����1A�<���A����o��S�9�=�lL'1f�&���v��!��iК�V"Zg=zԢ��=Q/r�������+mݍ���T�R�vr[!��D*4F&�*����p~e��[v[��`�N;�䘓�����xϲ�3/h��i#�Ӱ��UvSNNOU��;y�c��I�˼uM�0�kÄe�\�18�H�/\l��q�9]6��q�l�DѾƫ�ŌN��f�[ǔ(֋�
�����&?DcL;�c�[&:�)̙)\JVb�r�8g
���ܿ��h�ݛۺ�IRQ����O<*v��0Qy��D���1�]NTp?�)P��އ�G�����z���.!���
��uc��/He;�k�-�
w1��(��w.ۅ�i���-'3x��H�$��kG�/����ژ-8{Z��9J�oo�k��
~E�R;�X�˷w�"ML&;��zL<����� ��Y�
���Z���[{B�����aVki��*�X%��lTM/y��������:E���
Kmi�UΜYIqh����{������E{)�DHs<3�B���4B1e��AUTN�w�N�*i�?z�>�ˉ	����
�x-��%��S[�o�+��wGӗ�!���#X���Ϧ��s�4T����[���6�(U2%,íP]��D�8�U����m��b�.��͝w�D߄5�"�Tf�6(
��P�ۄ�i��B6����J|�z�~E�K�ۥ+M��J�|Sd���j�g�[��gW��n頋�=W�-�Dwp7�6��zF
�eW5I�DI=_��e��Ԯ�V�.C�!F������4G�����濮ϧ�l�>}�DI]���Vk�1~k�2���H��~��O��:�d��n�z�ymXř��ED2K}!�.���tGRA������_7v�z/Ő�� [�q�7{k�9�O��ᬸU�ͧ�e:T����t��H��l��ZZő6�j�#�P_����Se��UrS0<���M���^�2��%�zKd��?�$�a1(�������4��X!���hN=�nXesm����>+j-\�d�G�QK�r��@,�gEL�7�7W����Z3bv��;sA�ܸ��Y���T[:*����HD��E�wi۵'������l�(���P'����ѫ��/ʳf��fq
��4��.Ț83kR�	|3�B}�����V�\H_|L�'�)�b1���#���Fs�
��xZ+'��:��wdx�j$Q�t>b�$Ԭ�{�<�&�����?0R��1[����Y�$,��!�tF��+�-�Q�d�ӡ`;
�Y�Y��Ċ��d��^�^�Ga�"�Z���������.�{tY��eU;›D|��Nݎ�t{�*/����i9��ʲx�w�T�]~��&�1���Q�U�:�6=�6����ї���T�T�& Mg�H���i�@��S$�y�%gvmߥo��=���p�E���z���:�G�han��G6�K�,�$`�w.��c��"���D����	��{���<�PH"4��%��7O=7���1u�����2��]x�ge�D3�ѣ�e},yB`�ln� R��ON65�+cq��ő�Ď�sCC{�$mB�u��b�zA�;�%��`���c�i��hS�� �+�q�M�]8'G(m�]T�H��[�q�N���zRp�R����/y�}m8�q@=F`�8fh�KpH�7��vj��f=on_�E�w�Dæs��$�NJ��pI�V+|V�KXms��R�|.)VI��r���8�����*�~��Rd(AJ�[�q�T������|G7)i(	l�I����{��^B[x���{�Pm?�K��f��T��1@�gjںtyЍ��{���"��OO_��k��}0
���>v,�E����/I5Ҙ�I�T�	�1d�:aN�4&��%$��x��vKF��3=u��&�2�G:PM�$`^��31�S�	�d$���	�|�]�7���!=��U,�
s!��j���b���RG&/�/6��_#����q�1��(��ٍY��%{$�O�Oy�Z�(��?E�����0�6�`ٛ�0���׆��T�v�⵹��Eqq�������6�m�R�f�$y�a�
���^�X��'}R�ka�[O��x��aU�X{���ދ�9���{�}H=�tbg_kM��r�D{2����=��=o�"nz�����!�ά�l��~�=�o
O��'iS��s�lw����34�̚!����zj3�z�
���)迴��y��'����uQ��_ZY���V���ﴷ��4�$��l�>p�2��^�']���q֣�ŋ���
E=M�^���(�(A�?��f�#-��z�J����|+f@��y�"�%]�y���YH�"�G�QQԤkcKE9��Ҩ��5�.Z��f��Eu�߂��U.ou�'&ܤ�bй��#qL��Ь*Ɏi�͵5��0��z��4�fsk�����5*�N�TB�t�D�V3��c.���b̲Yń�|H����b��^E�|���e�G�Eq��3	��F�G�w}k������B.S���o�F�.�ؘ@ܰ�8��q�K�xn2�Q0Ij��wߔߵ��V��z��`)u��hD��-���e��TQmd�"�B�iA���YB�ˆ��V麎�`�; TY��nR�b�)�0X�{�F�M���$�Uh���4�Ђ!Xm��dөyŎ�%�Y;؋���)����}�'݋o�\�;��g��{��,�i`���Um��;�`^�H\��e����?����lo�RǦJ��x08��1�D�-�c?!^/��NV�Ζ�$Y��h|~��]�`�AL�3�Wן�:Ӱ���z��C�M�7��^U��C�����^7w.LM���� �(��i�j�1�Duw���
��F̾��W���W+O 2}d[�[`T��=X��&�y�n��>�9��N��(����4�O������n�,�dnT&��;{�֪��G��;
´�:�<���cI(Ѐ4!F�l���hkr��W̭�F`~�w�տ�Ly��]�(K�.n�A~��j�)Ft(N
��I�� ��Q�ȸ����(��B`��2��5N�Or�q�uv&/Jg�&O?��o��NAύ���x�k'��U_�����؛��ڤH��S��E�.�'��}�[�O�S,?�j�e���w�C��Ӹ/V�G�I�r�c��4�*�$�X�����f��Z+Z}ɚ�UØ&9k�W�v�1$�I�J@x��z)�4���}H���/��UC��$�>���%�P�!�Β�h�؀ )��%���c�s�^�r���ɴm�\��D+��[�7�����b��uɥ�6��~4I�8�P�W�5q#�q��\�Y�w�wR�PC?ap*UE*]#m`����Pv��"oB�I���Θ�,��x+�D^C�\�Ql�7:�+�=�ZMM�0�`8����������!��9�9%�_0���y@^����Y�ݕͅo�H؇��x��ɘ��g�<��<\�}����ZfY��g]��Vk�&kVL̤�x�ٳeΗ�$%�v{��'ʖɢ��@������}�Z����T�jMX�|<:�<����wZpڵ"'�ɓ�]��R�y��r�:i��E�����!�- ״8?�^���d�z���ĉ��(J�ԞN^��rJw2%��4,I>iع�7�2�a݌�����SM���2���i�ɠ����{���[�l�Ιv�/
����`\��ܸ���T̞�ܸ���d�֮�d��::fڇ�tEAH���4;W�*Z�(�+C�g;�%�5	i���QV�,X�,�U�%���	]�l��)�6�ޏe"�hgG�Љȇ�Ǯ�W8�Ywr�~9��e~���>��n˶��nX�d亮�i�:+ϯ?�o�((=Wc$<Z&�MZ��j��3;C��l� �<�wA�����M�v���K��ޗ�0�ٳ��"�+�+^�k� 0�!Ü�'�b�$�s��7�u*�/@@h����.>|������jo�����99���lj�NY�*��=)4��U;rV�r���LJ
�,�P�;�4v_E��<l5�|�~��L��DMb�8��]R�1��H�y��q���0��e��ZtB@�
;m4��u�GN���:_w�Ŕ�\ѻ��T��U���y�^��|�R���?6������)����5�0�c�y	�
7Ρ�
n�5h�)�n:�d&��!��A�������?��fKYك'�{��^����G�.FsϤl�g{j'k�\!����H��!���H�(Ů����������@��U�"Iat���I&XT�j���V_�DZ���e�3Π�9���1��-[�rY���c���$x����˼E�&.
`|wH�0�^�2gG=@��4q������j5�@�*�44�u�B+5I7L�Mj94�*��\�!8��E�#��"�K^����k��N�5�"�ԡ���0d4��cup9{3���36�
�h�h����~���Ch�@֞���rO�?w�T�
ij�e�I�O
I�vT||m�F%�@9Y���#���d����Ւ����t����cvvw��襰�nƇ�iSp�`�<��"ab��d�#V�)Hr3pY�s���w4f�W�iuxrY���p�X���X�[[�y=\��E������2?��c�-Yr(�b�Y��tC�1�����Y��n�c9�&pf�4\�4���^�8\���~��w�w|��2��J�B!G*i,zr�&[M�"��p<��U�.Z#�44�<�����m<���9��$�`�x�]�sB�俊yVsĤIf�e�m���CUCp������ȵd&lK�k���6�ɺ�L��;��.[�e�!�A4��ԊW(�!����&�
��r���ʒ٢�,R��|�W�ٞ��f;�}��c���{�	���F2QP��敖q�Ӂߠp�63�6"JB�N#�;��Rh{z����ř�[z[W�~���r���*3��/��?�t93�ᜃ�i�$���n�D��E��
8�l��z��w�&���e=_��E�)R�
�p\ �p,���(�$�4����LC�&8���P8 ���tD���BX?���G��<50B�'Y16�[7m2pNdld��*jV�w=""><>�zd���~�_Y�_M�;*�zaNjd���c�5�E^>��R������İc�WI���
�u��:"�O�m/e�u`�Ϙ��Fs
8c6�L�2s��1N��};��%��T8-�t�&�H
Wh��1��ٛ
���+��ɜ��%�0/�(��hph�ܸQO]<V��룙>=��2�)kc���������%\��KJɝ
'ܛp��'��;?`KbW/�
_�K{��u��ZF��tc�G�s	ٮ����}�����:z��Hb=�����%+�ЃvyƬ���R]x�1��A$���`�v���w@�XB�~������o-��B�q��bٙ�}e�]2�_j��z��u8�cB18x���.�¢�I��›��5G�Y�J�T����BIZݖ�ˍ!�s�b��YR�P���!���q<�弓�վswA�N����`�T��Q��jz���[�PQ��
�ט�kp/,x�o�\-rG�?�����iHr}�J��lDJ�`ŐNJE��י�'1���x�ŕ�o��z;"���O~�
)�c�8�I��7��xԞ��'���5��}����՚G՘i?!ȯޝNO��̣H�������oe[�8��ګ�ǀ�pWf������k��{t:�QϾQ
!�qܮ�Ө��٤�R�%5R{ǃ6|��⬑ޖ��Z��h^OOck���6�����YS����=-Q
^��KnUOs�6
�C��߲\(��b�pܶ+шx�o��kvd��A�L5�F�I�T�21�����'��Ƕ�f ��cm�h�*�3�JC��
.� ��PP[0,�~1�/s,�����[��@�z���΁&�S��VT���D�dSW�Mi���/؇��#��h�VE��TH��#��u�8ȉ����Y�^����.�c�c!��MR��~�fNF��C�r�9��S ���Fd�ш;�b�����a�����SW )��$�q)Xϒ9o�814&��42Md�����3��_T��
	Y6+A�,1AE_��G��2��u�Q���B*�h�ogih��
�[w�1�'ns�zC���J\�k�����
p�S+�@�,D�Xҵ�W��Ä�Ɠ,���¦`1��X!��I�O`w۽�3�.����DąםlY�%�T}�<�ٗL="9�p���I�
6<<zl������.-hiZ\�G4�5���0G䡍Hb�D��J<T��r͂WV��Ț��K�QE*H�@��t\�����S�p؈�4�AhX�\��{�s&���B�ǿ����Vr���:��ELJ._���o��D"��L>�2�iQ/H�B-"Hd��P$i1*�I�X"��B�^��%_8@�I$JU��$Pc�F.q���|�$
s�NF1�BC&NkiBR?�|6��.u4%��\$�"y�#�D�r_�$@&}�i���p�C��k�N�\x�{`�����(��2��$$�c���L�<#4b�"�B����]��'۔���Qi D���x�Ȍ�#�)aI�����o�=ü凊��6^\���0�S?�5�����
�^?0&�4��+!}��E���УY��*ڢ�V��ɭ�h���:��h=繿D_U*fRY���R����,2��#�d�1[����d.7q�#�{;+�1Ɗ�U2��v�1��Ɗf�W�ھ|�Q}�O�OУm��5i+�k;$�$��˅H¢����	��f����
	�>�����e�I�g�BK��y�-��J�h
����~�(�ũs�0bB�]w�ۅ<��ɡP����?���#tIH��qm(�`��2��}����.
#儌��H(����z�82�6�XJʎ�4�ɜ����ﯥ�_�क��_�U���҂+��ʀX����:�^��%2k`�n�4J�C�8E��5>OTV����LU���_���n�xL��X7j�R�"BC�(�`��0�k%8]3�4|�G&ĕ�r}�V���rUkx5%��Q����p[�P�����b�a��4��>TJ��צ���3/X@��?�k���!���ǀ��{c���S�*�����[֗B�ZX�z�ld�ු�ލ��^~����Ap˜�-Wlr�`KBi�{�*3-j'a����Vw��	C ��v�jd���t'&�z"s� 7��7ǯ���_���t	�����V��	�Σ-d꿒�Cj�Z�ꅁ2���g��ۖ�[��m��:-]Y��N��D�WD��ř8�W�;Q�u����7�d	USk��ohX�{�\v��+��#Zbk�i�*r���:Z>J�%���sÖ�����6� !ά�͐���i/��0vv����h܌��vm"t#�ڸ	���ċ�������Z�����!T�]�[�q�R$ܪ�#��Z�b�YM��B)p�'T�N~_�#!~x*��jb����(��b)9��K���@N�?8���K�z$�����>�n��qa�`�Y�3B�G��^�Z LY�g#�4����0��"YYΛ�LN�=Q��y����))�����y͗B*oC�j71��hÀ�_��uK#WW�{�㘜v���hAt�=�&[�8���7%��Z�����'��hj}�T��؁U�-5̱ev��8c��$FV�����r0��ņ��Jdȱ�z�כ&[U��H�]���y`�[�T|����������/m@\DvD��>Anh�W���)63AVl�ql�5r�b6���U�˓ܣ����)8���ĺo-,�,D-]�\��!��kݣվU2�~I�Q�JS�j�} �3�N��\�
��o
>�]]���!��-8��Tp!��s/�V΁~_�=��r|-	�ף�z��h��G�z1�?��l�l;Ԩ7
�ԒPI�C�l!�E�yABQA�E�
 Q�{l�'�脬��/8_�|��t����$PM��Ô�b��7�dܵmz�V�oA��DY���j�U��p�j�(	Ǔ�H��XHN �j��*T��!�Ӭ5c�Y�UC
HPn�L[3,뭬Q�v�kA :G����͚�Z+)��m'�n�
z�ZRJ7�OJ}<Y|�ݠ���VR`��nT\�}EE�)SK-��h����,�S��1h4_��^l���o|z�%����خ�/��-����.��9̥.�M�B�
#5;duK�F�(<M�}U
���2��o��9	�t�Bs�����\�(-�i�̠��P�c3f��ju�7���Ebȃ,��C]��{�f`(+cC!�f6~��j��LK�1�WV�(ݤ�z�M,�qǦ�鄍�/�j>&��%{Xh�P��RB��
��+��˦3`�
�p�(��TWԸ�>H��4��@�n߉�[΍�)H��<ƀ��׹"H���'�b�ݐ��9��9���
1���%{9��kkwf{'��쵭�6��PI�yfL�b;g6�,�s���մx�
������un��	���kseⓓ����;�l�Dǯ�L*��)�O��CT����a~?���(��WJߓB�_#���x�W3�O	��r��ܗ�Z�h�_�DJ^�
R�-���}���+��qru�q*�TU��V
�5NϽSi����x�G�10dgz8K� ?�|j��g�LK$p��*��vprX�'��O�[r�%���p�DgŌo�����\V[�uI-�����0<�b f��� ,w�5���I]�OƼL
-�o�叟��_*Os��e����"�r���;'��]�]����"!V��
�9�`Z��[���ʝbV�*2n�����>ۼG~Y�eH�z�W8?��;�=�u�ž�lP����#?{h=�T��I�{�o�[�$�#6:����o�qL�x���
г�`w���6��y����xD�
���e��G`RAW{ (,��Ɛ�%�䆸f����Z��\^������sɀ�;����߬�2C�YL�h���s�z�r�ZRxkE�6@��7؛�_����,4H	8�z���0���#�����)�
ɛ�T�Kk��I�J,�oYRm���^ކ�T�;�|0���~1S����	�t`+m��/��`�
����sC�3�Y����5	�Â"�5���&�w2-4
���^��j	e�<� lzȃ����6x���x�f���C�����3�R�ߨ,���=�2$b$^�P(킄;���?z���+��1���3���8��K������ݺ�R��_�:uÆ+����1տ?P�9�O�C�_#�e((�H����}�@�-����ػ��en�T}go�Y�p���f�M�
=)B�o�C��(�n0Aӝ?-bv�X���2�}�w�qK�"�����v����O�.������3��3�;ڞkP�1*�J�0�f�`�u'Ԏ†`��f�
+�>2#�jt�B�u��4��rE0�(�x��?brmy���@�n����E�Л���Ή�CL�^�	��v��m��;�A��B�	8�R���eۇ ����ۺ�뤳�a��6MZ-bثu�+D.b�BC8z��O3�Ot>xէ�Xq�l�n}w�d��
�J%�5Y�7�����b艮�m-��z���z�-|�}�������w�ʫ�U^�@ٻH���E�T�������IZ�x<��X�xH��`f;��ݦ$e>ڲ��H�q`�nr��?z@��9�����ġ��C_���uP_�R7k�P������_pSC��R�f�b6Ra1��O!��m�o1���#�p!#�USH�вne�x�)�[�E,$(�X�á����R��q�X„�8��(+
u�{ܕ?g�,aq��=�WB�D"{��\�����!����&z|�uu]k�4Ke�qr^ރ[�ۥ�(B�QEh� \`ab%f���EK�1:���M�FG���G�E�-Y�:���I^�-��J�z'�9_L	U7�0K�B*��7�����E�����6e'_�Z�\�Y�,'"z^A��|�t��D�%�B�ɧP�S`��q`��6�Z��F��b�8vb^�S߆�xt��p._���=U��G�&�U��J��/B�k����z3O)��$pN�n��wbl*p.���u�GͧԜr��+لF����|����W����+^`eӱ�-UyUm����9;������S2�Y{5�鿪��P:Ek�ʄT�v�����-�ES�e�
��ky�(��&�=��Z�/���f�<�Ԛ��-�Ffr}��/�)�=
ϖ�7\��U?G�y:�&勌��2��ޝ��D���품�$<��Kz�ߪ��7l�$���~�"]t��j0�!5��.��i�e���~u����:풓Yjg�/G�&�j�iKԺ�%F(�;	�)q>!�]6I`�����#�2i���x�����~1��9[\�����%���u�x�*݂
l!X[������Z�MU3 ��zj! ��5��$C��Z�L�7D��b��/�ب�ڬg=�����CE�/�`x�5WB�=.d3`NC�`{��#���]s8UX��$�or��Q��{5��1�����)O>'h�X�Q�O���
�-��T�Ȕ�0oD'pp���2�z%2U�����.-��T� �H4�BJ���@��{��*�L�of��!=��Ft��*A�Gm�4�1��i�4S��j^
h(�}z[^_����o}��	�
V��@�B�q&�։�=g���a��_�Nk4�-p;䕉��!��>WrÈV�ە"	ƈIK�ݫ�PO�,�kl#E�T[��>=��Ef���� L-�nEK�:��,�U#z�BHi�9Y���
Ј6�r����
���;�H�/��ExʫD�0n3
��Yk�F�I�1�s���Љ֬D	�]w���N��&�w9q�T�	Z�سJ,�Q�=�Y3����i�4�[����a�i	`���� �E�V7B�� ��Oxb-��8˗��S���e&�C��Ly^���h�ߩ]_t-�)�6�~C�7]�F�>:����|ډ�JW��@{,�r<+����L1�r��2ع��5�1�#Ji$D�`�I�V	}
p$�n�e���[��û����t��rq*S)��>r��Ȋf~�긂��<�W��8=���sį����ά.���J�ƒh��Ә3���f��x'8x�R��^��P�n�]�nh�m��ݵ���*���*�K,wq�l�fj��IaLR����{�$y=��{4I�#�tF��1�����ծ�{���KaʢO�w����k�@��v�o�{�#m����X��d����v$�h�V�@��^�y|g��YR�����P<#�_���_��Tx�7�M��6fe(�$���㚘OPe(��^�ѭ��g�����_s���c���?���3-n�x�����'��;����+�lUܫ�\>�ͪ���J}VR,Qή��!���TJ�(��X��Ng劀R�m��8�a��93	��@���V����o��$�UM?[�)�>���
ί	�fڝ�Tq҈�rv�8��O�H>�0�ؖ&�,!���{>�J�r�4���%y�� ��i(�JkFIC\؊���d�22�^y.��{�����px]34IR~��\���r��{l���gd-]���dlU���Z��R��D�ÌمvR�VF�W\N���s��b�H��C�Î��OQS��L�uXy�@��>�E�G�c���
����H��3�Rs^����4tRq�_^o�X'#���M�m~xk����LD^��p������۟��O{��~${�r�X�;R5r����>ko�:}\���M���-�s(F�N;P�|\�!����S��rz/OT�b	��>EcXm��kTu��'bR<f�e�F�x���#Ѻxq���7k�r|>
c���Z���՜�E;9�+�oQ7���d�_cP��5��N>�|�ʛ�~O���4qĘ��u{n��@w��`��5�x�B^�{T�̉�>~���*���A��>`{����I�P���r�xiۭ�Q
g@��7`�=�`.�@���2,tk ��j,�Z��pst;y�=�,.�u�� �}��#-c� K`�H�=��6���@��2�wf �f��x3,ߍ�n�G0�c�b�@���Bľ+��kbi�c�R���P�-�0c��k�R�?�\|�x�ƴ��k�Ψb	��Q�Lc%zQ��x�
$��ؓ��Q�H�IlJ`"}5ef/�#��y�d�l�N��2gA*ڈ����9fC��,)A$�d����ql|�I�Y�tz�)�*`�~�Ȍ��_��϶��B}|kA{��JJ��*��`T	(oe�D�(`�� 5F�l�Ҙ��X$���Z)�	S9�``�1*�1���@X���t���y�)R�v`>�h�:Ţ+
��V#6K�ΡY�ֵ���--.w|@�B|Hݍ`A�(~��$
�1�pba��@FP?��nO�ͬ8^ �%R�\�T�5Z��`4�-V���t�=^�!A�z!H�fX�DIVTM7L�v\��(N�,/�J�/t�v�0N�n�q^��~?B0�b8AR4�r� J��j�aZ��z~Fq�fyQVu�v�`8O���b�Zo��=„2.����	�8I��(��im��4/��u?����_=���C(�x��������͋'�#�X<�L�3�\�������������������innimk��������@FP'H�fX�DIVTM7L�v\��(N�,/ʪnڮ�i^�m?��~��@FP'H�fX�DIVTM7L�v��C��>@�##�,����Q��c�u1�{Z!��
݉�6G��/��R0j9���eJg&2������L��:��o��__�L�#�36�ˤg
�<��YΧOH[�7�������=�Fi��}>҆���3��Ü��:��
�1g��f�_����8f9���0
K��8U���=D�#�6b��]�δ/x߼�d����q��U�,�"�\�`	�� �L�03�K��?}<�p�����=J$�5��塌9*UԨ������dG�.��@hN�DC�,O��ndjk����DovP]Ω�/����E�X���_�s��h��WRlr��M��*҆~�c'd�թ{��5{�N*ӵ�'9��R��P�����w1�M�5��	3Yj'(�v<66��pW��_��̔���\�|X�����e��l�(̘<���>��t��g�c��F���u�vݽ���G�&罖�����ԥ�]�S�
j�6C��)ӱߟW�}&}�:q��eMڋ"'P��G�L�٬��y��Y0��X��3*��9����J�Y�Pu� �����V��i�_a\9�BUV3q:A(嫆x��J!V��̊/9[QT�i.�������(� �?U��~�U�?��G�C�8qY؉z��+HO(��PZ���	+a�%��,��tw[>��$�c=��g˵�Js�~�]��ɖb�����bF��l�[��&��4����6CFy�2��>���iI����7W�KV���)��Gь�>�ì�#Y��g���ʉBc���{��3b�x'1�^�I���<!�G໡iW�=ϝ��^�S)	�'_����}h1}k�Џ��jӈ��	�h.��xׇ��{�7�Ay"��8����yS:�ƢW�����]�Y�Ś���k�ѕ�+g�k�M�x�pl���w�=	q��k\~.3��Յ&˂:{��P����q�Ď�$O�2r��|�c�6P��
Q���즽��c\�_dk�^�Ӑ���,]"۪�#�B%JB஖"ʂNa��$i=fe�
��^�O��Főͣ�"�H�rͤ�Y^F�<����yAI:r/So3}�
�M�.�ly(�†�P\�"�!��=˝<_?)�������)�����R�2��u��+����wЮ�٪x�y0�t|�q�cwo��^���|���5
7])�ts��A�q-ǻk ���4fl���cAv�:e���W�����sR1y���:�8�BF�n���{T7$c��6t�
��߱\�I��V��(�s�pE�AIɒT��¬��E�U�>,f��D�)Us�'0�s����n����S����Z��7)o�e�J��V��2���}\��hZ�⻓�)���͕�Qr�F�`k犰A}�%�e��g).J���� xG&y�R�Uk�gE��t��
���|Z���vuuk8Ԛ��v0�6 ��Q1S����SfD��Nݓ}�X4��-��r����Q�Lg����D��p�c����1��8Kt!��
�x���߱\��N��a��߭�h�<6�KK}F���4r���4uԶ�
>�p���/��Χʿ��E%$�,�=��把�n��5ܑ]�)Ks)��gȍ�,���\��El	*#�;6� 4��
�Ky�U�p����~�#�wU�ȳ/I�o�DDq?�Ý�W���w�^��(f��<GW�����P������0�\*�/U����cLe��I�������i�*I����S������z���E�\����(ߥe���
�wY�g_?�BƘ1����#��M[����*�3�2tPI+��@�0x��ތ޽W�_�8��*$�X�v��C8��v�l����e)�ԙnY��$����谛Y1���~>Ȫ�x��I���c~D#,NP�I�'��q1�%�o�޿�v�\hY=���J�W�&��C?@�Ey�C���4+��G���_��-��8¼��`�����ء�
�"���Q�U䄷TK���B��T�Cϒ٭��d$�\��w�������Q^����Qփ&tEl|���Ԛ��@installer/dup-installer/assets/font-awesome/webfonts/fa-regular-400.woff2000064400000032430151336065400022361 0ustar00wOF25
�,4�IyX?FFTM`�Z
��D��Q6$�T�6 �U�+k5㘥x�3�(Jiv��?PC��]�@�KT�7�eU֬i�6�Ҧ#p.5]���8�C`ݍ�e
�[��ǽ�c�HR$�dط��¡@��n��X�}��P�1^Nw��NۧؿnI8ǐ��D��C��	O}���h��9X٫B��y�A�n��<���V\�-�Dq�\`Zi��Y9*�Ʃ-3��~Ӻ֕�v�ֶ��}u��5���<%�+.���'\!��*��Arߎr‰`���:%�>�/��6')�D8����3�	������TR�c8f`>�˩��6��NR�`LJ����\�����W�j�d[-ۖmJ	;.��#\�k��{���3������.�KW2�-ݥ�X@�҆gYӖ�Z�1??��Qr�%��hot�_�U3b�^*S�1��^�E���$��%���-ˌ��qa�z�03�0aCN{��D�
9��R*�}�^�\Ѧ���9S$�=�BWeG{������*"
�g�?d[�^�=AA��f�v�,�~�ɛ᎞�{�Aj�$PP�DD��@ �f,!�������Q�/@	9n'�,w��˝^Į�;��.��lf�A���2(��J�}���$��,�C^0! ؔ�"�iMGrY@
��c	-���>��nγ��\���ן��Yܒ6��	L7��mw�_x�-��{��xɥ�_a����
7�X_u������n��[/����<�o��sGwbg���@��8��M�_wТ��4�o�+�8���D�e��5nxl��m?���ظ�mڎ}Y��O)��7O�]<�ͻ����?[�d�;/7v���qf��/x�3����/.r�c\l��Z5�J��y��9��ٓeY��Y����q�4o%)�����s�L?.��w�ڞ�c�ww����E´V�D��x�a���d��&
�=T�5����vDc�%�Ci��<�b�88o�8�� !Ǒ�0�T�%���q���ع$Ə�P�Wr�]���2<�9bxM��Ŝq9RDb��|b�
�6�n'ָmK
��9a��&��x��tx/�(b�[�b��F��/q?4q�D�R�ݞ>h�����X�ګP�<�-�{�<�u ��ʂ����`�QT���+��뷵xE�q��
�`u��}Nc_�B��Z��RA�~���7io�����i~H��N�@��E5�:���y�@�
_�S�b��k9,��_��~�N����?�WP��sW-M�4p��c�cnώ?�+O%_ЦBz���J:!�����f��`�$��#��0��ؽ�,AӅL�6����d}b+Ɗ�kjFѮ��.!�+:%c�ÈP��$"��&$������#�{A�2I���hL�7b9�¼�\�j��n��������7�c����o�gì4��Qk�K��������2� f�F��
�А`ݣL�׈w�#�$���Fv쾴_�7�8L��MhY���	0��g%�*N� �Oi��0"g�l`�
��v��jJ���;�1F�F�?E�7A��걁)�X�	�3�5�	��j��7`���k�_�U_Wn/�F�`��D����5���@>��e)���-�8fdp�P�G����G�ViԎ�}��~��>R=z�����<8�
��i0��a7k5`���.oq
�S�w�zj&��9VB�C�VBMi��'�4!��B�H}Ɓ)
3E�Z���K�<��Z�7�ɸR�������m|��-Y��Z�\E�S��I�A�a�c�
���la�N,(yĭL� ~�Rե7��4WI`�r��eƭP�	!��I�Ԏ���^M�l| �0�4�n
�-���h�J�6H )�.dd2�|�W`�y����x����S�`��\I�"����Ա2�B!�����.n_R�x���e�����w�4��:S���—�ݻ7���K}�˗�7Ƀ㓺oz����wC��^�x!U����8}�b��\�t9�0�F�����/'��7�^9yW	0Ҽ,h��N�T3I�bBi:��~��z�Xԟ�%��kzo�W����I9�?�AXuߛ��r���SL@��c�\V��4�OO��;���y-t��lN!��!^`�*#*/���Ʃ!74����	m-m����tVe�%9�X���*"�'#�M�"��m%M��:Y��v�h:�����*Ĥ-�����3��^����=�K�a�h(bB�$w7���&��KMI�:pC�u�Gvh^~��)kiͭ�~R�~�^T^�L��$ްfq�[?H�	���*�����L�;A�|iG���B�$���	�V5P§�hЬqÔ���E_�/��ND��6�yڐ^���4m�-^��e�?��>��Jչ��hk�A�m�8����'`$[Y^u�J1H#`[ؕr���� �CQ`+n��A|mk�mN���n*D�t)H2��!-+�Ϣ����S������|�<��̂`�����x�Hk�@١��6C��\
�^�rן�"ç�ng��N�~xى��e�;3ۀ��3/��&���$����_U��yE��n�����}�~m�t+/+����<���~$����S8����������>�a�{Ͱ�����ځۊ���_�MjB�C�l쒡a�b�S�M�L4�7����chߦ����b��I�p�X�7^c������f�k49�3��7�CQj�+[�J��~�k�D��8���S���Pe�5<ED!�<�&g�66�[����2bD�3-p��!��T4�Z����qj~3�p6u6_~��"�3h�	�nK0���cXp����9u�J��EU4�*l��D�h�>ے��B�`/��ה��4q[x���,i-��ʱ��������sڡR��!JX�[*���I�kp���fEaYkK���6U(v���[� cn_*쳕���<b�rb�h8b�u��9{A'�����I7o�vO��υ��ɮ+Y��F	��w����(�3G��*�{Νw�g�/�j斕.�v�33O?�έg��{�������y`��ӛĵ+�t�Y��{Ɣ�4���:,�cj�.�|�#�K�˄a0�!����6\���#)Wn�L����r�z�^*+�U�uF��̾e�1N��kX�ӲK'w�<�� N�����j����2����&�h���B�C�2,�ޔ>�fڦ	���텃A�ф�-;��޻Ų�kڱi=!�>�ڱ�l�i�ʚV��f8�Ey�d�N�,�ڡ�����;5M�{�/��ء昳����֌��蓽ư��J��ԉr�`@��hC��r��S&a�%KQh�@��8!��/2�>�l�al%�����p���ax�ݲ6\�j>ڿjz�
�{+�W%%����ߎFi���hŽI0�\

��qEaKH`yՓx��Ь�S��wn~'n~]���I]r��ENL��7��
s�1ĝX9��Wk#
)�-���Z�`���_C$Q�g<�h`�H�L	�����4
�/j��+���C�zzǥ��X�>����G�%}�RYq��-]
��A	|�o�'�4�8Sx�e��k���x���Q"�C	:_���\/��4�Yq�O	�v;\3�(�f���?�6	m(.����2��!��4�͚���O����3!5�MkHI��Z�i�Z0[��#��w
�5K�Y�˹�"n��X����kk��H0f�&������}ȝw���׮?ɘw���{8m0�c�DB�f	V��j����\�-W��>`�~� ��ִ��	[1�V+NB�K�Z\�Z�լq��P����#�K���U����r�t�I�Y����{T@"č��N��-^\�����R���1�����Di�Y^����[�K;�ɂ?~J����+А&1L��N5%+Lt&���1����(+�kS�S\��Ӫ��i��
�4�d��1�������l
?D!DyZ��U��[1�M�MQI�f�d��mU��FF!�t56��!~$�Կ�On���G��$�n�
�G1�����̼G":�Y��=�����+����
�!��y7�M����T���~\��s>^Yj�Ҽ��ڗ6#��}���O�}k����u�P g�����E�+���(}n�ޙ�\�H_*{ji��x]�N��rۢ��X}����ŕ�
�9=$)#	�O��T�*�ޤ���܆��L����Ż|�c]�t��8}L#�f3�z�i>v����%�?ِ#�����ǵ��ucy������;X�t��ɹ쀄a�~o���͎��\	�5A�Q���ӻC���$l*.(���ʿn	g�"4�׎~-�>i�p����`?�/[�k�N��/N�R5�e\�&�O�)�ڥ�q��i��WG�e�|l=*�gW���]k>�
f��2�~V�|Xl�����>m4��X���ru���3r��c]���J�h�|�O>�~�6��6N�ŽS7*Q�=��ք��NX'�Pq�����������ֹ0�!&��+`Q�:@�~�+5�$��D��~�\�a�oQ��ܣc\
��]�	�_�V��R*
��K��"����W�K�yX�9�h��-�ղ�6�8����MÞN�C���,cE`+��=�a�.Q�2�3� ���<�C��U���2��T�J��P{�.ƹT�\�?�\���‘T-H�m%�R�د}_e��a�8��Ҭ�p�ui��I;���b��*R�g]��wwX��i�ſ�q�$�����!2@o~�y
�|=g�<��_6ɕ3!��^!�q��$L�q��$U+KΘ��c0�/�zUJ)K�����[�[uS)F^ҺW����D��ز�#��cO�Z�fr�j8�r�1"�v�^�{}aU�nY��K_U��\
�	"6���Ck8'V���G�7�=&�jw
�%h��a#g$ދ�;��Z:N�'X{˩�#sa��E�q��7�u�Eb1�'�vl��+��{g�]��w5��W���UotWI��—a����0rZ�b��c�p�e�L}������:�3nϹZ��#�����6��jD�����IB���	%��0*

���o��w��5Ea�����v+2O��UD{��qI�<�c6��?�O0�̠^t��[*;;M�l�$U��ᙲ�f�9���GLvۥ���8��4B�Ȝ�d���<�T��0ӆ�A�m(�p1D��#�3$��O�v2:Ь�q�I�Xo����Z=_�[$V7ΪS���#`��5�#[�� �/�qR[�M��~d�	3�Pm�`�ʆ�"�c_r$7 �U�5�4a�4�����l�,�Jm�k���Ȱ[�I?�7x�=
!�@ʜ���p�2&hkF�:Ȩ���o�2�zK�g�Tܶ���!�U�D��	X�N�b9ɴ&�
����i�7�o��	���M��F����B�zH?����닂��׳U�q'E����T���
Culr���#�
n�{#�wQ��<����-o��f���xc��A�g�V5Ō��̮���.s�iwx��"I��.�EbL������`��|�9�Mn;�|�Fw�F��r�
��l=�A6�g�����s��A�כ����A6�]��s����������2]���;�:^�>�'z��ϊ��y ��i����K���
kAНUm���g���gN��H�E��c̛�Վoj]���A�)M}��h�՞& �h����]�=:�t���mzS
&�=-��ot�L��s?���WA0�c�sAPR��"E���Ӂ���>8:7:�{r���pw,kGzC@��({�IOǾ!OC^�ļl�׮q{���ɶ}e�A�'w,Y��t��j�!]"8����h{n�.�nT�C�B����:��
���ބ��A�^{~ԂPk��@�0��tհ,U;��7��MS�.O4�@��_�j��(صې0����ނ��y_����ך�p�+�z��^{�јX?(C�C��xY��YuD����}b��K�y�5-^7%sL1?���]���w76��zV*&ua��-�eʼn	YSw���f�͌U7j�}�(G>0�c�@���$�c����q�k�ߡw��n���ʃs�����XŁ������R��56���#�<�}�BjV�خAMޯ����$�t�t�bB�='c����1J��}�C���X��=z4"��0K��6ಜ���Ju�oLQL�,m�Y.~����?K�"@h�<.#����SҲ�K~�s"���o���k��=�zf�Nn���y>���
�Oꥋ�c��V�����#�|��bE{�?�:5�{��p�ԁ�6[|59-r��AR�y����@0�E��ر�Ћ���R�$��.i�h����ﬦt�����bSN�L���pӪ�_�oy�2���r*��8��"@D��xJ��rUQP��G�H�t�t$�5"0����Z-�H5�_�p�u�8��AB���Pl��۴?��j}�g��pײ���?;��;	x
|�,."���ahע�Ę��h7�ZEBf��GE�ry��L��.����I����g����bC��}� t����g/�}�,�*�bIod���4`��LK�L��K0��{Ԁ������|)���Vg��6Z���5GGbHS8�����8w�����d�i�V�e0i�?P�P�b�1B`��C$5gO���?�.���0EF�����'��r��>k��K'�s�iR�]��Ϝ\t���C
 �As��$!��k�GSq�M9%�óA�v�
�9�&l1�4R@��������4R�#�ʋIj[NH&�]�Y�#䎘�!ɨ4���R��~X�U�Q�>!��yGC�é+m��w=ZA��
VC��Z��{P�\�
��]	�t|�Kl�Hv8�c?�PB�P���F�V�����ʂ�FIT���IJ
`�ډ�����e0�	�?@����D�b��+"�$�bB���Bp�h
���苔���+��4ob̩k��.25E���&�)��لBȑu!�q��rO�ML��鐠]_c�q�pt#
.w�Nz�l���3e1�V`[o��I�-�D�P��PyE	�����&/?[�=#��Y��U٠#ۖ����[֒�(�Weo�ܚG_��&�h�z��P����(��Bz�N�ӆo�j��f����6)�<$TwE@W3��dgP��o�hǰ���?���$/V�t�Q�;T�j���Ы�~Sj���΁�~�p=��<V�N�&��{�����C
���Y7u�uE��.�ti?�
�Oǻsdܘ�嚦_�}����۾�<������F�
1Y5Y�:�Ώ�2��9��ȇ�i����k�"KI����Rdhn�؟cw��Ml�6���K�^t�If*[+}�9�0%%u�(T0�8/��� {�?{B4����1����<�<+5c4���ۡ�8W��b���iA$��$"}r^�����#7xab-�]�i�bq
i��;29�ZA�� b:�nR��˿�&G}�I�:|�pO�e����=�I;[+������C:��;	���{̨%��L����=x�;h/���g��̓��z�{*��MK^4�ĸD~x�� %h>|�'��N�nZ�I-)�D(?il(��\X��IU���h�Y�z��3Դ��o䷬k��9Ѕ]�q�]݇JN�>�#�e�$�n|��$G9U�Y����[����Κ)��Y��̽"�"��~0.'�k�ˑ�@K�}V����5Ɔ��-���?A�$������n���7쟔ޭ4��Lz�_���go˔�Di}��,�D�����i_���T4��T���796^wOL͹�	*���n�s��������8���4�h_�
�B��b�D��h�1�U�9UiC�ai�*h$��%KO���ai��h[W�{����=�'�FT�|��	��K��U�(�o��9��պ3�h9�Q6f���(E7�xʱ��ߚ�O�=��FIPMޞ�,ŵ��׉t{��,B�J�����~
D�>v��H]fܕ�~�;�����²�ѷ�nD��u��ž�� �#�z)<W8�J��%�,���,/_�8�1�jE��l[9�w۟����1N�Qa���f9�eG��H�}�qLf���F�dݨ�C~Z��|���#�Sg�Z�!�U�
�\�7k�B�謭�Ť�G�
~�
�}bOl���k�_\8l���rR��k���f�2��L.KX&D�T��?����{K�4oXw�?C�vr���/KZ���q?�L��Ol�T}�!i���D�
�A=6Uv��r#�}uܸ*��$s���&�MR�[�0
�#��#�ۻIs��s�NB:ZC矝��۰���L���k �ށ�\U	�NRO#�tSY�;
�=;����E����U�9&�h�,Q�D�Xݭ�d`����)�Xݟ��UQ[��@{Dt���Q���ioq��}���i����l�?G'dA
^r�O�HL�Sb��7�@������K
���8ή鮱���� �@�����-��c��a��Ay~u��g�A<�΁�R�HWDtHjN�9�8��*0^:��_Rs>e�����&�v�Ry����&V�@�+~�Ƶ�vdQ@��Ѫ�~9�[��2O�j�����6�Ddž�j9+�KgI"�?�ㄅq8�X��)n
�$��tYKo�R(���j����<s��H�+ԗ���/�L�R�E�%<���KSW�s�W�㧵��g���=�����	g�Ai��ro�@|�H�y'h���^��D���W�f�$�/�9��dU��Y_�hk�]��+�)W�n�O�8�?5�/���W���+�;������se��b8^����O�+�u���w�y�F�3�b���?r=;�a�Ç�a���?�g�W��Ⱥ t T��ER�T�]�4�HԒZ�9�!�' PW� ��p��JRLй�{�����l|-�A���s%w!
`�Lg��z�ǂ�O�Ӗ���,�V�3O�tA[3�Ҍ�� ����;��bmr=��d)�2��8�&�D����^V��&V��^���s!Rp�QK[��I!�V��[��F4:�Xcʓ��fq�R�GD��b�m~����L��������ȹ�(�eh�C���m|��i>`E`ň�/"�&�b���h���E�a�@�4@v��:sv��כ�<
�YC�J�T�0�w��J�Ӕ�
Ë"���G��ޗ���B��L(6&ԅ��U���0u�Z�ј*B��_tDj�މ�@��#�‹��כb��VЊ�$I���}���z��z��aU��7��T6����9��Je�Ǒ��-���>�}�#�� K��$��m��;��czC`d���G��8�Kk�v4+��O.�/)��+�����j��E�#��J�����]&Gݻ�<�W��ǹV���ٽ�P�E�=��	 ԢA�쎊U]�B�R��ܱ�|���i~Xc����	�]+F7��|dh��e`�?Ka�VbI���>��z��)6���I�=���KUV;��
��k)���&�[���#�����wj-�˓Z®1ʨnVә�+/��#W�j�|����E�
��k�"��4�ʴ�����cc�S�)fjף*j��ݨ7�x*��;��qӼ��JD�Vj��y�_6�W��:<7�������/�L�6��D�F�Q�F�W���X�{ܷfp����J/֯�À����a����}�`�� 5�}n`"��>9%{f�~gW��|CsݭG�Ӿ9�.�ufx�f���0ɒd�n[-�;�	�Ox^�M�H���l��^�z��O��0�F��VR�-�;��~���O��kz�P��M��A�N��.��x�9D�t�G+�mU���a��,C��p�I��!H�<��shh����$1M>�2^�92Ϥ+�ɨd�a�4}��.ɴ�R��q<X
Ta��q�������U"_�F8�����L5AL6Qo~�����H��c-簟�?:�sz�$0�(R�����ű]�J�"�k!���%*�r�dw��[Qv��k�Θ/1�$��qC�d���͖����[@0X2G$��,�Y������Eq��nw\qE��rS]蓘�����cf>t�2]E��v�'�AM�,�E���6+ᯀJU�T��`jΨ�ʜCWti�{P?������#J�����]��r*Ss`������^��tR#Bhyu��SR�D�d//���4l���[���k�k��<{���pm��y��9��U�,!]�,�
f�7k�1��;��='<�wO�`�:n%Gq��t��PC�S�O�ug���m�A��љ�mǓ���2��ɉp��uy��}�cT+�f���>�N}�r�d
��Y�˳L�X�'9�yL�f��V�>iq��{�zOl��^�D�6�W��r�Uذ�!�D��)��Ƒ��rs8�vr���{���dòh��`hN1ߖ*a�;&5,�k���GJִ-O+x���$���(����0�?ʷ&S$浯*��=c-�u۞|
1d��Җ��[�}�bp�,�p����/,��2�|�7��g��)e�7˶��$�����4��Y�����'B~��f�.W_���⟚r�g��~~�����5���O�hF<��>�����z�����+��t�Xߏ7����8c�Nr>s����xM+��Qj7W�K�M]�S�_����z���Q������[�2�-^~^+�co�$%9տ��/3o�P<��t����X�<���t3zrYZ�(�Z$�ä��$�/�r����|m&��a�5���+��$���N&��ĺT?�\���-1	�Tl������I��Kd`�b�񠿰*r�>X���(�6�`��YW>����r�m���J ��Ko�?'���m+�Т;���6��p���0Y4s�V3�,�&��FQJ<�=9�֢��Ҟ�_\����[0�O����<~[��l}	��y���Um<��(3��[Kks����gƆ����������5��0u�M���|�@Q&q��e���w`�$���P�݁p�C_J��
n��1JW��M���<vC�b��j�<�EYu+��`<o&�j����{7��m��q�����U�A���m�3ӧG��q���D��rի��z�q�`��r�vx޷[,+=��&���u��ږ	5�
�f���<��(��KѼ��H��D� ��432/Ss�=��\W�z���ld�gi�(�2;~��e��z�vB���F����x����1��~��c�?��D�c?��s���M���kz/9.��Î��[='�̴0	CfT�&`���
g��8
�1Wߒ��B'��N��$ ϼ�迪�Y�Ҙ��d�:D4F�x��b��k8���JD2���_D���QO���_�Y�+��?f�E�nO�F���o�k�s�B	;Q�x����������e.��֓�+��۷ݜ�/��,�#\�O�N�W��4��DV����b2� K�:���h}�+���OC�������CB��>���rh��x
i]���>I�?EDy�z&���Z����{��;фrӽQ��/7����
�����ˠ_�x������i[2�=�� \'6h�ⶨـ7�?fǢm�X���	t���3?��6*�Y��h[l������8�d:����ü�뽢�>4I"�y�9:GB����`�rSڪ'��n<�<�#v&�tg��S9�&:��a�e�j�G�&��L�I,!
�Eipa���2x���8��|K)~��D��2�
QIVQa�j	*NM��JPD/QY
�T���C�)�~ƅ��.w�1�!�)�1�(%�\�ў���R�
�]�T��r��3T5T��7���sT��kC�i��Bx����O�9:p�B��:���R�Ĝ�^|1���7aJ?��]�z�e����/;�X�Pa'N���R^X�m����/+vxZf��y��U|6�"hF��Cn��&�	.vt��2���N��C}�l@���tLrn���)G��m[���غN�3^ %Zl;臺`W�n��B�h[e�*�`���LwD&ND:e�p�Y,7��'�2Γ����r8L�<��ڦ����=��Γ�؟��Yvk���{�Uq��9�j�}��B�L�Mj�ՠ��py�Ad�/��B��OB�*CUӥaZ��z�>?�ʸ�J�|Fq�fyQVu�v�0N�n�q^��~?C�08��,O zO�*-�3�,6����"�D*�+�*�j��Z�:�z��F�&�f����f������z�?�����tAkg�k��{�LVp�V�mXD����`�չRBs��3�>�ߟz��7�J���g���N���1Pɫ=zI	s=��u
��`}�n
8ml�.�=c�<y15�A�s�=B����Է/e\��j@+��;/����`�
�gd)8����4^���(V�O������E=�%�U���9av�-�A�z���%Q��j�}�,�,�:�0��H�n��e�V>7HA�J����kli�b�C���Z�H��5��=�4�@y��+a��E4��ax��o�\P5�\Р!3
��θk�H>��P��z�wdZ�?��M
�+k����bY��;�aU�ó�T�\i
�,��TZy}r��->Y%��\��=.�q��tc0�E@��5��6Of�6y��8CŅ7eP2j�N�/C��+���pD*�s�s�2�h���@3���,%A��;��[4�������¶'8f:�f�]K�-6<F0g�o�A..��ݑܜ����h�V�Ǫ`�����!6z�2<?�Zd�
�����]�_�zs��[y�0�&�xs1����}�] H���ĎU��C�����oǕ�E��p�"��7��ЙMu.�m��P'-��%'o��r�wA�r��0�W]%o
?�\�W�v�����F�i�0��3�-�|�+̟�L���I	sk��ǓSa��9��
��zB�VքP�D�5-J�}%�installer/dup-installer/assets/font-awesome/webfonts/fa-brands-400.woff000064400000245124151336065400022115 0ustar00wOFFJT
�XIyXFFTM0�qqGDEFL*�OS/2lO`B�/cmap��j��gasp���glyf�0��$��p�head5�36��hhea5� $5�hmtx6���}loca8�DD�.<maxp;� 
Oname<�uu"post>$.���x�c```d�	�9`�c�U(}G/��x�c`a|�8�����ч1����Je�dha``b`ef�FHsMah���1���0�4ՀZ1.R
��kZx���mh�e��]�}=�<��:��M�u�����?(�:��n�a�$��=��X����RQ��<�9_� �e6����s_��KZW���O}�/�������q�t���r"v;�Y�ER=}�q"hK��~���_���V�NC)���\*�Ŵ��P1��
������j��S#]�{�4����=8��q>��3x>�"^�%�)o�W�~�㣜�k|�o�4Y&��HJ��B��v��o䐜�SrZ�H�4I�ܔ6�/�D�t	 x-��ら�����9�<�/�r�KW�j}H��uR7����a<���w��aC�����1�M�YeJM��`6��9h�&i.�+�����8~q�#�_��e=>������
*�e)���c7��	j�&�K��4~��39�z���c&/�q��ͼ���^>`=Ns3_Oy̑BY+[��d�$d�|-URg=~��4X��֣U~���C[�� #Ȳ��h�j�z�����X���l3���x���?=�%����@|���
�}�~�5X�{�+0�[�K܌�X�����������p<�\�}�;v�,��.�t�
��<��pn@��`"�c�m
oA>�y0F�p��ȅa�~����
�@/xz�K�'�_cALb��y���)�E]P��YuJիT��Q�j�*QEj����U�wۻ���x�^�7��ey�^��"n����q����e���t�ݓO���+���3�H�]i�?����A��t��x���	�%Gy&�����}˻�v��nY[WuWU�[Rw���[K/�EkABhan��@ !y�#��`���ƌ�x�=�1�����g~f>�T�?��ju7�y�[u�FFfF����!`A8�
z	='X² �n8>�����{�0���q�F�
���#�*��k���]E�>z�/����z���z�r�(�)�f)2mZ�3
�$��N���?p�_����؈t�U�ݖ�.E2��%��*-����:7��;��$�W�2�Q�x܈j7D/��+�^b��ܞݵ�?���k��)�PV�����gF
�*�\�?�P?�G^o��߬Q����,���.wK���s���g���p*QT	�njW3Q���v��F��܄�}���ǨE��z0S+Z�Y��ْ�[��P7傺]-�n���(<$<�3jɇ��
���:��l͵�=�J�IG�f2�h؍Vq�0�M�
�&m������m�Vs��MF��5l�o؄
y�ϼ����립{O�vu��c�"Әl+Nˮ��lE��"�S>ѲT�=��Q�D��X$XT��BE�EL���bJ�>�\�l�>��\�`Ud�EU<���.ZÒY
C��bE�f*�n�L	+�9���HB�(b*!HaD��49HR�73�E���X@O	sp���hV$�f���P5�s��I�"O,�P��.��rͼ|)��b��ffg���w�]S�r���J���2���,��(#Q*Me��*����S�U�6bT���S�oIِ,>?ZsKK��LSCO�zl�>��
>?v��Tw������!���f�m��ƒ@��B��t��
�舶�.�^��D!5X�l� EN>�B��`��dĈ25[4�jQ	�Q	wא�K!�P�~��Λ��D���ǯ
c)�}�l��RV�0S�L�Ԛ����$��Xzd��l`�jPQ���3S$�τ�!E>p��X�#/*��"5L�*	QD��z(#�f�:���ͣ��b��5�řa��e�rC4dEQ�f��r�Zh�@yzH��hBq���!}Qg�y�m??~�
�W��"|Q"+�#�+`d|Κ�k�twx��OVQ��R!�Ud��b�[(��D�{���E?|�L3�P�V���k���2>%����u��z��Z����Y�R��y�[�����vvY��۳k����*R�D�jS{���b�U�yU��Z�(�h�?�ɿ�Й�/��:��"^��?�A�'A{p���K�?�Ԣ��T�fϕi�hڨ��R�.4Jcټ%�F2$h5\��b�Q��u��&w�f������Quj��t�_ȹZ�WJ�,��
0� �+z��#^�ǧ��g�n>�-���m�Ix�ac�%
�ν������~Q,䜂S�e�|�5����"�\�-{8-�5���\��喷����tA���B^h	B��?�ȴ�0���
��H�Q�̠7衇��l����W��N%�\6�Jw�{�d�{�u�{����-V��}��[�����K��8���N��_�
}<�#���
^E\���>���T�+��i�ΞY�N�@j�R��45Q����1�����\u$��}�@�T�'�	�pD��)�D��+��n�ë�+X�82Zk�ȱ$.��*nBe)T�E����h�U��$S(X��L� ����g'g'���%�v�k�t0L��W�lf�Js��[cϋ�Ǜu?�yu�\��"����N��e�Q�Uŷ�Q6�1���H��l30󧮮7�f*�	D�[F1N��)$�^�V�}�h��+7-]�ie=�Zo�?��ߡ�o���%���Y�U"��TE�BI�,`�q��P�Bg�9�?������[�M�=��@�,��WM�y �����%�}AaI�Ek���?�����o������j۟u����abz����P�x�%��KG��G���`@��8=$�^o�A��d��@�A�l	���EP�P�
Wi���� ����Ƽr�*2�Б%��J�7����t�*�����Ez�M�i�W�+���`�lnll.!$�l3�G�C��U��n�^:v#�#�j*��Ab��<�(������9�Z���9�Jb����<��P&���6KHJZ�)ZҤ���9=��ɖ
"��S7��{�?���qIUNL99�_��F��n��J�l��s�G��Br}�'�5�<�ܣ�B�3�Vq�s]&�{���N����@~>uR���N��	��S鿿MW�����<?��?�_W.�a�g�C�-��-#�Խ'g��Px=@�9�)Y��I�Q���T8�2�5x]�gAX�_�_Q���B��B�K��9�Mp����P7�	�bm+q��
�7�s$?r�8~���~��c_�?
��
z;�'�%ZPf�����/<����
_+�#�8���[�/:�����7~��`�=��V����'��x.������oz�7�zK��{^F��XB��.Ap�l*+/�����Mi�}�n��%����
<��I��c&���K�1D%��zK���n�ظq�������Z�m����7v���6y�ZM�6f�c"�e9��8+�u�E�`�4�[i6�m��:�K�5^�5LK��D�R��V�5��6���
�R�|����R��l�"ڋ��OӞ;>���.4�����%$��47�ߡ�V� yA�>�~��zI/�ɞ�����z��o�<�L�����z~�����~?���G?�1
��P�J"i�Z���	�Y���Z@D����	��TQ=��z	*n�`",1��EG�/��e|u	��O�;@��k�P�h�,/��F4�@���B4���Ւ1�j�mY���T�X\U��CR1�Bg:zJ�ԉ�ް��-��|�C��nu��^�����&�u�]�v��6���P�/#��z݋L&"|�}J�tZAd�ђ�5󓗌�3���b�p�­����l��0w��o���
?�q�S>%����qT�S!Zޥ/U̎��j�|Q6�v�*���J���+~n��<�\�W8�Z�P[J�4�v��Q�;������DH�K_�ts�/��g��
��T�}����ՅeaS8,�|<��}�q3/�l8@V<� �WE�I
#>���h���4;�y�'��ꚣ���B��/�������kP�?��� �X��T��Ho��0Q�m���G�=�۶��f۟���ug�k��]�G�l�[4�y[�d�D�bl
|�1�R8]f��"�TA9���2�_��ۅ��O_G*�@0�V��Ї�ڀ��������q"�G�*h���P�H�Hy$x3M�6��9:u����R��O�pl{%�ȃgk�F��Hӄk��xjTN�S��<��5q���u���n���p�o��Cfo�u�ל�7y���%�L�B=G%���q��큲���|�_���bH{��u�fF]�0G�9���"g�\���)rh�σ6�7�T�0/[���$�a��a��ZS>P�lU�QŐ�^5��y@'|Y�2�SJ�!E�T�8gR��Ja�	EzH���NM�v�d���n�ж��ꪌ��(Q��L�����$[��DD���B%�����3.R��I�d(��IȈzYC��"j	�֦��`�5�TҢ��T�s�7R�u��:4�m��i�h/�%1yץ�%�[��R�Y�H@��6��(Z �2�n@q"��L��+4�J��^�0�`��x��˕-j�
�ىliB��{��MoE�e�5�,Pmu�%��۟���R��(I@#�K=f&��C�@.�-غ�[�g�>���j��J�RdZ�eQ��<)�+��3���k��N���H�0�J�V��`i��b�����X�ʈ�r>'���Ij[r@�����WqK��&�a�0$Vq�g$M�C:�o�0 a�h��S񉞥�R�(�_���n�M�k��祹*�����'�p����g��@Ϩ���k{��K�$.��f��j_�g��
�����*��y��Ji���n���aF��Wv�'|��r�e��y��y=�Ź�H�Lm�����>�I�psp�|��dO�L�� x�'��N����DΧ~of㤤9�#M�YOc:�6��#*��dղ��F�s���־gJ��zD�t<�ΧX`R&��v$Ec�r{BsMU�LdH5E�Lx��o�m�"z}p�Z*�-d�c���q$�p���f�.����U����Q��&�c�}���,д��)�:�h�s�BV�	E%��)RID_�T�Q�m&��`�,B�u�W0M�ۿ��ke��8l0MW"K�X��b���LuA�9o����F?���<�8H���0e��|zwT�r�Q�=akG5[�_��# ���C5�~�F�z�U�s䚶
W�>�>�$O�i�c�j�Uj�V10rn��n"\O��.QB�Uu�����1��� �5�4�i*�Z��S������F� �p��Gs\'��uđ5cl��*@�kuQjJ܅8a�c]�Y��8�Uq��(5�гD�_f�w}�������_�4첩�0#���=׫+
s�3�
k��І�L���D�C�iVmU����s���nT�kL_Q	�$|�q����x���>!���U�
�p
2�0�:�v��XKj.�xM��ôK�Y�!�L�LFωios�WB��A���f�	F�K4�j��6{��_9��+�"�%k�r$�:wo��v�>*�ao�xӦ
�\��&��TJ�a��*�[ԐRɏt$TR��n��ˋuU4���]��e���/΃����G{�n�z��91���`K�`��M��9Y�!"+��ʾB��rd�_?/(�u����&^�G.4鈻��wk}ix�����̚���$?W��k߀��G+{O�c���
G:�#�ҵVo��ć��O��!�y���,�"�����>7��*�ӵ��r��p��	�'�f�_%��gA0��!:ku�gL�|Ӣ��)z��i��4������"W�~@�fђ��	,@"����*MN�&3D��Lk��*����#�Lˠj�i�:D���o�B��k����Ü19��
��79�-�HF�'D�4��Л>
z�.؂�{5��Ț
82�ՠ1��nXDU�]�l3�]�B���ݾ=�'�ܾ�� ,�N�hg�����k°оD?�,-�aJѩP��"�Rd4�n�F���zƪ���gly��"�sW�	�f��XG��5$R�ЮL�^S�b�1rԳ�P͚�c[c�Ш�2�@Q����W
�p�P��.��t���F��"b��q��i�'�6_8o���!�#v�%���i|}�Y(x��|�Ph�g�<$f=�z�W0�.���~���K�?�"��y�+�T��+�0���r� �7&K��Z)S��������F�y-�쨖Jt`G\}l�q���w�2���z�p�f�22Rj�P����ك�qH����]YA�oBq�T�qnin���
�w����}��Q��w�3�35���0r8U|�}��L�"ˮ��>�����l�ts��u]� >��x���!��S)J,5�'A����IZ��a� {��>��=����w6J�خ�[�#ꔲPo.1t��}����)�쁜
`>}
�S�'�ZPL��2|	O�%��d�V�T���Y9�,���Y�g�G����d���I�ƫ���~�o��x�6��_���n
xA<��G�:���gnڻQ��`rbw���'/�n�={�Z�`wϩ(�YW�0�;t X*8.CN՜�w�<Q�5[I42$A�ZM��,B�
G�x#Lh.�j\��p�cD:�#�90M��0U�T�]g2L�b�$�u�e{�‡������'D���{bl��OZ�jY������Ňtʹ|�4�g�LYfr;��u�v9��B��>�.}Xe����o���Tucj�W?��G����QcF�Ʌ���
ٸ�R���ᨇPt�-%��M�[�,K�쓣��9ح��z��8��u	�æf�����f�k��P�d���{��/�ZX�j7b[�mA�N㼖�ʲ2��2�2��;/g9�k��]��EI
�G�05��)��Gs�xl�a�A����զW�UK]�.��_\�T-�.��?�}U����&K��UU�锧��w��w昪�YU�-O�q:wϡ��@��0R�FI�	sw,�+��uzc���8������k}h�{��Z��_mk����ɍ�/���\f�x��_*���g�s�^�!#}lfm�L�ƶ��Ә�^E1�n_�tDQ
B�K
w}���1�U�G�RM�X�"J�N����K/0���$���2ƀ3)J�p��=D��/)�#yXY�,Rr�dZ�9�i�K-�q��� N ���V�^꜍�z�n��G���*~��_�������:}�]?�(L�>=�i���{�O�'��b��TpS�q�yU*�x���#�]�,�A	����g0��t
�1��ǃ�4ʾq��6j�����ߜ*QB�����2��#�I�ӟ_�`��l%lʷԞ���A��g!
}��}/���q�6�/
/
_�ps��M����&�Y�%AR��5� �#P�LX0ˀ��c
:I)��5ik%��[��r�
^)WYC#C܎zm������5lqT!F���hXY*�#������D'�"S(C��iÌxy$��+��W'�}�l�L%�����gDؤ�t�hÝNO�n��J"�i)��x&@�[�Q�Qu�Ჟb��0�}˒�`z)�ְ:���aس��u]CT��\;l�ޗQ�k���:Rm�F���?*�� O��u�d�hʑ(2
�y�j� ��ΜʦAT�����N�l�
���+W�S3�S����b��&Ѽ"V��|�P"�U����l�Q��c�����Hb���*{^a��%�?�od�ϐ�y="X�D<����?����袒�##��8�Ґ3ȝ�<
�������Z�?K�X���
�1V1L�[�4��:�@�YPچ'V,mʐ`D�����n�AmVT,b
M�^��tu��֦�Ll2��'u��齭���>�؜��P3����Ka���.�m*�0��l���1ȓ�l�VWM5ʠ��
?
��6�1#�0b�����v�M�R�S��wIq/hc���5 �c%\��v�OKn3�@��29Aq&����S�[�{U�7d?���Mo�kQ&.��̴�4�ğ��8kf1��OۅP�u�ܾy���ц+q�7��MU+��i��l\��i�u�[��a�To8n�+xI�⅙^�z�b5��Fh�f8~��F�h�*z�
�$���5M�V�[4�=(h�_���{\�&a�s9�n���q�垢��9�Y<��I�U,�z�Z~�g��7���_5;P����zj}�Z�"O\-�Z�w���Ƌ�K�l�;�^�rm��ѩ���n���;�\�ɖv�+���iv��S@E�������6�#��Oԍ@�)2��[ô�\c[��%1gv�^���L��rS��#q
9�t!3�С�8�z�t��K������]]�v뇲�$��)���\����1����
S��Ɋ���YY�YJ�#�T���D�Q�UkdR��k�VJ�R�lq�X�z��`��@���	o����$:�^H&��Q�ɛ�<��V�0̊��W��^��kl�@˿�q��mW�2���
Zh����ɍ�<�7T/�@�ێ,�o���~�����q�Ca0�0�g	�ՌB�U���K�醌��F�ᾰ�x.��g�Mϑ��Ov4��D�`�[�Ơwyo!t�.��j��x��f9�?�/P�l�i��`r��X��ae�vq��^���`c�~��j�y?W��\��wb�w�Y�#l\`Cٖ�=s@��r88��̱��4U��0d�շ�Y��ڝ�u�k?7'ׁgn�u�����|b@ǀ�{
��bY4��s]����1$[ְ��C��9[rU�vy��x	���q��,4��A҂I��{h����G�i��iv���r3��s�Y�r��
�x�0�gѕ�"�y3�6�C��<(�> |D� �,�S�����مi��&�\Cij�;|��Q2�!g���^���0�ˌ��]�j9Rwı��#���n]�����QJ�r���(�sI�3�G����È1x�f)c"�e��ʕ�	΂���=M��Er���%��W;��U�L.�J����q��(v("�W�Lȁܗ��%d�2!ݱW���!e��7%i�a�F1�E�f��E,.,����.�뛒x�&!��݇����J�3�{���%&�`Wq��<�;C߷A��f+�R�����C�"�g�,�y@��7�x��O<1��?C�g�)����ĭi�J\j�C(Khc�>v���g�WM�Z~�QW�0��fʍ�d�=�R �,L��}�?�1hf�ʷ_y�{ӫޡ���a�ȇ�\fiql�mV_Ou��P*BP��o@�mq6�54,� JZ,��D�[C��ŒC���������o���c7����5=A�?��ge�ٝ������W4^�dT��G���
��0��r��J�����i8-�`��-��<L����(#Q��`��SCz�O��<\{��."�������\���P��?�©/�ZT�����r�];��DB�b0���6�F� *�Q�ˢQ����=�LZ��'_n�J&�2U�"�%c:�b�Qʭ[^KS�B�A2�R��d��mֽJd���⍈H�G&"O�J[�H�Z_�J�FVQ��M�.~�iY��^^m��j�׫yX�S<��f����_�U��;HA�*�z�tJ�*����$(x�4L�;o��㿊�@_��Y�#ߓ�XF���P�`UZC����{��PaB��3��J���՜�8��`PFx�L�HQ��A�E�3ӊ�0HF.!�d�ԱSE��P�P��z��/޾rGL���z^Հ�0,��(�[D�|"UDUS@�(+r�GURdg�*ėe{��
"��8�gq�41r��Sw�O�c�+����
�J�p��^�f�+`��#��ʸxb����&!T�;-�\c�0�AT��R�������I����Vnr�0��En	�����E�(����M%[U݉]͘���2�T�=�g-�\�eݝXVU�tӒkK�&P]����K�'�K�࣏��ǿ~�Γ��7̜id�����݊۷3�n����/�C��^�Sl���?r,���8��FR(��ǒ.�=�f4[�[Ğ��;�@��g�l�px]ӽo^1V,�̶?�!��;dC=���`ڕ~:�,����H�	
H;�Q3�a�S�Kq,��i�~,#�����9�k(�~�8�G���q?�� ���P��{_)_C���P�B���2����(�f��2]l#�F(�&|�؀�v�7�n��z���cN�`�}�S��%�5i�l8t<	����`����=߶�1���+,�ў�`C?���G��\�K�<t&	(KU�����D=�;�.]^=»'5DKA��߅k�~�G�^Ќ�]�|�:t
�x�oy��LI�H��W���ጋ-7��5՜)�c���0�Z@=�:��M�V|�2@^-`���к����J�sh>s�OXH�e�N>���3�L�Ϭu�@���k��(Zi��"RUG���i/��K�Eq�"`T�G�;�$5��sZq��Kۻ��z�Q
c�E^�p=���_���-P)t�j<���s_Egڀ�`~\n5G�E��os���/&�{{����$�+尺\���{o~����w^l�֘KT8e���>���U�jٻm޼��m)�������X6���fFX����2ԧ+u�8�oI�o��t��U��uTOn�B�T�5"沲�ʢuO�mӊ��!�d`��Ƙʪ⑭#[b��Y6��I RE�d�q��!����
E�\%{�7��#����/e��>���Rd��>��Rw�l�F���>�ݙ���֎w$d��q�	׊v�~z���*{�ޡ���{��ܧ� @�x��&�\�֦5l���x�e�	ӨHU���^'��teN�}�Ԗ��{o<��Fh������]���z�Ǫ<�	D�θ`�x��S���w���Q�	׿��ǿQ�#M׋%+tPk��N��hx@dʷxL#K
�U����qU��1��^�ޫ���,�W��M$*5۵ay�t@���=0��co�N�)�O������Mn�f�+p��([�d�5���N"����ɢ칮��U�g�S�(��w����k}�/��
UV�<�o�
�싩�x�<�갘�Iu�A��Io��m���,�܅�ډŻ�m�o����E���n����<A:��0�΢�AFg���vs�)�b�i�k�� a���і������`%
<���'o5E�.��L����Z����ݲoݡ�ī�>=A�.�SV�/W��3\R��r�D�=�*$'���*���ۯS
$���J5�S[F�T=�$�̓�Ȋ�g%d��v����.ϝ;���q�1��LH|�]Љ��C�9O�Qk�8�RlR4	���M��Ny�u|�*��R��2���l�r�I�-�-�5�����oFSP�D�l�@����*Z�.�Y��A��L�l1Q�n�~Y�KB�s��u����X~�^P�%�K�J�S0a����|���	�^��ϧ>��K�������A����S��̸�%]���AY��e��s��n/��Dz��;��o+g�+�J�u:�s�`w���Q��V�7�s�(�ֿ�82�y͝7=���	��Vbw�I�%�G�oQ���K Jb��[c�QN@�m`•Q2Zj���<���V\�Po��"�]Um��݀*��/l_�{�E��v�ȫ�'��~���2�d�^�A�.xu
����%�L2ԗ��ɦ$?~����ӑH��>�n��d1TeF�̺�s2�Q1�!�I�D ��?��uJj��1[��n�>$|ZxI���G�_	?�X��f�"�d�_�W�	��8N�T�
��?_�5�W�|�ן��_8?��??�-����]ү$�N\<Ƶ��"n�Ge|����$@�ī�8��K���9�-�Ad��^�;�����X�NZ��H�W�G!|GO�^n��B_�%�eB_P���\\���<4>��^��u��s�9 �V@kG�����6�����_�4�M�� ��'#t�ET"Y��4�'�?�����9d�ʖ�����,1�K��܎L�=QdKD��X7Y�='��jV!�ZR%YV�i0���	�4��r-�'�,)b�.��4"�Hx������#�|�"GQ�Ֆ�����k�?�<1����c���b��5DE���U��&��9�4��D�����%nIb���1G�H�-Y�T$2i�(z�$1Z�"S�Bd�R����eF�ȓ�<d�_u����v1��K��3���y�@�0��s��Q�.�A���;����ƓKÜ8�D=��u�I��=]vʿS(�cg�N�i�kB@s�'b)��5��iJ�7�ܥ��i�c�;l�F����bْ$KN-�#���C?�zaH��L�P(���r�
��\#w�]�47��jźI��1���#�f=Ш��0�}#:i�/��-�i�lO*
������Z�{���X��a�M�<v,Y��@�2�z�鹖9�����$Q&ʚ�:6#�ldm�S���>�t�H�1��t���O�	!���#L��g��
oG��rt��	�=�>RR@>����΂ﲑc��o���w�$,i��� �dt�8#u�KlTԨ��E���[P@`뵤tUY�c��?�z��r�����2��.�Vj���¿����Iq
S�H��� 斂�,��g�N��ĵ�$����)�J
wL�R��A7)�� �b`�@�k��n��$\�kr�n�aM:J�3B�$a�t�ְ7���rD/�!�2u�(�(��d���fc��n勚�r������=w�^�3�����jK�忣�6�y��?hg�_��2�|�矉t���IFԞ��#�T:Κ�
,k]�x&� �g�hKtJ�1��m��I�%��İ�:���ؖF��XQBY�KWa"1j���ZK"c|t�����P��d��ĺb��:T�
��T�QL��T�'WQy�Y!�f6�m��D�,�)�N���x�zt�㠌	�̀�$g��df��6����
á�떡,�EEvޭ����Ί)��%
��C�X�����v�C">�'�PE�V��%ZV�H���L<�)j � S���bFTFHS��?�i�6q��F�r���}">�4Pe��Ɇ�Q@�0D���F�S,*aU��6��W��b DT-���d�9�eA�������e�b���+�y>�cL
�4p�k���DŽ_>%|!���T�_�r���<�O?x����<����%����3�r����?ݝ.�
�x�qz1e��[EKx��B��B�[6z��
�u}QWmC����@�=SqQ(�.��km	وx��D$f��1�͹��!�!Xm�=�4L\�j(����ω���t�u��c�j��4�fC
]a�|U1,ŨJ��ǚ��_ �?T�^Ch�CV�������S�V��bE�~�X��>�6�W%��L������O�z�w���<o^c*4@��Uĺ�0=t����ܪ��F���V�3H�zA�v�q�7:hr,�y Tע�#<;�|�S�h�`j�k���պ����TWa�������|^w�3C=�7������|؎,fnqW����=A��[:�ԍ��gߔ���9���.k+�byl��v�@�gЪ)SjT�tDž	����@�,�gRA��Xe���q��z��VJ5M���Vz�T��N���R����R���
f���d'��$��qC�4ޠ��M3���Z�Z6^C����@�cwu}sw��E��ҷ`��KTeW�I�+3׳eq�pU��)��!��\��
�����	��n*�$�2�l㲃L��F�1�엩&K|᜽2Ӻ���TM�/8�*���)m��z���#+ŝ���ry�fJ3�h�Fݒ�MG9�HZ�:qQ�Q�\�N���ub�^���:Y*6�D�B}	��ٱ�7��i�Z{ʋsn�R�/x���8g6�E�
.���zTW��_Hf�����$sM��X���U�M_�H%(�*%Bt��9Is���m��KBQX��=���;ke�QP��=��[��nV�Uӈ�j���N�{�o�����o+n\�.����S��]�p�A�&��ҳ�o������e�<}l�|��Lҳ��I�?���s�%���%�ݳ‚��c�'p'�jgQZv�ㆃU���R�)�#P��i����f����4"���ҩː덠�6[�8�/HJ�Di�H+�k���jx�՗�Гˮ��R��	�t׎r���f5�kZ�E����vY��7����uUШ�#�²��^V�m�Uy����Le��t�֜��=C@&J�o���Z\4Cٍ�G��g���5fs���]OvmR|oې��T���u����%��Oj�$35Z�\U^6{B%PT'�Z�:1�i_�����X%��R7��b��D�L]��	x�
go8yoM<�7Z%�G���=y���s�{�3��හ��w��Px��N�'�g�
�
>!� |Q���U�����9�>ܘ��Z;���y8��ft�ސ�>��u��G��8>�q��r@s�~li���B�V�bܾ�J��G�[|�V%�b$-��3<H�|3@Ȁ��6x������>w��y�Pn�z��>"|]�]�)�	�RA}%�>D����;GW ����?>==��{"�қƝit�ͻ��~���뜷��ڃGo�KH'_To�=s%�����VV��������q�y�&��ͽ�FN��!W�N ����7�XO`�&�$)���u���Aԫ�&�_��+��7*T$��ܛ�h�T��o����B�+Wf�k6�Y���=v�)�{�m��F��+��<Jh�?DG�N_��@���^��7�@H�����wZv��r��U����`����pB�6^�9�yA�5��Ґ��{͠�ߚ�As���b�O����}�xcn��W�d�h�V���~��%�)��S�Y�{��05@�F�$�"�/9�G�;Oe��އμ��j&���{�u�N�홍7Sz�Ḝ�����\��;��7U?y�W�������s���e���?r5�n�p-��E��0�gSh��+�(n�&1/
����h�7�4����Ґb�NK[��YZ�(O�횜�a��V'&V�X���ݓ��������gk��|favv!^DG��������ى���N��b��m�	��`����vN׽���+0�O����qD�xv��B�WW��,^����Y7���������[1lE�yri�-۟Ph�)
+S�:Hr�'�jw��Qh�g��;��To��^}����o���u����{9��G��s��pPN'�~��+�	y��FRN���		H�5a$�A�xj?z$ڻ��
�> ���!�#�DŽ�A����9��	_^��N�D~-����Q�_�>��]��9�$�`���c�Rk��s��X&�.ꍬؠ�$���b�a��Su"oPM�ѸL~G��;��qz��`|v+)Y*�'K���$���P���e�|_���\3���ճ�#�]�O׶_֎��Z�K����f��jAV��W�����䢥�Λ5t���m���>������[2����!~�R����=�fkM�T�j�y@���US��!����z�g�۵�AQM�o����%��lY�n:��Ef�N��k�?��V�hn�Λo�����Gg���V��Շ5�ci�M�v�V{�B�Z��j�6�g��W��|��ɟB�@��ŗ�Ԋ/�����ګ�x'�ً��?���M�謥m��lA4��ۚ���Vz1����ۄ��k�:�A����隅��-Q�PM��&�4��
��vx��|v�[�'��Aqr�0W�6��v�V��w���l��2=]k5:����R�@���f��%7w�z��ng����a<3;]�WW�'�`&�v���6��Ԧg�kaqb��)�fhw��1a�A�W�iu'^�w�Y�"�
��4Ҽe�t�W��8mE���%nc���:�?��.����QfX_�c�A/�J.�e���g�r8Rh0�V����K5�ѧ���	-,�)���+^e�6B���l�;���D�Hί����}���n��.����B��(|5����G������r���#���P)=|�ԩ����/�]$�el�U$21��&�g"�ɲ��H}c�"U@�
'N=�/��[9��w�ba������{%L�A�
�ʹlH�	J�\�$�Ũ(�_'��9�D�F�塳��HLbtvnn��:s�ug��͹��G�?r6?D��;W�����p�K/m{�Ek�E�=����u|蕀/��
Z�$���Ϛ	�@]޼��wc���H�*egސ�;t�t���3R��GmJR���?������H$�$�p��n�P/�A��E;�#��aT����b_:'��I�ȟ|�zAȜ�>�M����/��ڶ�&�G�^�/�'�Z@�������$z}}}-]���,�_��rm�}HD�t'�4�1�F�a��T��fKF~	A&���4�����/�U2X�DY��nt��0o���0y�?��P��<�����@���ɰ)����eF<����$e�߰`����f<Z���i�
<�g�~k��L�;���b�{@��{uF�B��KF�
|��r"t�H��7�����i�<�<�����W3����*;������tעڀ��7�a9�E��E�r'���h�w��E%��2�Q���d�iSbk�s�\E�
>Csۖ-�U�F��+f�Z�Pl5�ُ�ٲ&K"�Z̓$�jy���Q�%����� W�5�Jj�e|(��E�m���ʀ�2�E�J�a9eʠX��*ɋb�ؒ�L�J�3k���h���A���E9��+D�"_�Q�o�tK�[9�q��+'UP�UQ�5�E1(�.��y�2&��]D�j2��%�v�QS	�H�'��<j��0��!�..��3��
:1�O>����IY۬6�^�W�����m����Hj��Ε����`�1}�h���k,B5����&΂4M*�c"c�,
QQ�eG��D�|��y>���"��JA�:�uI�#�V�5���XŌIf��9T��#G�:S��@�S��XɫU������	i�r�u#�@9H��M��2Чmɩ�P��>�S����g>�܌��eLD�ءM�u���](K�2���Uy�?I��U
�o0�/�3�d�!F�`��W(���g�v4D|�+`�b��4]U��^��B��gCOr½���T�x���x��
Ve��Q�H�������Y[uI-��?MAȔ`��~T��`�)�ra00�c���G��i,��O�Q�ƑT���)2�3LZڡ�F��|���CGZ��L]���
z��G�Y�i}�\�=q�_�5s�pDX����A�LgÅF��g�z䖜�4=a�Y��_���;��DyEq�
�
�tS��I
��K4����m
�N�>�����qy;{>>��C���Hq�l��Se������	����'�[Ez[ܠ4^Q���>��WC��^�+J>��r%�bn毟�k���2�z��G�A����f #
��c���bjl@-��!��O��<G�5�u'�ݟ���~�W��ZA	w{Qw�􁛣�m�>���e�F����h�z�iH2M�n�~���
�<~�T�%9�-Bܼ�S�>�Mz��pe�k��̗D�L�ŷ��?����}��Q���Y�h'�4�*�]�)���Ӡ+�\�)-�+1v�Q'�h���Y��:����%������WU/����^�������9sf�9�g��$�i�d�'���@&
5��"`T����UB� E��"
��JE����O��"g�Z�yϔ���}���m���kxQ{��P�a�@�c��C��6��z��[ϼ�<1qOi�^d|��Q�졇_~�U���{μ�[����Ls�f�����|����>�p���;�����Bj�@C�@�<���K��[�hE���{E�*�H-�3Z�uf�s?_Q}�S���(������͓;O�o~���.{ŃW}����C�%[�x�Qߘ��'z���5+����vߎ�-���W\v�Cc�+e�yϥJ�3�SI~�'��>z��G?:��Ϟ���_�3�<s3Lepj�G�ʞ�)����g9W�?�d�ɎG����{��Hr��c/>�Ne��ㄳ��;�daq���#�=v~*���}?e���v#׃>�>�S��x��$��7�!2���f��6�f�S����v��c���7�c�HE�b�γ~��7��$�w�P��m�Q1 6���_�(�Ϸ��꟬�=����w֯�����{�O��q�Z��(w�HB��s�n#M��ѓ�c'�hjijj��Fd�Z9�)(�3��a�e8�oYق_�o���s�v��`�����([��tz;��~����:�'&�^�{��C���~.�����	'�>I6�5�B�.�$4r�Qs�e���0�i��1�޻��nśG��b��4Jv��߬��p��sT9�N����0�jX�?�?�m��c��f��̺E��Pq7�=$�Ş�,As,�Y��
G��pm�>ؿ�m4���[�8g�qn`��qD�Kŭ8v"�sd���p��U����
f��)fI=�.����Dl�������+j8E&[S�4̶�7�u>��Z�j�t�?s��6��eET<U��Y
8�7ɦV�Mݾ������;r�k���KD
2��ƃX�}�K~ҍ�<u�ɴ������S���/;���Sմ�&g��kN=��׸���-O7<����\�@�׉r�r~��Eϒ7��� ժ�j-���ug�ɠrL��?�
��L)#5Xc��|�1�g[�<��z��lͳ��b��W��m&+TdiI�g��ZT�$��yRjK�*}�T4�
2a�p���Zoj2��B�&``�z��ͅ-���&1�`�?��L��+�7�$k�V�". �xd�=<�^�UQIv�(�d�~�Z"��G��F����ӟ��R��1����� ����#���0B��c8�G*�m���$�D���ǟ�����}�,��m �6�D_,zD`��'K��6}յ��Q*V�!׾�|F�%Ae�"�w'�E��;~��m�<�U!�L�,�>�#ou}�(:� ���0O$�'Ͻ��s�?`���өjj�O(���jZ4��2�&�#���'�=u�v�h�����G��\&nƵNgW�,U6^]�'#��Z9����iW��Ƅ�%X��<rŇ��ԏW�hM*�Z��zmy�W~��H>��^���'P 2k�H
�;���Q�#[��Ty���Y{�T��@pFc��(�g�>Wau4m�b��ar*ބ�G��Cg�Ex�v�� �o������P�����{��Q���(Ƃ��B0�:a�ؠՉGAC�C���1B+�XwI`D��q�J%!�Y)F�(8��ze�FxQE��^r>'���E43��� ��x��q�[����3�9m\�J����)�J��I�E��
�Q�7-Ü[%Z�5WIӢɈid/�qW
�Ùa��	�c]�3��g)pX��T�&N��6���1;i�Ւ�D)��*%"Q%0~1EZ�$M��bp�F�TAV��qT�Ӆ9���bF��Y��D�+���l �<2��/%P���n��:�����{̧�b�Ռ��B�Xf�+@�@^Y8�n�﯐��5�՞���g�!�i�2����ٴ��)����`n�iE�ᙷ�!��m�v�F�����!�3k�?��W\��|㙷���й���P�׾���o��Jj*�EV^�
��LM�"	
�����FS�"�H/)6�nLRD����?6���8��]���
v��\v�=�{=S�k���P��Nm��Y���9Rޱ��s��m����e�3��CW�.Mg[��X���0�~+7��-��,:ik�}lỶ�l)���@��"i$0a�[�ǖk��_��Y]��� �6����<�S�e�aT���Ҙ ��a������(��?�k˹����`˙Ⲯ�Fo�R��1*�*	�C��g�σ�Yd{o�8V
džn:�`|�J\?����ӫǴ
��T���e��i�9��A:Ȅ(	h>O��(,
���sY;F64�T�P��(@4�"��uU)��S>�N�y�iӖ�lYڿ(ʋ�qӕK��=;6��Bcfv���G�����~W���wQ�mk���_���F�y�h<W�%�DI�ESEA.:�4F��%[�j1[h�HVm#�i�ܼ��lڪ&��'���~����ΖiuȔ��12��)n�RS��?!r'�<�"���ZC)�A�3PX�I�乲	G�$)5Ϋ�$��Y@�S7B{�,�aq ����A�h�@M����b7~��qQ�K��2��y9�e�l	`��2�l��.��Һ�(�Mf�ug�F���\�~d�}M��C�Ѩ�����j�7Q�2��h��T�H
��L� jd5��Ī���o3��-�0C��ra&mK�&�QAղ���\ir�%>Y
� �XBPқHb$ O51w�&����T�b}&ɭ��w�E:�~���[����|�<�ȸQ���k-�#�_�n�\`qD^N\��ʁ�k��*Cm",Fj�H{N�
v��N��z�����ɶ攆�ֈ����=��q���d�@K�/-�,�#�WW�_]��
^��ѣϟ����6�
<y�/c7J�/���|ɐGf/�G�c�S�#�t��	��
i�8n�����'e&�j�l�˃1>9#�}��+�8�a��y�E" ''F*+��艚*�"��	�݌�lF��{��5��K�멟,���C&�ߤ�|^KW�U��Ypm�B~$�bj7��H�E�FZ1��<�T{	�\s�y�C��;�W�f\MX!���+���sE5-���uBF-�"g�P����Ǯ�^tֿ�v[�cG��?A���v0|�=��9ilj�mv�Z91�s���v˙^��(�+q��
-�V'�uKqcݻ7C$;�_�y��>ٟ��o���<�ݑ�
*&@�`1@��7��<1�K�8ʒ�[�"Y>vu1s�V}EV�5�/�tc��u�7��R,��ӟ�~t����'+s��@'tw�ԫ�����/ʹA#�\�;�)��h���Q�1w($Y���	�4{,�z������}�][�-;��gv�tjt��_����f�{��&��{��yWiϱ��c+�������8O�|=�F��ĥ3�G�Fnl<�߮xW���M�ǣ_�r��G��W_�|����c��–޹�$�K�H�:
���sp~���#�/��
�����S�A��a!�[4x�x��]���T�cRN���
]u��r$I.s �u�h�y���X�|��m��s�]�-���(��e��y+��͊(67��^�UQ\��ϱ�O�y
��H�B
z|�.��E$neԸ�d��ݍ����F-�1�v)���%B��N k��?�ld��*�r�V��n�����T!Ӕ%W2D�f���r��K�Ӷ���f�U�P�N|AX!�nn��pGjnf8�6M��%��u�j�	T+Э�ؕ�fM��a�˹�ej��r=)/���؈Е��Y]�+�w���۫?��U��R�V�@�������G��Qj2�6��&�X"hZ��g4v~�1�X�9�[��
 ����j��Z���m�)��p뵖�[�oSQL����o���HSB=,�-�&�0X���Z�ɺi� `F����kE���s�+ro�W��NN6MCt� �MV�H�e%�\�|�5j���1��T�{�L���h�
�U���T#В��!�f�	�e'�	�'��U��	�qB�A�g����T�����7�5r�'w*�O�h7��L�"�����[j��ç��P���\���01K��'�j��ZZe�?�c)0�Sӓ��k�ɷ�[e9�(��+LP�Aޠ))��Z��\�cb�9�O�ްQ+lmh��4!S�����\qn�b�0�1;���}�G�r�N���H8}t��>�;4j�j4���.�Ӌg��G�f��:�������z�ºY�!���`�}�����t�n�Sg�ţ�;�(��{�7�vc��B��s6ѯ�d����F��h�F>�՞���o�8��ŧ���w����SפΉ�������"<�~��l�_���y���o~�T�'��<l���ൢ*�I.�I�oM�ZR�I!�)	j�50���HZ�A fG��Ȗ�k���Re�ɛOn�H�o�����M��;�K/̗��t�4��nY[�Ֆ֎�nz6v�r��ݶi̱���.	��
y��K���ok�
�q`�
�I~bQ:�B�[���x�6/Ӑջ�l�[�er�����{�>H����>���Vͬ?���v�������Xk6�6�{���Kc>2�O��h#	�IW��FJ��)cm`�1V�I��Ӈ!`�˲��\\)7�~����;b��Q�v�m�d��e2��򖝝�t�nI������;M�=��<SrQ9w&�dJ����g)u+�NH
"q����aSNk���k�
��3z�P�ZK��B��4�}"s� ۉ�X�����.v�F�$J�t&"���#3������[+:�E.0�TD3�T{*`�Y%#�ɴ��LHy/����EN�*U�pP,�N؊��nLM�C��ͺl��ĺ@����XuـiLHv%|f(#�?�'u�8B������<�&�:1AG�~�B//�^���R܎R"��57j��NhRkJ�}�pb��XrD��#Su�����z;�	��6�"2�T�륒{D�?b�#1I�!ɭ,k��-��2C_!"�W
(�*Ί�������7k���"H�κ����{`�+f0ld�ʬ���4\�mv���-��DcML��e�Q=-^�V����h�#�9E	2s�F=
L!�뽷7�4O,U
:����{�Z'V���t��o�s�22��5��lO�)�v 8�>�,m_+,,L�s�6=��#��K-��z�V�->���˗��T�aovr�d�����2/m󫨩L��VZ=���(x	�
��a�㍺�&�!�V��3]��w�0-�i�:����V)*�:u���BZO�o؜.G���Ǔ���9/���ܞ,���#�W֫ĭU���3��	Un���2��Үl�7�c�V�雺T
D%�u.��s�E\�Cd�%$ cZMO�m�]�T-^�MA�\�m�Eˆ�N8��'-�Xи��?'(f�2эJ�+WSd)��+{���2Lq`���"
;6e2���3�2�χQ��2N}�����J�ezLP�s�4���ziC�Ү���Y��BSI�g��0fH��'ķ�*����C��H�>����ܦO����H����MZ�Abc�!��}�mwQ
` Ø��G���;�EN�l�q���������ײVF�N:OT�YW�H|���A��R��D�PIn~�PQ���Y*eDA&��}Iy*QtQ�T�@��?C!T�U�A�=љ�����2M�u[�9o�Œi�(Ӊ�g�P �K����[���kS�%m
���^hS�hS�d؝����iZ�\��%�D,��vE��fui����|Dpo����o�/��p%��%)?Ҷ.�N�x�a���l`������ǔ��Q�Lvu�� �wu�?f�B}�fz�PQJ�F%�6�=�]��ś�����.��K�ox�=n0Y.����5"�O�O�+�݀ݘ�0ۅ7���]xW[#���F�Bd��]n4�X��8�]��6�jhb��Y��n��U���We}K��fn�z��
�Y��m1$\aǪdl��l�#A�޷�����>��O����zꢵ<؍j��@�]޺sc?�?[�H4U]� �GZ��H�s��gI���x��|���[w�ͥ�w�ᆝ��5h߿V�2q�=VK��za2���ۖ
�z��͢V/����[��O����'��0=��ݟHgmG�T�ە��Y����k�c���̟,|�0����L/to]�ٜCӐK�'ͥ��۽��gֿnI$�s���G�@S�l��qx���J�5���/�~7�� ��&@\
d^d{��p�%��DA7[ш��'�@<�Õ;��EⓉz�xQ��8 ɤ��l\f��LF��5>���A#>$ϕk��	@	)O'(6����")���,m�jYUʪ�&˖�Y�.���b�W�]�x����-Mq3���4k0ʹ����bkVY�Y0[,��PR��I�5���ё4	}�FGw�K��ip�W*�N��FUu��w�r��M�V'/��a���k����ו��,���X���b"�9�U�b��m���V�M�9T�0zqb�bE/+ı�:�3�¶a
�YD���y�e��м˲*���2�}���r���d��sG����7O�ԟ�����r�.��◸S���?/�X4.P'����ڨ@�%Lf�|h̖�A�����K��Z�ƪ���QMצ�3�;�9�R�{����N�R�����Nu\����qa�x��?�B��
�1$o
��`�}�I�2a*R#��R��i(6ҝ�f��2�2#ϝ_�꠸�Wo��T���p��[�a"�Lp-��2�7�n+y-u0uy�h�$��3��S����h��W��A�����s��g�fB���]��H��*���H���x���.�
&�ƃ��s��=�6!�A42����8�M��%n�6�^.$B�IrDx%%'�L�uJj��	Y�d���������>��?��j�ޤ-<$^yu�H�4=-n#��U2	�eM�IA�PP�V�)M����$��Ȑ)5�iJZ3�>E������LH��&���B�W��ŧ;��M�e��'�wm��wČ����k�'�9B����Vn{0h������q���!"c˜K*��o]�.�V����D���L��^��^�g�I�����^o���ᆦ������5W�����^y��GOo�˚&mj�>x�𡃒����s��/��t�<�ʃ}�x�M�5d4�ǕN���/�e0I�Bf�$j���6Gݘm&#���m�U*x3N�DMҌt��~�p�nw4!HB
% �me�GwiA�M
$g���TJ`�Hv���&�t!�Ş��C���6,[��r�Z���h�?����t������RPhyZ�0� ��7�<�5҆)IJ�sp��w.��N᯵�B�DlD"V-��J�b�L�j;�g�`��X���M*h�x�%ʒ=NW��ۺF+�(tN5��
s�u󝓾,)�v��L���h�b|�D��%�iw���>�+�d}˛0N�~��eO����DC�O����0�/�k�_t�Q��w;q�o\9��o���I����Y�"�+/�~[oB��<�ֱH/��¸fL�)��5��0�>ϟaX��σ"����8sy�sy��*� a��;Xq�Yސ��ܢۢ�1X��u�@T�q^�$��̙�1[���cR���RB�_�O�u���ls��)��Ɋ����)O�p�d@��!�B��H���J5K5cQq%��%S1�A�2Yv8���D@7Nl�ka�H�`��Udk���)k��&Z�'������b8=O�|�K2�;& ��$�"3�D|��f��30hNH�B��d�V��.���g���j���`;�$�=_I���W��f�"!]��<�R�v�T�Q���Ǚ1��8ǙM�"���9�5G�6�$���2��A\���$�$g5�C_�\��r��Mt��(`Xȃ�j�3L8��aÓh��s���gO�iɆd7n�#�Y�,ɤ��w�J��/����ꁁXQ~���!��'�3�J��
��["5��Z�z�ϴy
�j��ڞ���_��Y�k��	x8b��Q�d�Ƅ^W��V�y�9(Q�1�t�{1L��u���t��	I��1��2�~� �p�HT#z��H��*���W�={v���+���\��On�뺪M�U��;�E����DsK�2�1����|j��M����O������}.G��cd��08^��3��C�P\$3��U��4��p4���@Âa8z���I���G��Y��Q�P�HUw��a��fK�|Y�;�IP��Va&3_�A�K���BH@�+F���R����m/�{xm��齙tD����>��}*���ʬV��4�N��߹\�;�
`�+��}�\{k6�5"IiT���)/��	u�f�d��i�k�n2�Ɉܑ�f��}+�`��\�`�fm���rZ�H�;� o��C;��������q���W��t�`Ìju-�rOmҳj�&�@@zA��1c�5��t16��3���zka��ɩ�.J |��S��L��j$�]��Z�6�#̊���l2l����C#YQ�l���23�dw���f�e���_��d�O����sѡD3B]	�=��.����A<�: ���T�e@M�V�<�!y�؊,��Y;y�vlE���վxxsk�o^:I�;�|t�M�d�ұ-�����q�VW[����
N�{2޷�TjC7m$�7b�*dRLrƹ4�����_{��O<	���k{ۼ��X�H�!�ww܉nS��;Υ�~
W|�q�q�57�x�f�G�;
�x���8�~��#���z[�6����;SM}:�Frs��*�j!6
T�u�~^&|�������8�sy;p�as��s�/����|��`&툇b�&��j��E��L��!W�IX+C�W
��:AY_��(;>���@�~�PCW�J,PPX�u��y6�ұ=QW���[
H/��;%P� ���ӂ�8bتU��)��rBqg6QSL��Vp�T�X2���N�h*L2�iY��*>�fMW��NRIUh�c ۅ�$��A)�I)-Q�Lp|]�	Ő
�� ߀քj�k�g����_�����_��������
�'�gQ����U�t@�/��=R��%�B���+QmM����ց�z�&��f:X�!0T䊜��s4��u�۩&���K�a]Z���K�-p�lQ���\����1�YhI���=��1���$��9������rAlW���E*�!�$	+F愛ma0�����
"�u^����|f�M��߇�_�jҡ(�Ms�̀��k���/]գ�)8���އ�������>I~	��$`��X��B�;xZ	c�"<���N�$�f��V�bU^�"FS���IK�M:S�@�:�V�U��?ݳ����o0$}�m�?;U,�Vl}��mvmV*MϿ���W�r}y�o�ֲ��r43g�%k��_����2	�P�*���Yw"�����`��^���t¹s�>M����ٹ���_���O�+������
��(��pE5x5�Q�pt�
)R�mn�#���V�,Q�{N�;x�`pn������{f?�)��Gl�#�O����x� �li�w�|��S�UA&i�!#����b2d����֢~�A�K�
6�$�T�`��Ch*�Z��	2	$9�)n_!��#�צ���U̓�y�ɸ|Q'ކ�f�V�>�f�$��S<틏�`��J��?�)�=ys���1����S�-�?��?@t���9i�}�H���;�ax�K�n�oX�Z�Ð
��y#ɥ PG]�����5R,�Ȋ��HOT��/U*����`�E`:��B�3�\��
�VIA髍����c����d0�qv�E�$��<��G^���@)LoE���ɠ�A��lU��Z�2���b�$es2�K���!���;���d���ne��,o���R��~�����g��EIC	�"�Ly����
�h�$��eI95�4
�\9��7�����m��98�1룟&������טƾ���֮N/�I��8�������<z\;H��#�S��x�c�j� �a��(�L�R��
b�����O�D��w;9��^��t��~� �A�*�YV(�[�B�yۭkk����[��Sa�H�'l�lL�ҵ+��ƬM�
��0,'+���8��4�k�a�ä�!�&Ak�S)6�e���W�}dƶ�<Mj��u�%au ���j��Pc�O�z:�8��ʂ�������X
Kd�	��ޕ�?�#J��x�RĈc� C-�M@&j���,y���ۅ@�ɂ�t��~6=K�*�SGS�S7�nN} ����S��̦#|xa)y-�l$����[E���z�$k"�~���p����Pt�t�iێZl6�u��� [���Q��Z&�‘,�|_I3�
�I�`+/��&쒞j�練j̗�%����7׿�y!�g+�6
���Ȣ�jH�V�M���tY��}BZ�$N(��S]��&Ķ3�D[`L1��=��6X���.i��\e���
���ZY]*�qiZ*H�fxl���R'-1Ӕ�̖<BٽG1�����BJX�E�J�lZ����	Ьx��Az���ч�z����s�	�9E�\�B.'�GsB �л�Ҽ��W6u��KdM�M��4U���m�T�9q��>芛o�+��a��G��z� �0��=8Kg��V�6Z�LI�H���-�T���XXCRiZ4(@X�h����9{���
V!��ͣ�$�����5�A�c:O�A��JzQs��u��:$)Ut-I:�b���8���H�劻|	3����8��8��*:Ӎ���+�:q�1|���TGyg�4\���U>/æa^��*��~�o&�U�Kk��S�1��#h�2W� �0��`k��YxYA�6
��cb��<�ؙpȷ�6\��ff��G��T�c�b���J!i��;�p�jςE��dD�����G����3���!C�ݗ�0�הz�O+0S���ʥ��|H�*��@��]�ץ~"�!�W�%~0ڊ���.�֢J�6(�y]�KRdžl��F=OX�\�Dr%5=H���6���ɑ�0;'qć���_�L���p����6f4�E��Xz�-�)���l��o;�M&m�
h]�`E
0q75	�%�	K[/��
�4*��~�� �Z�0^��)8��VM�5��e5v����l����W�
|�-!�Q�ӡ��zc��Tc���{�i����)QM��e�
��D.�jz�R�@�A�S>��c�/�W���=5��}q��#qq��Tr��~��p����=A-f(��ޛ�2��k�z%����L-�\�t��F����;{7�w�}G����k����r�C7W��G�]�5e���MNm)ka�2wED�ߵ���uݒ5ӝ��֨���x��y�}X�m����ԧ���Rc �0�Ւ �X�`zh����N=���d���/�s�pՠ�m�km���\�_�	+�|����';�����}��/
�tvw� ҩn<��t:���z��w�J���I���%���v���Z%����<Y:X��l��2C�V^
�|�P��Na�K?���djy��KgTg��������s����C�8�/L��_y9�4Y�<Ĝ'�+n,Df�io1Wu�.�����9�!�
Y��瑝vĉ�1�K�b��`id�A=�p`��1�<~:�pЬ5e����*���0Fo���D�T�€j����ӏ��֜�aJ�a���	haXf\����Jl}L�+Λ9���Ĩ�?F�
LV��Z�e9Lkğ�t&f�Lfd�a&BA�E9��6�m����k�^����J��>�7ҧ��07u��VT_�E��0�V��i��0�D��u[-��d��$���޸��}Ϗ$Y���]���y
��^0�~SbQFd��4G�"U�i(�B��|��N���%_�L7�	�M����=Ӌ��~�'��ƻ��7�h���A���3�V
Q�UA�̐b��t0��(Y7�b�6Qc�\�U_!2�{"�R����(@ˉU�D�h$�@(�%q�5�1��h�c�3�D��A"�9��0#"�!�_?��dub�]���*1]���sp��x.m��ί���jS�}[kM�}[r� ��ds#/b%u9r�o��3�xmQ�����i���kW[��갸(�/5
h&�%�^Cud�i~��\�l���A�tCn0
������<A
��E��9C������"�U��,fB��4O�y� �4Y�n0+�73�x*����0�fA@0/���G�RIE�9�f�0+ϪNa6dCI�գ��8���a��DS2(�C�)��?���ݟM��2� u�� ��QElj�Y@"��E"�d�ļTLf��O�6V���z3�DH��^Yr��_]f�x��g�k���#�h�^5���`�4��CU
u����tv:�V�Z�@ݾ�e[61�^���+�j���3+��$��}�e�!j�~��4�{��������n�U�T\��sU�L��S
����b̽$5b�Ѹ�uyM�Qo����u�������pG!�X!Si��^����~?�ݽ��Bf�.o"Ȩ�p>Kv��}A�D&����Ɍ�9��!~��rU��v:'���g�Ϧ�T	�� �iwð��e,�!�ҵ%DG<��9&�Dm��A+��q(>q�"����;sЩf�E�	��"n��E�2���3��Ԍ,��gЌe�Tʁ��+Wl��='*?��]w���!{P-����,)�jE�{�
���*�+IOZ��X�1U3�?���D+��g~�#
F܊V)��aΜ�i��qlV���]��˒{��u4S�}��V��0<�%d
�����d��Nd�G5C8�N2^�g��Z���3zuI�3Wg�^����	�3�������d��\��.�rz����Qj�#�Rz��Ș.LR�kس���j���$4��]5/�i�-���Q0tX3-I@p��|�/���;K~��[��1��ه�����ߦ�sg�{�y���=��;���䓜���J�->P	s4yF3+��DC�_�T཰��Uٷ0�= ߽G)�-��l��_T�)Xk��Ï�Z�)���S�;����\N�����E�
��XH�!�G�m�8���q��<l�H�<��2h��jJ�*����[#B�f[WA������k�y����㖦���� �0��Ã�{a�o�^�+���8zJK����<Uъ<N�&!A�L�G�������εww����V��͏�R�p�V������jf�Ǹ��{� 뎧nI=�z<�,Ȓ��^"�`<j�Z2��ٴ0/
K	�;O�o
yEy앹/V�A'���Z�uAk���-��Ey�,��a3�ޑ�A�����`4�ׇ]C�ݭ��X�����Ba�)�F2�2�/�/�a�˕��C�$]҉dD��\���HU>�T�QM�hzB�Tx���,(>1c<ˤ	8�#�R���� �=]rOt��*,�4�<YhV�`N��΋j_�g�l�
�`�xI�hE��mǏ)kZ^�ż��<���H��� �*�81�tSW��I�<���"�"��V�I��'¦�*G�;D�Cd@����O���_�m]�T���bQ�d���B�+$�m�Z����J���n`��Ɋ̲,�
��S�������.�	�D12e&�	Y0��vK�
G�-
z(�5��71LtzX�bƩS�n֐T�����[�	�k�m{%Q�fc��Q�� �A�#t�KF�Wz�i�R�����
�39;�	�X��V߳<�4uE.�:���p��?�Լ�SQ$aB�W��P��	�b�ex���\�/�jї�V�"��g���d��Jd�.9[{�{H�/�+�=���@��7\o�
hk�e�>�</̃}k�͵B�]+�%�a��Y^u���c�}7N*_&�x��vz���ӵ��9,L-/O���.�5���n�.�K�G�y"����}�N�ϥ�R�>D��n�h�#�5��q�1~��P���RM�7YB+�D^�����@U�c��ڀ?���h
��Q����د#RB,�%�`��
�!?�	�a�,��Ѱ�Y��h�h�I��6j�j9sЏ�Y)��r���ݍǹF�D!�*�)n���
�vnn*��ܸ���6��6ȡ��6h��2�<L`H���BV/������lċ�1�"=B�����L��GV��?:F	y9X��ZI���l���W)5(����*�&蚯Q/g��h#�ͪ�:��
� ���ęđ#��e�d z��ɤ�0*f=�ߤdf�t��az�J\f�iOb]�\C#q\Ɓ�2V�����0]!$����-�Q�_ǃ�`)p[��
@�(�OdϚPEtU��`���؅0�b�[�4�_/;��I̕�2�9�$bp��*Y_����a�`oy1R�*�h*@!f�ԧ��e��Hc��H����Ae۱u56?'�UM��Ť��n`~(+�8#��*z�2��eOؼTl���ea�hѽ�@�.����)�p�R%_��
����p֮�R2[�mw�x�d0FU����U�,���1cL������@֧��d�'��J����^�`=�6������-I�2c%����5,*�R� �7]��\�`
+�W�8p�UL
�I%��2����][A��50�I���d<E�'�;"s,�ƎB������ o��BP����H�P�zT�(H�%)NW�`�}1th�9XW�ȸF��-�]&.�;P����_� �6��R'��’<����"�*���Bz�B.E�~��R?�c��5k�8���U���n�'�}s�2#a骟�G�|���7��fv�,~��]YQ����*�����4�]|���(�|�7ϥ����̞K�gJ乧/�N�
�O��R�,%��^�G�G�QOn�XMtN�x/���i�
�0��j���i��Rla�/�� ��!M�W��^�Z��ZE�#�a��_eT�b_N3��Hs�ў^e�j�����
��5z�pZ"�P*���#�TA�Z-2��?v�������d}����Z�g9.�b�VE������.�T<ٲ��Щ
z��^��L�f�ݶ�w8���ѩ���zpu�o�>]][{͖�Y}�ᵛO����������m�лb�/Oop%��f*L5��N}�!#�7��n�_�F�oΓ9l�"��D�blѰH{(���t8�Y��M&m�Ld`a��6XI��X��J!9��z��Ů%��_��[��p���R}"�1+��+��+�mˬ�N�5�7ҮOSD'��__�ۥ���J�������K�(:�P_	,!�d���5�1(P���j�]7�!���zA�	t	L����O<q�w^}r�o�m���y=��x�����}�J~_`�1�gȳ�S"��Z�X�4qa�]��7��}�W?�iϵ�ӧ�%�7��c�MS����S��sߦg/����Nj�Z�<���3lTёP��xb(�
VH��x5.���k�k�m�춓�&�L%�}��k!����.lH��˟�fl���[�ly��Ҟ��w#��9rí�*'[zzSdi�� K��8?�"�Y@��ڋ�E�
��`�
��q2Ds�9)
�h��zpI�
�a�C� 	�ۇ�����#�ab��|�;��sUQ�*{r��XlOt���ί���Y�׺�dӡ�Zk��������\`�dž��D�}=�Ne2q���:Lp��Ƿ����웟�~G�g�uj��[�]�,C/��O��ي�:��-�a���0��%����B�2��W�5_ʬ@�W�M���q���v%?�
��鹚Q۱��f'�.k��E2ߖ?u	���V�Y�w_ɛn0�o�rQu,�IV�}PS��a��܍Q�������7��H��WRn�>C�5荙��ڇ�۹\�|zӇ>t��ݾJ�۵r������u+�׎�~A{��4���fR���b�����/�sӢ�ZR`$��h��s�P:?�,�d�`�b�e���b��#���į���:���J�lī���X��V�Ã�hoY�G��{�.��(ĝ�4�X��HQ,(�>^o�r�1j&��qkhd��
"k"UK�W
d3��p�Ϙ*�Ty��i�J��6�X�UE��	�����T:;��М`�$/G`���]��wu9]�x�4�B&�)�a}���T���S�	�0��HˆdK50-z����S<��VE&�d	m3����-$Pz�<�"ER��FH��DI�G�'D�NI�ޡZ��^�o�zW.ݚ�`�H2���`�t6��l�
�%�Ҙ�-��2�
y;10ؘ�L��Xu��	U	*���-�(�̨&�=�i_TeUfLa?�pnĴ10�l�C���9I��\��"~h�1
�ꡱ��7�����J1W�}͕V֖I���T���A�?�z�F��6K~I���e��[���A�����'ԹF}^]��:߾���N8�iއ^��и)�����6�%.��O�P���{́�����𬕫����ڳ�"^v�;�x�{�Q����`�.�����ū����]�������]��E�{��ۧ��C��;wmi����-�_�g9�P�ʡG�ݣ��,�����R	�Rrv��8{2�ů�jv����Y�D}6{����s5�z�|fn��9� #7c��/�s���t#&�=��B����y2��Q	��1ARoԋ{�}��D^�hAU��`j~�fb�"�~c^�*�]�
Q�Ц�5�(5C3lJ/��K��՚@�w�Bw�4�iq�U�@��TBԉ� �-��Y-��ن�lZ�����TL.#XU�<-��i}�^��A�������	�'a5h�0^��0ɝk#��MB9������:��m��1��5����<E;rmJ� i?�lW;�{���S�9%u�8E��7[�w7�ژV8�YdbF���V���v�"��X����0��?�^��Z�N��s�3�W?���pޅ���`���cB�ڏ~�I./�Z��lL��b�Ϗ߄'��e���(F�����9���4@��/ݔ|��z�'�!$V���4�$��7n��&�����0�=�	t���f2�iQ�=[��Do�Œ#EjE��P٬�.Z�
Ja43���b_�b���C�x�Hr�:�����K���m�ɝ�[�9�Dؘ>�&'�^1���%*��V�P2D���pl��s��AJ�����*J`�#��LIQ�$�$Ȓ��G���;��E�sA��5�Nn,�����/���?�����p��}��?�S*���Ag@K0�FCi��W�`sB�M�~�m�Y�j�f}���yT�r�}�M7,��U��{�Vȵ��x��Z�F�ع2~JS;�'^��K7l�H��OW���y?O��,�#��ԓ��}l����4.�_�cpϣ�<�?'����%�,������|R�C��y����]�1%!Z�t��q��z&���ucp��s�{��2ә'ضqcA7*����Â�&Izs�|�e��z�W��Әf�ORe�����e�J�[��l������v�*�b�aa�}eYפ™�wg�TK	�\YQ��4�OmYaF!����ܳs˙���r�z��ѧ�[D���v��,*�hj��HU�UI�u��,�_�"�g���IY3�!�#v�v@v�yK&;Μ:���Wm]i�u���$�^���Y'��?u��'����s�^�w�.N��8o�a��g$eA�}����ZX�E
9�n�ڽ<I���};ͳԠ�� �)3Sa�W�wV�_�+���+Q&�;&�����J.[�i�0�Pe;!A��딙���lP=ta���� ^~��7m�t��Y1���2q������ƽ�|6�N��FG�()9��m������������ZM�zޖ�{2�X{09��\��9U�Ծ/�wO�t��[Ow�4���h��d[�7IزlY^�
fG6���!,��̖�d!�?;N y7$�'@��$�C�.��$F���ꑅý7�}~i��������o�ޗ�f��SK�%��f��4��W�V�j:A��[��:Xo�ޯ��D���,�6�<˰+]1%�-J�W���ͬ0�g���)
�ý��WF�k�V6G�H�M�>��f�HcQƺ���=�_#�+��8v��]�*R���1��m�1���7��7�G�wWk阮9��3r�IR�B�ϧ�.q����'׾�����y�*�O�nN�����/��Ě���bJ�R֋�XH0&@�$�Z��/�z8x8}9�%*�
�`�΃Ks/���Ԣ�q�@�")$���Q�plb��>�6473H�B$6eQ05�f��A�5�kv1��V_	�SYc}q�_/ �Iʻ&�c�;Hgu�,����T�
K�rc�3�G�P�p�^㥣�*W(�*�(��= -� y)�|�˗���_a�䔬�
,�I]8�`,����3�+CI�����#&9zj1���U�9[c��Q�{���%�Y���ްFs���r��&�b��y�<X�12^��Vwd�z�K.� z�쟑�8��@�[0̲8���Q�evء��;��#��$�\��l:��i/
��qQȄKk���"��`I���7��ȁ�Ww��2��Ÿ�΅�_W';�e
�r����WVr䈴��ȃ��}���ٕ�!r���y�Cv��DA��!�]�;�~�l�l�P��2l.ϵ�Q4�VE�=��9�<�֠Z��������u�����̴U1�&&��$*��U�0��8�O�!И�ے��3����.g`%:aLm�����Ԭl�Nf�榋���K�*Y3�=��ߖL$8������b;�c!���!$�[U�m���ʂD7[[T
�F��&ŐP�+�40x��B��Q���
b������9����밮����HT�)E.b��NtF����=�'ᄰ����;!�ƭ��y��ֲ���u��k�Yb�lL�uw~�j�56T3���~ڀ{�[��=9`Hr�Au�I�I��yAs�l�f4-�+5���ð��@�S,���h���j�p8���l'ެ��('ɸ���2],v�C˷$�e��p�ɓ�rx�P��4�S�X��XCԈ�u	'M�N
_�r[�
J�hyھ�Be��*�d��p��p��!<��D+j�!�%C%�4:�!��L��0�����N�O17�rAx�X0�9�B�L��b�M���r���1��gpw��5�m��â��yb�BX���o��6Cx�N�
u�[��u�=�ޚ;M��؎��6��[����� vE�B��9�Q�@�K廠_<2
��D]b��s�ؗ�]��#D/tE���#q�#-��~?�p�]hu�N������5�n͑R���,�&.6����<ōev��4QQ�Z
����(�<��Ȑˁ,OZ��p�9/}��ڥ�p�~�/d��y '���ᶐ^�����d#B��	��tK�+��{�>�
&<�~��̅�i� ��jp{UMUM���*��ӳS)LJͰ�$P����_Ո�&�z�A�a��a��&�?y�`�8{`ܳ]���D��*s;Zt���Q�#��e 	�
s5,WC�	�1�mbY��3�j�&	2���y�H��=v#��t6��`��� S�SkCn#�F��ӣԦj�Ou�6\S�%6�p�*�-aS���XK
baqT%k��Gr�$�>������,b�u%?��߸�U�,
�%��G��@����|�ki��|�m��1|�i� <=�(��i�E�C�
:;�ħ���-k���j�o =/�M>*��q������Wh��s�I��r�n�^�V*��\�A�� �,�35LB?�Akq����=8j@%	��>�mP�xL�A��0O@o��!ѵ{5��U
��<�c���(�;*��MV���m,<k�pOM��T2��b�E8B�Y���k��܀��ك�����Q��+����t��q�{@�3r�����6\���D2O�i"Dېd��٤��wf�e_���4Z�z�SI`J9�m���Ǹo�F��K/'��g玅�Ӈ��l��u����_�v�Tq��m�[�|O����({�.磒@�y�Z�?ݪ/�A��QIpgi�_~:m�=�����uZ}،�Jn�Ƒ�Lk��vӲ�@����]�Q=�N|�~Q���Ai�7���Ǯ�H����Y�#�%M�m[͌.5gV^6Q��&w�c_9����}��e��G��@��l�X�l���6�wj{��Σ�����-���� �1U��n��D��U��B����kk��O/Z>��X>���{Ͼ���7�N}�Iz%
Pݬ1�W���A�0�����R���(�}���;�/?���1��� �wˌ&Z��;�2#��ȓt�I*�D�\�t@s<��n����Z5��襠h��>����N�iD�^�ղȄ�o����U�Os���\�u<�"B:c����jk�n�HՄr^��M���z�N�L�`|�-�<��g����+_R�D���W~�A�@�%'�m���O~�|��!����bC�X��Nrg9/*��eIײ�ɦ�L�Ee96V�2�ӷ�<,�1"A� M��ŧ+˯����ª��I�#�F`'O��|TȖ�n�&�e��x�$M����s�v�f��cy[$��R�[����q�mX���p
Φ����4��5�G�Hِc?"e�Yoy)Y%p�!b^Ɋ,�>%C�&�DG ��4K�X���l�X<BnX��-�'�!��O�`R���y�RY�.;�*4A�[�&8'
#}���4�,jϺW#$�ηOJ���y13��pA������3�Rͪ�o���sՈb���X�f���ʲ�� R	�\c��v���S��AP[���7�5�P"A�Jf"�Ѩ
��I��WZ�`}��XBH����ʡ�"��F�zZ�B�Q˜ixs5^vm�>e�&�YP�`�4��T�)���ܣ��n �ط��}�a��_��D��pPE.ZA�Ł���	�J#�!`�MAS��m�=�b��oE�g�������X#�'�7œ�N�D������c�q,�F�8A0�c>����b.L%�OX>�J��H��&[���k��h{`� ����L��t�T���2�(��g����$�M1 ��Іg��*�-e��b��E]��.��K�Ro&���jy�/����8U�fP�Þ/ƪ+x���ji�Ԓ���<��9C�h�?�6a�0�p�`g�~4	^��G)�KD�VƘ)2��`���!��FuYC&f�*R76=���A	�T���J�,�V��0��:U�ԁ(�Y�	��7R��&A�=���iD���䤝`W���p����`�u��5	����X���U��m��n�U-J
]04�P�ԩn��p�D+�V.�>>A��ps4��5Y*�ÑM�%�����߀��9���.��F�Ma�C�ƻj�.�Ԡ]�d�J]�V�|�(�@�$�XW{\�ѥ�������:?h=o��:���g�_�:���ޯ���_�����spv�����ǃ�o�&��`��Ŗg#.��i8��A�<�����VַǓ�.Xƶj�E2x5Qןߜ�<|�hܙo�]gr0�򀁓�Q+a��q׼I�1��63kv���a/J,��y�d��Is��:��f��OS�5��j�L�[���<0Ǣ�J�TD8E�;E���ۛg~�'KI�m4�bĈih�&��B�G��ߔ����+�֏���|�����ϟ�2(�gO���|��)eNٯ\/�?^����0{�b	9��,����"���Il8tam�c�cRi�u(�$m�%.]Y2��"��3	9*�q
:R�$�-X��͵��������g�ZHʓ��5J����E�ͳ�!n�����.%	X�t����H�*���6�@	e�:�焱z�{�
q�J��!��,����[0�a�QC�[,�V�R����Ej�����CS/��E˜Y�餋+��e����j�B�R��-��]�;�s�ox���V����V���`=/)�vQr�ˡ[v@����f^�cT���'���Q����k����N-�c�4F�1A���g��Y:u�"�U37v�Uӡ᦬�s�0ةuE������ߐ�8'r�7_�LA~�Ǣ�zx�Dc�4��$���4�,�w��&�=255�&�l<�š��~����"?�~�r��I�U�我��y�`�[r�K�p�p���<���0�Z{
-9O��v���N���G#=�x°=an�Y�L�����1lye?�[|�
�Vjej|�5�� �os�>�^�[���ݚ�鳯��p��i��:���&�0���t�-��y�S�8���W`?�����a��;xl�_@Ôw��AA/��uF�uB^G�0�LF�˃�'h����A�SnV^�X}1/�LG����uQe�-wvJ6F%9��ӯy���ur�x�&"��@����TT|
����y��Y�lT��X��?�{�Bs�/��MRmί��/_u�ܜ��7��Ff�TU�0v	������]kp�\��~np���C:�����Lؕ�X� ˞�ʔr��w�3�U� o&���p��yIN�E��c�/x��A���U_^�g
E�-Ϫ�WJ�n���֦�+z����˦Z��B�p��l��y�N� ��n��.�}.�]��.�8T}zm�u�e�#!�&e)A>m�\�y�e�uP�g�g��70�FtE�
�Q��P���;�I6���q�
�y^W�_�y�M�s��+���+�!Q�%�Am��ZuKyk8��v���,wN]��΢	�[�@>�:k5%'��%��Strx�L^9�T���Ɏs�`I�*C��M��Z�����LU��t�1a�L�
������q�?�$���������������C�[�<�u�+��u�ء��5�4J�	�p��^#�A�R���h<fi �]�<�.��O�}oư4�k�re�0u�Գ7�r�3AF�p'����xO�<O��l�K@�O�y��P�սT̾��_�����g��]�+��{cϠd��;��۪��Pۺ�Qœ��&��mc]��
{���tt��T�i�ѩ����H���E�X�r0�/{����s����P�u�=WUj���M��*W}rw��s�W�c���}��Nӝr�r��E��	]���,H�7u�O�v�O	w�㓯^���w��lEɼAj����}ӝkZS
��s�~��3�zG���Cb����y��_�z�������A��9�E2B�&+\�'O��LM��x�ب��r��YZ)����@�eɯ�G_N���z���}��w�B|*�`8�K���i�����"<�q�zx����SȚ���F�k��5�����S��
ߨ�{Ϩ��gC�u!���.9}W�����������v����w�ss|P�;<w�G���8��;ߩ��K�zCU���������;Mx�ٻN��~�L�b�U.%H��2T��C�����w��]�
j,�Ie�,`bfy����RM�8u�t�3�����ݿ7͙[fLs����[/�ff��g���33_7Z���h��yU�Ҋe��0�4�%;o|X�騇Ì�P���w�l��%��2�2�g3"�@�
�}u�t�Y���L�5.)�}��v���p���KT�q8x�#l��Ø�-eUy����[e~Y"c����S�.�������+$_��J]���K�e��;\"2h�Cm���X7uϡl���S�1�KIA�x������xa�f��[Zl
��-��f<3q-g���XYH'�:kZ�ۑ�>��_e��*��οR��+�jj�i�_��̺�K����U�im�g_�dL���ip^ȱ��M�I
��h��.�v2&�|3	ݒ��u8z��h4Hc��s�?~$/<m>�,�������s�O�{�q^N���2��$���ۯ\�\��!�T/C���	a�1S6�E1O��[�<S'�~d@\�
twjrv��>9���W�]\��f����m/�V�:�`y ��񂣙�H�����d	W�W��=ƞv��Z�C#�ۥ�e2;���x�9�y������N�P�����tB�1��0�3@G�6��8+�$�RY�v�s�j���L��F�qɶ{�r�rJ�U�<��+�VS������k�J�4���]^׆MΩݚ��s���<M�A�~�k��������q�� �b�S*� ��nX��-'2��%��1�J�U�0dɮ���m5&�N�ښ������5�y�߻.�+�M>F�0�\B�y�͙ �o�H��ڦc��z��X)�D�Ӊ"�W�pEa�������oȃ^��~������

n�yA�
�檤��ye���޳��##�~�;ä���CPA�!m��V7��I�����+ɮ$�P���}T��?��[�z���w%D�_�=4�2�>z�Ų���$9@��w]uܵ��i�4
��
h }���W�y��׾>g���<\$���/=�0V����U,��jv-�%~mٶ��i��̈��)�:�Tz�݈n��t!���ɺ��G�͎�˹��<!#���u�7�{�W�~`L�i"�hj�9�1(��Aե�����ub�&'�;u�
����2��y��gtPHj@1�8�X�v�nR�9�Hz�%K-{�)'4���;����t�",�q?�<�
��5�ٻ�ہ�,�٥u'��H%�,O��C��$�
bhjt84
8�7"z��h�7Bs�V�"�7���]����*w9r>���?�������ȷ�G8���+��JS���eM�&��� �4��&ü��;�r��1�t'���U/�����=��w>z���+�f�w����.��[rn㺫�1�ӕ����>���pו�N}��^���g������r9��FY�ۃ�r앇F؏�S���HD�%�)i��%�#X�KI��'Iٰ-Ϋ���+�����AYD�%z͈S'��H��ĕo�d6.$rW�n�"+�X�\	��,l���O�|��O$���}� 4Nx[ՓĨ$NT;$�p��F�2$S+��1K�{���'F|�Eϑ�)~�r��*�畏)���r��+�$��ח������Qְ;"p��#݇Ѷ_�X��EI'���dr��%ta��I3Y��,��>�z����d�n����#@|����,��b�KwIR�w��ۓ<�ݎ��N,�L� R��Ι'�W�W:��a`f�|��Z��.�T��Q�XٰSV)V�	7��D�u�)xz��(�;�"����Wk&��[�Ī�#�ʎ�{�T155��ܳI�K����oJ���;�XF)n��U�O�HPt��r�;l,��i^Be*���x�B�W�@C��dY�©jh��H5������д��p9^v�c���!c������<���3~��$-3�Y03�=�7�����a�]�U�t�p��"����j>א��i��*�bèV0=q����v��b��"`�iJT�9�$�.2
ՑQ#R�0��76��XL���
^NjST�`�k:�	���v�/�|\ɔ	�����<ڗ`bia�.�b�=�K� �㚌�nP��A����Uf���os�Y��mw�I�o��ujpdu~��A����7�����#��Az�`��̰[+��g"�y]]c����*y�YL�v
��2Z��:?h�m�EO������G	��p��2���e���=H�9�Pˆ�"��D�`�������;�c�Mu��T�o���T��Z�A_q\؈�9I�����W:�O�w:K�`l��O��🾕��85
Q����;sg�W�Q����@��%N6�I�*'�(��d$�CzKt���+�"]b�Y����Q��n;u(���<��������Fzgibb��unh�
�a;�p���7�Ʉ����^O�O5�������Jɝ��wnM���m;�9|���,V��a��L�.�T�0�z�=�
F���������?��؋+���=����g�&$���f��o��՟1ݸ���+�"��l�|40|R�]�g��?z]�U��<��bn5զ�$�T�ͣa���|�t.�	a�k!��0�{T��2W5�|�Q��;:�a%�d]��*���F�Ȃ�M�	�hQ0m�ٜ֙��5�`mp���A ���X�P���*L6����i_SYY��*��E��h�Mm��J{&VW^�ؒ6$���y�b��#��9�N*�s�ޛ��(_"�O����GA�:�ܕqꀇ�B�0��'WQ�iB7M�Ѫ7}��',�#�{�m��c���k#?>����n��Lea �\Ͳ����.\�[}�
4ێ-녶Yֈ�{��ncT[t����liT<5O��<���['��'�ߩ|j��Y������7�z`wF��7�[��.4g�,~�K:�u�A�Wc�}���u��4�e3�l/誳y՝ۯ\?��i}�#�m��NJ�$60]�]WA����؅".�7���ј��+�17�ѫ��˗ɷW��WW޺�<�9a!��Ţ�U�k�0�'6�4���ӏn<g㦟XvaHV
��l��l�{H��|0�Y�j��ν�k�N��-a���6.iV��TNa�W��O�8�>��Y�X~l�g�F	qg_�P�Ye�Ϙ���"A�B4x��j^'��ֳ���}��4�r���s�h^l��	�>�8�|�̤��z�a)�
c���[�D���$u��;�_�	�l���i� ��|��W�S�C��W�Ó���2��J�(WՌ�$,���Z���ZylRoM's�K/)g�+�tO�h�o�i�ug�J�VM+�j+lm��p��UN&C�H�y�s&ݟ�楻����/���Rt����Vio�2�2�uM�a��W�H�э���L��
�ޜ�9g�7�1C-KK��E�܌�t�`��ޙ�}�䡚�����!�4:3���OׇY�s;,SN��>Y��+�����j�6��b�?{m���6�-���^��Ecw{j]]��]��)s"�]�\���؀��]rNѱ��c��ik�u�g_����¥˸3y���F���&����5���_���xd��Y�ʋ9x/F����|��ڛ���|�knn|�9���q����9�3gg�G���q�ϟ�S�9�i/��vʟN���G/ku�:� ��"��f�R��F�E���g��4�3�����%�?�30c���/����!K���̘j���\�U���cR�-�;W�5C������ܛ��h�3ߘ3#�i����mR�d@y��y��4_���_�{�S-k�I�1gW�d}�]�$�(�/�bc�Y�BK����
GE+5*k#�u�\H 
��W}�Ac�9�u�ů�`�:?9$��̗Iѩ�%�7
�:s��奕�_�x�#kF����!�d����x$<��mR�#��Y'�]�1�����)�y��X����.���<����_g�[
�cDb
�F�bpM��yŌ�G5(�C�����AWsO��b��\��]\�^���w	],��C�\�}C��)�t��|�3���!Ώq���|F�x-�㜿S�K9�V9�]����[hrn��9�4�%e�"<k�a"'��'�l����d,��
���g)	zK��V�w|��lq̭��}SV��l���/sQ�|��	���i���l�A&p��}W�͘a������V���mjꝎ��6�dc&n%��|�|��%O�9��3��X��"���U�]�DŽ�*�1�V�$'�Xȉ�sH_0�:Sy�i,����}�h��f��P��)��[R1O�]�a�eYr��4�H5���2�.�X�0�$)6, �J�p( ]�*�kx82�h�ðL%z��n�9�п�i�����&��N��:ݮ�U��>#AL�B���঒�@.��9���=�&!1�����z�Wv�F��ڌ�W}�pޤ��})��Kc�Yξ�߬:�Pj������ШQ*
���2�1/P}�Dz3�����U��1N����[�ƐT����i=���u����]FLY��g�����a��)�֪����'�U��Ǹ	�-N��Exv-����]ߑ9o�d���z�(��a7��x�֮�|�)��]9
nzH�}7��"�]�˼_>����K2\����]v�v����ke���n�ny�Bi�\o̗�w��s�L'���+7A�*ʖ,�r<����M`u�@��w�r���Z�ʇ��1��.I�n���lD��uZ0���I{�
<��h�c��tQD�CeC�H,9�W���i�Ǭ�P%�ڒib����
Gh�,���S	���Z̈���%$-zn�Z�}���\�����ζ��y��5ð�8�mr���c/��Z�7����-y�`��l��i�A#�m}C_�]U*,b���W�=���%l�DcP���[�"�i����!�n�L��e���@>��i��]6t����~���ڴ�^zaicu�u8�c��h4u��JMCz+MSȰ��-���S����B7-���׫�-���Y�Lķo
hL�����j�G�;~	F��ֆ����G��&��W���&b�]��J�;�8v����{	�.��r��/��'��|F^���o��[Y>xp9�OE�2�����D��'��$�,"ӐO}��_����ǯ=��'��}m����mw?��Ę��b�0�65"��U(�R�P�R�SnP�(w*�Ŭk��E2Z�pc8Ɗ��#=v������{�@|�� �tǸ`���|׽���+��񂅯}���b7z-Wof�Jo�������n�y�_c��ݰ�ۿ���*�| r�ZX�h�K��9��Ӳ-�>��i-J��w�4[��.l���i�m���_F�o�@!�k�[<�Z�9mÏ�c�C5����_D~S��kv�W��.�#�0�HW�ad�]���h�d1�Aθ�-�~eCD�I�ȥC;\ƽe�V��O�u$N ���$�eǰ�j�Up��~¹�u
�|D��쫡��)�Jl1G�+mC����E�B�Z �uD�b�L��<�^�g����ޗ�v�Q�e��
æ��OӴds5���#~�OY�RZ�1���X���Q�3�]��o�𕆊�u�`:��<�����˔W)oPޮ�O�5b�
X�8�rX�5.��x�\61����2L��ُ}��Yʆ"�qP8h�d|'s:�װ4�1�>�^�|��:o�r�w�t�
!���hq�%;�%=h,:Ӓ�a���2���-$D���b-��װ���&�gu�ٶ�bՏ�(N���}HSK�q�EA��;�M[���Y�G�+��^��pհ�;1��&�(T5�c;�eϛ�p�m��|m7�++�w�7�~���8�'^�R;P�99z�F�_alh!X�J91��#�0*!!���3��	/-��0)�x�������0m�F<[��2�_��,��z9�
�j�[��N�� ��V�r�M/(��8���p0H�"��Z�wg����l�{7�z�AF.�T=x�*6����ewg\�XBˏ�S������M'_��r:����_�̞^�N2��(�B�6c�9X&I�f�$�M�4��2�Ť₦��L0���L[�;���0[�.mA��g���;���F�,/����;dW�����6Ȩ�t��[HLڰ)!���	=Y$��)Œ�;Ӱ
n��-�	C��%�w�6���g��`Ѹ��h�ab��g$ah��H�tb3�
vn7j�F4�H X��Qk�a=�٩9۟��5׀��q�%$���A����:�ܯ�S~y�)Z.�"��	����n�	i��b-V���)��x�U$E^�u�#�X~�l��f�;�l��j9���p |G���Y%55[���YJ>5V���'Q�D4�ᒘ������JƳȐ-��[�[��4
fV�gͨ���7	��LT���o�8	�4�GZWadL�d����=�a�y.,s���eV�`#-D�kbN���b9`���#C3M���ˮ�:��1��S���,8C��l�'�z�٨�w/�K$�����	�7��pr~��_!Ӯ@YU3��u��
��tel	��;*�r���MkQ!)��SX�0�4(V�Ẽَ���<�������~�Z{g��d�a�7G�R��3�L���}o���lہ�~���I��@��2��I����Q魛�^niИr��W���������|�1%�rVNӇaX�(�(�=����9�n���Dc������.�s��������Ki��ؼ��e�r'������2U�%:��(�a����@ؘN�
�X���+V�#�6�6�|�!�[���Ќ�P(��mk�9��Zd��#†F`��tq/�Xb�����a�#���KTS�E�?���c��������W��c�cJ@���$u	��(�d
[&y�8[�	�G����#}�����;q�p��-9,��J�����8��^8"0p�݀!Ֆi:�����m>�:�0��
Izu��N����Y���s]
QN�c6U�|�FL8>��q�ya� 
�3�9���~��7��\��a�t�X��l.�ͼ�[yf�����5��k���IC��Jr���<�
���2v��?�s�Ļr�D�KX�#�A��*M��0��aG�.jf������Ǒ
��$����J~s~l��P��7�vg�I�۞;�;�`��I����=eg\��8�_�i��A5h<Z�o3􊝰j�%vYal���t�l%���ȓ�-c�8��	,-�[�&8~]�x�N�Nzqw���._��G\
	�:����|K��*W.�2⼩����7ƣ�!��(�)�v�~�\Z�
����bK}���dͼ��dH�;�?��_}�hDi��y]�]���b�fAS5�N���2�I%޶��
���C�'� ����AXk��@V��u0�%�{Ӎ�0�|���ڭ{v-Yv{:�����ȿ�O)x~{�x�l��Oҏe54U�ql�3\�M�yM��}��3B�jcr.kv$�%�]�����j/qN����u_ �Ř������Vy��] 6�e�OO���VZۏ�Ƌ��x�R�O>|]�7<����=cq��co����Hh�X�$��m��YT�k`"�p��N8nm�1+F�:`uڎ5��xB���F��!�J����d�n�����Ӈ��<6�v��W��W:�]v���y⮬�}!�5��E����ǒ��]9vj�E��@��E����(k���jl�}��mʋ�7g/�`��a
�UG�-	J0.�ķ�<鉘��$�#����09���CA�#�߅DX̚�>�m����7�M~�R׎(-9$�|�*6[�'b�S܋<�*�GV��YQ5hW�j�V���<�T�jf]�^!N�%ͪ��љ�F����U��h�y$��W�L!4l�v����J��M�Z~5��o}ಸ(�:*�
�[�䦬��赈ڡ������(�?��I��Փ�`����s��b\Cd\������Sb�F	3�W:/=�� 0��X���.�Gd���(l��Ԙr��^�);�\�P�,θ-�o��oHi�H�M�4�c��	̀[&�Zj�rLյ]
̸��^Ru���VhE,�K�32#�5-�b:NU�=��,�'l�5�_�y�ZbY1��$�\BTU�0��"�Cc+.<:o%e��:ae����+�p�S_b~��6��uNYA�+Q!��J�
��(��s��5�,p%���`i��4	I�0%������i���vk�2ݫ3z�Tw�=��rӤ��;���ýg�ZL�$^T/���1
^���[�i6���ϑ�liW����)'<Խ�E�(څ>�D�_��,�0Ӥ����(m�«�W~�yv�7j��.��BK�3�@ܩ�����Y�#y#�iq/��v�B��Eg�/�q�H��]��9��=n�!� W�	$HT	S��*?Lə��mW� 58��;����H+��Ό�
�f��Sܛ��^1���
5	�p��F��U��b�^��F׋`	�?��/ja�8A���2��.̛�zȟ�2����ʇ��+_S~>N���.��Q�����ǴW�a<j�Hd/�NgE���X1|�(s�C��(�`���;2�݆;�C^O��}��Lے���@_��5ʋ`0
��ei��
�y�oy澰V��p{�#-d�[qŸ�]����5�"F�f�n����d4������֩N(���R��(
��ql�5�\����X�o��J�L�����
S_�#2�\���;�穌��\'��_�
)v�[����[��6A"a��Co�������:!c�l��|���e+?Ol	uL�?���\[2���^��X�%N2�����h�1e���F�	Ug4�_T�QiB(�Q���[~
�ۡ�%*ka�L=�"��"�C
Ϟp�K(1\�Rڂɔ��5�=P��E�x��
�~��|�0rs���G��3�,��%sb^
���<�ox:8;'��$e;�6CI�3���!�/>��EWX���M�`��m�uk�YU�2GU���C�kھU��Q�ݬ��6���B��Xߴ�t�b��3����3���>��hi)���[_��U.N��>5g��k��,_xaEv�\���U��V���.Vf��]���ǯ��kgd�7�B~AYK��rRyX%(ު�W�u��U��|SFad�����90�r���Zk�����9�K�̨��y0�B%thv���ϛSx�%/�+a�.��u$�h�H�8G��ݗe=�i��!��T:������_7?��N.�b����,�z9��xuL��܈��T3��KSX"m�q�����V�#�+8�mc��t�8?�u��p����-P�YVH])�ay.����	�M���o��Z�}�Fԛ�x���麦)ZS�/tŋ5�5��
��%�q}�������LׂV���B7�i�a]�d/�˝2��,���¸��2�6��X�:�&¼�4�ra�S�����i�ز��
��x��t�w����
�F�G��ÅJ�8�A�qE v�(9�L�oo�j�q̛d7��7nj�U���l�Y��1f7��
z���*���E!t{!	��
�a���HU�W�ij:c6�c�F=(�ۉ+|�ڇ.�/B��fؓ�mi��a� Y�e�/�Փ��}G���&��v��+_��+��bԕ�sU��L�]���A�3��0�%y��Kʈ���BB�I2����"ͭ��p�Qb?w&��i�R{���Ձ
w��UP���-���=�$J��1�y;*N�,����x�l��"��d���Ş3���f)I��Jɔ�eN����8��?�@��Ӯ)p'���<���N~�+_��O�j	�,N�oo�荼~���2��\�����4��b\$�acfC�Z�l�1Z���ؔ�t37��ޯ��q�'DE����:�/��7
؏�ͦ�d��h?⬺M+t���A�O�	�e�èSl�m����>L>�O*�Q�)��å�G��cG2���Q�`d6#� �#�����-�hŒ��[A�:#}Zn��Az�C�]�i���iO��JfK����^�X�v�K���3Y�sJ+4ɓ���J4��tR6��W�	4٥&�����:�4�"�h*��~<�o�`�#��i�v����i[<2��I�3�Gb�2\ke*\��M��{&�Z`�� ?,nj�MwM]5�����/C���VCUc�Nm=h�l�޾��",y���K����D%�U�(@�M�o����6� � �0�I3�7�[x�3W2i��R޾��W1F�
��7'�l��!")����qX�.Q���)��H6��
[
$��f0aK�*Q}��qX�4�5A`ieV�h�|l)9n���m���e�Y/���ڮ�w0��(N���oJS��y�c\��'�~�Yb��Yw�Ft+b� ~-K)��4L̈́+���s��:p���`�Lc���jΎ(A�zG�����~�~���0|�pɋA7$�gn��j8�f�+6�>Z��
E��D��}�SO}xa��p�}��9r�ĉ�S��;�s�g9�(���e݌�.�A�9烝N�ˍ�A�=��B���G���ۇ��}��$�'2����Vޗ�9<�`�
ಲ��Ǖς���=�
0ű��9�Q�ƈ�Kst_�^��3˥I�$�ш\c��7�koԣ��K��#���ﺣ=���G�bT��{�N#O#س5Q���Y�{g����Q���`v6���
'oy�*��4
ͷ+6\[ ��0\]w
#1
�:)-��E���uZGE`q�Xz�#�]�,G-�:���S�sRÍ� *��mn�'~7$~���#���^{���s��=��ݖ�e�����n����?7J�|a?���"��h��)�	5��0����X���w��De*�!��./M��%�#�y���4��ʋ�C�E�_*�V��|IvUz�Y�߂[��1ZQ�\�b�l������W7D봋|i#�`�����xF���9��Tˬ�@����_Jq(dȶ
7S,���"(>�u�ʄ������!L&�Nz��!I�A�¾Z�t�6�*f=��v����IG:�h���Y�N|�hp�b�Z�F�wc�%��ka��uB�0쀥{�ڦ���pl���a�rL�Q�K/�E�G�E��xlFN���'$� ���s���4�:
���A*��	����55AXH�%�1�cb�$�l���y�L!�����?ZA�c��'�S,��!�n,�d�n��h�y�o"��@�����J9��m��n��~&�pAm��iz��إ�i[/�N��H�_�8��CD3TUYC9
�%M��p$�`F�P�A����K�Y���ꧠ�=obF\aS��=�nOx.�r�Θf�X|�r��o/
D��L̏#�'D� ���"�2�{�3���x:���f�:��00F�MPZcVl�Lơ�'ȧ��ΓQK�w ž�^B�A�X��J>���ե-p�c׍��|3#��eU�}��Qn��yV�r��]�`Pɚͬ�74�vZ��#���/|���a+�e<��������O�޶�r�ud��(>��_eo�r�$�k��<6�K��Uޣ|��O���w���?B��n�"�r�	̦���_��:�¢���%�U��6UwGۀ���ř�nގ�A��p�9UJ�l�H?�����L�K��t:�����E��Gv���\sKe��m�/�F#I�;�b���ύ�^�%��e�cI����
Y�4�nv���߯΅���_��iܱB���Ƕ_s�=�/�AnK
�pm��N$��
}�����	��|+�-"�s��X��5��������ʅ��^=�W����#���k��{��cN��K�B}�}04d�{�+Zc=P|���vb}����{�͒'��|�'�<>��yn$�Ո��1�r�r�� b�ɚ�t	�[.;߲A�tj�a"��,���V?/���$0���?���<e�KOv�Io	�&F�Xs���z_�i�&̮��]L��΍3��R�W�bV�X+�$��U�:ր�jڈ�Z�c���㭒.�
,�uu��7C�;�
���ǦRcR���}u�?%��^
ҳ��'AV֧�iC��1;/���"��z��	{����z�oco�W�gɝp���� ��]����Ʊ�]������՗�|��#[�-���������+͵�@,TWڇ�-�z�B��G��K��1�s(�d�p)��&�Re�ۢs�<~b�pvw_��J�
�U���+��n��]��Ǘ3׫D�.w����9PL]ľT���)�(V���#�Q���(g��p��aA�:��V�䗻�RO�����̩5�ˣ��,�2L�
�P�Ȑ�����U�%2p�B��8�ע�eO�t��WGrʨ�̋�<�=�I�$��r��a�ky4M����F���	.Ds'�"l��e��%��;�>�Ω�R�x����q��
�	�f4�Q�i��$@!�dr�
�
ƻk/�]�m�1�-kXl�����}㰋�[ۻx���;�w4��?��7wn��U�N�:�p���ژ�c��l�5C˜-�nl�L1��5M�e�ƶ���kk��
gp��S�t�ׯ�XL�,U���	j6L�z�N,Sc����l��a��^.%�+:�9�8`wPgOsL�e�&aDn�Ĵ�H�p���K�#2g”FT�"��x�Sؙ4x0>���_Bqv��D�R��|�˄S���p%�*/w �>�꺯|�@�r{�
v�$�Q�zD\��M�_ͨ^�,BNRD��9�6��R�P���H��l8��-�7^�	�؃J�� (1�NQ��$;p�LB�R	j�s�fx��"t���p��D���Jc��}��|{�i����i){w���#XJ��@|(�o�K�y��g�zЪ�X�/(<Z����E���\��>����1���Lx	.h��~���_2Wxʗ�ྂ9#�gwF.H����6@֊��X)DaFa#�U]�����#Ԇ�1����F�������7�M�G�sɖ�Gv'["�"߃\���Q�_��s��,��p�
/��E`�̏��0�>6�d���赤������,��.\$��I�ҕݯ��3�P�x�a�p��>�5Jꌋٰ�-�2��y�I��+!��&u-jk�Պ�#�u|;��i��I�dp�)�x�d�0$y;ӎ�L�j��PscrE��������w"{3�#d�!$,Z�5�X	��ԃ1�7s]��!��ϬP�:��M,a����t�o�d�y�Q㖒��v�+-�P���л���^���myB�
)���-��|ځ���`��o_B�yp�Z�Eq�EB����T�ESj�2]���Nh�J4.�2q ��d�la������u��f*�O���l/���,�1�av|�3����Btr��߯�q����߸���x�I��}x"`U>��r�[�x,W?{�Kv�>~�3w�u�{��Oȉr��7���/���_�h��v�_�}���Fj:�%?k8���>�s�KO�?��wȏ��g����%\f�b����\4�,���Usz�-Я�u�.E�-�b�h��U痽����[��_?T�m�,��V��,��~�R<(֥(&q2n(�����_�r+��|��������m�%�
�s�%Ļ2�Ȳ;Y#��/�l�68D�]�@� _��K/�]…n���ٌ3{���(Ԓ�+�=[`���	��R'�a4�{4�Α��k�q�r�1Zn7!dC U���*��%0�b������+�2|-��ʜ_*sso�H���o0�̉�oa�|u얰(}ܰ0�������u��HB��Kn��z&]ј#������톷0��Rb|�W	jAo�n��W�W
�����w
�.<
��X�z�*d+�o���Y勤+7�&��}���:]x.�*�0��n.��yWv{�Ѫ6���%��5�k��?��?���7�����ޘ.:q�7�5[x̥(7���'�'Z��G��表0�G{/���(*��1M*e?���3y�+<����-�<��D�3#�tDQ�� 7���n{ՋWN�~ze��j�<׊�h�T�'PAZ�}�'E
�����&�a�3B�
�t�C�"r���/�*�}��DŽY��1_"��|���儲����Mfd�x��Dt�ɪ������zWD
��G��(���\�zU�jR>zׅ�*�������A�G7�m��^��s�7��1�J�R����Z(��U��胈fd�W���
��s��6����S;H��׶���w��s�a?�؇�����/{$�!�诣Zw��j3�E�W��ս�IK�����)�<�w�
��g?Kޤ�ז
�
7�L��[
?�����DŽ�:.��b��A��2�f�����`������*�śe��?��a�46�\�v-��T	�֘CT�|:{W�Ix���Ѽe�7z�N;wI��z/��-�kq)v��f?�X���[���r�Jt�	s�	�J�Jתى7��r���nP1��UWg$(�1+���%���g�~Ϳ�ѝ[���Y+n{slh6���h��D�K*Ij��5�2���� �4����Q�8�J$E�:��@?1������ŠF�RZKB�m�&�.�"V����r�"��6�h�c܊��z* � �ӵ�'C��܏�O��>R8�ux\��S����Sd�D�K�L� 8)/�g)��BK�L;��3Wj�9��kY�l�Œ�Yf[]*�X3�9zC������)3�II��N1Tȿ���  �Qnj"c
�'J���d������:5���NJ�7iU��vg�4��K���BTh!V/Vđ��D�#��;�Y
�b��G�I�C��uS\�v��+���G��w>x�+^y����.<��aj�n��~ы�~����w�Uםbp�/\�����NP;#��`rv,
�*1�ɦ
2���D�$\�I%�C��T��wf���z�|y��N�Y���锷����wɹ�ީ��5�X_y�8t�|�]���\�ソԜ;�J+(��������Ma��KIL��ĝ��;qt�R�qs�py?n��ӳ�P̊p�`�MG��%�~����k�)5��4�O�k�2�ZJ�1�Pe}�>vl{��1�'o�T#��[9�WӔ��8FμE<~�C;�I���ԬR�9��[:�����m�宧�k��7�4���'>nA�s��h���f8���˂Y�Wؼ�ꄃi6.�qv�\2�
��4�⁡�_������Ç�f�u��������\lX�U�ΧKGw���8X�&�pn��hgj��O��$�ÕZ�ǃf3��h����Y*�PU1�dž�~��w�w����'��^>Hxi����%�T���sX}ԝ��/G�3[9����ü��)�k*d�Q�ޕ�"��V�{s�ը����a8����|��-ի�W����ug���?Tך��u�:�~w��k��R9��b{T[�yi�^�
��G��w�uS=�#B�"�S��\"q�y5�@��r"<�bGa'���ώO:�'���3�a���ض[{����U�a��o}(�\�Ъ����[���\�����?~ݚ$V��$��x:O�X���t��2~�=��V���+�û���?&/{�>��nY�~��?���j�Z;\"��;;����ڦ��p�{�Ra�h��a0������a�VaB�C�=����W�jnw\��[��R��Q2g�G�
Dqc��#��.-%�C������:Y��x~[���
�S��S�G���9Ur�O��=�/�c��Q���h�=��<�<��X�� �i���9�~����|$`��	�&�N-.G+�.����2�+�됱&�2Mz��i����2���I�9	;��.۾�z/�-
�=�I�G��Cr����ig�1�g.���9��uSG=����{yY�L�v��`��p�v�R�o{��!X�>��C�"E�,�FMK�Ɖz����p�e�b1�|�iZ�H��z����+����e޴���Y֩�uf�2O��ɰo5̓g-���u�I�+��y���|�������!���޻T�����GӼ��,�C䯎���	_�x��OP��~+x�o^��}⡇�ߙ�A��/L ���l1.��l:�'����`���pC��;$��%��c�y�|ts11�d1�sb�NtK�m����ڹUYZ��-U�?�["�^� �8�-�Œ{|�#�	�t�+�Pv�vc���F�u�,� �-��k$!�;h��a�g�f�qg��d�Cf�\{b�N&C
zg�s�m
�����,"-ڊ��Uj+�ڴÏ��Vo����Zm��w%M�v��w/YXmV���sK���	����{Գ�R	5^j�
3�>z�4?g�m���R%z�k�7�EFHIZz%���O��b��CpW17��2>H>�T	n,�Sx����'�.�9�NƓ��F���R��c��7An���"�C��
Ԗ�s��&9ḧ`�)V(�\Wd"E�)�r�PL�
��si��a߹^����)j�N'�i*��LSr�ٍ�e�և�j`K{���]\K����T�d��H6�ld��"%�M�����'���������
b�	���-��z�
d�E��@��f�s�Hh`���e�欥S��m��15[���2
��^Ѹ��~�����#��F2M��gY���ڙZ��&���rzh1k��e:/�fӭ���
!�[q��W�Ьz���m���Ap�Wt��Ȣ�N�
�o��RR��5��"B��|�qN獲��iZ��<0�Mn�~�ε�].�#ތ��_��O�Nd>W2�Y�\��I _�k�t�`y�[L��y
��qf����'��:I��_8M�_OðV��B�L|CP'�\��ӓ���q��(ZvpEQ��[+�,m��؜8'FX�,}(e��H�B{��4l�V��z���j�xS-���?�-�h��_��
M�UtZ�(z���������ۏ^���W�}�+W+Gڅ��P�|ݺA�(I��M�뺘jHr�%�=H(��i8ѕ�`���+o>��v���O\��3{+W��T�A��r�0�&��_~�m?�z�	
�SM�ώuRK��>z��wv�N\����c��k\8�z��+Z�`ݓG�������t�+u�'^�����<��S���~nC�a�V'ry7aB�j�m�U�����!\Z�h�U��Pd'C�^�
*O,7
��Y�[.�%3��r
���ۄ���\E��FŤ�HaRj2�
�^�~O)M>*�r���D��	�aM�*Z)̩��ً�#�Au
L�YM��%ަ���r�+�J���O>K� mn*���gY���Yg5��c�Y/B�b,�PP��5lxg]k���	�|2Cq���Xh
�n"yů�u�"���_���@�W�����w��3�p5�J�%1(ͷ���+��A��O�\��&�:J�0Ҥ3_t����tε��I�xc����!�u����&��V\����q�d2mcI��r����-�G�:?�s����b�W��o�����c��]qf)��uO�,���ɦ(����h�f�K�p�o$�<��/>�����O=�ԧ�z�'^�O���S�Wm��t.-�4���j%��$��U�8}���g�۠�a�VN禱�}�#Ϝ'��~�ѧq�d�)��o����o�3�g;�	��;��ɤ�T�fzr�ZӲT�B位e��]�zd�1����v�_X���{�ss���a�Hj��K?�;++��������2�'_��\���Z$�_Q��p�p3���*�����A��H�ɽR��Ur~y	���GV�t� '�#������N�sH=��hI�K1�J�R��ϼ��ϼ������j��rE�u%�v�3��~����^����}�X�e]/�Z�C^_�;���7{�V�]\9�z@]$r��x�G�C;be��������~ٱF+�V�,ao/�f�&����u�E8��U��\�
�WA<����o/��)a�Y�p��B���C�3�K�;�Bc�=���eɓٟ��H���4�)\�2U-��!�"��N�e���n���D�j;��/��!�]�?ʔM��$��#��V��N�v�a��8�^��t��I�8�%c�`�]s�>Y����]�
����a�lQ�'�f�z����v����i-k�r��Nԅ#���J�T#�u���o�b��5�OV�'�V�@׹Rk� ��o�6����E`�eѱ-���a	;���[X #�B�/GA�0q]
�)���]��P�%���5%l�b�64�(mX7ihr��DU���fH�sԿO�-��=�����]��
=�R�q�9ɗ�9<�&��99fq���8
�p#����64!w�(k@4�NfVMj���|�ʕR�Y%]F)t�ɹM�X7�f��բ�f`q55��uJ��QSכ��n�����˴ĝ�T��(%�O�Uvmf,���0��K�����emӬfB��ˋ�����B�0�o�Y��h������r\1�n�U��t�L����l����qvE�7V�ի͍�]�-k�htUA{v��ϑ���q�������|�PH���n�l4F���?΁QX��]WwO��8���Gz�8Gɀ����� ^������
k>��m�
,eU�C�TV���P��h��G���Q6g����\E�"�ZL��%���A��D�m1��N^����
�a����I��|��PQ%U�`��y�v2F�	�]:��۹~��&�*��
!��R8�)CљT�(�R9�u� HF�o�&��!�R.(ܞ��*,�Ʃ�#Ȝ i���s��x�u�.�����ki�1Q`r�	p��-F�b�S0������B�Rǵ1�QM�K,I]Ju�HG�qʹ4$�TE6��5GY[���D�	�J(8�������†���a`x"|�q#�G���vi~���b���/�,�6�!�Bw�B�<年�ݥF�����~8)w{�e1�"Jj\�C�yjJ�75�3\UD�!�/�0-ä�	��G��h3�0<���!����
����B��k	e���xk!L"�%�	�Dr��ĩ	[��b�Ig(��ÑY{J��#���!Z]*�押W�0tn��t����C��*ua�F,|*`R�8M�Ț�%J�0*l.��	�KF͎�i�pq~��a�<�+�M-�Ё�J���G-�ϑ���ר�%h���.�&!&�DX��2�4�o^�^�@VϪ�`�Ճ���B����/�/^W�R%w�;���Y�]��,D��� ����FUEZ#"�Lj^�QP�N�Z��܄2ü"��4#�'c��l���pa:�'��|
z�g)�/��f?
]:x�ۗ���6�;t���mS�"7͑C�)!��'��'��
7����@�����x�!�Ol�tɉ]�:�ֱ%�;#;�7DA�F�2ɟ�|��q�l�a���<���F��tU=�B
�]�V��8k��?kw�3���a��A���0�9G�u�3l�d�\��-r��]l�F�P�.X��%x?�����r8+/���\�I2] ��t��g�l$H]5���I�/�]�ڇ�U�C
Z��b��q����V6�=;���-%ߛ��ˮ5�t����A7Ci��g�
s��0e�-��"��eeb�f��Ti�򓅺H\G	%���|����8����h&av����_��W�S�L;W纔K.�՛�],5�A@kb2~�ۥ"�8�9��'�dk�s�����`��`~�(D۪>�7�?�E%)87�WQ�!n�D�Džfy0�e:�c�������E�U��h$a��$U�b���y*�YB���E•�W�6D���0�B���\��HM���g�������ji�d�t/u���T���u-"�nH�3�9�ܢ��[e?�5����X��~n�95hS���Ȃ#����9~_�"�<+���jȩ	狝��E�oCo0wSi���Ua�m�%�&3��t�k� /G�l#4UZNh�n��)���m����ڨ6��H�
2��f&`�a�*_w�p�y�<�&��w��3�]Ѱ,ȴ��8��i�BXE��
~oW8�J�/Kn*Ǡ�`��D�+[�c{��;6�6� �� �
�;�*S�#Ja�Sj4*iT��6c��pV�kcD&��sP��'�I��Q!�F
��:D�s��RNJ�F���$)kF��������p�ya&����9���ز�nѳ�&�YHM�1�D�G�܏��)𮆲	�}I�S��zc0�a`!Z�H�oB]��.j:�e�*�������8v�;N�\mkHd�ᚍ��8��(�N,�_?�H�&a���&Rf���&"e��\�`��V�'p��h�[��6�����ӔkDf���@���,L�tZS��5BZL�폗]�s#S�Ȼ,t��~��/A��
͆a_*F��	����;�R��҆��
����t��koCO�j����U|�YK:��kq�9�?�S�3+�=�8(�����X��[������궥��U��kioN��R#d�	¹J���Ս�2�ss:E���Z�h��\�,iz��{�2�Л�[���!1�i��<u�zRӇpہ�Ȋ+�N+��`a�5�c�����iB3�ש^��4ʦ%���		��r�,��6�nG�h�T�*������u2�y��^��P�(�4C)w�q�K�j"S/����OJ�mNŹ�~��C�5
�J%���C_����>|r4:9"��y�F�_R{	O��ԅ�7��9о1�W/,ƅ�©��m�
/+�����]{]U��w��x(k�R�+�M�T�b�/&�.>��l��˿�d�}����7�K����h������o#oz�ׯ?��ϟ:�����k��y�y�MӔ�#���	c�T>�y�E�����7��o$G��?8���wi��/��'^��<�ز��4�b��`��<w���Q?�]��/����@�l�_��(����5�Cѱ�QI�eܵ�����F��x�vsxn�_��#����ڛOo
��_�z���FZq	B�s}��y��¿(|����'�)|���o�V��B9^3C\>��	.[��~�'L��?���:C�'\H�4�M2EaXQh,f��e��!x�Y"�k��3��I6E�j����v�9�	>E4+<�0/0������1{
�ǰŷm��4��,�yv�Z3�j�h���W���p+�� �l�FD���ߢm��`ٯ�ՎY�_.ʇ�&�E�If���-�t
˱��OR�WRR�e�顨jņhVl/��X�\g�Jf�
!���K�!X��mI�N��9�/��擲f��V�ר���8�l٠^)���[���SY��>�Ѳ-��uY�X1��gF=JZ��\����������-	��>�{b�ܺ#�gP�n�<��r=0�*�"�iF�XcnW��p8N_o�l~�i�Z~��z\�hCڏXBˑ͙nI�v��$�5�dS��""�K����1�ݖI��<��g?�*�p��,<�8!ŪB7�iJB3��6�F�t�
�:>Cj��(����<Vd(k�!'�Ҏ�v�dՈ`�4�c�"S6�S):a9�0���ݺk��������4���+��b����
n���m
�m$dR\kH��VI�
�5����\���_z�Z6��%p;V�5%����f����Ð����S�6wV��q��x����6�i�D���Rd�Ǘ)y�	ZR�4��Ikwu�0��t�
HJ6�D���&Q[I�	���˹�F��z'��AyLų��ߐ	V�]8^��p�pC�B�
_-|�X�i�.�n���#��%���7��!t�R��KTI�ib��frU�&=�6cэ xFAM�|�X�&G��#Z����+r�2�l���y����p�A$�M'������m����*>p�b�]�L*~���襁���TF3]WQ5�n��G�&�/ժ�`S�6�w��+��4���Ѝ��Y�$�źݮ�S�{%:ԏ*��uc�†�ѣ�I�I���q:�LkL�q���DF�b7u�Fo'q_��	3�Ku�� P@�֡����[j�U���!-�̒��"�.A�G��R�+��l�����|P��2ǫ�V+̓�*��v)1��;<z4�fj;zQj�JAJ���3a�=BL�6ћ��Y�m�/��b��V'&���)��[+7�U�sq1��ͰR�:nt����E��.r�r�WbZ$l
��
!�jg��\:�(��g�e�N�`�����i�F�^�h�!DPyPӆpL[�_F�]��`��2��.��$mka붎A�]�����,~p}���0��WB@�]���6���|y"���PaЩIU8�S�U�iHq��:��3�u�
M�|g��-�`�d5�GnT��&7��.��ʊ�oX�V���3�	Yj2��U�G�'�E�k�pvp�Մt�U�|N���㣓Ou�<_H�Ƕ��>R�R�"N�h��C��Tӭ����Ŏ�OTr�
cQN!�+E��Ķ js�JLd��RÔCm�5]
$͂�K��`�?z�����`�*�!�,)�C� Pz��3߄}�U?3S\P���^�8��O:E����:�v��\:����*��C�J�S�tڕ���m����cyӡ���ë�n>tSi������*����߶����n$g�Xl�4o�8Hw�9��H}��q�A�Zm���x�/Z�Ϧ��>�ș��K1Z��������ȵ���}��çO?����0O|�v�0���ws��q*NJ�_�Pdӄx٤ߟ���Ͽ�%g~x��?t{�^=�%|7�:}�u����u���Y8W�f��M~�P�
O-�Ss7�����$��s���&�JG����������ƽ�J��^�HB��b�뇃�桨I�X>y��
�]���j��m�)�}�ЄS�$�m8�o��+��x�ٿ����B#`�p-��
��ɦ���9{K�L�j+�V�/\��_�x1/X������m�_�-����e�'?T;W׽Hw��-��Hw���o��m�x�u����'�H~�^�#Ow፻.�����7P�t�'�!���W�`�p�j��3i�J��0RW���IIWQ�O�i��O���0$�S����Kɯ�t�_
���MS�l1�L)���-=D��cMǥ�"xY���a�������o�j�rT������i>ȋ��E�b�|1/��
]����u_�aqZ���>�-��b;k��Ft��\����V!VT��Q.�	�W�hYMjN��Y��G���ug��J2U)��|��a֥��ʱ�ry�Xňm�Ed�k���\�1�J*���Xu�LV�Ms�,˺��G�V��ȼ�i����֙0]
�O&WV��n[�.��J�^iJnעz���|�����Zo}G=����z�W���Ss��-��}��ukE�Vt0�pj�d	B�hN�
�H�p���p �cw��PO}[���l
��m'�|	���[��h`���I)飼�-�̳	3��y`�m��ѰŻ5�,$��c��\?cȈ�,�����E!��j��wkI�eKV �ق�&�����t�"�8)A��ޠ�E7v�R (�-�o|���凟4ޗ��|?�~��
~��z���3�Ms��^������/�����2ZN��U
։��`2Srg�Ă��"&�8g/����ޡ�!�f8����3��g�o���8�N�e����G�-2��H���L����6�a^��菇x�qG4��8�ߖ?�$�]�3�����g�Oh�Du]`�"�E]г�4����?�0>��3G�^��xT�zk�c|�#e��[��
x!���|��KZ���5"��
��`��q���7tLh�4����1���;&�v>�xH�ɷu}�o}���G�"o,x`%:�� �T4�̱�<���j5���������n���&o��{_W﯆ս����?q����1|y�Q�1T�,h�,��I�À�q8�vI�t�2$H�D ���z��{�~�M/�;v�atf��Gg�=�"��g����'�����x��ހ|lo8��ޗ3���}�~cL�t�8��޿#ۿt�$c���}<s
'
��.�W��t�Pa�N3��!ؠ.�#"KF!|�����.E*%�!-��F${ޭҁ�e�\�K3�E `�`ADCD�Û(�L̘�p�Wm,��N�Z�VƷ���Z�ǟ��q�<��E/�",���е�5>��kaW��ȥ�QU.P�b�ʌ<DZ�8�r2B��t�5^���"k�/�K���TJ?���❖Qlm&u	ÓI�ѡ�qM��2�V,R���Z֥��6FO�զ�>��	!�5�SnlI	����	[�2p:}�yh>���G.��>6�~��s*9�cP%��B� �%7^��e}S�vȫ��{�f��?<|����[�\�lu}�t����p����zJ�+�����ȇ���ъ�4��0l�Fy�[_[��L`��:���Ql�N�g��oa\�Sxgេi���/�y��ߠ}z��JUu�3���H@MJه�pc��0��)�H�s)S\��I�2�Re`9.Ɋ���˰
Dy��}�	>��W� �te��F�D}�M�2�yc����QGSm��qdC�YC�<�b|��ԇZWZz�KՑ�BH�7\�i��O���^�bL'S�e��E{�׻D"r��t��b��D��U����Ud?')l�E�YCL�9�s��på� �{g� �6�tjB	h�T�X-2�/#d4���>�SD�f����2�~(�9�SD�g�GM�YC�3�;8\)�P�t�0ˬ@M8����'I�-Q%!��9��0C*ۍ,\�i6F5��D4fw2��wQ�
�R�C�rh�<�T��H,w�b}�0�ʨ|*�b��!��59
Q����ۏ!��'u�`p4+�U^�7�<�@8�N��s $��r�zM�@Bf���:�����xI�;����|�����1��6]n{	�,�mŹ̵�oY�!&3m"=�'�?�Ԗ�W�=`F �Y��qY��4�e���b��DD�2qY�…[Ν�6�q�B'�Q�Q�9����ݐ[¡:%Q� ܠ
,�v��k
z� 7�97�@���>ŀ��X�e���Z.+�Ũ�pi'O�a;n���b�[���\����DX�Z1hM"$~��K��Q=ф�pl4l�?��ؾ�	3N-WV(7W�[�^4.�K	�}��T���ɰW�I�(�����0wì)B�uM�ߦ�0�>O9�O���^q�Ӿ��*��k玅�0�s�ّeW���k���kSԩ4ZA	5� Z���4�W�,��s��{�[۷�1����i�'E#���jx��#�R�R�`H�B���&.�P87J,ax�I|��&o�Qi�&�l�0ݶL_��@7
!��ĥx"xв�%�![�E�X�S0'���a��r�pL�'H�E,1�͢�5ؤ�9�Z�!`�Ap�R��)�I}��n��6Q Yw�@D�l��I	z���p9�JSf�fP���Գ��7-1e&*;�i�q��R9
�p�N�^���N��i���-�>�q!���|�\a���.y�p'����?]Vk���&�zBn�KX�Vu9���k�u�$�#L�8�A���kFϲ=}�ge��ؖ�`��
Ϥ��DF]�6�V5|	�o�H�k�u`=(����HD$``58u�0�`|LT��A`*!�v(��ط�|�`A����Q�b$QTpQ���o��€gGMF �haQö�����P��9���1x����-����P����t0�P
OK0�'��Xhd����=�{�6�Ǡ;L&�F���Y�w��T�<��.��䰑‡$$��
�:n�4�ν�}�0���E�b�S��`*�E�i��L/N�3MQ�iJ��I+r\p���6+�`>�7������VBD\�e��q�c�.嗐:��`���Ѽ.
�|���_.|��$%w��&ߤ�@N��2�Vgl��$��B���jEX�WC	�(~��؀K��-�L�a6�	`r��G�M�*��n���5��d�-���"�/?�c!Q�w4\�Ѧ�@��p]���L騟u���P!�.`�H
_�87NJ끓���&�X9���;�V��}�QzA--M0颊��:�J�+���t}8���>�D�8]$�^$�:�T��v���6>�C$�r[:�m���p0U;�&�cC"�Ov2��8Ǩ�eq}�"�pIF16��>4c������GS�4H��!:xf�d#�ʥ畟��^��@D8��;�!��%\�NE�s����}�߆#3��.=
���n���
$--��m�7O�@�)Q��8':��arK�6H�}�5����D���~���e�Wu�!�f��d����П7�ٴt�"�&��<� �K[�m�A��t��2i���@Dz���Aq:$����tu�/f0���vs�1�H?E`ZvÚ�#g"4s�@��P(���兟��*����j�TT�di��>����8K�X
a���Y�q�}��yT)W�/����%�B(4h.V"L��:[V��CL�c�=ə
�G�腴�1XH_��B��)*Н��ט��d��xQ�e��GGM����~�9��p$Ś��B!����ȬG��K�<���?�uD���_&��d�&�{L;g���%�\��X�9g7P!`�]��<�j託����y5���/g��B�ˉN�ez0�zh��u)F3��*�pŽ�
D �!w�,��*�l��yl�[Z�6��܂�7|Q��붵��V�{I�U�)�U��c��LEИ���q�PE	8��/S�P��:\�P]2ی�Q�\�7����s�:��U��?2�D~�Zl�P��p��N!E�ZR�vbNo
��<�3t��܏A�'�����&!�.>.DQ
�t�U��j�c
E�K��	�)ܗ�}Ӱ�����aȳMD�i��{x��
��~�h:B�?ڤ�)4�O�f�����xoT�����<U����>��!£��%�B��V�$�:��p[���^_�@�
�*�=X֌l�����.�yy?���Jh	�i&GX�A`8��	(��N"9�`VfF\W�`=�
�)�4�Zc�	&I��L�#�2 ����r}� �~R̳�����e�|�֡��(S<�H�z����%q����ăi"'}9�ݧbE���\��A���:8Vr�*���4�C���x�>A5��=�N�Eڅ��?6MUu� m�M�Ñ�l��fi���!R���SlU��O��dq�>GX�W��p�'CO�@����x}��P�k��P�:�w��ٌ�g�
f����ya:�	��m	�'1q�5):��� c��t\��4M��8}2Zh���k9�X���r,C�:a#S�C��j�P���U}mm�o91�@��g-�\��j
�3�*�Bsz���i,y��(�Ц�K)f�����_D�1�)84f���؄�#?�N
ݲ�nz�w��֥��Ѧ�[�kB�����<�z��#�]�����8t���]%��
�{-�҉l�%c��0j�&,D�lNsl��dB��̤l���P^�b<�j�ێs�N�W�L�?L���-��N�E&�b�Ԅ��T(,��H����b�(�QO��p�c��s]S4��K|XM6�~F�׈vK�W2� �. ^H��b�y���皃�7^��A��
���PX}�죂��5g
�\TC����PQ���F˫��b�u����ghw`_~l��c/޲�q\��z=>S�Fh�Q�����S�d,\�Z���L���Y�k��2�B�5����ok��z�ea�}�{��o؀ȡ�g]'3��<��\y0��g�H�2�����>j���b�R�{?>>������}��e;�V�v����2�����%yQ���'��O�l��k����������l�T]{�p�p5�"��3�p�+�ǜFjU��I���vx����}^�,WL&`�0�O
��7�I��EYx�Y��n9�B�ak�#��~��67tpd)6$X��SN�}�:���ERx~�o���'a�qtv(�Ȭ`��)����Ho\�؟����*��3�XZϨN� ��ݑ�/�2��'
����1%�9�!��I�48�H�����J+����T��VIw='3Dl�K��#���G�M%�ϻ_��L�%-%7�C^�/��Wr�'���u7>}Ns�=h���4��jD��s�[F�1�o<��c�W���o
�ԌUkgM"!쫢�q ;`%�Ϛ��L	8mŕ��0��=f_c��̵Ӓc.k�iˍQr���x�-�ˍL+z./TwB�"�-�B��+�TxA�E�w>Z��p7.�mrDɯ# �D�H�z���C������H��S���I.�&d_e�����vI^�4�1�r�9S�4�0WE�4��b��gh\Ւ&j�A�;ð�;
�"�k��)\��h00ycL�CX7ΐ7a�Z��קy5ٴ#�A�`i�h��;(��j��n��
��(h����&�h����S��`����A�SL�'CE��F���ؐb�(8'���+q��x��X�E��
>��`̦�n�Uv���guW�&H��Z��$p�8uw�W��>���y��WI^���O!(m���d��f�xT�ؓ]T�"�G�l�8�<T"�)��CpI��æ�,R�1=��	�J#S�L�g���z| �S\Q,!�\ǔ�OD�k�@�]�D��"��N���d
o0�����=j��I.(���k��/�2M+!��K/�	��[^���9��Kh�Ї/����jTU�mbL�K���:x�k�I��	���N�d1�����oQ�!�V��X6���E��#�9����N�<�!�Y�U��&��b�a���0��b_�]��C��L��k��.������WB�!��ј�@�*U�0XJm�/ ������J����!3����*�p�`FGOL�J�w��>��?�"�f��!��i)Ƣ��6�2K��#��C눞���:rk藠��Xܑ�Z�>�N^�;v$�`��`҇�+��CZ@Y���]�k�͇vP���j�$1�j���ڜ��`��u`Ř@�B�n;i�������n8vt��t�aTa}�����y��0%d��cG�Dw��C22��0�⚷�Κ]0|O7�W��<��Yˤ',m�n�ҥUe���c�(�u/M�f;*��/�KkQXkn�8x���A�����:"���Sתuq�͹H����$/TD��D}Np{m��WI�D��6(I�ʤ�։��z�Ѕ,_�����KG�P�K)l%A=�|��%4�K|E�v���H6�3t�3׀8s."0,��`�K��Ѕm�M��ΥW����k�0OXT�4]B�[�Øf����r��SU�pL�!u_Bȣ��InWl�o#Ԡ�����%�J	�:]�>���2 ��n��h�2b�$�r�h���0N���ýg/���9cQ��9���y�.V!eX�/f�]��\rn>n\��0����[�Jcr�����i�u��ۢ�i�U}fΟ=<���g}�yf���n;�:N	:����<C��wI��Y$���P��.��|�˭?���ޕ?����z<#/�0!���]��br�ob�����~��/)u�A�L��Å�
o(�����3�/�Y���T��g��	�;�%I���h��J5ˤ���dC ��_��E�TQ�d(��C.������q�5ƻt���c�
�},��]�$�`*�7�^�����=�s�
�}���9~<�}u�!
�I����y��p�`����3hyS���4��
���Md
C�5�*�P��o�%����@<2Q�y,��%þCWs9������Bu��T�N3���F�>%�>��s
�Lq�1�l�^~�x�Ë�7��D/�~�;����w(��nK�Iq��	�h�M����9w-έ��WtE����^�7Κ6�_y�-C���8�@���9�C0N�U�G<ϊ�US�5�F��>�=�DI��	�~S�f	lַVV�r�ku��̻VH����j"]BBp�3��zzdZ*������c�L&�T��O
-/���.,�+��__��^"�8�[/U5-�V�Wnn��1�l�5��&X(]�拁�"�M���I�+η¾M��6��M��)��	|��	��fч7�,Յ���+�?��6v���_�����n��&�D�L>�;��λX>#�`��b�"��-��Q�9
KOS�q�6,C��C�Y��b}�؄�c�]��^���.�v��Y֜U�RR���U�-i�ۮ�U�R�"��MO��k�mK�'��{�B#VEߺq��*���7�l��#��Y�v�!�)x� pLijݺ����ޛd�_��O�2d��Z���&��W���.q��d��jUn�	�� �VV�("$�
V��lTa�:\�z��q��x��e
�
���fK�w`�T�o�]��Y��$��*o�a@X1D�%���Ǿ�Щ�\��?���*ȇ��/����z�=D��:���-��F.�={s�������v��:A�������`��Ս�S!Ͱȝ��ΝlU�!�4��9����=��߆��fdq�6���N~���������<-^�xrxb��7��:ج+�b����~q��h��䀸E~��$�sOw�s��S�����]f�P�W|�C�ESD릮y#pzh�aZb��	k�
��ԡ��Y��,��ƝnN�˨G�� �<�kwH�9f2j��`4�?��}��n��	��NU3��%M�Z�^�ȩ�3"VUEC��~l���p�ʌ�!�A`S7�����M�!V_�G�l:��0��ݬg�L3����I�.�����X��
�,#K1�3�I�y�㭕��e�'x��kZG<i�O����m���ֺջ�y�J�����|�L^�Z׬5W��~���e�_u]m��y��ٝ���]r?H�$��w<�G�H�%�d��,ɒˮlɶb4���J�8i�ԩ�X��:q�ب�m�&i8)��1ڠ)�&
�vS7m
�@��HS
P=�}g)�E�q�[�Β�3�~��>ϯ5��<��S����Fl��/�Șg��#l|X�����}�~��a��{�����W���܍&�-��}��_�w����]=x$�韑�H�1��;�ӒH�WiV���rQ'1�U"�o<x��r�t:�.s�^�]l�R��@"� ��Ln�o�ǔf�,
��^m͈+�r���J�:�!tj�]�C�X�Z$��9�T�RZx�ƜRXЂz���!#��V�US~$�@�6P�ʶ�#y����3�D��<����t|���-�*�N0[L`�����_<��Ԣ����?���鑸���Ϭ�c��ݽ��=��ѯF>C��^�UN��~�ĉӦv��}����+;O��?��VH�::����[+[��%ci
/�0v�|����u]$���A�“��KEP�=C�f2�o-&�i�Mw�$%[��A�J�&g�:t�J�8�k=��G�����gɹ�>r�<
��HJ%��	i�F���E�G�_�5�pM�!��Aag0��IP�v��EC0*�.Iqx�T�ZWI�6�w���g#����B�ʝJ5�Y��u2��T>SO.nJ��'.e�ٖ���4W'��޸tfS��Q�v���=g�u�h�������,w�9ٙNw�^돆�J�?u�p�\v�YRp���iY��?_��"���wj�J�"9ڨ�g�f5��It�
�Y�=��f3�����_'��Jz��ס��a�9=�r���)�Y��?�|AyI����c���^�aƍB�U��>g҅Ig�E�Y��/:&r�R�_d�R�n^�*�Ѱ�����^J_K�xD\#�(�{q�s�"���'�z�\�磻N������r����H
�b��P3�Mtڦڈ��#U�f��;�@U�ߤ����\�ˌA�1-ksw�w]�IY3�
��v؀��7�%5p�ts����o1�ִ�F�t��dcbh����_\i�_���X;�M]_�B��8�U�6U�:��%LkKe���Cf,�Kl��aQ��I�'�a�l�kup��D=��S*3:N��gY�ڝ���i[��^��)��5ٺ�����:Ĵ�:�g���RH+X1�_���5:�]+T~qz�t�j�^_
�;=vl:=6%�U�݌�a+�FЖﱬC�\]�ND����Cʉ���(C����ůg\�	�,W��d�l&{_��[iz��=���4U㖶��TÒ|m߫7���Kޑ4ϼ"�+�������)�{�8�i����3r�u_k�}*-���ݽ&��L��b*w���
�g{���L‘ �Z�2d��*y!(���gq���5p�m�^�vL"8���c��[)4O���d#�V�r��BH#���k-�����
l��7�yJ6/w�e�۷�����$�ˍ�
-�VD��
�z�1���;X
qPE�:�r�;\�8�!c'��r��;�Gݗ�s�ԩט�N�D���?�;�1؋��b����/t�c�I>%��D1��r���9������Pj�J�B���(�'�����z��<�����^�&��I����j���jݷ
�yy=�y".�0�l0�{oղN�T:n>R��ê�����&إ�!�
2,�h��l�N7�_�n
ϒr���?;ܚB��O*�NET� ��}��7�e�C�ǔo)��2ؼ
�w�ryy/��`+M_t�W�tpbQT���\�,��v��yS�!�\k��_�`��M2M����)�z�<e�pH�X�8�0m��%�#dR ���&_����͗].����+'��k���=e7y�echl1a��Pb�zm�H3�x��(�ܙtQo��>��S�1�
��@^���)�Y��/�N�\ސ+;�f6�Y�C^D��&u�Z��&�j��v4�i�i� <~�M-
�|�aE�1<�B3��j�,�̘�1)'��4a�zq��,j�B\���I��x_��FmV�����Th�8k���p~���6��A�Dx��@�b�ZTG���T*�v1KK�i?�Ԣ�N��|�G=SEn%fQ
Bs�;�N��2&��si�x�C�mjE��ek����&\N3"a=��M�a�3���h�%�b��WO�&��qU3�
�2��X"2��oX�idTkm�ժ�v�jDӎ�"���9��X �61�j �
9�,�^NJ��"��P�A�Z&\��8�m5�$���]H��4� u���f�Z�=��I}rL�Z,0<JU�!*��3���r+�U8���$���m7vs�7��Y��iق���p0<g�hoD�P0���@B��hpB4K�-�n[�;/ka�m{�}�����b�~*q��;�a�4mB����$�7b�Dš�o�#KS�sV{�Q�z/�k�o��y��ާ��������<9�, ��SsR	Žd������:��|{1�b��_-���ʓ���6��Hf.E^p�y�^3~2y��Q���]�08Z������D�3���D�J����`�(�m�J��hζg��P��<��q��s�}~}����Ẹ��&�4 ���T�&�Ik
�טn��4ۆ�n���h�:���aRp�w�,�)J�3�x҇�z�²�nA?���ᑸ'+m7i%Tߺ{z���h�4S��d�'兣N�(8�Z� ���
b[Vs d��_��&KH�d�䶗��H�]��OH9:��
�4����2�
�9�"hQ�T��q��q��?�鄅n�'�_Cu�C]���o^��Us�`2���o I5)|c�2ɿׇ���-��iӓ�9�X�[�W�*Jq�[\����As1i��~�p��I�6~�\��G����nw��o�}�����$i�․��<��s_�1���=|���6y��(t��s��[߾cU���:��)j�0p�V�V�ua�0��0"c�[wMv?3wo}���{��^��y���"*U]<|���YiF���t��)5��䗔K`wS�OM&�b/)`g(S�s��d�n�4�T9.��7��z�%9\F��G؁�)��.E=M#�Z�K\
h���t;#�@���-f[u�,��e�t�kV��c%�1��_JTu��O�Ȩ�*�+�,_�(R�;�ax��0���՜�9�)*'�Gf���	�u�B�{�B��m�0�&	9G�غ:0�aT"508�����U����h��G�~A3��P%��G����ԤX`��V�������V\��ҼA�`�i��px�[����/�:���UN������	�9���I��D��,<Nq�>ű\� :8g�k��@��<)��D���鸃R�W���!�+'��t ^;3H�S�X1FZ'���8\��8W��բk
Sn��_��֯M����G��d<�!B�=d�mđH֣�\G�{�#�s0�z��AEA�U�s(-.?�W�;?2��9��Jڏ]]���E�%k!$b`�#�0�bjl
��w5��Un
�Γ��Ì�m�a�o�"��b��;�u�h�����Id�n7ڕq�٤�k�t�v��m� �7zm���<��d�r�E��7��Iً�ȴm3t �ԃ7tM�G+�Z=�ײ�sƺ�i���)�\JX ҰP�7�Y*�a�
5����(��Z�~�
g����mu�fs偧�����Kءv���^���H��h%���")�8�D�뵘?�V:�}�s�������f/���)M�~@�ud�yV'��uIyn�k���ºjU��U�0�-߭7������Yq$!���gU���]U��_�ەsR�Zj�I�-����y��]�ԕ8�,A�ԗӓ��6��R�#^��i�(��Bh�|���,�f�.�g���ԯ���]`�Z;�<�* �K5�Q!��)s�X�tj�f%�c%��E���Ņ&�<�PK�쵂C���q�C��m0/�!�V-���aD�=ǂIQ
�p\1x7�� ���#�b;�:6`X��=o�f�p�cX&I�.�D�\�١
_8Κe���
��f�h`Ǎʚ?6x׈�tM0�T+F�l�TcA�Z�R�N 4b�����x�c`d``���}�3���+7��X|J���6�V�@.X�sx�c`d``<�S�w@��(��x��T;�A��;���]����?�d'�2��L0�4:
d��x�D|�">"�Cg���pCM�Q8o�گ��{zN��ꪮ��5F�D)=�GN�ZH�U�����TK�P=m�c�>�L�G>~�Fj����t�(��
�uP���H
(�,ۮFt7aۣ�K#�+���C�<�ĝ)}.�q��$y��,k�V���ѷ�B�e�px�3�����t�`^f;+��jj_8�8��7�٠���A.:镯�LzT��1�J�e��_}�A��?��C�;��i�3D�5���SGZ��U~�D��j[��j:B�:��c�.ɟ�<$�'���]�>��,�R'�ss���];��_����{7g�y&�q�)�;�=�1���T�Gl3�������;��\�9�R�伨�Q;KP���ڹ���Y@�N�YZ�0'�����g�g�I�>��n��ǝ��e�s�[���y���D~�W�g��+P�;�%+5!�
���G�=�{Ř2�8'�p�W����L�����;�\B�>�7���%�+��@o޶w"��*6�\�r������?��8�v�.f�d��n���=E/Hn}��_�n����"o'u�AO/�|���R�]��{М�gO�}��o>$�.�g�뿉�a����b�
�o���BKZ���� �N�H��@`�J������H���	vN�"~��
d
�2��*�"P~�(�D��0H�`�|�Npl���B�6\��j���.�!>!�$$�%�&&�&�'�'�))6)|)�*R+p+�,&,~,�--V-v00Z0�1d1�22B2z323�44B4�5L5�6�77|7�8�9$989v9�9�:z:�:�;;�<<@<�==X=z=�=�>P>�?*?�@@�A$A�BRB�C(CzD�D�E>E�FBGG6GPHXH�IFI�J~J�J�L(L�MMzN\N�N�O^P�P�QnRNR�R�SDTZT�U6U�VV�WWnW�W�X*X�Y�Y�Z\f\�]T]�^^B^d^�_4_�_�aaLana�a�b4dd\eeDe�ff4f`f�i�j�kk�ll^l�m2o�pxp�q(q�r*r^r�s�s�tt�t�ufu�u�u�vv�w<wrw�x�yfy�zzlz�|@|�|�}j}�~(~�~�v�������ЁR����j����̄��2�R�����2�����抐���V�،�����b���P�֑Z����ܕf�������>�~�������@�p���<�؝��P�����d� �Z�ܡ��$�f�ȣ4������b������L���������������B�n������j��\�(�l�*���ʻ�B����x�코�Ⱦ(�T���п����z�:���Vʮ�0���jό�R�nҐ���0���2Ԭ���lֆּ�$ט��<�\ۊ���ܺ�2���6�x�c`d``\��à�L@��`>�^x����jQ��;�6���R�8"�D̄Ɖ��kč��i:M�dr����>B��W�]�.ħ�Ɠ��j��($�d�{Ι���H�������
|v��WaOTA8��
��)��mgWxϝO�<p]�
��W�%��Xx��p�k�����=fu�[�o'��B�����,좃o�9�!����Rx��^�{�p��Cx�܇�%�›܉p�k�o��+�	.�"B������6��)Bd����C�\�Q`�ګQG�
�O�Lǜ��%B���r���#��1��c)��G#j�A��ft�'�.�������b�+<��nޣ^oym��Lw/x�=���y|�	wk�����VV��G�[5�<��SuA�<L�H��Vj��,vo-����B:���7����ƛ�;���1�ͬ�Ğ��F�����V�E�Y�5k��� �ix��Q�3C�Nf�����AF��02\=;Ć�2�2
���gw��g�c.7&ɂF㌝u�μ���e�o��e��N��f��
�x�uW�丵����.����v��d��l���A�U��l�#�U�33�I>3c�3C>333���U��d&}�ؒ�֓�����>��S�O]�>�/���zԧҐF4�	MiF{�Ot���Y:G���t݈�Ӎ�&tS�٩�ѕtݜnA��[ѭ�6t[�ݞ�@w�;ѝ)���]�j�]C��ut=ݝ�A7�=�^to�ݗ�G����A�`z=�F�G�#�Q�hz=�G��'��I�dz
=��FO�g�3�Y�lz=��Gϧ���JIҜ2�I�!-���*�T�2d�QCKZњZ:�ҋ���z)��^N��Wҫ���z-��^Oo�7қ���z+���N�wһ���z/���O�҇���U����(}�����������������������������������������~�~�~�~�>N��Oҧ����,��(��8��$��4��,��<��"��2}�~�~�~�~�~�~�~�~�~�~�~�~�����������������������������������������������������������������>��=��y�#�<�=��>�g�,���r��o���|�)ߌ���|�%ߊoͷ����|�#߉��߅��W�����U|_�w�{�
|O�ߛ�����@~?������H~?�Ï����	�D~?���O����L~?��������,8�S�<�sV|�.��5�|�
[v��W�斏���"~1��_�/��+���*~5��_˯������&~3����o��;���.~7����������!��[)礉�F�?���^l��BU��j�)�7�v8ܾ5�=l~ժ°��ี}�L�uVȨ.����&�P����h�pA)�IZ
rW�k���.	[ݸ&��������V�]�z�g�H�^J3/�j�*dF���P���DZ�b��&YH���3��vS�T��
E�IU:���05*��B좭�x��y>pF�"�S�hy����u`d��Q-2�9��.N��\T��.U)�6��m��&��>�ZVފ\�`�1L����6�]�m�z�Ժ�e�BNN�R�N�nl?UY6��L�Z�8���;��9OMS�"8Ժ,DK,3�{��B�崻�2fk�Լ�r�D�qc��*M
ݤ�%�&:������U�"�FƲdY+#��o��9ɑ
,��+;s�+u)�4p�c[�Tڼ;�2��,��-� �E!]�$�RY1ýX�I�I'��&+�	Q����e�Aj������۲��\[7�YʺqܴM�ڽDW�L�!]Sa��ε��HRTu��Nm������b1����6nT��p<�bY��U.�u"ىVUP�|�r�F�.cU	��L�%U��ow�=��\�x����"��x��C%�����#��9�FY���O�H�M#�����Z�s_�ۦi�I�X�Z��0샋hX1FInt)�9 0��Vi��n���Zm�	�N'����ׁ(ő/���(�T�r�≜��9�Ux�N�U"
%��L39��N�S~]I�%�Ok��&qQ�TnX�u��&(��v���
�Wu,3�37�Ƽ�
d�TF2�Ұ�FY�K��mn;����Ano׈2�����6�_��	$�*����\�RY�	r��d���P���6bon�?`�*e=t���%�1HϏ��[���m_�i�'�=`����
��������5����Y�E���H)�3D��z��Ş��U����VBQd]����L�C��Gq"��)m�I3�-K	�.BѤ>f(</�uO�,ؿ��!�3�����ގ;�Ҙ6��eҌ��(>�U��|�'Ǟ�@#Hฃ�MD�k��i��[/I���Ы���8i�+�\�<L#d<JA��`��,�-��Z9QD:Y�S<���:�V��r�1w�l��߉�;A�
�e,��(���@N�Ǻ??s�,qR�f�κ���u�����
=�b��}a�BVP,<$G@c�SK��e�-F���	���j��̠�YS�gN���@�.7�A��\�ݡ0!��u(P���N6���N���Z�	5����p7U��-l�ds`�p!�'��",D���W�~��]XB�+�C�.g����ƍJ�����:j*�H��!J��q�+1:���.{��aR5��S�R끷�ANJ�L�Z�]@űO�Թ��J<ɟ�s
����(]	반�,b�~��nl.Ӡn]�@��Ϸ�(o0�t&�V��ll:������1��ZO,������V��B5{/Z�Er=��K�C�`�X�z�ڍ�ۙ���u����l
�*T#��pJ]ȽyH �N3h n�L-B�!����ڦ�D,���
��?�	CoY-�wj��/��L�ϊ:����yZԢ\��ܢ�u��~m�L�W�uz�ݯ�����=m<�H�T4N#�\���[�`��C�/�oaONN$��9�%�9/D�5��l],E�q&��-�����F��f�����S�l�`�
b����C��m��69#�d�h��~�j۫�zt�A�$���S���b'�#�{��=C��U���ds���3������t�F�$/�Š�,PW~�_:��8FgI/�h��ߗ�hC0N,�z'�S_���,˦�2����LWK�'�~öM��H���Մ}�L������1�ԴyqR�!��"=~�`G"���u���@A�tpv��9��*����`l�kSŪ(F�PE���@���!A��7U�����^!+�
�,f�����D��˸h{+��Ϩ��BdP$�,�AV�+	�?�U���K�D��Z��y����Q��\b!�B:K<�B�#��/[ɍb��*�����ۢ�T�À�N���j#�2qn��P6���M�뚸��3����%|B-"�WCA�T<�L�E��&�M	Xs�)�	m�P�9�%>wzi^��CX�v��b�6�DV��p�H>��������ˠF�W#j4���3��Iٷ
lD�I�^S�~cqi������installer/dup-installer/assets/font-awesome/webfonts/index.php000064400000000016151336065400020701 0ustar00<?php
//silentinstaller/dup-installer/assets/font-awesome/index.php000064400000000017151336065400017053 0ustar00<?php
//silentinstaller/dup-installer/assets/font-awesome/css/index.php000064400000000017151336065400017643 0ustar00<?php
//silentinstaller/dup-installer/assets/font-awesome/css/all.min.css000064400000151030151336065400020071 0ustar00.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}installer/dup-installer/assets/inc.css.php000064400000107250151336065400014707 0ustar00<?php defined('ABSPATH') || defined('DUPXABSPATH') || exit; ?>
<style>
    /*******
    HELPER CALSSES
    *******/

    .float-right {
        float:right;
    }

    .float-left {
        float:left;
    }

    .clearfix:before,
    .clearfix:after {
        content:" ";
        /* 1 */
        display:table;
        /* 2 */
    }

    .clearfix:after {
        clear:both;
    }

    .no-display {
        display:none;
    }

    .transparent {
        opacity:0;
    }

    .monospace {
        font-family:monospace;
    }

    .red {
        color:#AF0000;
    }

    .orangered {
        color:orangered;
    }

    .green {
        color:#008000;
    }

    .maroon {
        color:maroon;
    }

    .text-center {
        text-align:center;
    }

    .text-right {
        text-align:right;
    }

    .display-inline {
        display:inline;
    }

    .display-inline-block {
        display:inline-block;
    }

    .display-block {
        display:block;
    }

    .margin-top-0 {
        margin-top:0;
    }

    .margin-top-1 {
        margin-top:20px;
    }

    .margin-top-2 {
        margin-top:40px;
    }

    .margin-top-3 {
        margin-top:60px;
    }

    .margin-top-4 {
        margin-top:80px;
    }

    .margin-bottom-0 {
        margin-bottom:0;
    }

    .margin-bottom-1 {
        margin-bottom:20px;
    }

    .margin-bottom-2 {
        margin-bottom:40px;
    }

    .margin-bottom-3 {
        margin-bottom:60px;
    }

    .margin-bottom-4 {
        margin-bottom:80px;
    }

    .margin-left-0 {
        margin-left:0;
    }

    .margin-left-1 {
        margin-left:20px;
    }

    .margin-left-2 {
        margin-left:40px;
    }

    .margin-right-0 {
        margin-right:0;
    }

    .margin-left-1 {
        margin-right:20px;
    }

    .margin-left-2 {
        margin-right:40px;
    }

    body {
        font-family:Verdana, Arial, sans-serif;
        font-size:13px
    }

    fieldset {
        border:1px solid silver;
        border-radius:3px;
        padding:10px
    }

    h3 {
        margin:1px;
        padding:1px;
        font-size:13px;
    }

    a {
        color:#222
    }

    a:hover {
        color:gray
    }

    input:not([type=checkbox]):not([type=radio]):not([type=button]),
    select {
        width:100%;
        border-radius:2px;
        border:1px solid silver;
        padding:4px;
        padding-left:4px;
        font-family:Verdana, Arial, sans-serif;
        line-height:20px;
        height:30px;
        box-sizing:border-box;
        background-color:white;
        color:black;
        border-radius:4px;
    }

    input[readonly]:not([type="checkbox"]):not([type="radio"]):not([type="button"]),
    select[readonly],
    select[readonly] option {
        background-color: #f0f0f0;
        color: #0c0c0c;
        cursor: not-allowed;
        border: 1px solid silver !important;
    }

    input:not([type=checkbox]):not([type=radio]):not([type=button]):disabled,
    select:disabled,
    select option:disabled,
    select:disabled option, 
    select:disabled option:focus,
    select:disabled option:active,
    select:disabled option:checked {
        background:#EBEBE4;
        color:#ccc;
        cursor:not-allowed;
    }

    select:disabled,
    select option:disabled,
    select:disabled option, 
    select:disabled option:focus,
    select:disabled option:active,
    select:disabled option:checked  {
        text-decoration:line-through;
    }

    select[size] {
        height:auto;
        line-height:25px;
    }

    select,
    option {
        color:black;
    }

    select {
        padding-left:0;
    }

    select option {
        padding:2px 5px;
    }

    select option:disabled {
        text-decoration:line-through;
        cursor:not-allowed;
        color:#A9A9A9;
    }

    select:disabled {
        background:#EBEBE4
    }

    input.readonly {
        background-color:#efefef;
    }
    /* ============================
    COMMON VIEWS
     ============================ */

    div#content {
        border:1px solid #CDCDCD;
        width:850px;
        min-height:550px;
        margin:auto;
        margin-top:18px;
        border-radius:2px;
        box-shadow:0 8px 6px -6px #999;
        font-size:13px
    }

    div#content-inner {
        padding:10px 25px;
        min-height:550px
    }

    form.content-form {
        min-height:550px;
        position:relative;
        line-height:17px
    }

    div.logfile-link {
        float:right;
        font-weight:normal;
        font-size:11px;
        font-style:italic
    }

    span.sub-notes {
        font-size:10px;
    }
    /* Header */

    table.header-wizard {
        width:100%;
        box-shadow:0 5px 3px -3px #999;
        background-color:#E0E0E0;
        font-weight:bold
    }

    div.dupx-logfile-link {
        float:right;
        font-weight:normal;
        font-style:italic;
        font-size:11px;
        cursor:pointer
    }

    .wiz-dupx-version {
        white-space:nowrap;
        color:#777;
        font-size:11px;
        font-style:italic;
        text-align:right;
        padding:3px 15px 5px 0;
        line-height:14px;
        font-weight:normal
    }

    .wiz-dupx-version a {
        color:#777;
    }

    div.dupx-debug-hdr {
        padding:5px 0 5px 0;
        font-size:16px;
        font-weight:bold
    }

    div.dupx-branding-header {
        font-size:26px;
        padding:10px 0 7px 15px;
    }

    .dupx-overwrite {
        color:#AF0000;
    }

    .dupx-pass {
        display:inline-block;
        color:green;
    }

    .dupx-fail {
        display:inline-block;
        color:#AF0000;
    }

    .dupx-warn {
        display:inline-block;
        color:#555;
    }

    .dupx-notice {
        display:inline-block;
        color:#000;
    }

    i[data-tooltip].fa-question-circle {
        cursor:pointer;
        color:#C3C3C3
    }

    div.status-badge-pass {
        background-color:#418446;
    }

    div.status-badge-fail {
        background-color:maroon;
    }

    div.status-badge-warn {
        background-color:#555;
    }

    div.status-badge-pass,
    div.status-badge-fail,
    div.status-badge-warn {
        float:right;
        border-radius:4px;
        color:#fff;
        padding:0 3px 0 3px;
        font-size:11px !important;
        min-width:30px;
        text-align:center;
        font-weight:normal;
    }

    button.default-btn,
    .default-btn,
    .default-btn:hover {
        cursor:pointer;
        color:#fff;
        font-size:16px;
        border-radius:5px;
        padding:7px 25px 5px 25px;
        background-color:#13659C;
        border:1px solid gray;
        text-decoration:none;
    }

    button.disabled,
    input.disabled {
        background-color:#F4F4F4;
        color:silver;
        border:1px solid silver;
    }

    div.log-ui-error {
        padding-top:2px;
        font-size:13px
    }

    div#progress-area {
        padding:5px;
        margin:150px 0 0 0;
        text-align:center;
    }

    div#ajaxerr-data {
        padding:6px;
        height:425px;
        width:99%;
        border:1px solid silver;
        border-radius:2px;
        background-color:#F1F1F1;
        font-size:13px;
        overflow-y:scroll;
        line-height:20px
    }

    div.hdr-main {
        font-size:22px;
        padding:0 0 5px 0;
        border-bottom:1px solid #D3D3D3;
        font-weight:bold;
        margin:5px 0 20px 0;
    }

    div.hdr-main span.step {
        color:#DB4B38
    }

    div.sub-header {
        font-size:11px;
        font-style:italic;
        font-weight:normal;
        margin:5px 0 -1px 0
    }

    div.hdr-sub1 {
        font-size:18px;
        margin-bottom:5px;
        border:1px solid #D3D3D3;
        padding:10px;
        background-color:#E0E0E0;
        font-weight:bold;
        border-radius:2px
    }

    div.hdr-sub1 a {
        cursor:pointer;
        text-decoration:none !important
    }

    div.hdr-sub1 i.fa {
        font-size:15px;
        display:inline-block;
        margin:2px 5px 0 0;
        vertical-align:top
    }

    div.hdr-sub1-area {
        padding:5px
    }

    div.hdr-sub2 {
        font-size:15px;
        padding:2px 2px 2px 0;
        font-weight:bold;
        margin-bottom:5px;
        border:none
    }

    div.hdr-sub3 {
        font-size:15px;
        padding:2px 2px 2px 0;
        border-bottom:1px solid #D3D3D3;
        font-weight:bold;
        margin-bottom:5px;
    }

    div.hdr-sub4 {
        font-size:15px;
        padding:7px;
        border:1px solid #D3D3D3;
        ;
        font-weight:bold;
        background-color:#e9e9e9;
    }

    div.hdr-sub4:hover {
        background-color:#dfdfdf;
        cursor:pointer
    }

    div.toggle-hdr:hover {
        cursor:pointer;
        background-color:#f1f1f1;
        border:1px solid #dcdcdc;
    }

    div.toggle-hdr:hover a {
        color:#000
    }

    [data-type="toggle"]>i.fa,
    i.fa.fa-toggle-empty {
        min-width:8px;
    }

    div#tabs .ui-widget-header,
    div#tabs-opts .ui-widget-header
    {
        border:none;
        border-bottom:1px solid #D3D3D3 !important;
        background:#fff
    }
    /* ============================
    NOTICES
    ============================ */
    /* step messages */

    #step-messages {
        padding:10px 25px 0;
    }

    .notice {
        background:#fff;
        border:1px solid #dfdfdf;
        border-left:4px solid #fff;
        margin:4px;
        padding:5px;
        border-radius:2px;
        font-size:12px;
    }

    .notice-report {
        border-left:4px solid #fff;
        padding-left:0;
        padding-right:0;
        margin-bottom:4px;
    }

    .next-step .title-separator {
        margin-top:5px;
        padding-top:5px;
        border-top:1px solid lightgray;
    }

    .notice .info pre {
        margin:0;
        padding:0;
        overflow:auto;
    }

    .notice-report .title {
        padding:0 10px;
    }

    .notice-report .info {
        border-top:1px solid #dedede;
        padding:10px;
        font-size:10px;
        background:#FAFAFA;
        word-wrap:break-word;
    }

    .notice.l-info,
    .notice.l-notice {
        border-left-color:#197b19;
    }

    .notice.l-swarning {
        border-left-color:#636363;
    }

    .notice.l-hwarning {
        border-left-color:#636363;
    }

    .notice.l-critical {
        border-left-color:maroon;
    }

    .notice.l-fatal {
        border-left-color:#000000;
    }

    .report-sections-list .section {
        border:1px solid #DFDFDF;
        margin-bottom:25px;
        box-shadow:4px 8px 11px -8px rgba(0, 0, 0, 0.41);
    }

    .report-sections-list .section>.section-title {
        background-color:#efefef;
        padding:3px;
        font-weight:bold;
        text-align:center;
        font-size:14px;
    }

    .report-sections-list .section>.section-content {
        padding:5px;
    }

    .notice-level-status {
        border-radius:2px;
        padding:2px;
        margin:1px;
        font-size:10px;
        display:inline-block;
        color:#FFF;
        font-weight:bold;
        min-width:55px;
    }

    .notice-level-status.l-info,
    .notice-level-status.l-notice {
        background:#197b19;
    }

    .notice-level-status.l-swarning {
        background:#636363;
    }

    .notice-level-status.l-hwarning {
        background:#636363;
    }

    .notice-level-status.l-critical {
        background:maroon;
    }

    .notice-level-status.l-fatal {
        background:#000000;
    }

    .gray-panel {
        border:1px solid silver;
        margin:5px 0;
        padding:10px;
        background:#f9f9f9;
        border-radius:2px
    }

    .gray-panel.warn-text,
    .gray-panel .warn-text {
        font-size:12px;
        color:maroon
    }

    .gray-panel-overwrite {
        font-size:14px !important;
        line-height:25px;
    }
    /*Adv Opts */

    table.dupx-opts {
        width:100%;
        border:0px;
    }

    table.dupx-opts td {
        padding:5px;
    }

    table.dupx-opts td:first-child {
        width:125px;
        font-weight:bold
    }

    table.dupx-advopts td:first-child {
        width:125px;
    }

    table.dupx-advopts label.radio {
        width:50px;
        display:inline-block
    }

    table.dupx-advopts label {
        white-space:nowrap;
        cursor:pointer
    }

    table.dupx-advopts-space {
        line-height:24px
    }

    div.error-pane {
        border:1px solid #efefef;
        border-left:4px solid maroon;
        padding:0 0 0 10px;
        margin:2px 0 10px 0
    }

    div.dupx-ui-error {
        padding-top:2px;
        font-size:13px;
        line-height:20px
    }

    div.footer-buttons {
        position:absolute;
        bottom:10px;
        padding:10px;
        right:0;
        width:100%;
        text-align:right
    }

    div.footer-buttons input:hover,
    button:hover {
        border:1px solid #000
    }

    div.footer-buttons input[disabled=disabled],
    button[disabled=disabled] {
        background-color:#F4F4F4;
        color:silver;
        border:1px solid silver;
    }

    form#form-debug {
        display:block;
        margin:10px auto;
        width:750px;
    }

    form#form-debug a {
        display:inline-block;
    }

    form#form-debug pre {
        margin-top:-2px;
        display:none
    }
    /*Dialog Info */

    div.dlg-serv-info {
        line-height:22px;
        font-size:12px
    }

    div.dlg-serv-info label {
        display:inline-block;
        width:200px;
        font-weight:bold
    }

    div.dlg-serv-info div.hdr {
        font-weight:bold;
        margin-top:5px;
        padding:2px 5px 2px 0;
        border-bottom:1px solid #777;
        font-size:14px
    }

    div.dupx-modes {
        color:#999;
        font-weight:normal;
        font-style:italic;
        font-size:11px;
        padding:5px 10px 0 0;
        text-align:right
    }

    div.dupx-panel-area {
      padding:1em 1.4em;
    }
    /* ============================
    INIT 1:SECURE PASSWORD
    ============================ */

    button.pass-toggle {
        height:26px;
        width:26px;
        position:absolute;
        top:0px;
        right:0px;
        border:1px solid silver;
        border-radius:0 4px 4px 0;
        padding:2px 0 0 3px;
    }

    button.pass-toggle i {
        padding:0;
        display:block;
        margin:-4px 0 0 -5px
    }

    div.i1-pass-area {
        width:100%;
        text-align:center;
        max-width:300px;
        margin:auto;
        position:relative;
    }

    div.i1-pass-data table {
        width:100%;
        border-collapse:collapse;
        padding:0
    }

    div.i1-pass-data label {
        display:block;
        margin-bottom:10px;
        font-weight:bold;
    }

    div.i1-pass-errmsg {
        color:maroon;
        font-weight:bold
    }

    div#i1-pass-input {
        position:relative;
        margin:2px 0 15px 0
    }

    input#secure-pass {
        border-radius:4px 0 0 4px;
        width:250px
    }

    #body-secure .param-wrapper {
        display:flex;
    }

    #body-secure .param-wrapper > label {
        min-width:150px;
        font-weight:bold;
        line-height:27px;
    }

    #body-secure .param-wrapper > *:nth-child(2) {
        width:100%;
    }

    .param-wrapper .sub-note {
        display:block;
        font-size:11px;
        margin-top:6px;
    }

    #body-secure .param-wrapper .sub-note {
        text-align:right;
    }

    .box {
        border:1px solid silver;
        padding:10px;
        background:#f9f9f9;
        border-radius:2px;
    }

    .box *:first-child {
        margin-top:0;
    }

    .box *:last-child {
        margin-bottom:0;
    }

    .box.warning {
        color:maroon;
        border-color:maroon;
    }
    #pass-quick-help-info {
        font-size:13px;
        line-height:22px;
    }
    #pass-quick-help-info li {
        padding:7px 0 7px 0
    }

    .pass-quick-help-note {
        text-align:center;
        font-size:11px;
        font-style:italic;
    }
    
    /* ============================
    STEP 1 VIEW
     ============================ */

    div#s1-area-setup-type label {
        cursor:pointer
    }

    div.s1-setup-type-sub {
        padding:5px 0 0 25px;
        display:none
    }


    div#tabs,
    div#tabs-opts {
        border:0 !important;
    }

    div#tabs-opts-1,
    div#tabs-opts-2 {
        min-height:250px;
    }

    table.s1-archive-local {
        width:100%
    }

    table.s1-archive-local td {
        padding:4px 4px 4px 4px
    }

    table.s1-archive-local td:first-child {
        font-weight:bold;
        width:55px
    }

    div.s1-archive-failed-msg {
        padding:15px;
        border:1px dashed maroon;
        font-size:12px;
        border-radius:2px;
    }

    div.s1-err-msg {
        padding:0 0 80px 0;
        line-height:20px
    }

    div.s1-err-msg i {
        color:maroon
    }

    .maroon {
        color:maroon
    }

    .green {
        color:green
    }

    div.s1-hdr-sys-setup-hdr {
        margin-bottom:0;
    }

    div#s1-area-sys-setup,
    div#s2-dbtest-area-basic {
        border: 2px dashed #D0D0D0;
        border-top:none;
        padding:10px 20px 20px 20px;
        border-radius:2px;
        margin-top:-4px;
    }

    div#s1-area-sys-setup div.info-top {
        text-align:center;
        font-style:italic;
        font-size:11px;
        padding:0 5px 5px 5px
    }

    table.s1-checks-area {
        width:100%;
        margin:0;
        padding:0
    }

    table.s1-checks-area td.title {
        font-size:16px;
        width:100%
    }

    table.s1-checks-area td.title small {
        font-size:11px;
        font-weight:normal
    }

    table.s1-checks-area td.toggle {
        font-size:11px;
        margin-right:7px;
        font-weight:normal
    }

    div.s1-reqs {
        background-color:#efefef;
        border:1px solid silver;
        border-radius:2px;
        padding-bottom:4px
    }

    div.s1-reqs div.header {
        background-color:#E0E0E0;
        color:#000;
        border-bottom:1px solid silver;
        padding:2px;
        font-weight:bold
    }

    div.s1-reqs div.status {
        float:right;
        border-radius:2px;
        color:#fff;
        padding:0 3px 0 3px;
        margin:4px 5px 0 0;
        font-size:11px;
        min-width:30px;
        text-align:center;
    }

    div.s1-reqs div.pass {
        background-color:green;
    }

    div.s1-reqs div.fail {
        background-color:maroon;
    }

    div.s1-reqs div.title {
        padding:3px 3px 3px 5px;
        font-size:13px;
    }

    div.s1-reqs div.title:hover {
        background-color:#dfdfdf;
        cursor:pointer
    }

    div.s1-reqs div.info {
        padding:8px 8px 20px 8px;
        background-color:#fff;
        display:none;
        line-height:18px;
        font-size:12px
    }

    div.s1-reqs div.info a {
        color:#485AA3;
    }

    #archive_engine,
    #archive_action_input {
        cursor:pointer
    }

    .info>*:first-child {
        margin-top:0;
    }

    .info>*:last-child {
        margin-bottom:0;
    }
    /*Terms and Notices*/

    div#s1-warning-check label {
        cursor:pointer;
    }

    div#s1-warning-msg {
        padding:5px;
        font-size:12px;
        color:#333;
        line-height:14px;
        font-style:italic;
        overflow-y:scroll;
        height:460px;
        border:1px solid #dfdfdf;
        background:#fff;
        border-radius:2px
    }

    div#s1-warning-check {
        padding:3px;
        font-size:14px;
        font-weight:normal;
    }

    .s1-warning-check [type=checkbox] {
        height:17px;
        width:17px;
    }

    .config-files-helper{
        font-size:10px;
        display:block;
        margin:4px 0 4px 0;
    }

    /* ============================
    STEP 2 VIEW
    ============================ */

    div.s2-opts label {
        cursor:pointer
    }

    textarea#debug-dbtest-json {
        width:98%;
        height:200px
    }

    div.php-chuncking-warning {
        font-style:italic;
        font-size:11px;
        color:maroon;
        white-space:normal;
        line-height:16px;
        padding-left:20px
    }
    /*Toggle Buttons */

    div.s2-btngrp {
        text-align:center;
        margin:0 auto 10px auto
    }

    div.s2-btngrp input[type=button] {
        font-size:14px;
        padding:6px;
        width:120px;
        border:1px solid silver;
        cursor:pointer
    }

    div.s2-btngrp input[type=button]:first-child {
        border-radius:5px 0 0 5px;
        margin-right:-2px
    }

    div.s2-btngrp input[type=button]:last-child {
        border-radius:0 5px 5px 0;
        margin-left:-4px
    }

    div.s2-btngrp input[type=button].active {
        background-color:#13659C;
        color:#fff;
    }

    div.s2-btngrp input[type=button].in-active {
        background-color:#E4E4E4;
    }

    div.s2-btngrp input[type=button]:hover {
        border:1px solid #999
    }
    /*Basic DB */

    select#dbname-select {
        width:100%;
        border-radius:3px;
        height:20px;
        font-size:12px;
        border:1px solid silver;
    }

    div#s2-dbrefresh-basic {
        float:right;
        font-size:12px;
        display:none;
        font-weight:bold;
        margin:5px 5px 1px 0
    }

    div#s2-db-basic-overwrite div.warn-text {
        padding:5px 0 5px 0;
    }

    div#s2-db-basic-overwrite div.btn-area {
        text-align:right;
        margin:5px 0
    }

    input.overwrite-btn {
        cursor:pointer;
        color:#fff;
        font-size:13px;
        border-radius:5px;
        padding:5px 20px 4px 20px;
        background-color:#989898;
        border:1px solid #777;
    }
    /*cPanel DB */

    div.s2-cpnl-pane {
        margin-top:5px
    }

    div.s2-gopro {
        color:black;
        margin-top:10px;
        padding:0 20px 10px 20px;
        border:1px solid silver;
        background-color:#F6F6F6;
        border-radius:2px
    }

    div.s2-gopro h2 {
        text-align:center;
        margin:10px
    }

    div.s2-gopro small {
        font-style:italic
    }

    div.s2-cpanel-login {
        padding:15px;
        color:#fff;
        text-align:center;
        margin:15px 5px 15px 5px;
        border:1px solid silver;
        border-radius:2px;
        background-color:#13659C;
        font-size:14px;
        line-height:22px
    }

    div.s2-cpanel-off {
        padding:15px;
        color:#fff;
        text-align:center;
        margin:15px 5px 15px 5px;
        border:1px solid silver;
        border-radius:2px;
        background-color:#b54949;
        font-size:14px;
        line-height:22px
    }

    div.s2-cpnl-panel-no-support {
        text-align:center;
        font-size:18px;
        font-weight:bold;
        line-height:30px;
        margin-top:40px
    }
    /*DATABASE CHECKS */

    div#s2-dbtest-area-basic {
        margin-top:-8px;
    }
    div.s2-dbtest-area {
        margin:auto;
        margin:5px 0 15px 0;
        min-height:110px
    }

    div.s2-dbtest-area input[type=button] {
        font-size:11px;
        height:20px;
        border:1px solid gray;
        border-radius:3px;
        cursor:pointer
    }

    div.s2-dbtest-area small.db-check {
        color:#000;
        text-align:center;
        padding:3px;
        font-size:11px;
        font-weight:normal
    }


    div.s2-dbtest-area div.message {
        padding:25px 10px 10px 10px;
        margin:5px auto 5px auto;
        text-align:center;
        font-size:15px;
        line-height:22px;
        width:100%;
    }

    div.s2-dbtest-area div.sub-message {
        padding:15px 5px 15px 5px;
        text-align:center;
        font-style:italic;
        color:maroon
    }

    div.s2-dbtest-area div.error-msg {
        color:maroon
    }

    div.s2-dbtest-area div.success-msg {
        color:green
    }

    div.s2-dbtest-area pre {
        font-family:Verdana, Arial, sans-serif;
        font-size:13px;
        margin:0;
        white-space:normal;
    }

    div.s2-reqs-hdr {
        border-radius:2px 2px 0 0;
        border-bottom:none
    }

    div.s2-notices-hdr {
        border-radius:0;
        border-bottom:1px solid #D3D3D3;
    }

    div#s2-reqs-all {
        display:none
    }

    div#s2-notices-all {
        display:none
    }

    div.s2-reqs {
        background-color:#efefef;
        border:1px solid #D3D3D3;
        border-top:none
    }

    div.s2-reqs div.status {
        float:right;
        border-radius:2px;
        color:#fff;
        padding:0 4px 0 4px;
        margin:4px 7px 0 0;
        font-size:12px;
        min-width:30px;
        text-align:center;
    }

    div.s2-reqs div.title {
        padding:3px 8px 3px 20px;
        font-size:13px;
        background-color:#f1f1f1;
        border-top:1px solid #D3D3D3;
    }

    div.s2-reqs div.title:hover {
        background-color:#dfdfdf;
        cursor:pointer
    }

    div.s2-reqs div.info {
        padding:4px 12px 15px 12px;
        ;
        background-color:#fff;
        display:none;
        line-height:18px;
        font-size:12px
    }

    div.s2-reqs div.info a {
        color:#485AA3;
    }

    div.s2-reqs div.info ul {
        padding-left:25px
    }

    div.s2-reqs div.info ul li {
        padding:2px
    }

    div.s2-reqs div.info ul.vids {
        list-style-type:none;
    }

    div.s2-reqs div.sub-title {
        border-bottom:1px solid #d3d3d3;
        font-weight:bold;
        margin:7px 0 3px 0
    }

    div.s2-reqs10 table {
        margin-top:5px;
    }

    div.s2-reqs10 table td {
        padding:1px;
    }

    div.s2-reqs10 table td:first-child {
        font-weight:bold;
        padding-right:10px
    }

    div.s2-reqs40 div.db-list {
        height:70px;
        width:95%;
        overflow-y:scroll;
        padding:2px 5px 5px 5px;
        border:1px solid #d3d3d3;
    }

    div.s2-reqs60 div.tbl-list {
        padding:2px 5px 5px 5px;
        border:0
    }

    div.s2-reqs60 div.tbl-list b {
        display:inline-block;
        width:55px;
    }

    div.s2-notice20 table.collation-list table {
        padding:2px;
    }

    div.s2-notice20 table.collation-list td:first-child {
        font-weight:bold;
        padding-right:5px
    }

    textarea[readonly] {
        background-color:#efefef;
    }

    .copy-to-clipboard-block textarea {
        width:100%;
        height:100px;
    }

    .copy-to-clipboard-block button,
    .copy-to-clipboard-block button:hover {
        font-size:14px;
        padding:5px 8px;
        margin-bottom:15px;
    }
    /*Warning Area and Message */

    div.s2-warning-emptydb {
        color:maroon;
        margin:2px 0 0 0;
        font-size:11px;
        display:none;
        white-space:normal;
        width:550px
    }

    div.s2-warning-manualdb {
        color:#1B67FF;
        margin:2px 0 0 0;
        font-size:11px;
        display:none;
        white-space:normal;
        width:550px
    }

    div.s2-warning-renamedb {
        color:#1B67FF;
        margin:2px 0 0 0;
        font-size:11px;
        display:none;
        white-space:normal;
        width:550px
    }

    div#s2-tryagain {
        padding-top:50px;
        text-align:center;
        width:100%;
        font-size:16px;
        color:#444;
        font-weight:bold;
    }
    /* ============================
    STEP 3 VIEW
    ============================ */

    table.s3-opts {
        width:96%;
        border:0;
    }

    table.s3-opts i.fa {
        font-size:16px
    }

    table.s3-opts td {
        white-space:nowrap;
        padding:3px;
    }

    table.s3-opts td:first-child {
        width:90px;
        font-weight:bold
    }

    div#s3-adv-opts {
        margin-top:5px;
    }

    div.s3-allnonelinks {
        font-size:11px;
        float:right;
    }

    div.s3-manaual-msg {
        font-style:italic;
        margin:-2px 0 5px 0
    }

    small.s3-warn {
        color:maroon;
        font-style:italic
    }
    /* ============================
    STEP 4 VIEW
    ============================ */

    div.s4-final-msg {
        height:110px;
        border:1px solid #CDCDCD;
        padding:8px;
        font-size:12px;
        border-radius:2px;
        box-shadow:0 4px 2px -2px #777;
    }

    div.s4-final-title {
        color:#BE2323;
        font-size:18px
    }

    div.s4-connect {
        font-size:12px;
        text-align:center;
        font-style:italic;
        position:absolute;
        bottom:10px;
        padding:10px;
        width:100%;
        margin-top:20px
    }

    table.s4-report-results,
    table.s4-report-errs {
        border-collapse:collapse;
        box-shadow:4px 8px 11px -8px rgba(0, 0, 0, 0.41);
    }

    table.s4-report-errs td {
        text-align:center;
        width:33%
    }

    table.s4-report-results th,
    table.s4-report-errs th {
        background-color:#d0d0d0;
        padding:3px;
        font-size:14px;
    }

    table.s4-report-results td,
    table.s4-report-errs td {
        padding:3px;
        white-space:nowrap;
        border:1px solid #dfdfdf;
        text-align:center;
        font-size:11px
    }

    table.s4-report-results td:first-child {
        text-align:left;
        font-weight:bold;
        padding-left:3px
    }

    div.s4-err-title {
        background-color:#dfdfdf;
        font-weight:bold;
        margin:-3px 0 15px 0;
        padding:5px;
        border-radius:2px;
        font-size:13px
    }

    div.s4-err-msg {
        padding:8px;
        display:none;
        border:1px dashed #999;
        margin:10px 0 20px 0;
        border-radius:2px;
    }

    div.s4-err-msg div.content {
        padding:5px;
        font-size:11px;
        line-height:17px;
        max-height:125px;
        overflow-y:scroll;
        border:1px solid silver;
        margin:3px;
    }

    div.s4-err-msg div.info-error {
        padding:7px;
        background-color:#f9c9c9;
        border:1px solid silver;
        border-radius:2px;
        font-size:12px;
        line-height:16px
    }

    div.s4-err-msg div.info-notice {
        padding:7px;
        background-color:#FCFEC5;
        border:1px solid silver;
        border-radius:2px;
        font-size:12px;
        line-height:16px;
    }

    table.s4-final-step {
        width:100%;
    }

    table.s4-final-step td {
        padding:5px 15px 5px 5px;
        font-size:13px;
    }

    table.s4-final-step td:first-child {
        white-space:nowrap;
        width:165px
    }

    div.s4-go-back {
        border-top:1px dotted #dfdfdf;
        margin:auto;
        font-size:11px;
        color:#333;
        padding-top:4px
    }

    div.s4-go-back ul {
        line-height:18px
    }

    button.s4-final-btns {
        cursor: pointer;
        color: #fff;
        font-size: 17px;
        border-radius:4px;
        padding:8px;
        background-color: #13659C;
        border: 1px solid gray;
        width: 175px;
    }

    button.s4-final-btns:hover {
        background-color:#bdbdbd;
    }

    div.s4-gopro-btn {
        text-align:center;
        font-size:14px;
        margin:auto;
        width:200px;
        font-style:italic;
        font-weight:bold
    }

    div.s4-gopro-btn a {
        color:green
    }

    div.s4-final-steps {
        border:1px solid #cdcdcd;
        border-radius:3px;
        padding:15px;
        color:maroon;
        font-size:12px;
        font-style:italic;
        margin:5px 0 10px 0;
    }
    
    pre.s4-diff-viewer {
        line-height:11px
    }

    div#s4-notice-reports div.section-content div.title {
        cursor:pointer
    }
    /* ============================
    STEP 5 HELP
    ============================    */

    #body-help div#content {
        width:100%;
        max-width:1024px;
    }

    div.help-target {
        float:right;
    }

    div.help-target a {
        float:right;
        font-size:16px;
        color:#13659C
    }

    div#main-help sup {
        font-size:11px;
        font-weight:normal;
        font-style:italic;
        color:blue
    }

    div.help-online {
        text-align:center;
        font-size:18px;
        padding:10px 0 0 0;
        line-height:24px
    }

    div.help {
        color:#555;
        font-style:italic;
        font-size:11px;
        padding:4px;
        border-top:1px solid #dfdfdf
    }

    div.help-page fieldset {
        margin-bottom:25px
    }

    div#main-help {
        font-size:13px;
        line-height:17px
    }

    div#main-help h3 {
        border-bottom:1px solid silver;
        padding:8px;
        margin:4px 0 8px 0;
        font-size:20px
    }

    div#main-help span.step {
        color:#DB4B38
    }

    .help-opt {
        width:100%;
        border:none;
        border-collapse:collapse;
        margin:5px 0 0 0;
    }

    .help-opt .col-opt {
        width:250px;
    }

    .help-opt td.section {
        background-color:#dfdfdf;
    }

    .help-opt td,
    .help-opt th {
        padding:15px 10px;
        border:1px solid silver;
    }

    .help-opt td:first-child {
        font-weight:bold;
        padding-right:10px;
        white-space:nowrap
    }

    .help-opt th {
        background:#333;
        color:#fff;
        border:1px solid #333
    }

    #main-help section {
        border:1px solid silver;
        margin-top:28px;
        border-radius:2px;
        overflow:hidden;
    }

    #main-help section h2.header {
        background-color:#F1F1F1;
        padding:15px;
        margin:0;
        font-size:20px;
    }

    #main-help section .content {
        padding:10px;
    }
    /* ============================
    Expandable section
    ============================    */

    .expandable.close .expand-header {
        cursor:pointer;
    }

    .expandable.open .expand-header {
        cursor:pointer;
    }

    .expandable .expand-header::before {
        font-family:'Font Awesome 5 Free';
        margin-right:10px;
    }

    .expandable.close .expand-header::before {
        content:"\f0fe";
    }

    .expandable.open .expand-header::before {
        content:"\f146";
    }

    .expandable.close .content {
        display:none;
    }

    .expandable.open .content {
        display:block;
    }
    /* ============================
    VIEW EXCEPTION
    ============================    */

    .exception-trace {
        overflow:auto;
        border:1px solid lightgray;
        padding:10px;
        margin:0;
    }
    /*!
     * password indicator
     */

    .top_testresult {
        font-weight:bold;
        font-size:11px;
        color:#222;
        display:block;
        position:absolute;
        top:0;
        right:30px;
        text-align:right;
        padding-right:20px;
        box-sizing:border-box;
        width:40%;
        height:30px;
        line-height:30px;
    }

    .top_shortPass,
    .top_badPass {
        background:#edabab;
        background:transparent linear-gradient(90deg, transparent 20%, #edabab);
        display:block;
    }

    .top_goodPass {
        background:#ffffe0;
        background:transparent linear-gradient(90deg, transparent 20%, #ffffe0);
        display:block;
    }

    .top_strongPass {
        background:#d3edab;
        background:transparent linear-gradient(90deg, transparent 20%, #d3edab);
        display:block;
    }
    /*================================================
    LIB OVERIDES*/

    input.parsley-error,
    textarea.parsley-error,
    select.parsley-error {
        color:#B94A48 !important;
        background-color:#F2DEDE !important;
        border:1px solid #EED3D7 !important;
    }

    ul.parsley-errors-list {
        margin:1px 0 0 -40px;
        list-style-type:none;
        font-size:10px
    }

    .ui-widget {
        font-size:13px
    }

    <?php if (DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)):?>
        .dupx-debug {display:block; margin:0 0 25px 0; font-size:11px; background-color:#f5dbda; padding:8px; border:1px solid silver; border-radius:2px}
        .dupx-debug label {font-weight:bold; display:block; margin:4px 0 1px 0}
        .dupx-debug textarea {width:95%; height:100px; font-size:11px}
        .dupx-debug input {font-size:11px; padding:3px}
    <?php else :?>
        .dupx-debug {display:none}
    <?php endif; ?>

</style>
<?php
DUPX_U_Html::css();
installer/dup-installer/assets/inc.libs.css.php000064400000117417151336065400015645 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
require_once($GLOBALS['DUPX_INIT'] . '/classes/utilities/class.u.php');
DUPX_U::init();
?>
<style type="text/css">
/*! jQuery UI - v1.12.1 - 2016-09-14
* http://jqueryui.com
* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
* Copyright jQuery Foundation and other contributors; Licensed MIT 

	TODO:  When updating replace: [url("images/] with: []url("assets/images/]
*/
.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-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;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.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-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.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-wrapper{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-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.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-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{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:none;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-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.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-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:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.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 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.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-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;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-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.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:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family: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:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("assets/images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;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,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("assets/images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.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,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("assets/images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("assets/images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.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:#fef1ec url("assets/images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.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("assets/images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("assets/images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("assets/images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("assets/images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("assets/images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("assets/images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("assets/images/ui-icons_888888_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-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:-65px -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:-65px -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:1px -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:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}

/* qTip2 v2.2.1 | Plugins: tips modal viewport svg imagemap ie6 | Styles: core basic css3 | qtip2.com | Licensed MIT | Sat Sep 06 2014 23:12:07 */

.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:350px;min-width:50px;font-size:10.5px;line-height:12px;direction:ltr;box-shadow:none;padding:0}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;z-index:11;cursor:pointer;outline:0;border:1px solid transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-icon .ui-icon,.qtip-titlebar .ui-icon{display:block;text-indent:-1000em;direction:ltr}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;line-height:14px;text-align:center;text-indent:0;font:400 bold 10px/13px Tahoma,sans-serif;color:inherit;background:-100em -100em no-repeat}.qtip-default{border:1px solid #F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111}.qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1}.qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0}.qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon,.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252}.qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0}.qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-bootstrap,.qtip-rounded,.qtip-tipsy{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-rounded .qtip-titlebar{-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border:0 solid transparent;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,#000));background-image:-webkit-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,#000 100%)}.qtip-youtube .qtip-titlebar{background-color:transparent}.qtip-youtube .qtip-content{padding:.75em;font:12px arial,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)"}.qtip-jtools .qtip-content,.qtip-jtools .qtip-titlebar{background:0 0;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px #000}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10px;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10px}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:0 0}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}.qtip .qtip-tip,x:-o-prefocus{visibility:hidden}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml,.qtip .qtip-tip canvas{position:absolute;color:#123456;background:0 0;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:0;top:0;width:100%;height:100%}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"alpha(Opacity=70)"}.qtipmodal-ie6fix{position:absolute!important}
</style>installer/dup-installer/assets/inc.libs.js000064400002062427151336065400014705 0ustar00/* ======================================== */
/*! jQuery v3.5.0 | (c) JS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t=Object.create(null),V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});

/* ======================================== */
/*! jQuery UI - v1.12.1 - 2017-01-28
* http://jqueryui.com
* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js
* Copyright jQuery Foundation and other contributors; Licensed MIT */

(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(p.inline?p.dpDiv.parent()[0]:p.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var l=0,h=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=h.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=h.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,g,m,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),k={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,g=_.offset,m=t.extend({},g),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):l.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=l.test(i[1])?i[1]:"center",t=h.exec(i[0]),e=h.exec(i[1]),k[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?m.left+=p:"center"===n.at[0]&&(m.left+=p/2),"bottom"===n.at[1]?m.top+=f:"center"===n.at[1]&&(m.top+=f/2),u=e(k.at,p,f),m.left+=u[0],m.top+=u[1],this.each(function(){var s,r,l=t(this),h=l.outerWidth(),c=l.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),x=h+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},m),T=e(k.my,l.outerWidth(),l.outerHeight());"right"===n.my[0]?D.left-=h:"center"===n.my[0]&&(D.left-=h/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:h,elemHeight:c,collisionPosition:s,collisionWidth:x,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:l})}),n.using&&(r=function(t){var e=g.left-D.left,i=e+p-h,s=g.top-D.top,r=s+f-c,u={target:{element:v,left:g.left,top:g.top,width:p,height:f},element:{element:l,left:D.left,top:D.top,width:h,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,l,h=i.nodeName.toLowerCase();return"area"===h?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(h)?(r=!i.disabled,r&&(l=t(i).closest("fieldset")[0],l&&(r=!l.disabled))):r="a"===h?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c=!1;t(document).on("mouseup",function(){c=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!c){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),c=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,c=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blurActiveElement(e),this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("<div>").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)
},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),l=t.pageX,h=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.left<i[0]&&(l=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(h=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(h=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,h=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,l=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(l=this.originalPageX),"x"===a.axis&&(h=this.originalPageY)),{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY<n.scrollSensitivity?a.scrollTop=o=a.scrollTop+n.scrollSpeed:e.pageY-s.overflowOffset.top<n.scrollSensitivity&&(a.scrollTop=o=a.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+a.offsetWidth-e.pageX<n.scrollSensitivity?a.scrollLeft=o=a.scrollLeft+n.scrollSpeed:e.pageX-s.overflowOffset.left<n.scrollSensitivity&&(a.scrollLeft=o=a.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(e.pageY-t(r).scrollTop()<n.scrollSensitivity?o=t(r).scrollTop(t(r).scrollTop()-n.scrollSpeed):t(window).height()-(e.pageY-t(r).scrollTop())<n.scrollSensitivity&&(o=t(r).scrollTop(t(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(e.pageX-t(r).scrollLeft()<n.scrollSensitivity?o=t(r).scrollLeft(t(r).scrollLeft()-n.scrollSpeed):t(window).width()-(e.pageX-t(r).scrollLeft())<n.scrollSensitivity&&(o=t(r).scrollLeft(t(r).scrollLeft()+n.scrollSpeed)))),o!==!1&&t.ui.ddmanager&&!n.dropBehaviour&&t.ui.ddmanager.prepareOffsets(s,e)}}),t.ui.plugin.add("draggable","snap",{start:function(e,i,s){var n=s.options;s.snapElements=[],t(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var e=t(this),i=e.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:e.outerWidth(),height:e.outerHeight(),top:i.top,left:i.left})})},drag:function(e,i,s){var n,o,a,r,l,h,c,u,d,p,f=s.options,g=f.snapTolerance,m=i.offset.left,_=m+s.helperProportions.width,v=i.offset.top,b=v+s.helperProportions.height;for(d=s.snapElements.length-1;d>=0;d--)l=s.snapElements[d].left-s.margins.left,h=l+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,l-g>_||m>h+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(l-_),r=g>=Math.abs(h-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(l-m),r=g>=Math.abs(h-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&u(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var u=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,l=a+e.helperProportions.height,h=i.offset.left,c=i.offset.top,u=h+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=h&&u>=r&&a>=c&&d>=l;case"intersect":return o+e.helperProportions.width/2>h&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>l-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,h,i.proportions().width);case"touch":return(a>=c&&d>=a||l>=c&&d>=l||c>a&&l>d)&&(o>=h&&u>=o||r>=h&&u>=r||h>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&u(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=u(e,this,this.options.tolerance,i),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),o.length&&(s=t(o[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,l=this._change[o];return this._updatePrevProperties(),l?(i=l.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,l,h=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,l=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,h.animate||this.element.css(t.extend(a,{top:l,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!h.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,l=this.originalPosition.top+this.originalSize.height,h=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&h&&(t.left=r-e.minWidth),s&&h&&(t.left=r-e.maxWidth),a&&c&&(t.top=l-e.minHeight),n&&c&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,l={width:i.size.width-r,height:i.size.height-a},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(l,c&&h?{top:c,left:h}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,l=t(this).resizable("instance"),h=l.options,c=l.element,u=h.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(l.containerElement=t(d),/document/.test(u)||u===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=l._num(e.css("padding"+s))}),l.containerOffset=e.offset(),l.containerPosition=e.position(),l.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=l.containerOffset,n=l.containerSize.height,o=l.containerSize.width,a=l._hasScroll(d,"left")?d.scrollWidth:o,r=l._hasScroll(d)?d.scrollHeight:n,l.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,l=a.containerOffset,h=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=l),h.left<(a._helper?l.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-l.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?l.left:0),h.top<(a._helper?l.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-l.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?l.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-l.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-l.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),l=a.outerWidth()-e.sizeDiff.width,h=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:l,height:h})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};
t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,l="number"==typeof s.grid?[s.grid,s.grid]:s.grid,h=l[0]||1,c=l[1]||1,u=Math.round((n.width-o.width)/h)*h,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=l,_&&(p+=h),v&&(f+=c),g&&(p-=h),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-h)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-h>0?(i.size.width=p,i.position.left=a.left-u):(p=h-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable,t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),s=i.offset(),n={left:s.left-e.elementPos.left,top:s.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:n.left,top:n.top,right:n.left+i.outerWidth(),bottom:n.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("<div>"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(s.$element,"ui-selected"),s.selected=!1,i._addClass(s.$element,"ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),i._removeClass(n.$element,s?"ui-unselecting":"ui-selected")._addClass(n.$element,s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,l=e.pageY;return o>r&&(i=r,r=o,o=i),a>l&&(i=l,l=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:l-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),h=!1,c={};i&&i.element!==s.element[0]&&(c.left=i.left+s.elementPos.left,c.right=i.right+s.elementPos.left,c.top=i.top+s.elementPos.top,c.bottom=i.bottom+s.elementPos.top,"touch"===n.tolerance?h=!(c.left>r||o>c.right||c.top>l||a>c.bottom):"fit"===n.tolerance&&(h=c.left>o&&r>c.right&&c.top>a&&l>c.bottom),h?(i.selected&&(s._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(s._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(s._addClass(i.$element,"ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,s._addClass(i.$element,"ui-selected"),i.selected=!0):(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(s._removeClass(i.$element,"ui-selected"),i.selected=!1,s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-selecting")._addClass(s.$element,"ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-this.document.scrollTop()<a.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-a.scrollSpeed):this.window.height()-(e.pageY-this.document.scrollTop())<a.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+a.scrollSpeed)),e.pageX-this.document.scrollLeft()<a.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-a.scrollSpeed):this.window.width()-(e.pageX-this.document.scrollLeft())<a.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,l=r+t.height,h=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+h>r&&l>s+h,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&l>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],l=[],h=this._connectWith();if(h&&e)for(s=h.length-1;s>=0;s--)for(o=t(h[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&l.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=l.length-1;s>=0;s--)l[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,l,h,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,h=r.length;h>s;s++)l=t(r[s]),l.data(this.widgetName+"-item",a),c.push({item:l,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("<tr>",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t("<td>&#160;</td>",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,l,h,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(l=this.items[s].item.offset()[a],h=!1,e[u]-l>this.items[s][r]/2&&(h=!0),n>Math.abs(e[u]-l)&&(n=Math.abs(e[u]-l),o=this.items[s],this.direction=h?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():l?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t("<span>"),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))
},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],l=r&&n.collapsible,h=l?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:l?t():a,newPanel:h};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=l?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,l=t.css("box-sizing"),h=t.length&&(!e.length||t.index()<e.index()),c=this.options.animate||{},u=h&&c.down||c,d=function(){a._toggleComplete(i)};return"number"==typeof u&&(o=u),"string"==typeof u&&(n=u),n=n||u.easing||c.easing,o=o||u.duration||c.duration,e.length?t.length?(s=t.show().outerHeight(),e.animate(this.hideProps,{duration:o,easing:n,step:function(t,e){e.now=Math.round(t)}}),t.hide().animate(this.showProps,{duration:o,easing:n,complete:d,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?"content-box"===l&&(r+=i.now):"content"!==a.options.heightStyle&&(i.now=Math.round(s-e.outerHeight()-r),r=0)}}),void 0):e.animate(this.hideProps,o,n,d):t.animate(this.showProps,o,n,d)},_toggleComplete:function(t){var e=t.oldPanel,i=e.prev();this._removeClass(e,"ui-accordion-content-active"),this._removeClass(i,"ui-accordion-header-active")._addClass(i,"ui-accordion-header-collapsed"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}}),t.widget("ui.menu",{version:"1.12.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("<span>").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)},_filterMenuItems:function(e){var i=e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(t.trim(t(this).children(".ui-menu-item-wrapper").text()))})}}),t.widget("ui.autocomplete",{version:"1.12.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("<ul>").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("<div>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):void 0},_search:function(t){this.pending++,this._addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return t.proxy(function(t){e===this.requestIndex&&this.__response(t),this.pending--,this.pending||this._removeClass("ui-autocomplete-loading")},this)},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,"mousedown"),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({},e,{label:e.label||e.value,value:e.value||e.label})})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:"_closeOnClickOutside"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<div>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("<div>").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete;var d=/ui-corner-([a-z]){2,6}/g;t.widget("ui.controlgroup",{version:"1.12.1",defaultElement:"<div>",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var e=this,i=[];t.each(this.options.items,function(s,n){var o,a={};return n?"controlgroupLabel"===s?(o=e.element.find(n),o.each(function(){var e=t(this);e.children(".ui-controlgroup-label-contents").length||e.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>")}),e._addClass(o,null,"ui-widget ui-widget-content ui-state-default"),i=i.concat(o.get()),void 0):(t.fn[s]&&(a=e["_"+s+"Options"]?e["_"+s+"Options"]("middle"):{classes:{}},e.element.find(n).each(function(){var n=t(this),o=n[s]("instance"),r=t.widget.extend({},a);if("button"!==s||!n.parent(".ui-spinner").length){o||(o=n[s]()[s]("instance")),o&&(r.classes=e._resolveClassesValues(r.classes,o)),n[s](r);var l=n[s]("widget");t.data(l[0],"ui-controlgroup-data",o?o:n[s]("instance")),i.push(l[0])}})),void 0):void 0}),this.childWidgets=t(t.unique(i)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var i=t(this),s=i.data("ui-controlgroup-data");s&&s[e]&&s[e]()})},_updateCornerClass:function(t,e){var i="ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all",s=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,i),this._addClass(t,null,s)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){var e=this._buildSimpleOptions(t,"ui-spinner");return e.classes["ui-spinner-up"]="",e.classes["ui-spinner-down"]="",e},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e?"auto":!1,classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(e,i){var s={};return t.each(e,function(n){var o=i.options.classes[n]||"";o=t.trim(o.replace(d,"")),s[n]=(o+" "+e[n]).replace(/\s+/g," ")}),s},_setOption:function(t,e){return"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"===t?(this._callChildMethod(e?"disable":"enable"),void 0):(this.refresh(),void 0)},refresh:function(){var e,i=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),e=this.childWidgets,this.options.onlyVisible&&(e=e.filter(":visible")),e.length&&(t.each(["first","last"],function(t,s){var n=e[s]().data("ui-controlgroup-data");if(n&&i["_"+n.widgetName+"Options"]){var o=i["_"+n.widgetName+"Options"](1===e.length?"only":s);o.classes=i._resolveClassesValues(o.classes,n),n.element[n.widgetName](o)}else i._updateCornerClass(e[s](),s)}),this._callChildMethod("refresh"))}}),t.widget("ui.checkboxradio",[t.ui.formResetMixin,{version:"1.12.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var e,i,s=this,n=this._super()||{};return this._readType(),i=this.element.labels(),this.label=t(i[i.length-1]),this.label.length||t.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){s.originalLabel+=3===this.nodeType?t(this).text():this.outerHTML}),this.originalLabel&&(n.label=this.originalLabel),e=this.element[0].disabled,null!=e&&(n.disabled=e),n},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this.icon&&this._addClass(this.icon,null,"ui-state-hover")),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var e=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===e&&/radio|checkbox/.test(this.type)||t.error("Can't create checkboxradio on element.nodeName="+e+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var e,i=this.element[0].name,s="input[name='"+t.ui.escapeSelector(i)+"']";return i?(e=this.form.length?t(this.form[0].elements).filter(s):t(s).filter(function(){return 0===t(this).form().length}),e.not(this.element)):t([])},_toggleClasses:function(){var e=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",e),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",e)._toggleClass(this.icon,null,"ui-icon-blank",!e),"radio"===this.type&&this._getRadioGroup().each(function(){var e=t(this).checkboxradio("instance");e&&e._removeClass(e.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){return"label"!==t||e?(this._super(t,e),"disabled"===t?(this._toggleClass(this.label,null,"ui-state-disabled",e),this.element[0].disabled=e,void 0):(this.refresh(),void 0)):void 0},_updateIcon:function(e){var i="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=t("<span>"),this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(i+=e?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,e?"ui-icon-blank":"ui-icon-check")):i+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",i),e||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)
},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]),t.ui.checkboxradio,t.widget("ui.button",{version:"1.12.1",defaultElement:"<button>",options:{classes:{"ui-button":"ui-corner-all"},disabled:null,icon:null,iconPosition:"beginning",label:null,showLabel:!0},_getCreateOptions:function(){var t,e=this._super()||{};return this.isInput=this.element.is("input"),t=this.element[0].disabled,null!=t&&(e.disabled=t),this.originalLabel=this.isInput?this.element.val():this.element.html(),this.originalLabel&&(e.label=this.originalLabel),e},_create:function(){!this.option.showLabel&!this.options.icon&&(this.options.showLabel=!0),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled||!1),this.hasTitle=!!this.element.attr("title"),this.options.label&&this.options.label!==this.originalLabel&&(this.isInput?this.element.val(this.options.label):this.element.html(this.options.label)),this._addClass("ui-button","ui-widget"),this._setOption("disabled",this.options.disabled),this._enhance(),this.element.is("a")&&this._on({keyup:function(e){e.keyCode===t.ui.keyCode.SPACE&&(e.preventDefault(),this.element[0].click?this.element[0].click():this.element.trigger("click"))}})},_enhance:function(){this.element.is("button")||this.element.attr("role","button"),this.options.icon&&(this._updateIcon("icon",this.options.icon),this._updateTooltip())},_updateTooltip:function(){this.title=this.element.attr("title"),this.options.showLabel||this.title||this.element.attr("title",this.options.label)},_updateIcon:function(e,i){var s="iconPosition"!==e,n=s?this.options.iconPosition:i,o="top"===n||"bottom"===n;this.icon?s&&this._removeClass(this.icon,null,this.options.icon):(this.icon=t("<span>"),this._addClass(this.icon,"ui-button-icon","ui-icon"),this.options.showLabel||this._addClass("ui-button-icon-only")),s&&this._addClass(this.icon,null,i),this._attachIcon(n),o?(this._addClass(this.icon,null,"ui-widget-icon-block"),this.iconSpace&&this.iconSpace.remove()):(this.iconSpace||(this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-button-icon-space")),this._removeClass(this.icon,null,"ui-wiget-icon-block"),this._attachIconSpace(n))},_destroy:function(){this.element.removeAttr("role"),this.icon&&this.icon.remove(),this.iconSpace&&this.iconSpace.remove(),this.hasTitle||this.element.removeAttr("title")},_attachIconSpace:function(t){this.icon[/^(?:end|bottom)/.test(t)?"before":"after"](this.iconSpace)},_attachIcon:function(t){this.element[/^(?:end|bottom)/.test(t)?"append":"prepend"](this.icon)},_setOptions:function(t){var e=void 0===t.showLabel?this.options.showLabel:t.showLabel,i=void 0===t.icon?this.options.icon:t.icon;e||i||(t.showLabel=!0),this._super(t)},_setOption:function(t,e){"icon"===t&&(e?this._updateIcon(t,e):this.icon&&(this.icon.remove(),this.iconSpace&&this.iconSpace.remove())),"iconPosition"===t&&this._updateIcon(t,e),"showLabel"===t&&(this._toggleClass("ui-button-icon-only",null,!e),this._updateTooltip()),"label"===t&&(this.isInput?this.element.val(e):(this.element.html(e),this.icon&&(this._attachIcon(this.options.iconPosition),this._attachIconSpace(this.options.iconPosition)))),this._super(t,e),"disabled"===t&&(this._toggleClass(null,"ui-state-disabled",e),this.element[0].disabled=e,e&&this.element.blur())},refresh:function(){var t=this.element.is("input, button")?this.element[0].disabled:this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOptions({disabled:t}),this._updateTooltip()}}),t.uiBackCompat!==!1&&(t.widget("ui.button",t.ui.button,{options:{text:!0,icons:{primary:null,secondary:null}},_create:function(){this.options.showLabel&&!this.options.text&&(this.options.showLabel=this.options.text),!this.options.showLabel&&this.options.text&&(this.options.text=this.options.showLabel),this.options.icon||!this.options.icons.primary&&!this.options.icons.secondary?this.options.icon&&(this.options.icons.primary=this.options.icon):this.options.icons.primary?this.options.icon=this.options.icons.primary:(this.options.icon=this.options.icons.secondary,this.options.iconPosition="end"),this._super()},_setOption:function(t,e){return"text"===t?(this._super("showLabel",e),void 0):("showLabel"===t&&(this.options.text=e),"icon"===t&&(this.options.icons.primary=e),"icons"===t&&(e.primary?(this._super("icon",e.primary),this._super("iconPosition","beginning")):e.secondary&&(this._super("icon",e.secondary),this._super("iconPosition","end"))),this._superApply(arguments),void 0)}}),t.fn.button=function(e){return function(){return!this.length||this.length&&"INPUT"!==this[0].tagName||this.length&&"INPUT"===this[0].tagName&&"checkbox"!==this.attr("type")&&"radio"!==this.attr("type")?e.apply(this,arguments):(t.ui.checkboxradio||t.error("Checkboxradio widget missing"),0===arguments.length?this.checkboxradio({icon:!1}):this.checkboxradio.apply(this,arguments))}}(t.fn.button),t.fn.buttonset=function(){return t.ui.controlgroup||t.error("Controlgroup widget missing"),"option"===arguments[0]&&"items"===arguments[1]&&arguments[2]?this.controlgroup.apply(this,[arguments[0],"items.button",arguments[2]]):"option"===arguments[0]&&"items"===arguments[1]?this.controlgroup.apply(this,[arguments[0],"items.button"]):("object"==typeof arguments[0]&&arguments[0].items&&(arguments[0].items={button:arguments[0].items}),this.controlgroup.apply(this,arguments))}),t.ui.button,t.extend(t.ui,{datepicker:{version:"1.12.1"}});var p;t.extend(s.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return a(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var s=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?n(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(i),t.data(e,"datepicker",i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.off("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.on("focus",this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.on("click",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,n,o){var r,l,h,c,u,d=this._dialogInst;return d||(this.uuid+=1,r="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+r+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.on("keydown",this._doKeyDown),t("body").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],"datepicker",d)),a(d.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=o?o.length?o:[o.pageX,o.pageY]:null,this._pos||(l=document.documentElement.clientWidth,h=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+c,h/2-150+u]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),d.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],"datepicker",d),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,"datepicker");s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),p===n&&(p=null))},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,i,s){var n,o,r,l,h=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):h?"all"===i?t.extend({},h.settings):this._get(h,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),h&&(this._curInst===h&&this._hideDatepicker(),o=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(h,"min"),l=this._getMinMaxDate(h,"max"),a(h.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(h.settings.minDate=this._formatDate(h,r)),null!==l&&void 0!==n.dateFormat&&void 0===n.maxDate&&(h.settings.maxDate=this._formatDate(h,l)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),h),this._autoSize(h),this._setDate(h,o),this._updateAlternate(h),this._updateDatepicker(h)),void 0)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,s,n=t.datepicker._getInst(e.target);return t.datepicker._get(n,"constrainInput")?(i=t.datepicker._possibleChars(t.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var s,n,o,r,l,h,c;s=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==s&&(t.datepicker._curInst.dpDiv.stop(!0,!0),s&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),n=t.datepicker._get(s,"beforeShow"),o=n?n.apply(e,[e,s]):{},o!==!1&&(a(s.settings,o),s.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(s),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),r=!1,t(e).parents().each(function(){return r|="fixed"===t(this).css("position"),!r}),l={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,s.dpDiv.empty(),s.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(s),l=t.datepicker._checkOffset(s,l,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:l.left+"px",top:l.top+"px"}),s.inline||(h=t.datepicker._get(s,"showAnim"),c=t.datepicker._get(s,"duration"),s.dpDiv.css("z-index",i(t(e))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[h]?s.dpDiv.show(h,t.datepicker._get(s,"showOptions"),c):s.dpDiv[h||"show"](h?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s))}},_updateDatepicker:function(e){this.maxRows=4,p=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,s=this._getNumberOfMonths(e),n=s[1],a=17,r=e.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,l=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),h=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>l&&l>n?Math.abs(i.left+n-l):0),i.top-=Math.min(i.top,i.top+o>h&&h>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,a=this._curInst;!a||e&&a!==t.data(e,"datepicker")||this._datepickerShowing&&(i=this._get(a,"showAnim"),s=this._get(a,"duration"),n=function(){t.datepicker._tidyDialog(a)},t.effects&&(t.effects.effect[i]||t.effects[i])?a.dpDiv.hide(i,t.datepicker._get(a,"showOptions"),s,n):a.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(a,"onClose"),o&&o.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).val(n))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,s){if(null==e||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,o,a,r,l=0,h=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof h?h:(new Date).getFullYear()%100+parseInt(h,10),u=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,d=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,_=-1,v=-1,b=!1,y=function(t){var i=e.length>n+1&&e.charAt(n+1)===t;return i&&n++,i},w=function(t){var e=y(t),s="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n="y"===t?s:1,o=RegExp("^\\d{"+n+","+s+"}"),a=i.substring(l).match(o);if(!a)throw"Missing number at position "+l;return l+=a[0].length,parseInt(a[0],10)},k=function(e,s,n){var o=-1,a=t.map(y(e)?n:s,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(a,function(t,e){var s=e[1];return i.substr(l,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],l+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+l},x=function(){if(i.charAt(l)!==e.charAt(n))throw"Unexpected literal at position "+l;l++};for(n=0;e.length>n;n++)if(b)"'"!==e.charAt(n)||y("'")?x():b=!1;else switch(e.charAt(n)){case"d":_=w("d");break;case"D":k("D",u,d);break;case"o":v=w("o");break;case"m":m=w("m");break;case"M":m=k("M",p,f);break;case"y":g=w("y");break;case"@":r=new Date(w("@")),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"!":r=new Date((w("!")-this._ticksTo1970)/1e4),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"'":y("'")?x():b=!0;break;default:x()}if(i.length>l&&(a=i.substr(l),!/^\s+/.test(a)))throw"Extra/unparsed characters found in date: "+a;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),v>-1)for(m=1,_=v;;){if(o=this._getDaysInMonth(g,m-1),o>=_)break;m++,_-=o}if(r=this._daylightSavingAdjust(new Date(g,m-1,_)),r.getFullYear()!==g||r.getMonth()+1!==m||r.getDate()!==_)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,l=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},h=function(t,e,i){var s=""+e;if(l(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return l(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||l("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=h("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=h("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=h("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=l("y")?e.getFullYear():(10>e.getFullYear()%100?"0":"")+e.getFullYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":l("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),l=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,h=l.exec(i);h;){switch(h[2]||"d"){case"d":case"D":r+=parseInt(h[1],10);break;case"w":case"W":r+=7*parseInt(h[1],10);break;case"m":case"M":a+=parseInt(h[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(h[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}h=l.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).on(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,l,h,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,T,I,M,P,S,N,H,A,z,O,E,W,F,L,R=new Date,Y=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),B=this._get(t,"isRTL"),j=this._get(t,"showButtonPanel"),q=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),V=this._get(t,"showCurrentAtPos"),X=this._get(t,"stepMonths"),$=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),J=this._getMinMaxDate(t,"min"),Q=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),Q)for(e=this._daylightSavingAdjust(new Date(Q.getFullYear(),Q.getMonth()-U[0]*U[1]+1,Q.getDate())),e=J&&J>e?J:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-X,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(B?"e":"w")+"'>"+i+"</span></a>":q?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(B?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+X,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(B?"w":"e")+"'>"+n+"</span></a>":q?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(B?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:Y,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,l=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",h=j?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(B?l:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(B?"":l)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),_=this._get(t,"showOtherMonths"),v=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,C=0;U[1]>C;C++){if(D=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),T=" ui-corner-all",I="",$){if(I+="<div class='ui-datepicker-group",U[1]>1)switch(C){case 0:I+=" ui-datepicker-group-first",T=" ui-corner-"+(B?"right":"left");
break;case U[1]-1:I+=" ui-datepicker-group-last",T=" ui-corner-"+(B?"left":"right");break;default:I+=" ui-datepicker-group-middle",T=""}I+="'>"}for(I+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+T+"'>"+(/all|left/.test(T)&&0===k?B?o:s:"")+(/all|right/.test(T)&&0===k?B?s:o:"")+this._generateMonthYearHeader(t,Z,te,J,Q,k>0||C>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",M=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)P=(w+c)%7,M+="<th scope='col'"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[P]+"'>"+p[P]+"</span></th>";for(I+=M+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),N=(this._getFirstDayOfMonth(te,Z)-c+7)%7,H=Math.ceil((N+S)/7),A=$?this.maxRows>H?this.maxRows:H:H,this.maxRows=A,z=this._daylightSavingAdjust(new Date(te,Z,1-N)),O=0;A>O;O++){for(I+="<tr>",E=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(z)+"</td>":"",w=0;7>w;w++)W=m?m.apply(t.input?t.input[0]:null,[z]):[!0,""],F=z.getMonth()!==Z,L=F&&!v||!W[0]||J&&J>z||Q&&z>Q,E+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!_?"":" "+W[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===Y.getTime()?" ui-datepicker-today":""))+"'"+(F&&!_||!W[2]?"":" title='"+W[2].replace(/'/g,"&#39;")+"'")+(L?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(F&&!_?"&#xa0;":L?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===Y.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);I+=E+"</tr>"}Z++,Z>11&&(Z=0,te++),I+="</tbody></table>"+($?"</div>"+(U[0]>0&&C===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=I}y+=x}return y+=h,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var l,h,c,u,d,p,f,g,m=this._get(t,"changeMonth"),_=this._get(t,"changeYear"),v=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(l=s&&s.getFullYear()===i,h=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!l||c>=s.getMonth())&&(!h||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(v||(b+=y+(!o&&m&&_?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",o||!_)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),v&&(b+=(!o&&m&&_?"":"&#xa0;")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,l=this._get(t,"yearRange");return l&&(i=l.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on("mousedown",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new s,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.12.1",t.datepicker,t.widget("ui.dialog",{version:"1.12.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||t.ui.safeBlur(t.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+t(this).css("z-index")}).get(),o=Math.max.apply(null,n);return o>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",o+1),s=!0),s&&!i&&this._trigger("focus",e),s},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=t(t.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find("[autofocus]")),t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).trigger("focus")},_keepFocus:function(e){function i(){var e=t.ui.safeActiveElement(this.document[0]),i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),void 0;if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){n.trigger("focus")}),e.preventDefault()):(this._delay(function(){s.trigger("focus")}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>"),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=t("<button type='button'></button>").button({label:t("<a>").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,"ui-dialog-title"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html("&#160;")},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>"),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this._removeClass(this.uiDialog,"ui-dialog-buttons"),void 0):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,o={icon:s.icon,iconPosition:s.iconPosition,showLabel:s.showLabel,icons:s.icons,text:s.text},delete s.click,delete s.icon,delete s.iconPosition,delete s.showLabel,delete s.icons,"boolean"==typeof s.text&&delete s.text,t("<button></button>",s).button(o).appendTo(e.uiButtonSet).on("click",function(){n.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){i._addClass(t(this),"ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){var a=o.offset.left-i.document.scrollLeft(),r=o.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" "+"top"+(r>=0?"+":"")+r,of:i.window},i._removeClass(t(this),"ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){i._addClass(t(this),"ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){var a=i.uiDialog.offset(),r=a.left-i.document.scrollLeft(),l=a.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(l>=0?"+":"")+l,of:i.window},i._removeClass(t(this),"ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,s=!1,n={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,i){var s,n,o=this.uiDialog;"disabled"!==e&&(this._super(e,i),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:t("<a>").text(""+this.options.closeText).html()}),"draggable"===e&&(s=o.is(":data(ui-draggable)"),s&&!i&&o.draggable("destroy"),!s&&i&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(n=o.is(":data(ui-resizable)"),n&&!i&&o.resizable("destroy"),n&&"string"==typeof i&&o.resizable("option","handles",i),n||i===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("<div>").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null}}}),t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=t("<div>").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),void 0)},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,e===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div>").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}}),t.widget("ui.selectmenu",[t.ui.formResetMixin,{version:"1.12.1",defaultElement:"<select>",options:{appendTo:null,classes:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"},disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=t()},_drawButton:function(){var e,i=this,s=this._parseOption(this.element.find("option:selected"),this.element[0].selectedIndex);this.labels=this.element.labels().attr("for",this.ids.button),this._on(this.labels,{click:function(t){this.button.focus(),t.preventDefault()}}),this.element.hide(),this.button=t("<span>",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true",title:this.element.attr("title")}).insertAfter(this.element),this._addClass(this.button,"ui-selectmenu-button ui-selectmenu-button-closed","ui-button ui-widget"),e=t("<span>").appendTo(this.button),this._addClass(e,"ui-selectmenu-icon","ui-icon "+this.options.icons.button),this.buttonItem=this._renderButtonItem(s).appendTo(this.button),this.options.width!==!1&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){i._rendered||i._refreshMenu()})},_drawMenu:function(){var e=this;this.menu=t("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=t("<div>").append(this.menu),this._addClass(this.menuWrap,"ui-selectmenu-menu","ui-front"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{"ui-menu":"ui-corner-bottom"},role:"listbox",select:function(t,i){t.preventDefault(),e._setSelection(),e._select(i.item.data("ui-selectmenu-item"),t)},focus:function(t,i){var s=i.item.data("ui-selectmenu-item");null!=e.focusIndex&&s.index!==e.focusIndex&&(e._trigger("focus",t,{item:s}),e.isOpen||e._select(s,t)),e.focusIndex=s.index,e.button.attr("aria-activedescendant",e.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t,e=this.element.find("option");this.menu.empty(),this._parseOptions(e),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"),this._rendered=!0,e.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(".ui-state-active"),null,"ui-state-active"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",t)))},_position:function(){this.menuWrap.position(t.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(e){var i=t("<span>");return this._setText(i,e.label),this._addClass(i,"ui-selectmenu-text"),i},_renderMenu:function(e,i){var s=this,n="";t.each(i,function(i,o){var a;o.optgroup!==n&&(a=t("<li>",{text:o.optgroup}),s._addClass(a,"ui-selectmenu-optgroup","ui-menu-divider"+(o.element.parent("optgroup").prop("disabled")?" ui-state-disabled":"")),a.appendTo(e),n=o.optgroup),s._renderItemData(e,o)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-selectmenu-item",e)},_renderItem:function(e,i){var s=t("<li>"),n=t("<div>",{title:i.element.attr("title")});return i.disabled&&this._addClass(s,null,"ui-state-disabled"),this._setText(n,i.label),s.append(n).appendTo(e)},_setText:function(t,e){e?t.text(e):t.html("&#160;")},_move:function(t,e){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),n+=":not(.ui-state-disabled)"),s="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](n).eq(-1):i[t+"All"](n).eq(0),s.length&&this.menuInstance.focus(e,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?(t=window.getSelection(),t.removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(e){this.isOpen&&(t(e.target).closest(".ui-selectmenu-menu, #"+t.ui.escapeSelector(this.ids.button)).length||this.close(e))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection(),t.rangeCount&&(this.range=t.getRangeAt(0))):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(e){var i=!0;switch(e.keyCode){case t.ui.keyCode.TAB:case t.ui.keyCode.ESCAPE:this.close(e),i=!1;break;case t.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(e);break;case t.ui.keyCode.UP:e.altKey?this._toggle(e):this._move("prev",e);break;case t.ui.keyCode.DOWN:e.altKey?this._toggle(e):this._move("next",e);break;case t.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(e):this._toggle(e);break;case t.ui.keyCode.LEFT:this._move("prev",e);break;case t.ui.keyCode.RIGHT:this._move("next",e);break;case t.ui.keyCode.HOME:case t.ui.keyCode.PAGE_UP:this._move("first",e);break;case t.ui.keyCode.END:case t.ui.keyCode.PAGE_DOWN:this._move("last",e);break;default:this.menu.trigger(e),i=!1}i&&e.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){var e=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":e,"aria-activedescendant":e}),this.menu.attr("aria-activedescendant",e)},_setOption:function(t,e){if("icons"===t){var i=this.button.find("span.ui-icon");this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)}this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;return t===!1?(this.button.css("width",""),void 0):(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(t),void 0)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(e){var i=this,s=[];e.each(function(e,n){s.push(i._parseOption(t(n),e))}),this.items=s},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),t.widget("ui.slider",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle"),o="<span tabindex='0'></span>",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e).attr("tabIndex",0)})},_createRange:function(){var e=this.options;e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=t("<div>").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),("min"===e.range||"max"===e.range)&&this._addClass(this.range,"ui-slider-range-"+e.range)):(this.range&&this.range.remove(),this.range=null)
},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,l,h,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,this._addClass(o,null,"ui-state-active"),o.trigger("focus"),l=o.offset(),h=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=h?{left:0,top:0}:{left:e.pageX-l.left-o.width()/2,top:e.pageY-l.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_uiHash:function(t,e,i){var s={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(s.value=void 0!==e?e:this.values(t),s.values=i||this.values()),s},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var s,n,o=this.value(),a=this.values();this._hasMultipleValues()&&(n=this.values(e?0:1),o=this.values(e),2===this.options.values.length&&this.options.range===!0&&(i=0===e?Math.min(n,i):Math.max(n,i)),a[e]=i),i!==o&&(s=this._trigger("slide",t,this._uiHash(e,i,a)),s!==!1&&(this._hasMultipleValues()?this.values(e,i):this.value(i)))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),void 0;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this._hasMultipleValues()?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),this._super(e,i),e){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(i),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=n-1;s>=0;s--)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step,s=Math.round((t-e)/i)*i;t=s+e,t>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,l=this,h=this._animateOff?!1:r.animate,c={};this._hasMultipleValues()?this.handles.each(function(s){i=100*((l.values(s)-l._valueMin())/(l._valueMax()-l._valueMin())),c["horizontal"===l.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[h?"animate":"css"](c,r.animate),l.options.range===!0&&("horizontal"===l.orientation?(0===s&&l.range.stop(1,1)[h?"animate":"css"]({left:i+"%"},r.animate),1===s&&l.range[h?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&l.range.stop(1,1)[h?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&l.range[h?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[h?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({width:100-i+"%"},r.animate),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({height:100-i+"%"},r.animate))},_handleEvents:{keydown:function(e){var i,s,n,o,a=t(e.target).data("ui-slider-handle-index");switch(e.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(e.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(t(e.target),null,"ui-state-active"),i=this._start(e,a),i===!1))return}switch(o=this.options.step,s=n=this._hasMultipleValues()?this.values(a):this.value(),e.keyCode){case t.ui.keyCode.HOME:n=this._valueMin();break;case t.ui.keyCode.END:n=this._valueMax();break;case t.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+o);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-o)}this._slide(e,a,n)},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),this._removeClass(t(e.target),null,"ui-state-active"))}}}),t.widget("ui.spinner",{version:"1.12.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);null!=n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var e=this.element[0]===t.ui.safeActiveElement(this.document[0]);e||(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("<span>").parent().append("<a></a><a></a>")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,s,n;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,this.element.val(this._format(i)),void 0):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(s=this.buttons.first().find(".ui-icon"),this._removeClass(s,null,this.options.icons.up),this._addClass(s,null,e.up),n=this.buttons.last().find(".ui-icon"),this._removeClass(n,null,this.options.icons.down),this._addClass(n,null,e.down)),this._super(t,e),void 0)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:r(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null===t?!1:t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:r(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:r(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:r(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:r(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(r(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),t.uiBackCompat!==!1&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return"<span>"},_buttonHtml:function(){return"<a></a><a></a>"}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),l=t(s).closest("li"),h=l.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=l.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),h&&l.data("ui-tabs-aria-controls",h),l.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,l=r?t():this._getPanelForTab(o),h=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:h,newTab:r?t():o,newPanel:l};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),h.length||l.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),l.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},l=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),l(n,e)},1)}).fail(function(t,e){setTimeout(function(){l(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs,t.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))},_removeDescribedBy:function(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=t("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=t([])},_setOption:function(e,i){var s=this;this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s.element[0],e.close(n,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is("[title]")?e.data("ui-tooltip-title",e.attr("title")).removeAttr("title"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))}),this.disabledTitles=t([])},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(e,s),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s||s.nodeType||s.jquery?this._open(e,t,s):(i=s.call(t[0],function(i){n._delay(function(){t.data("ui-tooltip-open")&&(e&&(e.type=o),this._open(e,t,i))})}),i&&this._open(e,t,i),void 0)},_open:function(e,i,s){function n(t){h.of=t,a.is(":hidden")||a.position(h)}var o,a,r,l,h=t.extend({},this.options.position);if(s){if(o=this._find(i))return o.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(e&&"mouseover"===e.type?i.attr("title",""):i.removeAttr("title")),o=this._tooltip(i),a=o.tooltip,this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),l=t("<div>").html(a.find(".ui-tooltip-content").html()),l.removeAttr("name").find("[name]").removeAttr("name"),l.removeAttr("id").find("[id]").removeAttr("id"),l.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:n}),n(e)):a.position(t.extend({of:i},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(h.of),clearInterval(r))},t.fx.interval)),this._trigger("open",e,{tooltip:a})}},_registerCloseHandlers:function(e,i){var s={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var s=t.Event(e);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&"mouseover"!==e.type||(s.mouseleave="close"),e&&"focusin"!==e.type||(s.focusout="close"),this._on(!0,i,s)},close:function(e){var i,s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);return o?(i=o.tooltip,o.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),o.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]
}),o.closing=!0,this._trigger("close",e,{tooltip:i}),o.hiding||(o.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(e){var i=t("<div>").attr("role","tooltip"),s=t("<div>").appendTo(i),n=i.uniqueId().attr("id");return this._addClass(s,"ui-tooltip-content"),this._addClass(i,"ui-tooltip","ui-widget ui-widget-content"),i.appendTo(this._appendTo(e)),this.tooltips[n]={element:e,tooltip:i}},_find:function(t){var e=t.data("ui-tooltip-id");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){var e=t.closest(".ui-front, dialog");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur"),o=s.element;n.target=n.currentTarget=o[0],e.close(n,!0),t("#"+i).remove(),o.data("ui-tooltip-title")&&(o.attr("title")||o.attr("title",o.data("ui-tooltip-title")),o.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),t.uiBackCompat!==!1&&t.widget("ui.tooltip",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip;var f="ui-effects-",g="ui-effects-style",m="ui-effects-animated",_=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=h(),n=s._rgba=[];return i=i.toLowerCase(),f(l,function(t,o){var a,r=o.re.exec(i),l=r&&o.parse(r),h=o.space||"rgba";return l?(a=s[h](l),s[c[h].cache]=a[c[h].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,l=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],h=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=h.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),h.fn=t.extend(h.prototype,{parse:function(n,a,r,l){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,l],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof h?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=h(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=h(t),n=s._space(),o=c[n],a=0===this.alpha()?h("transparent"):this,r=a[o.cache]||o.to(a._rgba),l=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],h=s[o],c=u[n.type]||{};null!==h&&(null===a?l[o]=h:(c.mod&&(h-a>c.mod/2?a+=c.mod:a-h>c.mod/2&&(a-=c.mod)),l[o]=i((h-a)*e+a,n)))}),this[n](l)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=h(e)._rgba;return h(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),h.fn.parse.prototype=h.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),l=Math.min(s,n,o),h=r-l,c=r+l,u=.5*c;return e=l===r?0:s===r?60*(n-o)/h+360:n===r?60*(o-s)/h+120:60*(s-n)/h+240,i=0===h?0:.5>=u?h/c:h/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,l=n.to,c=n.from;h.fn[s]=function(s){if(l&&!this[a]&&(this[a]=l(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=h(c(d)),n[a]=d,n):h(d)},f(o,function(e,i){h.fn[e]||(h.fn[e]=function(n){var o,a=t.type(n),l="alpha"===e?this._hsla?"hsla":"rgba":s,h=this[l](),c=h[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),h[i.idx]=n,this[l](h)))})})}),h.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=h(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(l){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(l){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=h(e.elem,i),e.end=h(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},h.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(_),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(_.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var l=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",h=l.children?a.find("*").addBack():a;h=h.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),h=h.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),h=h.map(function(){var e=this,i=t.Deferred(),s=t.extend({},l,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,h.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),l.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(m)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(f+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(f+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(g,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(g)||"",t.removeData(g)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(f+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=f+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(m),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(l)&&l.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[h](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===h:"show"===h)?(r[h](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",l=s.complete,h=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,h)||o;i.data(m,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?h?this[h](s.duration,l):this.each(function(){l&&l.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,l=o?a.scrollLeft():0,h=n.offset(),c={top:h.top-r,left:h.left-l,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-l,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var v=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},l=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),l&&l.css(t.effects.clipToBox(r)),r.clip=a),l&&l.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,l="hide"===r,h="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(h||l?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),h&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),l&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=l?2*u:u/2;l&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,l=r||"horizontal"===a,h=r||"vertical"===a;s=o.cssClip(),n.clip={top:h?(s.bottom-s.top)/2:s.top,right:l?(s.right-s.left)/2:s.right,bottom:h?(s.bottom-s.top)/2:s.bottom,left:l?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",l="up"===r||"down"===r?"top":"left",h="up"===r||"left"===r?"-=":"+=",c="+="===h?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,u[l]=h+s,a&&(n.css(u),u[l]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,l,h,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(l=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,h=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?h*_:0),top:l+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:h*_),top:l+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,l=/([0-9]+)%/.exec(r),h=!!e.horizFirst,c=h?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;l&&(r=parseInt(l[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],l=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],h=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,l,n.from.y,_),v=t.effects.setTransition(a,l,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,h,n.from.x,_),v=t.effects.setTransition(a,h,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(l=l.concat(["marginTop","marginBottom"]).concat(r),h=h.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,l,n.from.y,o),a=t.effects.setTransition(i,l,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,h,n.from.x,o),a=t.effects.setTransition(i,h,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,l=2*(e.times||5)+(r?1:0),h=e.duration/l,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);l>u;u++)s.animate({opacity:c},h,e.easing),c=1-c;s.animate({opacity:c},h,e.easing),s.queue(i),t.effects.unshift(s,d,l+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,l=2*r+1,h=Math.round(e.duration/l),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,h,e.easing);r>s;s++)n.animate(p,h,e.easing).animate(f,h,e.easing);n.animate(p,h,e.easing).animate(d,h/2,e.easing).queue(i),t.effects.unshift(n,g,l+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,l=e.direction||"left",h="up"===l||"down"===l?"top":"left",c="up"===l||"left"===l,u=e.distance||o["top"===h?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[h],d[h]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[l][1]]=d.clip[a[l][0]],"show"===r&&(o.cssClip(d.clip),o.css(h,d[h]),d.clip=s,d[h]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var v;t.uiBackCompat!==!1&&(v=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)}))});

/* ======================================== */
// Knockout JavaScript library v2.2.1
// (c) Steven Sanderson - http://knockoutjs.com/
// License: MIT (http://www.opensource.org/licenses/mit-license.php)

(function() {function j(w){throw w;}var m=!0,p=null,r=!1;function u(w){return function(){return w}};var x=window,y=document,ga=navigator,F=window.jQuery,I=void 0;
function L(w){function ha(a,d,c,e,f){var g=[];a=b.j(function(){var a=d(c,f)||[];0<g.length&&(b.a.Ya(M(g),a),e&&b.r.K(e,p,[c,a,f]));g.splice(0,g.length);b.a.P(g,a)},p,{W:a,Ka:function(){return 0==g.length||!b.a.X(g[0])}});return{M:g,j:a.pa()?a:I}}function M(a){for(;a.length&&!b.a.X(a[0]);)a.splice(0,1);if(1<a.length){for(var d=a[0],c=a[a.length-1],e=[d];d!==c;){d=d.nextSibling;if(!d)return;e.push(d)}Array.prototype.splice.apply(a,[0,a.length].concat(e))}return a}function S(a,b,c,e,f){var g=Math.min,
h=Math.max,k=[],l,n=a.length,q,s=b.length,v=s-n||1,G=n+s+1,J,A,z;for(l=0;l<=n;l++){A=J;k.push(J=[]);z=g(s,l+v);for(q=h(0,l-1);q<=z;q++)J[q]=q?l?a[l-1]===b[q-1]?A[q-1]:g(A[q]||G,J[q-1]||G)+1:q+1:l+1}g=[];h=[];v=[];l=n;for(q=s;l||q;)s=k[l][q]-1,q&&s===k[l][q-1]?h.push(g[g.length]={status:c,value:b[--q],index:q}):l&&s===k[l-1][q]?v.push(g[g.length]={status:e,value:a[--l],index:l}):(g.push({status:"retained",value:b[--q]}),--l);if(h.length&&v.length){a=10*n;var t;for(b=c=0;(f||b<a)&&(t=h[c]);c++){for(e=
0;k=v[e];e++)if(t.value===k.value){t.moved=k.index;k.moved=t.index;v.splice(e,1);b=e=0;break}b+=e}}return g.reverse()}function T(a,d,c,e,f){f=f||{};var g=a&&N(a),g=g&&g.ownerDocument,h=f.templateEngine||O;b.za.vb(c,h,g);c=h.renderTemplate(c,e,f,g);("number"!=typeof c.length||0<c.length&&"number"!=typeof c[0].nodeType)&&j(Error("Template engine must return an array of DOM nodes"));g=r;switch(d){case "replaceChildren":b.e.N(a,c);g=m;break;case "replaceNode":b.a.Ya(a,c);g=m;break;case "ignoreTargetNode":break;
default:j(Error("Unknown renderMode: "+d))}g&&(U(c,e),f.afterRender&&b.r.K(f.afterRender,p,[c,e.$data]));return c}function N(a){return a.nodeType?a:0<a.length?a[0]:p}function U(a,d){if(a.length){var c=a[0],e=a[a.length-1];V(c,e,function(a){b.Da(d,a)});V(c,e,function(a){b.s.ib(a,[d])})}}function V(a,d,c){var e;for(d=b.e.nextSibling(d);a&&(e=a)!==d;)a=b.e.nextSibling(e),(1===e.nodeType||8===e.nodeType)&&c(e)}function W(a,d,c){a=b.g.aa(a);for(var e=b.g.Q,f=0;f<a.length;f++){var g=a[f].key;if(e.hasOwnProperty(g)){var h=
e[g];"function"===typeof h?(g=h(a[f].value))&&j(Error(g)):h||j(Error("This template engine does not support the '"+g+"' binding within its templates"))}}a="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+b.g.ba(a)+" } })()})";return c.createJavaScriptEvaluatorBlock(a)+d}function X(a,d,c,e){function f(a){return function(){return k[a]}}function g(){return k}var h=0,k,l;b.j(function(){var n=c&&c instanceof b.z?c:new b.z(b.a.d(c)),q=n.$data;e&&b.eb(a,n);if(k=("function"==typeof d?
d(n,a):d)||b.J.instance.getBindings(a,n)){if(0===h){h=1;for(var s in k){var v=b.c[s];v&&8===a.nodeType&&!b.e.I[s]&&j(Error("The binding '"+s+"' cannot be used with virtual elements"));if(v&&"function"==typeof v.init&&(v=(0,v.init)(a,f(s),g,q,n))&&v.controlsDescendantBindings)l!==I&&j(Error("Multiple bindings ("+l+" and "+s+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.")),l=s}h=2}if(2===h)for(s in k)(v=b.c[s])&&"function"==
typeof v.update&&(0,v.update)(a,f(s),g,q,n)}},p,{W:a});return{Nb:l===I}}function Y(a,d,c){var e=m,f=1===d.nodeType;f&&b.e.Ta(d);if(f&&c||b.J.instance.nodeHasBindings(d))e=X(d,p,a,c).Nb;e&&Z(a,d,!f)}function Z(a,d,c){for(var e=b.e.firstChild(d);d=e;)e=b.e.nextSibling(d),Y(a,d,c)}function $(a,b){var c=aa(a,b);return c?0<c.length?c[c.length-1].nextSibling:a.nextSibling:p}function aa(a,b){for(var c=a,e=1,f=[];c=c.nextSibling;){if(H(c)&&(e--,0===e))return f;f.push(c);B(c)&&e++}b||j(Error("Cannot find closing comment tag to match: "+
a.nodeValue));return p}function H(a){return 8==a.nodeType&&(K?a.text:a.nodeValue).match(ia)}function B(a){return 8==a.nodeType&&(K?a.text:a.nodeValue).match(ja)}function P(a,b){for(var c=p;a!=c;)c=a,a=a.replace(ka,function(a,c){return b[c]});return a}function la(){var a=[],d=[];this.save=function(c,e){var f=b.a.i(a,c);0<=f?d[f]=e:(a.push(c),d.push(e))};this.get=function(c){c=b.a.i(a,c);return 0<=c?d[c]:I}}function ba(a,b,c){function e(e){var g=b(a[e]);switch(typeof g){case "boolean":case "number":case "string":case "function":f[e]=
g;break;case "object":case "undefined":var h=c.get(g);f[e]=h!==I?h:ba(g,b,c)}}c=c||new la;a=b(a);if(!("object"==typeof a&&a!==p&&a!==I&&!(a instanceof Date)))return a;var f=a instanceof Array?[]:{};c.save(a,f);var g=a;if(g instanceof Array){for(var h=0;h<g.length;h++)e(h);"function"==typeof g.toJSON&&e("toJSON")}else for(h in g)e(h);return f}function ca(a,d){if(a)if(8==a.nodeType){var c=b.s.Ua(a.nodeValue);c!=p&&d.push({sb:a,Fb:c})}else if(1==a.nodeType)for(var c=0,e=a.childNodes,f=e.length;c<f;c++)ca(e[c],
d)}function Q(a,d,c,e){b.c[a]={init:function(a){b.a.f.set(a,da,{});return{controlsDescendantBindings:m}},update:function(a,g,h,k,l){h=b.a.f.get(a,da);g=b.a.d(g());k=!c!==!g;var n=!h.Za;if(n||d||k!==h.qb)n&&(h.Za=b.a.Ia(b.e.childNodes(a),m)),k?(n||b.e.N(a,b.a.Ia(h.Za)),b.Ea(e?e(l,g):l,a)):b.e.Y(a),h.qb=k}};b.g.Q[a]=r;b.e.I[a]=m}function ea(a,d,c){c&&d!==b.k.q(a)&&b.k.T(a,d);d!==b.k.q(a)&&b.r.K(b.a.Ba,p,[a,"change"])}var b="undefined"!==typeof w?w:{};b.b=function(a,d){for(var c=a.split("."),e=b,f=0;f<
c.length-1;f++)e=e[c[f]];e[c[c.length-1]]=d};b.p=function(a,b,c){a[b]=c};b.version="2.2.1";b.b("version",b.version);b.a=new function(){function a(a,d){if("input"!==b.a.u(a)||!a.type||"click"!=d.toLowerCase())return r;var c=a.type;return"checkbox"==c||"radio"==c}var d=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,c={},e={};c[/Firefox\/2/i.test(ga.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];c.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");
for(var f in c){var g=c[f];if(g.length)for(var h=0,k=g.length;h<k;h++)e[g[h]]=f}var l={propertychange:m},n,c=3;f=y.createElement("div");for(g=f.getElementsByTagName("i");f.innerHTML="\x3c!--[if gt IE "+ ++c+"]><i></i><![endif]--\x3e",g[0];);n=4<c?c:I;return{Na:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],o:function(a,b){for(var d=0,c=a.length;d<c;d++)b(a[d])},i:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var d=0,c=a.length;d<
c;d++)if(a[d]===b)return d;return-1},lb:function(a,b,d){for(var c=0,e=a.length;c<e;c++)if(b.call(d,a[c]))return a[c];return p},ga:function(a,d){var c=b.a.i(a,d);0<=c&&a.splice(c,1)},Ga:function(a){a=a||[];for(var d=[],c=0,e=a.length;c<e;c++)0>b.a.i(d,a[c])&&d.push(a[c]);return d},V:function(a,b){a=a||[];for(var d=[],c=0,e=a.length;c<e;c++)d.push(b(a[c]));return d},fa:function(a,b){a=a||[];for(var d=[],c=0,e=a.length;c<e;c++)b(a[c])&&d.push(a[c]);return d},P:function(a,b){if(b instanceof Array)a.push.apply(a,
b);else for(var d=0,c=b.length;d<c;d++)a.push(b[d]);return a},extend:function(a,b){if(b)for(var d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);return a},ka:function(a){for(;a.firstChild;)b.removeNode(a.firstChild)},Hb:function(a){a=b.a.L(a);for(var d=y.createElement("div"),c=0,e=a.length;c<e;c++)d.appendChild(b.A(a[c]));return d},Ia:function(a,d){for(var c=0,e=a.length,g=[];c<e;c++){var f=a[c].cloneNode(m);g.push(d?b.A(f):f)}return g},N:function(a,d){b.a.ka(a);if(d)for(var c=0,e=d.length;c<e;c++)a.appendChild(d[c])},
Ya:function(a,d){var c=a.nodeType?[a]:a;if(0<c.length){for(var e=c[0],g=e.parentNode,f=0,h=d.length;f<h;f++)g.insertBefore(d[f],e);f=0;for(h=c.length;f<h;f++)b.removeNode(c[f])}},bb:function(a,b){7>n?a.setAttribute("selected",b):a.selected=b},D:function(a){return(a||"").replace(d,"")},Rb:function(a,d){for(var c=[],e=(a||"").split(d),f=0,g=e.length;f<g;f++){var h=b.a.D(e[f]);""!==h&&c.push(h)}return c},Ob:function(a,b){a=a||"";return b.length>a.length?r:a.substring(0,b.length)===b},tb:function(a,b){if(b.compareDocumentPosition)return 16==
(b.compareDocumentPosition(a)&16);for(;a!=p;){if(a==b)return m;a=a.parentNode}return r},X:function(a){return b.a.tb(a,a.ownerDocument)},u:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},n:function(b,d,c){var e=n&&l[d];if(!e&&"undefined"!=typeof F){if(a(b,d)){var f=c;c=function(a,b){var d=this.checked;b&&(this.checked=b.nb!==m);f.call(this,a);this.checked=d}}F(b).bind(d,c)}else!e&&"function"==typeof b.addEventListener?b.addEventListener(d,c,r):"undefined"!=typeof b.attachEvent?b.attachEvent("on"+
d,function(a){c.call(b,a)}):j(Error("Browser doesn't support addEventListener or attachEvent"))},Ba:function(b,d){(!b||!b.nodeType)&&j(Error("element must be a DOM node when calling triggerEvent"));if("undefined"!=typeof F){var c=[];a(b,d)&&c.push({nb:b.checked});F(b).trigger(d,c)}else"function"==typeof y.createEvent?"function"==typeof b.dispatchEvent?(c=y.createEvent(e[d]||"HTMLEvents"),c.initEvent(d,m,m,x,0,0,0,0,0,r,r,r,r,0,b),b.dispatchEvent(c)):j(Error("The supplied element doesn't support dispatchEvent")):
"undefined"!=typeof b.fireEvent?(a(b,d)&&(b.checked=b.checked!==m),b.fireEvent("on"+d)):j(Error("Browser doesn't support triggering events"))},d:function(a){return b.$(a)?a():a},ua:function(a){return b.$(a)?a.t():a},da:function(a,d,c){if(d){var e=/[\w-]+/g,f=a.className.match(e)||[];b.a.o(d.match(e),function(a){var d=b.a.i(f,a);0<=d?c||f.splice(d,1):c&&f.push(a)});a.className=f.join(" ")}},cb:function(a,d){var c=b.a.d(d);if(c===p||c===I)c="";if(3===a.nodeType)a.data=c;else{var e=b.e.firstChild(a);
!e||3!=e.nodeType||b.e.nextSibling(e)?b.e.N(a,[y.createTextNode(c)]):e.data=c;b.a.wb(a)}},ab:function(a,b){a.name=b;if(7>=n)try{a.mergeAttributes(y.createElement("<input name='"+a.name+"'/>"),r)}catch(d){}},wb:function(a){9<=n&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},ub:function(a){if(9<=n){var b=a.style.width;a.style.width=0;a.style.width=b}},Lb:function(a,d){a=b.a.d(a);d=b.a.d(d);for(var c=[],e=a;e<=d;e++)c.push(e);return c},L:function(a){for(var b=[],d=0,c=a.length;d<
c;d++)b.push(a[d]);return b},Pb:6===n,Qb:7===n,Z:n,Oa:function(a,d){for(var c=b.a.L(a.getElementsByTagName("input")).concat(b.a.L(a.getElementsByTagName("textarea"))),e="string"==typeof d?function(a){return a.name===d}:function(a){return d.test(a.name)},f=[],g=c.length-1;0<=g;g--)e(c[g])&&f.push(c[g]);return f},Ib:function(a){return"string"==typeof a&&(a=b.a.D(a))?x.JSON&&x.JSON.parse?x.JSON.parse(a):(new Function("return "+a))():p},xa:function(a,d,c){("undefined"==typeof JSON||"undefined"==typeof JSON.stringify)&&
j(Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js"));return JSON.stringify(b.a.d(a),d,c)},Jb:function(a,d,c){c=c||{};var e=c.params||{},f=c.includeFields||this.Na,g=a;if("object"==typeof a&&"form"===b.a.u(a))for(var g=a.action,h=f.length-1;0<=h;h--)for(var k=b.a.Oa(a,f[h]),l=k.length-1;0<=l;l--)e[k[l].name]=k[l].value;d=b.a.d(d);var n=y.createElement("form");
n.style.display="none";n.action=g;n.method="post";for(var w in d)a=y.createElement("input"),a.name=w,a.value=b.a.xa(b.a.d(d[w])),n.appendChild(a);for(w in e)a=y.createElement("input"),a.name=w,a.value=e[w],n.appendChild(a);y.body.appendChild(n);c.submitter?c.submitter(n):n.submit();setTimeout(function(){n.parentNode.removeChild(n)},0)}}};b.b("utils",b.a);b.b("utils.arrayForEach",b.a.o);b.b("utils.arrayFirst",b.a.lb);b.b("utils.arrayFilter",b.a.fa);b.b("utils.arrayGetDistinctValues",b.a.Ga);b.b("utils.arrayIndexOf",
b.a.i);b.b("utils.arrayMap",b.a.V);b.b("utils.arrayPushAll",b.a.P);b.b("utils.arrayRemoveItem",b.a.ga);b.b("utils.extend",b.a.extend);b.b("utils.fieldsIncludedWithJsonPost",b.a.Na);b.b("utils.getFormFields",b.a.Oa);b.b("utils.peekObservable",b.a.ua);b.b("utils.postJson",b.a.Jb);b.b("utils.parseJson",b.a.Ib);b.b("utils.registerEventHandler",b.a.n);b.b("utils.stringifyJson",b.a.xa);b.b("utils.range",b.a.Lb);b.b("utils.toggleDomNodeCssClass",b.a.da);b.b("utils.triggerEvent",b.a.Ba);b.b("utils.unwrapObservable",
b.a.d);Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments);a=c.shift();return function(){return b.apply(a,c.concat(Array.prototype.slice.call(arguments)))}});b.a.f=new function(){var a=0,d="__ko__"+(new Date).getTime(),c={};return{get:function(a,d){var c=b.a.f.la(a,r);return c===I?I:c[d]},set:function(a,d,c){c===I&&b.a.f.la(a,r)===I||(b.a.f.la(a,m)[d]=c)},la:function(b,f){var g=b[d];if(!g||!("null"!==g&&c[g])){if(!f)return I;g=b[d]="ko"+
a++;c[g]={}}return c[g]},clear:function(a){var b=a[d];return b?(delete c[b],a[d]=p,m):r}}};b.b("utils.domData",b.a.f);b.b("utils.domData.clear",b.a.f.clear);b.a.F=new function(){function a(a,d){var e=b.a.f.get(a,c);e===I&&d&&(e=[],b.a.f.set(a,c,e));return e}function d(c){var e=a(c,r);if(e)for(var e=e.slice(0),k=0;k<e.length;k++)e[k](c);b.a.f.clear(c);"function"==typeof F&&"function"==typeof F.cleanData&&F.cleanData([c]);if(f[c.nodeType])for(e=c.firstChild;c=e;)e=c.nextSibling,8===c.nodeType&&d(c)}
var c="__ko_domNodeDisposal__"+(new Date).getTime(),e={1:m,8:m,9:m},f={1:m,9:m};return{Ca:function(b,d){"function"!=typeof d&&j(Error("Callback must be a function"));a(b,m).push(d)},Xa:function(d,e){var f=a(d,r);f&&(b.a.ga(f,e),0==f.length&&b.a.f.set(d,c,I))},A:function(a){if(e[a.nodeType]&&(d(a),f[a.nodeType])){var c=[];b.a.P(c,a.getElementsByTagName("*"));for(var k=0,l=c.length;k<l;k++)d(c[k])}return a},removeNode:function(a){b.A(a);a.parentNode&&a.parentNode.removeChild(a)}}};b.A=b.a.F.A;b.removeNode=
b.a.F.removeNode;b.b("cleanNode",b.A);b.b("removeNode",b.removeNode);b.b("utils.domNodeDisposal",b.a.F);b.b("utils.domNodeDisposal.addDisposeCallback",b.a.F.Ca);b.b("utils.domNodeDisposal.removeDisposeCallback",b.a.F.Xa);b.a.ta=function(a){var d;if("undefined"!=typeof F)if(F.parseHTML)d=F.parseHTML(a);else{if((d=F.clean([a]))&&d[0]){for(a=d[0];a.parentNode&&11!==a.parentNode.nodeType;)a=a.parentNode;a.parentNode&&a.parentNode.removeChild(a)}}else{var c=b.a.D(a).toLowerCase();d=y.createElement("div");
c=c.match(/^<(thead|tbody|tfoot)/)&&[1,"<table>","</table>"]||!c.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!c.indexOf("<td")||!c.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||[0,"",""];a="ignored<div>"+c[1]+a+c[2]+"</div>";for("function"==typeof x.innerShiv?d.appendChild(x.innerShiv(a)):d.innerHTML=a;c[0]--;)d=d.lastChild;d=b.a.L(d.lastChild.childNodes)}return d};b.a.ca=function(a,d){b.a.ka(a);d=b.a.d(d);if(d!==p&&d!==I)if("string"!=typeof d&&(d=d.toString()),
"undefined"!=typeof F)F(a).html(d);else for(var c=b.a.ta(d),e=0;e<c.length;e++)a.appendChild(c[e])};b.b("utils.parseHtmlFragment",b.a.ta);b.b("utils.setHtml",b.a.ca);var R={};b.s={ra:function(a){"function"!=typeof a&&j(Error("You can only pass a function to ko.memoization.memoize()"));var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);R[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},hb:function(a,b){var c=R[a];c===I&&j(Error("Couldn't find any memo with ID "+
a+". Perhaps it's already been unmemoized."));try{return c.apply(p,b||[]),m}finally{delete R[a]}},ib:function(a,d){var c=[];ca(a,c);for(var e=0,f=c.length;e<f;e++){var g=c[e].sb,h=[g];d&&b.a.P(h,d);b.s.hb(c[e].Fb,h);g.nodeValue="";g.parentNode&&g.parentNode.removeChild(g)}},Ua:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:p}};b.b("memoization",b.s);b.b("memoization.memoize",b.s.ra);b.b("memoization.unmemoize",b.s.hb);b.b("memoization.parseMemoText",b.s.Ua);b.b("memoization.unmemoizeDomNodeAndDescendants",
b.s.ib);b.Ma={throttle:function(a,d){a.throttleEvaluation=d;var c=p;return b.j({read:a,write:function(b){clearTimeout(c);c=setTimeout(function(){a(b)},d)}})},notify:function(a,d){a.equalityComparer="always"==d?u(r):b.m.fn.equalityComparer;return a}};b.b("extenders",b.Ma);b.fb=function(a,d,c){this.target=a;this.ha=d;this.rb=c;b.p(this,"dispose",this.B)};b.fb.prototype.B=function(){this.Cb=m;this.rb()};b.S=function(){this.w={};b.a.extend(this,b.S.fn);b.p(this,"subscribe",this.ya);b.p(this,"extend",
this.extend);b.p(this,"getSubscriptionsCount",this.yb)};b.S.fn={ya:function(a,d,c){c=c||"change";var e=new b.fb(this,d?a.bind(d):a,function(){b.a.ga(this.w[c],e)}.bind(this));this.w[c]||(this.w[c]=[]);this.w[c].push(e);return e},notifySubscribers:function(a,d){d=d||"change";this.w[d]&&b.r.K(function(){b.a.o(this.w[d].slice(0),function(b){b&&b.Cb!==m&&b.ha(a)})},this)},yb:function(){var a=0,b;for(b in this.w)this.w.hasOwnProperty(b)&&(a+=this.w[b].length);return a},extend:function(a){var d=this;if(a)for(var c in a){var e=
b.Ma[c];"function"==typeof e&&(d=e(d,a[c]))}return d}};b.Qa=function(a){return"function"==typeof a.ya&&"function"==typeof a.notifySubscribers};b.b("subscribable",b.S);b.b("isSubscribable",b.Qa);var C=[];b.r={mb:function(a){C.push({ha:a,La:[]})},end:function(){C.pop()},Wa:function(a){b.Qa(a)||j(Error("Only subscribable things can act as dependencies"));if(0<C.length){var d=C[C.length-1];d&&!(0<=b.a.i(d.La,a))&&(d.La.push(a),d.ha(a))}},K:function(a,b,c){try{return C.push(p),a.apply(b,c||[])}finally{C.pop()}}};
var ma={undefined:m,"boolean":m,number:m,string:m};b.m=function(a){function d(){if(0<arguments.length){if(!d.equalityComparer||!d.equalityComparer(c,arguments[0]))d.H(),c=arguments[0],d.G();return this}b.r.Wa(d);return c}var c=a;b.S.call(d);d.t=function(){return c};d.G=function(){d.notifySubscribers(c)};d.H=function(){d.notifySubscribers(c,"beforeChange")};b.a.extend(d,b.m.fn);b.p(d,"peek",d.t);b.p(d,"valueHasMutated",d.G);b.p(d,"valueWillMutate",d.H);return d};b.m.fn={equalityComparer:function(a,
b){return a===p||typeof a in ma?a===b:r}};var E=b.m.Kb="__ko_proto__";b.m.fn[E]=b.m;b.ma=function(a,d){return a===p||a===I||a[E]===I?r:a[E]===d?m:b.ma(a[E],d)};b.$=function(a){return b.ma(a,b.m)};b.Ra=function(a){return"function"==typeof a&&a[E]===b.m||"function"==typeof a&&a[E]===b.j&&a.zb?m:r};b.b("observable",b.m);b.b("isObservable",b.$);b.b("isWriteableObservable",b.Ra);b.R=function(a){0==arguments.length&&(a=[]);a!==p&&(a!==I&&!("length"in a))&&j(Error("The argument passed when initializing an observable array must be an array, or null, or undefined."));
var d=b.m(a);b.a.extend(d,b.R.fn);return d};b.R.fn={remove:function(a){for(var b=this.t(),c=[],e="function"==typeof a?a:function(b){return b===a},f=0;f<b.length;f++){var g=b[f];e(g)&&(0===c.length&&this.H(),c.push(g),b.splice(f,1),f--)}c.length&&this.G();return c},removeAll:function(a){if(a===I){var d=this.t(),c=d.slice(0);this.H();d.splice(0,d.length);this.G();return c}return!a?[]:this.remove(function(d){return 0<=b.a.i(a,d)})},destroy:function(a){var b=this.t(),c="function"==typeof a?a:function(b){return b===
a};this.H();for(var e=b.length-1;0<=e;e--)c(b[e])&&(b[e]._destroy=m);this.G()},destroyAll:function(a){return a===I?this.destroy(u(m)):!a?[]:this.destroy(function(d){return 0<=b.a.i(a,d)})},indexOf:function(a){var d=this();return b.a.i(d,a)},replace:function(a,b){var c=this.indexOf(a);0<=c&&(this.H(),this.t()[c]=b,this.G())}};b.a.o("pop push reverse shift sort splice unshift".split(" "),function(a){b.R.fn[a]=function(){var b=this.t();this.H();b=b[a].apply(b,arguments);this.G();return b}});b.a.o(["slice"],
function(a){b.R.fn[a]=function(){var b=this();return b[a].apply(b,arguments)}});b.b("observableArray",b.R);b.j=function(a,d,c){function e(){b.a.o(z,function(a){a.B()});z=[]}function f(){var a=h.throttleEvaluation;a&&0<=a?(clearTimeout(t),t=setTimeout(g,a)):g()}function g(){if(!q)if(n&&w())A();else{q=m;try{var a=b.a.V(z,function(a){return a.target});b.r.mb(function(c){var d;0<=(d=b.a.i(a,c))?a[d]=I:z.push(c.ya(f))});for(var c=s.call(d),e=a.length-1;0<=e;e--)a[e]&&z.splice(e,1)[0].B();n=m;h.notifySubscribers(l,
"beforeChange");l=c}finally{b.r.end()}h.notifySubscribers(l);q=r;z.length||A()}}function h(){if(0<arguments.length)return"function"===typeof v?v.apply(d,arguments):j(Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.")),this;n||g();b.r.Wa(h);return l}function k(){return!n||0<z.length}var l,n=r,q=r,s=a;s&&"object"==typeof s?(c=s,s=c.read):(c=c||{},s||(s=c.read));"function"!=typeof s&&j(Error("Pass a function that returns the value of the ko.computed"));
var v=c.write,G=c.disposeWhenNodeIsRemoved||c.W||p,w=c.disposeWhen||c.Ka||u(r),A=e,z=[],t=p;d||(d=c.owner);h.t=function(){n||g();return l};h.xb=function(){return z.length};h.zb="function"===typeof c.write;h.B=function(){A()};h.pa=k;b.S.call(h);b.a.extend(h,b.j.fn);b.p(h,"peek",h.t);b.p(h,"dispose",h.B);b.p(h,"isActive",h.pa);b.p(h,"getDependenciesCount",h.xb);c.deferEvaluation!==m&&g();if(G&&k()){A=function(){b.a.F.Xa(G,arguments.callee);e()};b.a.F.Ca(G,A);var D=w,w=function(){return!b.a.X(G)||D()}}return h};
b.Bb=function(a){return b.ma(a,b.j)};w=b.m.Kb;b.j[w]=b.m;b.j.fn={};b.j.fn[w]=b.j;b.b("dependentObservable",b.j);b.b("computed",b.j);b.b("isComputed",b.Bb);b.gb=function(a){0==arguments.length&&j(Error("When calling ko.toJS, pass the object you want to convert."));return ba(a,function(a){for(var c=0;b.$(a)&&10>c;c++)a=a();return a})};b.toJSON=function(a,d,c){a=b.gb(a);return b.a.xa(a,d,c)};b.b("toJS",b.gb);b.b("toJSON",b.toJSON);b.k={q:function(a){switch(b.a.u(a)){case "option":return a.__ko__hasDomDataOptionValue__===
m?b.a.f.get(a,b.c.options.sa):7>=b.a.Z?a.getAttributeNode("value").specified?a.value:a.text:a.value;case "select":return 0<=a.selectedIndex?b.k.q(a.options[a.selectedIndex]):I;default:return a.value}},T:function(a,d){switch(b.a.u(a)){case "option":switch(typeof d){case "string":b.a.f.set(a,b.c.options.sa,I);"__ko__hasDomDataOptionValue__"in a&&delete a.__ko__hasDomDataOptionValue__;a.value=d;break;default:b.a.f.set(a,b.c.options.sa,d),a.__ko__hasDomDataOptionValue__=m,a.value="number"===typeof d?
d:""}break;case "select":for(var c=a.options.length-1;0<=c;c--)if(b.k.q(a.options[c])==d){a.selectedIndex=c;break}break;default:if(d===p||d===I)d="";a.value=d}}};b.b("selectExtensions",b.k);b.b("selectExtensions.readValue",b.k.q);b.b("selectExtensions.writeValue",b.k.T);var ka=/\@ko_token_(\d+)\@/g,na=["true","false"],oa=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i;b.g={Q:[],aa:function(a){var d=b.a.D(a);if(3>d.length)return[];"{"===d.charAt(0)&&(d=d.substring(1,d.length-1));a=[];for(var c=
p,e,f=0;f<d.length;f++){var g=d.charAt(f);if(c===p)switch(g){case '"':case "'":case "/":c=f,e=g}else if(g==e&&"\\"!==d.charAt(f-1)){g=d.substring(c,f+1);a.push(g);var h="@ko_token_"+(a.length-1)+"@",d=d.substring(0,c)+h+d.substring(f+1),f=f-(g.length-h.length),c=p}}e=c=p;for(var k=0,l=p,f=0;f<d.length;f++){g=d.charAt(f);if(c===p)switch(g){case "{":c=f;l=g;e="}";break;case "(":c=f;l=g;e=")";break;case "[":c=f,l=g,e="]"}g===l?k++:g===e&&(k--,0===k&&(g=d.substring(c,f+1),a.push(g),h="@ko_token_"+(a.length-
1)+"@",d=d.substring(0,c)+h+d.substring(f+1),f-=g.length-h.length,c=p))}e=[];d=d.split(",");c=0;for(f=d.length;c<f;c++)k=d[c],l=k.indexOf(":"),0<l&&l<k.length-1?(g=k.substring(l+1),e.push({key:P(k.substring(0,l),a),value:P(g,a)})):e.push({unknown:P(k,a)});return e},ba:function(a){var d="string"===typeof a?b.g.aa(a):a,c=[];a=[];for(var e,f=0;e=d[f];f++)if(0<c.length&&c.push(","),e.key){var g;a:{g=e.key;var h=b.a.D(g);switch(h.length&&h.charAt(0)){case "'":case '"':break a;default:g="'"+h+"'"}}e=e.value;
c.push(g);c.push(":");c.push(e);e=b.a.D(e);0<=b.a.i(na,b.a.D(e).toLowerCase())?e=r:(h=e.match(oa),e=h===p?r:h[1]?"Object("+h[1]+")"+h[2]:e);e&&(0<a.length&&a.push(", "),a.push(g+" : function(__ko_value) { "+e+" = __ko_value; }"))}else e.unknown&&c.push(e.unknown);d=c.join("");0<a.length&&(d=d+", '_ko_property_writers' : { "+a.join("")+" } ");return d},Eb:function(a,d){for(var c=0;c<a.length;c++)if(b.a.D(a[c].key)==d)return m;return r},ea:function(a,d,c,e,f){if(!a||!b.Ra(a)){if((a=d()._ko_property_writers)&&
a[c])a[c](e)}else(!f||a.t()!==e)&&a(e)}};b.b("expressionRewriting",b.g);b.b("expressionRewriting.bindingRewriteValidators",b.g.Q);b.b("expressionRewriting.parseObjectLiteral",b.g.aa);b.b("expressionRewriting.preProcessBindings",b.g.ba);b.b("jsonExpressionRewriting",b.g);b.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",b.g.ba);var K="\x3c!--test--\x3e"===y.createComment("test").text,ja=K?/^\x3c!--\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*--\x3e$/:/^\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*$/,ia=K?/^\x3c!--\s*\/ko\s*--\x3e$/:
/^\s*\/ko\s*$/,pa={ul:m,ol:m};b.e={I:{},childNodes:function(a){return B(a)?aa(a):a.childNodes},Y:function(a){if(B(a)){a=b.e.childNodes(a);for(var d=0,c=a.length;d<c;d++)b.removeNode(a[d])}else b.a.ka(a)},N:function(a,d){if(B(a)){b.e.Y(a);for(var c=a.nextSibling,e=0,f=d.length;e<f;e++)c.parentNode.insertBefore(d[e],c)}else b.a.N(a,d)},Va:function(a,b){B(a)?a.parentNode.insertBefore(b,a.nextSibling):a.firstChild?a.insertBefore(b,a.firstChild):a.appendChild(b)},Pa:function(a,d,c){c?B(a)?a.parentNode.insertBefore(d,
c.nextSibling):c.nextSibling?a.insertBefore(d,c.nextSibling):a.appendChild(d):b.e.Va(a,d)},firstChild:function(a){return!B(a)?a.firstChild:!a.nextSibling||H(a.nextSibling)?p:a.nextSibling},nextSibling:function(a){B(a)&&(a=$(a));return a.nextSibling&&H(a.nextSibling)?p:a.nextSibling},jb:function(a){return(a=B(a))?a[1]:p},Ta:function(a){if(pa[b.a.u(a)]){var d=a.firstChild;if(d){do if(1===d.nodeType){var c;c=d.firstChild;var e=p;if(c){do if(e)e.push(c);else if(B(c)){var f=$(c,m);f?c=f:e=[c]}else H(c)&&
(e=[c]);while(c=c.nextSibling)}if(c=e){e=d.nextSibling;for(f=0;f<c.length;f++)e?a.insertBefore(c[f],e):a.appendChild(c[f])}}while(d=d.nextSibling)}}}};b.b("virtualElements",b.e);b.b("virtualElements.allowedBindings",b.e.I);b.b("virtualElements.emptyNode",b.e.Y);b.b("virtualElements.insertAfter",b.e.Pa);b.b("virtualElements.prepend",b.e.Va);b.b("virtualElements.setDomNodeChildren",b.e.N);b.J=function(){this.Ha={}};b.a.extend(b.J.prototype,{nodeHasBindings:function(a){switch(a.nodeType){case 1:return a.getAttribute("data-bind")!=
p;case 8:return b.e.jb(a)!=p;default:return r}},getBindings:function(a,b){var c=this.getBindingsString(a,b);return c?this.parseBindingsString(c,b,a):p},getBindingsString:function(a){switch(a.nodeType){case 1:return a.getAttribute("data-bind");case 8:return b.e.jb(a);default:return p}},parseBindingsString:function(a,d,c){try{var e;if(!(e=this.Ha[a])){var f=this.Ha,g,h="with($context){with($data||{}){return{"+b.g.ba(a)+"}}}";g=new Function("$context","$element",h);e=f[a]=g}return e(d,c)}catch(k){j(Error("Unable to parse bindings.\nMessage: "+
k+";\nBindings value: "+a))}}});b.J.instance=new b.J;b.b("bindingProvider",b.J);b.c={};b.z=function(a,d,c){d?(b.a.extend(this,d),this.$parentContext=d,this.$parent=d.$data,this.$parents=(d.$parents||[]).slice(0),this.$parents.unshift(this.$parent)):(this.$parents=[],this.$root=a,this.ko=b);this.$data=a;c&&(this[c]=a)};b.z.prototype.createChildContext=function(a,d){return new b.z(a,this,d)};b.z.prototype.extend=function(a){var d=b.a.extend(new b.z,this);return b.a.extend(d,a)};b.eb=function(a,d){if(2==
arguments.length)b.a.f.set(a,"__ko_bindingContext__",d);else return b.a.f.get(a,"__ko_bindingContext__")};b.Fa=function(a,d,c){1===a.nodeType&&b.e.Ta(a);return X(a,d,c,m)};b.Ea=function(a,b){(1===b.nodeType||8===b.nodeType)&&Z(a,b,m)};b.Da=function(a,b){b&&(1!==b.nodeType&&8!==b.nodeType)&&j(Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node"));b=b||x.document.body;Y(a,b,m)};b.ja=function(a){switch(a.nodeType){case 1:case 8:var d=b.eb(a);if(d)return d;
if(a.parentNode)return b.ja(a.parentNode)}return I};b.pb=function(a){return(a=b.ja(a))?a.$data:I};b.b("bindingHandlers",b.c);b.b("applyBindings",b.Da);b.b("applyBindingsToDescendants",b.Ea);b.b("applyBindingsToNode",b.Fa);b.b("contextFor",b.ja);b.b("dataFor",b.pb);var fa={"class":"className","for":"htmlFor"};b.c.attr={update:function(a,d){var c=b.a.d(d())||{},e;for(e in c)if("string"==typeof e){var f=b.a.d(c[e]),g=f===r||f===p||f===I;g&&a.removeAttribute(e);8>=b.a.Z&&e in fa?(e=fa[e],g?a.removeAttribute(e):
a[e]=f):g||a.setAttribute(e,f.toString());"name"===e&&b.a.ab(a,g?"":f.toString())}}};b.c.checked={init:function(a,d,c){b.a.n(a,"click",function(){var e;if("checkbox"==a.type)e=a.checked;else if("radio"==a.type&&a.checked)e=a.value;else return;var f=d(),g=b.a.d(f);"checkbox"==a.type&&g instanceof Array?(e=b.a.i(g,a.value),a.checked&&0>e?f.push(a.value):!a.checked&&0<=e&&f.splice(e,1)):b.g.ea(f,c,"checked",e,m)});"radio"==a.type&&!a.name&&b.c.uniqueName.init(a,u(m))},update:function(a,d){var c=b.a.d(d());
"checkbox"==a.type?a.checked=c instanceof Array?0<=b.a.i(c,a.value):c:"radio"==a.type&&(a.checked=a.value==c)}};b.c.css={update:function(a,d){var c=b.a.d(d());if("object"==typeof c)for(var e in c){var f=b.a.d(c[e]);b.a.da(a,e,f)}else c=String(c||""),b.a.da(a,a.__ko__cssValue,r),a.__ko__cssValue=c,b.a.da(a,c,m)}};b.c.enable={update:function(a,d){var c=b.a.d(d());c&&a.disabled?a.removeAttribute("disabled"):!c&&!a.disabled&&(a.disabled=m)}};b.c.disable={update:function(a,d){b.c.enable.update(a,function(){return!b.a.d(d())})}};
b.c.event={init:function(a,d,c,e){var f=d()||{},g;for(g in f)(function(){var f=g;"string"==typeof f&&b.a.n(a,f,function(a){var g,n=d()[f];if(n){var q=c();try{var s=b.a.L(arguments);s.unshift(e);g=n.apply(e,s)}finally{g!==m&&(a.preventDefault?a.preventDefault():a.returnValue=r)}q[f+"Bubble"]===r&&(a.cancelBubble=m,a.stopPropagation&&a.stopPropagation())}})})()}};b.c.foreach={Sa:function(a){return function(){var d=a(),c=b.a.ua(d);if(!c||"number"==typeof c.length)return{foreach:d,templateEngine:b.C.oa};
b.a.d(d);return{foreach:c.data,as:c.as,includeDestroyed:c.includeDestroyed,afterAdd:c.afterAdd,beforeRemove:c.beforeRemove,afterRender:c.afterRender,beforeMove:c.beforeMove,afterMove:c.afterMove,templateEngine:b.C.oa}}},init:function(a,d){return b.c.template.init(a,b.c.foreach.Sa(d))},update:function(a,d,c,e,f){return b.c.template.update(a,b.c.foreach.Sa(d),c,e,f)}};b.g.Q.foreach=r;b.e.I.foreach=m;b.c.hasfocus={init:function(a,d,c){function e(e){a.__ko_hasfocusUpdating=m;var f=a.ownerDocument;"activeElement"in
f&&(e=f.activeElement===a);f=d();b.g.ea(f,c,"hasfocus",e,m);a.__ko_hasfocusUpdating=r}var f=e.bind(p,m),g=e.bind(p,r);b.a.n(a,"focus",f);b.a.n(a,"focusin",f);b.a.n(a,"blur",g);b.a.n(a,"focusout",g)},update:function(a,d){var c=b.a.d(d());a.__ko_hasfocusUpdating||(c?a.focus():a.blur(),b.r.K(b.a.Ba,p,[a,c?"focusin":"focusout"]))}};b.c.html={init:function(){return{controlsDescendantBindings:m}},update:function(a,d){b.a.ca(a,d())}};var da="__ko_withIfBindingData";Q("if");Q("ifnot",r,m);Q("with",m,r,function(a,
b){return a.createChildContext(b)});b.c.options={update:function(a,d,c){"select"!==b.a.u(a)&&j(Error("options binding applies only to SELECT elements"));for(var e=0==a.length,f=b.a.V(b.a.fa(a.childNodes,function(a){return a.tagName&&"option"===b.a.u(a)&&a.selected}),function(a){return b.k.q(a)||a.innerText||a.textContent}),g=a.scrollTop,h=b.a.d(d());0<a.length;)b.A(a.options[0]),a.remove(0);if(h){c=c();var k=c.optionsIncludeDestroyed;"number"!=typeof h.length&&(h=[h]);if(c.optionsCaption){var l=y.createElement("option");
b.a.ca(l,c.optionsCaption);b.k.T(l,I);a.appendChild(l)}d=0;for(var n=h.length;d<n;d++){var q=h[d];if(!q||!q._destroy||k){var l=y.createElement("option"),s=function(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c},v=s(q,c.optionsValue,q);b.k.T(l,b.a.d(v));q=s(q,c.optionsText,v);b.a.cb(l,q);a.appendChild(l)}}h=a.getElementsByTagName("option");d=k=0;for(n=h.length;d<n;d++)0<=b.a.i(f,b.k.q(h[d]))&&(b.a.bb(h[d],m),k++);a.scrollTop=g;e&&"value"in c&&ea(a,b.a.ua(c.value),m);b.a.ub(a)}}};
b.c.options.sa="__ko.optionValueDomData__";b.c.selectedOptions={init:function(a,d,c){b.a.n(a,"change",function(){var e=d(),f=[];b.a.o(a.getElementsByTagName("option"),function(a){a.selected&&f.push(b.k.q(a))});b.g.ea(e,c,"value",f)})},update:function(a,d){"select"!=b.a.u(a)&&j(Error("values binding applies only to SELECT elements"));var c=b.a.d(d());c&&"number"==typeof c.length&&b.a.o(a.getElementsByTagName("option"),function(a){var d=0<=b.a.i(c,b.k.q(a));b.a.bb(a,d)})}};b.c.style={update:function(a,
d){var c=b.a.d(d()||{}),e;for(e in c)if("string"==typeof e){var f=b.a.d(c[e]);a.style[e]=f||""}}};b.c.submit={init:function(a,d,c,e){"function"!=typeof d()&&j(Error("The value for a submit binding must be a function"));b.a.n(a,"submit",function(b){var c,h=d();try{c=h.call(e,a)}finally{c!==m&&(b.preventDefault?b.preventDefault():b.returnValue=r)}})}};b.c.text={update:function(a,d){b.a.cb(a,d())}};b.e.I.text=m;b.c.uniqueName={init:function(a,d){if(d()){var c="ko_unique_"+ ++b.c.uniqueName.ob;b.a.ab(a,
c)}}};b.c.uniqueName.ob=0;b.c.value={init:function(a,d,c){function e(){h=r;var e=d(),f=b.k.q(a);b.g.ea(e,c,"value",f)}var f=["change"],g=c().valueUpdate,h=r;g&&("string"==typeof g&&(g=[g]),b.a.P(f,g),f=b.a.Ga(f));if(b.a.Z&&("input"==a.tagName.toLowerCase()&&"text"==a.type&&"off"!=a.autocomplete&&(!a.form||"off"!=a.form.autocomplete))&&-1==b.a.i(f,"propertychange"))b.a.n(a,"propertychange",function(){h=m}),b.a.n(a,"blur",function(){h&&e()});b.a.o(f,function(c){var d=e;b.a.Ob(c,"after")&&(d=function(){setTimeout(e,
0)},c=c.substring(5));b.a.n(a,c,d)})},update:function(a,d){var c="select"===b.a.u(a),e=b.a.d(d()),f=b.k.q(a),g=e!=f;0===e&&(0!==f&&"0"!==f)&&(g=m);g&&(f=function(){b.k.T(a,e)},f(),c&&setTimeout(f,0));c&&0<a.length&&ea(a,e,r)}};b.c.visible={update:function(a,d){var c=b.a.d(d()),e="none"!=a.style.display;c&&!e?a.style.display="":!c&&e&&(a.style.display="none")}};b.c.click={init:function(a,d,c,e){return b.c.event.init.call(this,a,function(){var a={};a.click=d();return a},c,e)}};b.v=function(){};b.v.prototype.renderTemplateSource=
function(){j(Error("Override renderTemplateSource"))};b.v.prototype.createJavaScriptEvaluatorBlock=function(){j(Error("Override createJavaScriptEvaluatorBlock"))};b.v.prototype.makeTemplateSource=function(a,d){if("string"==typeof a){d=d||y;var c=d.getElementById(a);c||j(Error("Cannot find template with ID "+a));return new b.l.h(c)}if(1==a.nodeType||8==a.nodeType)return new b.l.O(a);j(Error("Unknown template type: "+a))};b.v.prototype.renderTemplate=function(a,b,c,e){a=this.makeTemplateSource(a,e);
return this.renderTemplateSource(a,b,c)};b.v.prototype.isTemplateRewritten=function(a,b){return this.allowTemplateRewriting===r?m:this.makeTemplateSource(a,b).data("isRewritten")};b.v.prototype.rewriteTemplate=function(a,b,c){a=this.makeTemplateSource(a,c);b=b(a.text());a.text(b);a.data("isRewritten",m)};b.b("templateEngine",b.v);var qa=/(<[a-z]+\d*(\s+(?!data-bind=)[a-z0-9\-]+(=(\"[^\"]*\"|\'[^\']*\'))?)*\s+)data-bind=(["'])([\s\S]*?)\5/gi,ra=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;b.za={vb:function(a,
d,c){d.isTemplateRewritten(a,c)||d.rewriteTemplate(a,function(a){return b.za.Gb(a,d)},c)},Gb:function(a,b){return a.replace(qa,function(a,e,f,g,h,k,l){return W(l,e,b)}).replace(ra,function(a,e){return W(e,"\x3c!-- ko --\x3e",b)})},kb:function(a){return b.s.ra(function(d,c){d.nextSibling&&b.Fa(d.nextSibling,a,c)})}};b.b("__tr_ambtns",b.za.kb);b.l={};b.l.h=function(a){this.h=a};b.l.h.prototype.text=function(){var a=b.a.u(this.h),a="script"===a?"text":"textarea"===a?"value":"innerHTML";if(0==arguments.length)return this.h[a];
var d=arguments[0];"innerHTML"===a?b.a.ca(this.h,d):this.h[a]=d};b.l.h.prototype.data=function(a){if(1===arguments.length)return b.a.f.get(this.h,"templateSourceData_"+a);b.a.f.set(this.h,"templateSourceData_"+a,arguments[1])};b.l.O=function(a){this.h=a};b.l.O.prototype=new b.l.h;b.l.O.prototype.text=function(){if(0==arguments.length){var a=b.a.f.get(this.h,"__ko_anon_template__")||{};a.Aa===I&&a.ia&&(a.Aa=a.ia.innerHTML);return a.Aa}b.a.f.set(this.h,"__ko_anon_template__",{Aa:arguments[0]})};b.l.h.prototype.nodes=
function(){if(0==arguments.length)return(b.a.f.get(this.h,"__ko_anon_template__")||{}).ia;b.a.f.set(this.h,"__ko_anon_template__",{ia:arguments[0]})};b.b("templateSources",b.l);b.b("templateSources.domElement",b.l.h);b.b("templateSources.anonymousTemplate",b.l.O);var O;b.wa=function(a){a!=I&&!(a instanceof b.v)&&j(Error("templateEngine must inherit from ko.templateEngine"));O=a};b.va=function(a,d,c,e,f){c=c||{};(c.templateEngine||O)==I&&j(Error("Set a template engine before calling renderTemplate"));
f=f||"replaceChildren";if(e){var g=N(e);return b.j(function(){var h=d&&d instanceof b.z?d:new b.z(b.a.d(d)),k="function"==typeof a?a(h.$data,h):a,h=T(e,f,k,h,c);"replaceNode"==f&&(e=h,g=N(e))},p,{Ka:function(){return!g||!b.a.X(g)},W:g&&"replaceNode"==f?g.parentNode:g})}return b.s.ra(function(e){b.va(a,d,c,e,"replaceNode")})};b.Mb=function(a,d,c,e,f){function g(a,b){U(b,k);c.afterRender&&c.afterRender(b,a)}function h(d,e){k=f.createChildContext(b.a.d(d),c.as);k.$index=e;var g="function"==typeof a?
a(d,k):a;return T(p,"ignoreTargetNode",g,k,c)}var k;return b.j(function(){var a=b.a.d(d)||[];"undefined"==typeof a.length&&(a=[a]);a=b.a.fa(a,function(a){return c.includeDestroyed||a===I||a===p||!b.a.d(a._destroy)});b.r.K(b.a.$a,p,[e,a,h,c,g])},p,{W:e})};b.c.template={init:function(a,d){var c=b.a.d(d());if("string"!=typeof c&&!c.name&&(1==a.nodeType||8==a.nodeType))c=1==a.nodeType?a.childNodes:b.e.childNodes(a),c=b.a.Hb(c),(new b.l.O(a)).nodes(c);return{controlsDescendantBindings:m}},update:function(a,
d,c,e,f){d=b.a.d(d());c={};e=m;var g,h=p;"string"!=typeof d&&(c=d,d=c.name,"if"in c&&(e=b.a.d(c["if"])),e&&"ifnot"in c&&(e=!b.a.d(c.ifnot)),g=b.a.d(c.data));"foreach"in c?h=b.Mb(d||a,e&&c.foreach||[],c,a,f):e?(f="data"in c?f.createChildContext(g,c.as):f,h=b.va(d||a,f,c,a)):b.e.Y(a);f=h;(g=b.a.f.get(a,"__ko__templateComputedDomDataKey__"))&&"function"==typeof g.B&&g.B();b.a.f.set(a,"__ko__templateComputedDomDataKey__",f&&f.pa()?f:I)}};b.g.Q.template=function(a){a=b.g.aa(a);return 1==a.length&&a[0].unknown||
b.g.Eb(a,"name")?p:"This template engine does not support anonymous templates nested within its templates"};b.e.I.template=m;b.b("setTemplateEngine",b.wa);b.b("renderTemplate",b.va);b.a.Ja=function(a,b,c){a=a||[];b=b||[];return a.length<=b.length?S(a,b,"added","deleted",c):S(b,a,"deleted","added",c)};b.b("utils.compareArrays",b.a.Ja);b.a.$a=function(a,d,c,e,f){function g(a,b){t=l[b];w!==b&&(z[a]=t);t.na(w++);M(t.M);s.push(t);A.push(t)}function h(a,c){if(a)for(var d=0,e=c.length;d<e;d++)c[d]&&b.a.o(c[d].M,
function(b){a(b,d,c[d].U)})}d=d||[];e=e||{};var k=b.a.f.get(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult")===I,l=b.a.f.get(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult")||[],n=b.a.V(l,function(a){return a.U}),q=b.a.Ja(n,d),s=[],v=0,w=0,B=[],A=[];d=[];for(var z=[],n=[],t,D=0,C,E;C=q[D];D++)switch(E=C.moved,C.status){case "deleted":E===I&&(t=l[v],t.j&&t.j.B(),B.push.apply(B,M(t.M)),e.beforeRemove&&(d[D]=t,A.push(t)));v++;break;case "retained":g(D,v++);break;case "added":E!==I?
g(D,E):(t={U:C.value,na:b.m(w++)},s.push(t),A.push(t),k||(n[D]=t))}h(e.beforeMove,z);b.a.o(B,e.beforeRemove?b.A:b.removeNode);for(var D=0,k=b.e.firstChild(a),H;t=A[D];D++){t.M||b.a.extend(t,ha(a,c,t.U,f,t.na));for(v=0;q=t.M[v];k=q.nextSibling,H=q,v++)q!==k&&b.e.Pa(a,q,H);!t.Ab&&f&&(f(t.U,t.M,t.na),t.Ab=m)}h(e.beforeRemove,d);h(e.afterMove,z);h(e.afterAdd,n);b.a.f.set(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult",s)};b.b("utils.setDomNodeChildrenFromArrayMapping",b.a.$a);b.C=function(){this.allowTemplateRewriting=
r};b.C.prototype=new b.v;b.C.prototype.renderTemplateSource=function(a){var d=!(9>b.a.Z)&&a.nodes?a.nodes():p;if(d)return b.a.L(d.cloneNode(m).childNodes);a=a.text();return b.a.ta(a)};b.C.oa=new b.C;b.wa(b.C.oa);b.b("nativeTemplateEngine",b.C);b.qa=function(){var a=this.Db=function(){if("undefined"==typeof F||!F.tmpl)return 0;try{if(0<=F.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,c,e){e=e||{};2>a&&j(Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later."));
var f=b.data("precompiled");f||(f=b.text()||"",f=F.template(p,"{{ko_with $item.koBindingContext}}"+f+"{{/ko_with}}"),b.data("precompiled",f));b=[c.$data];c=F.extend({koBindingContext:c},e.templateOptions);c=F.tmpl(f,b,c);c.appendTo(y.createElement("div"));F.fragments={};return c};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){y.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(F.tmpl.tag.ko_code=
{open:"__.push($1 || '');"},F.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};b.qa.prototype=new b.v;w=new b.qa;0<w.Db&&b.wa(w);b.b("jqueryTmplTemplateEngine",b.qa)}"function"===typeof require&&"object"===typeof exports&&"object"===typeof module?L(module.exports||exports):"function"===typeof define&&define.amd?define(["exports"],L):L(x.ko={});m;
})();

/* ======================================== */
/**
 * password_strength_plugin.js
 * Copyright (c) 20010 myPocket technologies (www.mypocket-technologies.com)
 * @author Darren Mason (djmason9@gmail.com)
 * @date 3/13/2009
 * @projectDescription Password Strength Meter is a jQuery plug-in provide you smart algorithm to detect a password strength. 
 * Based on Firas Kassem orginal plugin - phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/
 * @version 1.0.1	*/
(function(a){a.fn.shortPass="Too short";a.fn.badPass="Weak";a.fn.goodPass="Good";a.fn.strongPass="Strong";a.fn.samePassword="Username and Password identical.";a.fn.resultStyle="";a.fn.passStrength=function(b){var d={shortPass:"shortPass",badPass:"badPass",goodPass:"goodPass",strongPass:"strongPass",baseStyle:"testresult",userid:"",messageloc:1};
var c=a.extend(d,b);return this.each(function(){var e=a(this);a(e).unbind().keyup(function(){var f=a.fn.teststrength(a(this).val(),a(c.userid).val(),c);if(c.messageloc===1){a(this).next("."+c.baseStyle).remove();a(this).after('<span class="'+c.baseStyle+'"><span></span></span>');a(this).next("."+c.baseStyle).addClass(a(this).resultStyle).find("span").text(f)
}else{a(this).prev("."+c.baseStyle).remove();a(this).before('<span class="'+c.baseStyle+'"><span></span></span>');a(this).prev("."+c.baseStyle).addClass(a(this).resultStyle).find("span").text(f)}});a.fn.teststrength=function(f,i,g){var h=0;if(f.length<4){this.resultStyle=g.shortPass;return a(this).shortPass
}if(f.toLowerCase()==i.toLowerCase()){this.resultStyle=g.badPass;return a(this).samePassword}h+=f.length*4;h+=(a.fn.checkRepetition(1,f).length-f.length)*1;h+=(a.fn.checkRepetition(2,f).length-f.length)*1;h+=(a.fn.checkRepetition(3,f).length-f.length)*1;h+=(a.fn.checkRepetition(4,f).length-f.length)*1;
if(f.match(/(.*[0-9].*[0-9].*[0-9])/)){h+=5}if(f.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)){h+=5}if(f.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)){h+=10}if(f.match(/([a-zA-Z])/)&&f.match(/([0-9])/)){h+=15}if(f.match(/([!,@,#,$,%,^,&,*,?,_,~])/)&&f.match(/([0-9])/)){h+=15}if(f.match(/([!,@,#,$,%,^,&,*,?,_,~])/)&&f.match(/([a-zA-Z])/)){h+=15
}if(f.match(/^\w+$/)||f.match(/^\d+$/)){h-=10}if(h<0){h=0}if(h>100){h=100}if(h<34){this.resultStyle=g.badPass;return a(this).badPass}if(h<68){this.resultStyle=g.goodPass;return a(this).goodPass}this.resultStyle=g.strongPass;return a(this).strongPass}})}})(jQuery);$.fn.checkRepetition=function(a,f){var d="";
for(var c=0;c<f.length;c++){var e=true;for(var b=0;b<a&&(b+c+a)<f.length;b++){e=e&&(f.charAt(b+c)==f.charAt(b+c+a))}if(b<a){e=false}if(e){c+=a-1;e=false}else{d+=f.charAt(c)}}return d};

/* ======================================== */
/*!
* Parsley.js
* Version 2.3.5 - built Sun, Feb 28th 2016, 6:25 am
* http://parsleyjs.org
* Guillaume Potier - <guillaume@wisembly.com>
* Marc-Andre Lafortune - <petroselinum@marc-andre.ca>
* MIT Licensed
*/
function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t<e.length;t++)i[t]=e[t];return i}return Array.from(e)}var _slice=Array.prototype.slice;!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):e.parsley=t(e.jQuery)}(this,function(e){"use strict";function t(e,t){return e.parsleyAdaptedCallback||(e.parsleyAdaptedCallback=function(){var i=Array.prototype.slice.call(arguments,0);i.unshift(this),e.apply(t||A,i)}),e.parsleyAdaptedCallback}function i(e){return 0===e.lastIndexOf(D,0)?e.substr(D.length):e}var n=1,r={},s={attr:function(e,t,i){var n,r,s,a=new RegExp("^"+t,"i");if("undefined"==typeof i)i={};else for(n in i)i.hasOwnProperty(n)&&delete i[n];if("undefined"==typeof e||"undefined"==typeof e[0])return i;for(s=e[0].attributes,n=s.length;n--;)r=s[n],r&&r.specified&&a.test(r.name)&&(i[this.camelize(r.name.slice(t.length))]=this.deserializeValue(r.value));return i},checkAttr:function(e,t,i){return e.is("["+t+i+"]")},setAttr:function(e,t,i,n){e[0].setAttribute(this.dasherize(t+i),String(n))},generateID:function(){return""+n++},deserializeValue:function(t){var i;try{return t?"true"==t||("false"==t?!1:"null"==t?null:isNaN(i=Number(t))?/^[\[\{]/.test(t)?e.parseJSON(t):t:i):t}catch(n){return t}},camelize:function(e){return e.replace(/-+(.)?/g,function(e,t){return t?t.toUpperCase():""})},dasherize:function(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()},warn:function(){var e;window.console&&"function"==typeof window.console.warn&&(e=window.console).warn.apply(e,arguments)},warnOnce:function(e){r[e]||(r[e]=!0,this.warn.apply(this,arguments))},_resetWarnings:function(){r={}},trimString:function(e){return e.replace(/^\s+|\s+$/g,"")},namespaceEvents:function(t,i){return t=this.trimString(t||"").split(/\s+/),t[0]?e.map(t,function(e){return e+"."+i}).join(" "):""},objectCreate:Object.create||function(){var e=function(){};return function(t){if(arguments.length>1)throw Error("Second argument not supported");if("object"!=typeof t)throw TypeError("Argument must be an object");e.prototype=t;var i=new e;return e.prototype=null,i}}()},a=s,o={namespace:"data-parsley-",inputs:"input, textarea, select",excluded:"input[type=button], input[type=submit], input[type=reset], input[type=hidden]",priorityEnabled:!0,multiple:null,group:null,uiEnabled:!0,validationThreshold:3,focus:"first",trigger:!1,triggerAfterFailure:"input",errorClass:"parsley-error",successClass:"parsley-success",classHandler:function(e){},errorsContainer:function(e){},errorsWrapper:'<ul class="parsley-errors-list"></ul>',errorTemplate:"<li></li>"},l=function(){};l.prototype={asyncSupport:!0,actualizeOptions:function(){return a.attr(this.$element,this.options.namespace,this.domOptions),this.parent&&this.parent.actualizeOptions&&this.parent.actualizeOptions(),this},_resetOptions:function(e){this.domOptions=a.objectCreate(this.parent.options),this.options=a.objectCreate(this.domOptions);for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.actualizeOptions()},_listeners:null,on:function(e,t){this._listeners=this._listeners||{};var i=this._listeners[e]=this._listeners[e]||[];return i.push(t),this},subscribe:function(t,i){e.listenTo(this,t.toLowerCase(),i)},off:function(e,t){var i=this._listeners&&this._listeners[e];if(i)if(t)for(var n=i.length;n--;)i[n]===t&&i.splice(n,1);else delete this._listeners[e];return this},unsubscribe:function(t,i){e.unsubscribeTo(this,t.toLowerCase())},trigger:function(e,t,i){t=t||this;var n,r=this._listeners&&this._listeners[e];if(r)for(var s=r.length;s--;)if(n=r[s].call(t,t,i),n===!1)return n;return this.parent?this.parent.trigger(e,t,i):!0},reset:function(){if("ParsleyForm"!==this.__class__)return this._resetUI(),this._trigger("reset");for(var e=0;e<this.fields.length;e++)this.fields[e].reset();this._trigger("reset")},destroy:function(){if(this._destroyUI(),"ParsleyForm"!==this.__class__)return this.$element.removeData("Parsley"),this.$element.removeData("ParsleyFieldMultiple"),void this._trigger("destroy");for(var e=0;e<this.fields.length;e++)this.fields[e].destroy();this.$element.removeData("Parsley"),this._trigger("destroy")},asyncIsValid:function(e,t){return a.warnOnce("asyncIsValid is deprecated; please use whenValid instead"),this.whenValid({group:e,force:t})},_findRelated:function(){return this.options.multiple?this.parent.$element.find("["+this.options.namespace+'multiple="'+this.options.multiple+'"]'):this.$element}};var u={string:function(e){return e},integer:function(e){if(isNaN(e))throw'Requirement is not an integer: "'+e+'"';return parseInt(e,10)},number:function(e){if(isNaN(e))throw'Requirement is not a number: "'+e+'"';return parseFloat(e)},reference:function(t){var i=e(t);if(0===i.length)throw'No such reference: "'+t+'"';return i},"boolean":function(e){return"false"!==e},object:function(e){return a.deserializeValue(e)},regexp:function(e){var t="";return/^\/.*\/(?:[gimy]*)$/.test(e)?(t=e.replace(/.*\/([gimy]*)$/,"$1"),e=e.replace(new RegExp("^/(.*?)/"+t+"$"),"$1")):e="^"+e+"$",new RegExp(e,t)}},d=function(e,t){var i=e.match(/^\s*\[(.*)\]\s*$/);if(!i)throw'Requirement is not an array: "'+e+'"';var n=i[1].split(",").map(a.trimString);if(n.length!==t)throw"Requirement has "+n.length+" values when "+t+" are needed";return n},h=function(e,t){var i=u[e||"string"];if(!i)throw'Unknown requirement specification: "'+e+'"';return i(t)},p=function(e,t,i){var n=null,r={};for(var s in e)if(s){var a=i(s);"string"==typeof a&&(a=h(e[s],a)),r[s]=a}else n=h(e[s],t);return[n,r]},f=function(t){e.extend(!0,this,t)};f.prototype={validate:function(t,i){if(this.fn)return arguments.length>3&&(i=[].slice.call(arguments,1,-1)),this.fn.call(this,t,i);if(e.isArray(t)){if(!this.validateMultiple)throw"Validator `"+this.name+"` does not handle multiple values";return this.validateMultiple.apply(this,arguments)}if(this.validateNumber)return isNaN(t)?!1:(arguments[0]=parseFloat(arguments[0]),this.validateNumber.apply(this,arguments));if(this.validateString)return this.validateString.apply(this,arguments);throw"Validator `"+this.name+"` only handles multiple values"},parseRequirements:function(t,i){if("string"!=typeof t)return e.isArray(t)?t:[t];var n=this.requirementType;if(e.isArray(n)){for(var r=d(t,n.length),s=0;s<r.length;s++)r[s]=h(n[s],r[s]);return r}return e.isPlainObject(n)?p(n,t,i):[h(n,t)]},requirementType:"string",priority:2};var c=function(e,t){this.__class__="ParsleyValidatorRegistry",this.locale="en",this.init(e||{},t||{})},m={email:/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,number:/^-?(\d*\.)?\d+(e[-+]?\d+)?$/i,integer:/^-?\d+$/,digits:/^\d+$/,alphanum:/^\w+$/i,url:new RegExp("^(?:(?:https?|ftp)://)?(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:/\\S*)?$","i")};m.range=m.number;var g=function(e){var t=(""+e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0};c.prototype={init:function(t,i){this.catalog=i,this.validators=e.extend({},this.validators);for(var n in t)this.addValidator(n,t[n].fn,t[n].priority);window.Parsley.trigger("parsley:validator:init")},setLocale:function(e){if("undefined"==typeof this.catalog[e])throw new Error(e+" is not available in the catalog");return this.locale=e,this},addCatalog:function(e,t,i){return"object"==typeof t&&(this.catalog[e]=t),!0===i?this.setLocale(e):this},addMessage:function(e,t,i){return"undefined"==typeof this.catalog[e]&&(this.catalog[e]={}),this.catalog[e][t]=i,this},addMessages:function(e,t){for(var i in t)this.addMessage(e,i,t[i]);return this},addValidator:function(e,t,i){if(this.validators[e])a.warn('Validator "'+e+'" is already defined.');else if(o.hasOwnProperty(e))return void a.warn('"'+e+'" is a restricted keyword and is not a valid validator name.');return this._setValidator.apply(this,arguments)},updateValidator:function(e,t,i){return this.validators[e]?this._setValidator(this,arguments):(a.warn('Validator "'+e+'" is not already defined.'),this.addValidator.apply(this,arguments))},removeValidator:function(e){return this.validators[e]||a.warn('Validator "'+e+'" is not defined.'),delete this.validators[e],this},_setValidator:function(e,t,i){"object"!=typeof t&&(t={fn:t,priority:i}),t.validate||(t=new f(t)),this.validators[e]=t;for(var n in t.messages||{})this.addMessage(n,e,t.messages[n]);return this},getErrorMessage:function(e){var t;if("type"===e.name){var i=this.catalog[this.locale][e.name]||{};t=i[e.requirements]}else t=this.formatMessage(this.catalog[this.locale][e.name],e.requirements);return t||this.catalog[this.locale].defaultMessage||this.catalog.en.defaultMessage},formatMessage:function(e,t){if("object"==typeof t){for(var i in t)e=this.formatMessage(e,t[i]);return e}return"string"==typeof e?e.replace(/%s/i,t):""},validators:{notblank:{validateString:function(e){return/\S/.test(e)},priority:2},required:{validateMultiple:function(e){return e.length>0},validateString:function(e){return/\S/.test(e)},priority:512},type:{validateString:function(e,t){var i=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],n=i.step,r=void 0===n?"1":n,s=i.base,a=void 0===s?0:s,o=m[t];if(!o)throw new Error("validator type `"+t+"` is not supported");if(!o.test(e))return!1;if("number"===t&&!/^any$/i.test(r||"")){var l=Number(e),u=Math.max(g(r),g(a));if(g(l)>u)return!1;var d=function(e){return Math.round(e*Math.pow(10,u))};if((d(l)-d(a))%d(r)!=0)return!1}return!0},requirementType:{"":"string",step:"string",base:"number"},priority:256},pattern:{validateString:function(e,t){return t.test(e)},requirementType:"regexp",priority:64},minlength:{validateString:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxlength:{validateString:function(e,t){return e.length<=t},requirementType:"integer",priority:30},length:{validateString:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},mincheck:{validateMultiple:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxcheck:{validateMultiple:function(e,t){return e.length<=t},requirementType:"integer",priority:30},check:{validateMultiple:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},min:{validateNumber:function(e,t){return e>=t},requirementType:"number",priority:30},max:{validateNumber:function(e,t){return t>=e},requirementType:"number",priority:30},range:{validateNumber:function(e,t,i){return e>=t&&i>=e},requirementType:["number","number"],priority:30},equalto:{validateString:function(t,i){var n=e(i);return n.length?t===n.val():t===i},priority:256}}};var y={},v=function T(e,t,i){for(var n=[],r=[],s=0;s<e.length;s++){for(var a=!1,o=0;o<t.length;o++)if(e[s].assert.name===t[o].assert.name){a=!0;break}a?r.push(e[s]):n.push(e[s])}return{kept:r,added:n,removed:i?[]:T(t,e,!0).added}};y.Form={_actualizeTriggers:function(){var e=this;this.$element.on("submit.Parsley",function(t){e.onSubmitValidate(t)}),this.$element.on("click.Parsley",'input[type="submit"], button[type="submit"]',function(t){e.onSubmitButton(t)}),!1!==this.options.uiEnabled&&this.$element.attr("novalidate","")},focus:function(){if(this._focusedField=null,!0===this.validationResult||"none"===this.options.focus)return null;for(var e=0;e<this.fields.length;e++){var t=this.fields[e];if(!0!==t.validationResult&&t.validationResult.length>0&&"undefined"==typeof t.options.noFocus&&(this._focusedField=t.$element,"first"===this.options.focus))break}return null===this._focusedField?null:this._focusedField.focus()},_destroyUI:function(){this.$element.off(".Parsley")}},y.Field={_reflowUI:function(){if(this._buildUI(),this._ui){var e=v(this.validationResult,this._ui.lastValidationResult);this._ui.lastValidationResult=this.validationResult,this._manageStatusClass(),this._manageErrorsMessages(e),this._actualizeTriggers(),!e.kept.length&&!e.added.length||this._failedOnce||(this._failedOnce=!0,this._actualizeTriggers())}},getErrorsMessages:function(){if(!0===this.validationResult)return[];for(var e=[],t=0;t<this.validationResult.length;t++)e.push(this.validationResult[t].errorMessage||this._getErrorMessage(this.validationResult[t].assert));return e},addError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.message,n=t.assert,r=t.updateClass,s=void 0===r?!0:r;this._buildUI(),this._addError(e,{message:i,assert:n}),s&&this._errorClass()},updateError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.message,n=t.assert,r=t.updateClass,s=void 0===r?!0:r;this._buildUI(),this._updateError(e,{message:i,assert:n}),s&&this._errorClass()},removeError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.updateClass,n=void 0===i?!0:i;this._buildUI(),this._removeError(e),n&&this._manageStatusClass()},_manageStatusClass:function(){this.hasConstraints()&&this.needsValidation()&&!0===this.validationResult?this._successClass():this.validationResult.length>0?this._errorClass():this._resetClass()},_manageErrorsMessages:function(t){if("undefined"==typeof this.options.errorsMessagesDisabled){if("undefined"!=typeof this.options.errorMessage)return t.added.length||t.kept.length?(this._insertErrorWrapper(),0===this._ui.$errorsWrapper.find(".parsley-custom-error-message").length&&this._ui.$errorsWrapper.append(e(this.options.errorTemplate).addClass("parsley-custom-error-message")),this._ui.$errorsWrapper.addClass("filled").find(".parsley-custom-error-message").html(this.options.errorMessage)):this._ui.$errorsWrapper.removeClass("filled").find(".parsley-custom-error-message").remove();for(var i=0;i<t.removed.length;i++)this._removeError(t.removed[i].assert.name);for(i=0;i<t.added.length;i++)this._addError(t.added[i].assert.name,{message:t.added[i].errorMessage,assert:t.added[i].assert});for(i=0;i<t.kept.length;i++)this._updateError(t.kept[i].assert.name,{message:t.kept[i].errorMessage,assert:t.kept[i].assert})}},_addError:function(t,i){var n=i.message,r=i.assert;this._insertErrorWrapper(),this._ui.$errorsWrapper.addClass("filled").append(e(this.options.errorTemplate).addClass("parsley-"+t).html(n||this._getErrorMessage(r)))},_updateError:function(e,t){var i=t.message,n=t.assert;this._ui.$errorsWrapper.addClass("filled").find(".parsley-"+e).html(i||this._getErrorMessage(n))},_removeError:function(e){this._ui.$errorsWrapper.removeClass("filled").find(".parsley-"+e).remove()},_getErrorMessage:function(e){var t=e.name+"Message";return"undefined"!=typeof this.options[t]?window.Parsley.formatMessage(this.options[t],e.requirements):window.Parsley.getErrorMessage(e)},_buildUI:function(){if(!this._ui&&!1!==this.options.uiEnabled){var t={};this.$element.attr(this.options.namespace+"id",this.__id__),t.$errorClassHandler=this._manageClassHandler(),t.errorsWrapperId="parsley-id-"+(this.options.multiple?"multiple-"+this.options.multiple:this.__id__),t.$errorsWrapper=e(this.options.errorsWrapper).attr("id",t.errorsWrapperId),t.lastValidationResult=[],t.validationInformationVisible=!1,this._ui=t}},_manageClassHandler:function(){if("string"==typeof this.options.classHandler&&e(this.options.classHandler).length)return e(this.options.classHandler);var t=this.options.classHandler.call(this,this);return"undefined"!=typeof t&&t.length?t:!this.options.multiple||this.$element.is("select")?this.$element:this.$element.parent()},_insertErrorWrapper:function(){var t;if(0!==this._ui.$errorsWrapper.parent().length)return this._ui.$errorsWrapper.parent();if("string"==typeof this.options.errorsContainer){if(e(this.options.errorsContainer).length)return e(this.options.errorsContainer).append(this._ui.$errorsWrapper);a.warn("The errors container `"+this.options.errorsContainer+"` does not exist in DOM")}else"function"==typeof this.options.errorsContainer&&(t=this.options.errorsContainer.call(this,this));if("undefined"!=typeof t&&t.length)return t.append(this._ui.$errorsWrapper);var i=this.$element;return this.options.multiple&&(i=i.parent()),i.after(this._ui.$errorsWrapper)},_actualizeTriggers:function(){var e=this,t=this._findRelated();t.off(".Parsley"),this._failedOnce?t.on(a.namespaceEvents(this.options.triggerAfterFailure,"Parsley"),function(){e.validate()}):t.on(a.namespaceEvents(this.options.trigger,"Parsley"),function(t){e._eventValidate(t)})},_eventValidate:function(e){(!/key|input/.test(e.type)||this._ui&&this._ui.validationInformationVisible||!(this.getValue().length<=this.options.validationThreshold))&&this.validate()},_resetUI:function(){this._failedOnce=!1,this._actualizeTriggers(),"undefined"!=typeof this._ui&&(this._ui.$errorsWrapper.removeClass("filled").children().remove(),this._resetClass(),this._ui.lastValidationResult=[],this._ui.validationInformationVisible=!1)},_destroyUI:function(){this._resetUI(),"undefined"!=typeof this._ui&&this._ui.$errorsWrapper.remove(),delete this._ui},_successClass:function(){this._ui.validationInformationVisible=!0,this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass)},_errorClass:function(){this._ui.validationInformationVisible=!0,this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass)},_resetClass:function(){this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass)}};var _=function(t,i,n){this.__class__="ParsleyForm",this.__id__=a.generateID(),this.$element=e(t),this.domOptions=i,this.options=n,this.parent=window.Parsley,this.fields=[],this.validationResult=null},w={pending:null,resolved:!0,rejected:!1};_.prototype={onSubmitValidate:function(e){var t=this;if(!0!==e.parsley){var i=this._$submitSource||this.$element.find('input[type="submit"], button[type="submit"]').first();if(this._$submitSource=null,this.$element.find(".parsley-synthetic-submit-button").prop("disabled",!0),!i.is("[formnovalidate]")){var n=this.whenValidate({event:e});"resolved"===n.state()&&!1!==this._trigger("submit")||(e.stopImmediatePropagation(),e.preventDefault(),"pending"===n.state()&&n.done(function(){t._submit(i)}))}}},onSubmitButton:function(t){this._$submitSource=e(t.target)},_submit:function(t){if(!1!==this._trigger("submit")){if(t){var i=this.$element.find(".parsley-synthetic-submit-button").prop("disabled",!1);0===i.length&&(i=e('<input class="parsley-synthetic-submit-button" type="hidden">').appendTo(this.$element)),i.attr({name:t.attr("name"),value:t.attr("value")})}this.$element.trigger(e.extend(e.Event("submit"),{parsley:!0}))}},validate:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling validate on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1],s=i[2];t={group:n,force:r,event:s}}return w[this.whenValidate(t).state()]},whenValidate:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force,s=i.event;this.submitEvent=s,s&&(this.submitEvent=e.extend({},s,{preventDefault:function(){a.warnOnce("Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`"),t.validationResult=!1}})),this.validationResult=!0,this._trigger("validate"),this._refreshFields();var o=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValidate({force:r,group:n})})}),l=function(){var i=e.Deferred();return!1===t.validationResult&&i.reject(),i.resolve().promise()};return e.when.apply(e,_toConsumableArray(o)).done(function(){t._trigger("success")}).fail(function(){t.validationResult=!1,t.focus(),t._trigger("error")}).always(function(){t._trigger("validated")}).pipe(l,l)},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling isValid on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={group:n,force:r}}return w[this.whenValid(t).state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force;this._refreshFields();var s=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValid({group:n,force:r})})});return e.when.apply(e,_toConsumableArray(s))},_refreshFields:function(){return this.actualizeOptions()._bindFields()},_bindFields:function(){var t=this,i=this.fields;return this.fields=[],this.fieldsMappedById={},this._withoutReactualizingFormOptions(function(){t.$element.find(t.options.inputs).not(t.options.excluded).each(function(e,i){var n=new window.Parsley.Factory(i,{},t);"ParsleyField"!==n.__class__&&"ParsleyFieldMultiple"!==n.__class__||!0===n.options.excluded||"undefined"==typeof t.fieldsMappedById[n.__class__+"-"+n.__id__]&&(t.fieldsMappedById[n.__class__+"-"+n.__id__]=n,t.fields.push(n))}),e(i).not(t.fields).each(function(e,t){t._trigger("reset")})}),this},_withoutReactualizingFormOptions:function(e){var t=this.actualizeOptions;this.actualizeOptions=function(){return this};var i=e();return this.actualizeOptions=t,i},_trigger:function(e){return this.trigger("form:"+e)}};var b=function(t,i,n,r,s){if(!/ParsleyField/.test(t.__class__))throw new Error("ParsleyField or ParsleyFieldMultiple instance expected");var a=window.Parsley._validatorRegistry.validators[i],o=new f(a);e.extend(this,{validator:o,name:i,requirements:n,priority:r||t.options[i+"Priority"]||o.priority,isDomConstraint:!0===s}),this._parseRequirements(t.options)},F=function(e){var t=e[0].toUpperCase();return t+e.slice(1)};b.prototype={validate:function(e,t){var i=this.requirementList.slice(0);return i.unshift(e),i.push(t),this.validator.validate.apply(this.validator,i)},_parseRequirements:function(e){var t=this;this.requirementList=this.validator.parseRequirements(this.requirements,function(i){return e[t.name+F(i)]})}};var C=function(t,i,n,r){this.__class__="ParsleyField",this.__id__=a.generateID(),this.$element=e(t),"undefined"!=typeof r&&(this.parent=r),this.options=n,this.domOptions=i,this.constraints=[],this.constraintsByName={},this.validationResult=[],this._bindConstraints()},$={pending:null,resolved:!0,rejected:!1};C.prototype={validate:function(t){arguments.length>=1&&!e.isPlainObject(t)&&(a.warnOnce("Calling validate on a parsley field without passing arguments as an object is deprecated."),t={options:t});var i=this.whenValidate(t);if(!i)return!0;switch(i.state()){case"pending":return null;case"resolved":return!0;case"rejected":return this.validationResult}},whenValidate:function(){var e=this,t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],i=t.force,n=t.group;return this.refreshConstraints(),!n||this._isInGroup(n)?(this.value=this.getValue(),this._trigger("validate"),this.whenValid({force:i,value:this.value,_refreshed:!0}).always(function(){e._reflowUI()}).done(function(){e._trigger("success")}).fail(function(){e._trigger("error")}).always(function(){e._trigger("validated")})):void 0},hasConstraints:function(){return 0!==this.constraints.length},needsValidation:function(e){return"undefined"==typeof e&&(e=this.getValue()),e.length||this._isRequired()||"undefined"!=typeof this.options.validateIfEmpty?!0:!1},_isInGroup:function(t){return e.isArray(this.options.group)?-1!==e.inArray(t,this.options.group):this.options.group===t},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling isValid on a parsley field without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={force:n,value:r}}var s=this.whenValid(t);return s?$[s.state()]:!0},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=void 0===n?!1:n,s=i.value,a=i.group,o=i._refreshed;if(o||this.refreshConstraints(),!a||this._isInGroup(a)){if(this.validationResult=!0,!this.hasConstraints())return e.when();if(("undefined"==typeof s||null===s)&&(s=this.getValue()),!this.needsValidation(s)&&!0!==r)return e.when();var l=this._getGroupedConstraints(),u=[];return e.each(l,function(i,n){var r=e.when.apply(e,_toConsumableArray(e.map(n,function(e){return t._validateConstraint(s,e)})));return u.push(r),"rejected"===r.state()?!1:void 0}),e.when.apply(e,u)}},_validateConstraint:function(t,i){var n=this,r=i.validate(t,this);return!1===r&&(r=e.Deferred().reject()),e.when(r).fail(function(e){!0===n.validationResult&&(n.validationResult=[]),n.validationResult.push({assert:i,errorMessage:"string"==typeof e&&e})})},getValue:function(){var e;return e="function"==typeof this.options.value?this.options.value(this):"undefined"!=typeof this.options.value?this.options.value:this.$element.val(),"undefined"==typeof e||null===e?"":this._handleWhitespace(e)},refreshConstraints:function(){return this.actualizeOptions()._bindConstraints()},addConstraint:function(e,t,i,n){if(window.Parsley._validatorRegistry.validators[e]){var r=new b(this,e,t,i,n);"undefined"!==this.constraintsByName[r.name]&&this.removeConstraint(r.name),this.constraints.push(r),this.constraintsByName[r.name]=r}return this},removeConstraint:function(e){for(var t=0;t<this.constraints.length;t++)if(e===this.constraints[t].name){this.constraints.splice(t,1);break}return delete this.constraintsByName[e],this},updateConstraint:function(e,t,i){return this.removeConstraint(e).addConstraint(e,t,i)},_bindConstraints:function(){for(var e=[],t={},i=0;i<this.constraints.length;i++)!1===this.constraints[i].isDomConstraint&&(e.push(this.constraints[i]),t[this.constraints[i].name]=this.constraints[i]);this.constraints=e,this.constraintsByName=t;for(var n in this.options)this.addConstraint(n,this.options[n],void 0,!0);return this._bindHtml5Constraints()},_bindHtml5Constraints:function(){(this.$element.hasClass("required")||this.$element.attr("required"))&&this.addConstraint("required",!0,void 0,!0),"string"==typeof this.$element.attr("pattern")&&this.addConstraint("pattern",this.$element.attr("pattern"),void 0,!0),"undefined"!=typeof this.$element.attr("min")&&"undefined"!=typeof this.$element.attr("max")?this.addConstraint("range",[this.$element.attr("min"),this.$element.attr("max")],void 0,!0):"undefined"!=typeof this.$element.attr("min")?this.addConstraint("min",this.$element.attr("min"),void 0,!0):"undefined"!=typeof this.$element.attr("max")&&this.addConstraint("max",this.$element.attr("max"),void 0,!0),"undefined"!=typeof this.$element.attr("minlength")&&"undefined"!=typeof this.$element.attr("maxlength")?this.addConstraint("length",[this.$element.attr("minlength"),this.$element.attr("maxlength")],void 0,!0):"undefined"!=typeof this.$element.attr("minlength")?this.addConstraint("minlength",this.$element.attr("minlength"),void 0,!0):"undefined"!=typeof this.$element.attr("maxlength")&&this.addConstraint("maxlength",this.$element.attr("maxlength"),void 0,!0);var e=this.$element.attr("type");return"undefined"==typeof e?this:"number"===e?this.addConstraint("type",["number",{step:this.$element.attr("step"),base:this.$element.attr("min")||this.$element.attr("value")}],void 0,!0):/^(email|url|range)$/i.test(e)?this.addConstraint("type",e,void 0,!0):this},_isRequired:function(){return"undefined"==typeof this.constraintsByName.required?!1:!1!==this.constraintsByName.required.requirements},_trigger:function(e){return this.trigger("field:"+e)},_handleWhitespace:function(e){return!0===this.options.trimValue&&a.warnOnce('data-parsley-trim-value="true" is deprecated, please use data-parsley-whitespace="trim"'),"squish"===this.options.whitespace&&(e=e.replace(/\s{2,}/g," ")),("trim"===this.options.whitespace||"squish"===this.options.whitespace||!0===this.options.trimValue)&&(e=a.trimString(e)),e},_getGroupedConstraints:function(){if(!1===this.options.priorityEnabled)return[this.constraints];for(var e=[],t={},i=0;i<this.constraints.length;i++){var n=this.constraints[i].priority;t[n]||e.push(t[n]=[]),t[n].push(this.constraints[i])}return e.sort(function(e,t){return t[0].priority-e[0].priority}),e}};var x=C,P=function(){this.__class__="ParsleyFieldMultiple"};P.prototype={addElement:function(e){return this.$elements.push(e),this},refreshConstraints:function(){var t;if(this.constraints=[],this.$element.is("select"))return this.actualizeOptions()._bindConstraints(),this;for(var i=0;i<this.$elements.length;i++)if(e("html").has(this.$elements[i]).length){t=this.$elements[i].data("ParsleyFieldMultiple").refreshConstraints().constraints;for(var n=0;n<t.length;n++)this.addConstraint(t[n].name,t[n].requirements,t[n].priority,t[n].isDomConstraint)}else this.$elements.splice(i,1);return this},getValue:function(){if("function"==typeof this.options.value)value=this.options.value(this);else if("undefined"!=typeof this.options.value)return this.options.value;if(this.$element.is("input[type=radio]"))return this._findRelated().filter(":checked").val()||"";if(this.$element.is("input[type=checkbox]")){var t=[];return this._findRelated().filter(":checked").each(function(){t.push(e(this).val())}),t}return this.$element.is("select")&&null===this.$element.val()?[]:this.$element.val()},_init:function(){return this.$elements=[this.$element],this}};var E=function(t,i,n){this.$element=e(t);var r=this.$element.data("Parsley");if(r)return"undefined"!=typeof n&&r.parent===window.Parsley&&(r.parent=n,r._resetOptions(r.options)),r;if(!this.$element.length)throw new Error("You must bind Parsley on an existing element.");if("undefined"!=typeof n&&"ParsleyForm"!==n.__class__)throw new Error("Parent instance must be a ParsleyForm instance");return this.parent=n||window.Parsley,this.init(i)};E.prototype={init:function(e){return this.__class__="Parsley",this.__version__="2.3.5",this.__id__=a.generateID(),this._resetOptions(e),this.$element.is("form")||a.checkAttr(this.$element,this.options.namespace,"validate")&&!this.$element.is(this.options.inputs)?this.bind("parsleyForm"):this.isMultiple()?this.handleMultiple():this.bind("parsleyField")},isMultiple:function(){return this.$element.is("input[type=radio], input[type=checkbox]")||this.$element.is("select")&&"undefined"!=typeof this.$element.attr("multiple")},handleMultiple:function(){var t,i,n=this;if(this.options.multiple||("undefined"!=typeof this.$element.attr("name")&&this.$element.attr("name").length?this.options.multiple=t=this.$element.attr("name"):"undefined"!=typeof this.$element.attr("id")&&this.$element.attr("id").length&&(this.options.multiple=this.$element.attr("id"))),this.$element.is("select")&&"undefined"!=typeof this.$element.attr("multiple"))return this.options.multiple=this.options.multiple||this.__id__,this.bind("parsleyFieldMultiple");if(!this.options.multiple)return a.warn("To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.",this.$element),this;this.options.multiple=this.options.multiple.replace(/(:|\.|\[|\]|\{|\}|\$)/g,""),
"undefined"!=typeof t&&e('input[name="'+t+'"]').each(function(t,i){e(i).is("input[type=radio], input[type=checkbox]")&&e(i).attr(n.options.namespace+"multiple",n.options.multiple)});for(var r=this._findRelated(),s=0;s<r.length;s++)if(i=e(r.get(s)).data("Parsley"),"undefined"!=typeof i){this.$element.data("ParsleyFieldMultiple")||i.addElement(this.$element);break}return this.bind("parsleyField",!0),i||this.bind("parsleyFieldMultiple")},bind:function(t,i){var n;switch(t){case"parsleyForm":n=e.extend(new _(this.$element,this.domOptions,this.options),window.ParsleyExtend)._bindFields();break;case"parsleyField":n=e.extend(new x(this.$element,this.domOptions,this.options,this.parent),window.ParsleyExtend);break;case"parsleyFieldMultiple":n=e.extend(new x(this.$element,this.domOptions,this.options,this.parent),new P,window.ParsleyExtend)._init();break;default:throw new Error(t+"is not a supported Parsley type")}return this.options.multiple&&a.setAttr(this.$element,this.options.namespace,"multiple",this.options.multiple),"undefined"!=typeof i?(this.$element.data("ParsleyFieldMultiple",n),n):(this.$element.data("Parsley",n),n._actualizeTriggers(),n._trigger("init"),n)}};var V=e.fn.jquery.split(".");if(parseInt(V[0])<=1&&parseInt(V[1])<8)throw"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.";V.forEach||a.warn("Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim");var M=e.extend(new l,{$element:e(document),actualizeOptions:null,_resetOptions:null,Factory:E,version:"2.3.5"});e.extend(x.prototype,y.Field,l.prototype),e.extend(_.prototype,y.Form,l.prototype),e.extend(E.prototype,l.prototype),e.fn.parsley=e.fn.psly=function(t){if(this.length>1){var i=[];return this.each(function(){i.push(e(this).parsley(t))}),i}return e(this).length?new E(this,t):void a.warn("You must bind Parsley on an existing element.")},"undefined"==typeof window.ParsleyExtend&&(window.ParsleyExtend={}),M.options=e.extend(a.objectCreate(o),window.ParsleyConfig),window.ParsleyConfig=M.options,window.Parsley=window.psly=M,window.ParsleyUtils=a;var O=window.Parsley._validatorRegistry=new c(window.ParsleyConfig.validators,window.ParsleyConfig.i18n);window.ParsleyValidator={},e.each("setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator".split(" "),function(t,i){window.Parsley[i]=e.proxy(O,i),window.ParsleyValidator[i]=function(){var e;return a.warnOnce("Accessing the method '"+i+"' through ParsleyValidator is deprecated. Simply call 'window.Parsley."+i+"(...)'"),(e=window.Parsley)[i].apply(e,arguments)}}),window.Parsley.UI=y,window.ParsleyUI={removeError:function(e,t,i){var n=!0!==i;return a.warnOnce("Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e.removeError(t,{updateClass:n})},getErrorsMessages:function(e){return a.warnOnce("Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly."),e.getErrorsMessages()}},e.each("addError updateError".split(" "),function(e,t){window.ParsleyUI[t]=function(e,i,n,r,s){var o=!0!==s;return a.warnOnce("Accessing ParsleyUI is deprecated. Call '"+t+"' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e[t](i,{message:n,assert:r,updateClass:o})}}),/firefox/i.test(navigator.userAgent)&&e(document).on("change","select",function(t){e(t.target).trigger("input")}),!1!==window.ParsleyConfig.autoBind&&e(function(){e("[data-parsley-validate]").length&&e("[data-parsley-validate]").parsley()});var A=e({}),R=function(){a.warnOnce("Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley")},D="parsley:";e.listen=function(e,n){var r;if(R(),"object"==typeof arguments[1]&&"function"==typeof arguments[2]&&(r=arguments[1],n=arguments[2]),"function"!=typeof n)throw new Error("Wrong parameters");window.Parsley.on(i(e),t(n,r))},e.listenTo=function(e,n,r){if(R(),!(e instanceof x||e instanceof _))throw new Error("Must give Parsley instance");if("string"!=typeof n||"function"!=typeof r)throw new Error("Wrong parameters");e.on(i(n),t(r))},e.unsubscribe=function(e,t){if(R(),"string"!=typeof e||"function"!=typeof t)throw new Error("Wrong arguments");window.Parsley.off(i(e),t.parsleyAdaptedCallback)},e.unsubscribeTo=function(e,t){if(R(),!(e instanceof x||e instanceof _))throw new Error("Must give Parsley instance");e.off(i(t))},e.unsubscribeAll=function(t){R(),window.Parsley.off(i(t)),e("form,input,textarea,select").each(function(){var n=e(this).data("Parsley");n&&n.off(i(t))})},e.emit=function(e,t){var n;R();var r=t instanceof x||t instanceof _,s=Array.prototype.slice.call(arguments,r?2:1);s.unshift(i(e)),r||(t=window.Parsley),(n=t).trigger.apply(n,_toConsumableArray(s))};e.extend(!0,M,{asyncValidators:{"default":{fn:function(e){return e.status>=200&&e.status<300},url:!1},reverse:{fn:function(e){return e.status<200||e.status>=300},url:!1}},addAsyncValidator:function(e,t,i,n){return M.asyncValidators[e]={fn:t,url:i||!1,options:n||{}},this}}),M.addValidator("remote",{requirementType:{"":"string",validator:"string",reverse:"boolean",options:"object"},validateString:function(t,i,n,r){var s,a,o={},l=n.validator||(!0===n.reverse?"reverse":"default");if("undefined"==typeof M.asyncValidators[l])throw new Error("Calling an undefined async validator: `"+l+"`");i=M.asyncValidators[l].url||i,i.indexOf("{value}")>-1?i=i.replace("{value}",encodeURIComponent(t)):o[r.$element.attr("name")||r.$element.attr("id")]=t;var u=e.extend(!0,n.options||{},M.asyncValidators[l].options);s=e.extend(!0,{},{url:i,data:o,type:"GET"},u),r.trigger("field:ajaxoptions",r,s),a=e.param(s),"undefined"==typeof M._remoteCache&&(M._remoteCache={});var d=M._remoteCache[a]=M._remoteCache[a]||e.ajax(s),h=function(){var t=M.asyncValidators[l].fn.call(r,d,i,n);return t||(t=e.Deferred().reject()),e.when(t)};return d.then(h,h)},priority:-1}),M.on("form:submit",function(){M._remoteCache={}}),window.ParsleyExtend.addAsyncValidator=function(){return ParsleyUtils.warnOnce("Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`"),M.addAsyncValidator.apply(M,arguments)},M.addMessages("en",{defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",number:"This value should be a valid number.",integer:"This value should be a valid integer.",digits:"This value should be digits.",alphanum:"This value should be alphanumeric."},notblank:"This value should not be blank.",required:"This value is required.",pattern:"This value seems to be invalid.",min:"This value should be greater than or equal to %s.",max:"This value should be lower than or equal to %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or fewer.",length:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or fewer.",check:"You must select between %s and %s choices.",equalto:"This value should be the same."}),M.setLocale("en");var q=M;return q});

/* ======================================== */
/**!
@license
handlebars v4.7.7
Copyright (C) 2011-2016 by Yehuda Katz
*/
!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.parseWithoutProcessing=j.parseWithoutProcessing,a}var e=c(1)["default"];b.__esModule=!0;var f=c(2),g=e(f),h=c(45),i=e(h),j=c(46),k=c(51),l=c(52),m=e(l),n=c(49),o=e(n),p=c(44),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(37),j=f(i),k=c(6),l=f(k),m=c(5),n=e(m),o=c(38),p=e(o),q=c(44),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(30),k=c(32),l=e(k),m=c(33),n="4.7.7";b.VERSION=n;var o=8;b.COMPILER_REVISION=o;var p=7;b.LAST_COMPATIBLE_COMPILER_REVISION=p;var q={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 <4.3.0",8:">= 4.3.0"};b.REVISION_CHANGES=q;var r="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===r){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)===r)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)===r){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]},resetLoggedPropertyAccesses:function(){m.resetLoggedProperties()}};var s=l["default"].log;b.log=s,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0,i=void 0,j=void 0;c&&(g=c.start.line,h=c.end.line,i=c.start.column,j=c.end.column,a+=" - "+g+":"+i);for(var k=Error.prototype.constructor.call(this,a),l=0;l<f.length;l++)this[f[l]]=k[f[l]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,this.endLineNumber=h,e?(Object.defineProperty(this,"column",{value:i,enumerable:!0}),Object.defineProperty(this,"endColumn",{value:j,enumerable:!0})):(this.column=i,this.endColumn=j))}catch(m){}}var e=c(7)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","endLineNumber","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){h["default"](a),j["default"](a),l["default"](a),n["default"](a),p["default"](a),r["default"](a),t["default"](a)}function e(a,b,c){a.helpers[b]&&(a.hooks[b]=a.helpers[b],c||delete a.helpers[b])}var f=c(1)["default"];b.__esModule=!0,b.registerDefaultHelpers=d,b.moveHelperToHooks=e;var g=c(11),h=f(g),i=c(12),j=f(i),k=c(25),l=f(k),m=c(26),n=f(m),o=c(27),p=f(o),q=c(28),r=f(q),s=c(29),t=f(s)},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){(function(d){"use strict";var e=c(13)["default"],f=c(1)["default"];b.__esModule=!0;var g=c(5),h=c(6),i=f(h);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,d){l&&(l.key=b,l.index=c,l.first=0===c,l.last=!!d,m&&(l.contextPath=m+b)),k+=f(a[b],{data:l,blockParams:g.blockParams([a[b],b],[m+b,null])})}if(!b)throw new i["default"]("Must pass iterator to #each");var f=b.fn,h=b.inverse,j=0,k="",l=void 0,m=void 0;if(b.data&&b.ids&&(m=g.appendContextPath(b.data.contextPath,b.ids[0])+"."),g.isFunction(a)&&(a=a.call(this)),b.data&&(l=g.createFrame(b.data)),a&&"object"==typeof a)if(g.isArray(a))for(var n=a.length;j<n;j++)j in a&&c(j,j,j===a.length-1);else if(d.Symbol&&a[d.Symbol.iterator]){for(var o=[],p=a[d.Symbol.iterator](),q=p.next();!q.done;q=p.next())o.push(q.value);a=o;for(var n=a.length;j<n;j++)c(j,j,j===a.length-1)}else!function(){var b=void 0;e(a).forEach(function(a){void 0!==b&&c(b,j-1),b=a,j++}),void 0!==b&&c(b,j-1,!0)}();return 0===j&&(k=h(this)),k})},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b,c){a.exports={"default":c(14),__esModule:!0}},function(a,b,c){c(15),a.exports=c(21).Object.keys},function(a,b,c){var d=c(16);c(18)("keys",function(a){return function(b){return a(d(b))}})},function(a,b,c){var d=c(17);a.exports=function(a){return Object(d(a))}},function(a,b){a.exports=function(a){if(void 0==a)throw TypeError("Can't call method on  "+a);return a}},function(a,b,c){var d=c(19),e=c(21),f=c(24);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(20),e=c(21),f=c(22),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(23);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,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";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("if",function(a,b){if(2!=arguments.length)throw new g["default"]("#if requires exactly one argument");return e.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||e.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){if(2!=arguments.length)throw new g["default"]("#unless requires exactly one argument");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,c){return a?c.lookupProperty(a,b):a})},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("with",function(a,b){if(2!=arguments.length)throw new g["default"]("#with requires exactly one argument");e.isFunction(a)&&(a=a.call(this));var c=b.fn;if(e.isEmpty(a))return b.inverse(this);var d=b.data;return b.data&&b.ids&&(d=e.createFrame(b.data),d.contextPath=e.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:d,blockParams:e.blockParams([a],[d&&d.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(31),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,c){"use strict";function d(a){var b=i(null);b.constructor=!1,b.__defineGetter__=!1,b.__defineSetter__=!1,b.__lookupGetter__=!1;var c=i(null);return c.__proto__=!1,{properties:{whitelist:l.createNewLookupObject(c,a.allowedProtoProperties),defaultValue:a.allowProtoPropertiesByDefault},methods:{whitelist:l.createNewLookupObject(b,a.allowedProtoMethods),defaultValue:a.allowProtoMethodsByDefault}}}function e(a,b,c){return"function"==typeof a?f(b.methods,c):f(b.properties,c)}function f(a,b){return void 0!==a.whitelist[b]?a.whitelist[b]===!0:void 0!==a.defaultValue?a.defaultValue:(g(b),!1)}function g(a){o[a]!==!0&&(o[a]=!0,n.log("error",'Handlebars: Access has been denied to resolve the property "'+a+'" because it is not an "own property" of its parent.\nYou can add a runtime option to disable the check or this warning:\nSee https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details'))}function h(){j(o).forEach(function(a){delete o[a]})}var i=c(34)["default"],j=c(13)["default"],k=c(3)["default"];b.__esModule=!0,b.createProtoAccessControl=d,b.resultIsAllowed=e,b.resetLoggedProperties=h;var l=c(36),m=c(32),n=k(m),o=i(null)},function(a,b,c){a.exports={"default":c(35),__esModule:!0}},function(a,b,c){var d=c(9);a.exports=function(a,b){return d.create(a,b)}},function(a,b,c){"use strict";function d(){for(var a=arguments.length,b=Array(a),c=0;c<a;c++)b[c]=arguments[c];return f.extend.apply(void 0,[e(null)].concat(b))}var e=c(34)["default"];b.__esModule=!0,b.createNewLookupObject=d;var f=c(5)},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=v.COMPILER_REVISION;if(!(b>=v.LAST_COMPATIBLE_COMPILER_REVISION&&b<=v.COMPILER_REVISION)){if(b<v.LAST_COMPATIBLE_COMPILER_REVISION){var d=v.REVISION_CHANGES[c],e=v.REVISION_CHANGES[b];throw new u["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 u["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=s.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=s.extend({},e,{hooks:this.hooks,protoAccessControl:this.protoAccessControl}),g=b.VM.invokePartial.call(this,c,d,f);if(null==g&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),g=e.partials[e.name](d,f)),null!=g){if(e.indent){for(var h=g.split("\n"),i=0,j=h.length;i<j&&(h[i]||i+1!==j);i++)h[i]=e.indent+h[i];g=h.join("\n")}return g}throw new u["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(g,b,g.helpers,g.partials,f,i,h)}var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],f=e.data;d._setup(e),!e.partial&&a.useData&&(f=j(b,f));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=e.depths?b!=e.depths[0]?[b].concat(e.depths):e.depths:[b]),(c=k(a.main,c,g,e.depths||[],f,i))(b,e)}if(!b)throw new u["default"]("No environment passed to template");if(!a||!a.main)throw new u["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e=a.compiler&&7===a.compiler[0],g={strict:function(a,b,c){if(!(a&&b in a))throw new u["default"]('"'+b+'" not defined in '+a,{loc:c});return g.lookupProperty(a,b)},lookupProperty:function(a,b){var c=a[b];return null==c?c:Object.prototype.hasOwnProperty.call(a,b)?c:y.resultIsAllowed(c,g.protoAccessControl,b)?c:void 0},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++){var e=a[d]&&g.lookupProperty(a[d],b);if(null!=e)return a[d][b]}},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:s.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},mergeIfNeeded:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=s.extend({},b,a)),c},nullContext:n({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){if(c.partial)g.protoAccessControl=c.protoAccessControl,g.helpers=c.helpers,g.partials=c.partials,g.decorators=c.decorators,g.hooks=c.hooks;else{var d=s.extend({},b.helpers,c.helpers);l(d,g),g.helpers=d,a.usePartial&&(g.partials=g.mergeIfNeeded(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(g.decorators=s.extend({},b.decorators,c.decorators)),g.hooks={},g.protoAccessControl=y.createProtoAccessControl(c);var f=c.allowCallsToHelperMissing||e;w.moveHelperToHooks(g,"helperMissing",f),w.moveHelperToHooks(g,"blockHelperMissing",f)}},d._child=function(b,c,d,e){if(a.useBlockParams&&!d)throw new u["default"]("must pass block params");if(a.useDepths&&!e)throw new u["default"]("must pass parent depths");return f(g,b,a[b],c,0,d,e)},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=v.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=v.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=s.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new u["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?v.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),s.extend(b,g)}return b}function l(a,b){o(a).forEach(function(c){var d=a[c];a[c]=m(d,b)})}function m(a,b){var c=b.lookupProperty;return x.wrapHelper(a,function(a){return s.extend({lookupProperty:c},a)})}var n=c(39)["default"],o=c(13)["default"],p=c(3)["default"],q=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 r=c(5),s=p(r),t=c(6),u=q(t),v=c(4),w=c(10),x=c(43),y=c(33)},function(a,b,c){a.exports={"default":c(40),__esModule:!0}},function(a,b,c){c(41),a.exports=c(21).Object.seal},function(a,b,c){var d=c(42);c(18)("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){"use strict";function c(a,b){if("function"!=typeof a)return a;var c=function(){var c=arguments[arguments.length-1];return arguments[arguments.length-1]=b(c),a.apply(this,arguments)};return c}b.__esModule=!0,b.wrapHelper=c},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;i["default"].yy=o,o.locInfo=function(a){return new o.SourceLocation(b&&b.srcName,a)};var c=i["default"].parse(a);return c}function e(a,b){var c=d(a,b),e=new k["default"](b);return e.accept(c)}var f=c(1)["default"],g=c(3)["default"];b.__esModule=!0,b.parseWithoutProcessing=d,b.parse=e;var h=c(47),i=f(h),j=c(48),k=f(j),l=c(50),m=g(l),n=c(5);b.parser=i["default"];var o={};n.extend(o,m)},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_repetition0: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,0],[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.$=[];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]},{15:[2,48],17:39,18:[2,48]},{20:41,56:40,64:42,65:[1,43],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:44,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:45,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: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:41,56:48,64:42,65:[1,43],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:49,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,50]},{72:[1,35],86:51},{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:52,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:53,38:55,39:[1,57],43:56,44:[1,58],45:54,47:[2,54]},{28:59,43:60,44:[1,58],47:[2,56]},{13:62,15:[1,20],18:[1,61]},{33:[2,86],57:63,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:64,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:65,47:[1,66]},{30:67,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:68,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:69,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:70,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:74,33:[2,80],50:71,63:72,64:75,65:[1,43],69:73,70:76,71:77,72:[1,78],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,79]},{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,50]},{20:74,53:80,54:[2,84],63:81,64:75,65:[1,43],69:82,70:76,71:77,72:[1,78],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:83,47:[1,66]},{47:[2,55]},{4:84,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:85,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:86,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:87,47:[1,66]},{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:74,33:[2,88],58:88,63:89,64:75,65:[1,43],69:90,70:76,71:77,72:[1,78],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:91,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:92,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:74,31:93,33:[2,60],63:94,64:75,65:[1,43],69:95,70:76,71:77,72:[1,78],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:74,33:[2,66],36:96,63:97,64:75,65:[1,43],69:98,70:76,71:77,72:[1,78],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:74,22:99,23:[2,52],63:100,64:75,65:[1,43],69:101,70:76,71:77,72:[1,78],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:74,33:[2,92],62:102,63:103,64:75,65:[1,43],69:104,70:76,71:77,72:[1,78],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,105]},{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:106,72:[1,107],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,108],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,109]},{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:55,39:[1,57],43:56,44:[1,58],45:111,46:110,47:[2,76]},{33:[2,70],40:112,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,113]},{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:74,63:115,64:75,65:[1,43],67:114,68:[2,96],69:116,70:76,71:77,72:[1,78],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,117]},{32:118,33:[2,62],74:119,75:[1,120]},{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:121,74:122,75:[1,120]},{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,123]},{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,124]},{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,108]},{20:74,63:125,64:75,65:[1,43],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:74,33:[2,72],41:126,63:127,64:75,65:[1,43],69:128,70:76,71:77,72:[1,78],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,129]},{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,130]},{33:[2,63]},{72:[1,132],76:131},{33:[1,133]},{33:[2,69]},{15:[2,12],18:[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:134,74:135,75:[1,120]},{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,137],77:[1,136]},{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,138]},{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],54:[2,55],56:[2,20],60:[2,57],73:[2,81],82:[2,85],86:[2,18],90:[2,89],101:[2,53],104:[2,93],110:[2,19],111:[2,77],116:[2,97],119:[2,63],122:[2,69],135:[2,75],136:[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.substring(a,b.yyleng-c+a)}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:(e(5,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(49),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.substring(1,a.length-1):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=0,h=b.length;g<h;g++){var i=b[g].part,j=b[g].original!==i;if(d+=(b[g].separator||"")+i,j||".."!==i&&"."!==i&&"this"!==i)e.push(i);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===i&&f++}}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 l["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 l["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=m.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(m.isArray(a)&&m.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(34)["default"],j=c(1)["default"];b.__esModule=!0,b.Compiler=d,b.precompile=e,b.compile=f;var k=c(6),l=j(k),m=c(5),n=c(45),o=j(n),p=[].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){return this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[],b.knownHelpers=m.extend(i(null),{helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},b.knownHelpers),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 l["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 l["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 l["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,o["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=o["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:p.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=o["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&o["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||o["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&&m.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]),", ",JSON.stringify(b.source.currentLocation)," )"]:e}var g=c(13)["default"],h=c(1)["default"];b.__esModule=!0;var i=c(4),j=c(6),k=h(j),l=c(5),m=c(53),n=h(m);e.prototype={nameLookup:function(a,b){return this.internalNameLookup(a,b)},depthedLookup:function(a){return[this.aliasable("container.lookup"),"(depths, ",JSON.stringify(a),")"]},compilerInfo:function(){var a=i.COMPILER_REVISION,b=i.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return l.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("")},internalNameLookup:function(a,b){return this.lookupPropertyFunctionIsUsed=!0,["lookupProperty(",a,",",JSON.stringify(b),")"]},lookupPropertyFunctionIsUsed:!1,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 k["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, ",this.lookupPropertyFunctionVarDeclaration(),";\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 j=this.createFunctionContext(d);if(this.isChild)return j;var l={compiler:this.compilerInfo(),main:j};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 n["default"](this.options.srcName),this.decorators=new n["default"](this.options.srcName)},createFunctionContext:function(a){var b=this,c="",d=this.stackVars.concat(this.registers.list);d.length>0&&(c+=", "+d.join(", "));var e=0;g(this.aliases).forEach(function(a){var d=b.aliases[a];d.children&&d.referenceCount>1&&(c+=", alias"+ ++e+"="+a,d.children[0]="alias"+e)}),this.lookupPropertyFunctionIsUsed&&(c+=", "+this.lookupPropertyFunctionVarDeclaration());var f=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&f.push("blockParams"),this.useDepths&&f.push("depths");var h=this.mergeSource(c);return a?(f.push(h),Function.apply(this,f)):this.source.wrap(["function(",f.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()},lookupPropertyFunctionVarDeclaration:function(){return"\n      lookupProperty = container.lookupProperty || function(parent, propertyName) {\n        if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {\n          return parent[propertyName];\n        }\n        return undefined\n    }\n    ".trim()},blockValue:function(a){var b=this.aliasable("container.hooks.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("container.hooks.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){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&&f.push(e.name),f.push(d),this.options.strict||f.push(this.aliasable("container.hooks.helperMissing"));var g=["(",this.itemsSeparatedBy(f,"||"),")"],h=this.source.functionCall(g,"call",e.callParams);this.push(h)},itemsSeparatedBy:function(a,b){var c=[];c.push(a[0]);for(var d=1;d<a.length;d++)c.push(b,a[d]);return c},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("container.hooks.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 k["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 k["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.loc=JSON.stringify(this.source.currentLocation),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(g.isArray(a)){for(var d=[],e=0,f=a.length;e<f;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=[]}var f=c(13)["default"];b.__esModule=!0;var g=c(5),h=void 0;try{}catch(i){}h||(h=function(a,b,c,d){this.src="",d&&this.add(d)},h.prototype={add:function(a){g.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){g.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 h(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 h?a:(a=d(a,this,b),new h(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=this,c=[];f(a).forEach(function(e){var f=d(a[e],b);"undefined"!==f&&c.push([b.quotedString(e),":",f])});var e=this.generateList(c);return e.prepend("{"),e.add("}"),e},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"]}])});

/* ======================================== */
/* qTip2 v2.2.1 | Plugins: tips modal viewport svg imagemap ie6 | Styles: core basic css3 | qtip2.com | Licensed MIT | Sat Sep 06 2014 23:12:07 */

!function(a,b,c){!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.qtip&&a(jQuery)}(function(d){"use strict";function e(a,b,c,e){this.id=c,this.target=a,this.tooltip=F,this.elements={target:a},this._id=S+"-"+c,this.timers={img:{}},this.options=b,this.plugins={},this.cache={event:{},target:d(),disabled:E,attr:e,onTooltip:E,lastClass:""},this.rendered=this.destroyed=this.disabled=this.waiting=this.hiddenDuringWait=this.positioning=this.triggering=E}function f(a){return a===F||"object"!==d.type(a)}function g(a){return!(d.isFunction(a)||a&&a.attr||a.length||"object"===d.type(a)&&(a.jquery||a.then))}function h(a){var b,c,e,h;return f(a)?E:(f(a.metadata)&&(a.metadata={type:a.metadata}),"content"in a&&(b=a.content,f(b)||b.jquery||b.done?b=a.content={text:c=g(b)?E:b}:c=b.text,"ajax"in b&&(e=b.ajax,h=e&&e.once!==E,delete b.ajax,b.text=function(a,b){var f=c||d(this).attr(b.options.content.attr)||"Loading...",g=d.ajax(d.extend({},e,{context:b})).then(e.success,F,e.error).then(function(a){return a&&h&&b.set("content.text",a),a},function(a,c,d){b.destroyed||0===a.status||b.set("content.text",c+": "+d)});return h?f:(b.set("content.text",f),g)}),"title"in b&&(d.isPlainObject(b.title)&&(b.button=b.title.button,b.title=b.title.text),g(b.title||E)&&(b.title=E))),"position"in a&&f(a.position)&&(a.position={my:a.position,at:a.position}),"show"in a&&f(a.show)&&(a.show=a.show.jquery?{target:a.show}:a.show===D?{ready:D}:{event:a.show}),"hide"in a&&f(a.hide)&&(a.hide=a.hide.jquery?{target:a.hide}:{event:a.hide}),"style"in a&&f(a.style)&&(a.style={classes:a.style}),d.each(R,function(){this.sanitize&&this.sanitize(a)}),a)}function i(a,b){for(var c,d=0,e=a,f=b.split(".");e=e[f[d++]];)d<f.length&&(c=e);return[c||a,f.pop()]}function j(a,b){var c,d,e;for(c in this.checks)for(d in this.checks[c])(e=new RegExp(d,"i").exec(a))&&(b.push(e),("builtin"===c||this.plugins[c])&&this.checks[c][d].apply(this.plugins[c]||this,b))}function k(a){return V.concat("").join(a?"-"+a+" ":" ")}function l(a,b){return b>0?setTimeout(d.proxy(a,this),b):void a.call(this)}function m(a){this.tooltip.hasClass(ab)||(clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this.timers.show=l.call(this,function(){this.toggle(D,a)},this.options.show.delay))}function n(a){if(!this.tooltip.hasClass(ab)&&!this.destroyed){var b=d(a.relatedTarget),c=b.closest(W)[0]===this.tooltip[0],e=b[0]===this.options.show.target[0];if(clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this!==b[0]&&"mouse"===this.options.position.target&&c||this.options.hide.fixed&&/mouse(out|leave|move)/.test(a.type)&&(c||e))try{a.preventDefault(),a.stopImmediatePropagation()}catch(f){}else this.timers.hide=l.call(this,function(){this.toggle(E,a)},this.options.hide.delay,this)}}function o(a){!this.tooltip.hasClass(ab)&&this.options.hide.inactive&&(clearTimeout(this.timers.inactive),this.timers.inactive=l.call(this,function(){this.hide(a)},this.options.hide.inactive))}function p(a){this.rendered&&this.tooltip[0].offsetWidth>0&&this.reposition(a)}function q(a,c,e){d(b.body).delegate(a,(c.split?c:c.join("."+S+" "))+"."+S,function(){var a=y.api[d.attr(this,U)];a&&!a.disabled&&e.apply(a,arguments)})}function r(a,c,f){var g,i,j,k,l,m=d(b.body),n=a[0]===b?m:a,o=a.metadata?a.metadata(f.metadata):F,p="html5"===f.metadata.type&&o?o[f.metadata.name]:F,q=a.data(f.metadata.name||"qtipopts");try{q="string"==typeof q?d.parseJSON(q):q}catch(r){}if(k=d.extend(D,{},y.defaults,f,"object"==typeof q?h(q):F,h(p||o)),i=k.position,k.id=c,"boolean"==typeof k.content.text){if(j=a.attr(k.content.attr),k.content.attr===E||!j)return E;k.content.text=j}if(i.container.length||(i.container=m),i.target===E&&(i.target=n),k.show.target===E&&(k.show.target=n),k.show.solo===D&&(k.show.solo=i.container.closest("body")),k.hide.target===E&&(k.hide.target=n),k.position.viewport===D&&(k.position.viewport=i.container),i.container=i.container.eq(0),i.at=new A(i.at,D),i.my=new A(i.my),a.data(S))if(k.overwrite)a.qtip("destroy",!0);else if(k.overwrite===E)return E;return a.attr(T,c),k.suppress&&(l=a.attr("title"))&&a.removeAttr("title").attr(cb,l).attr("title",""),g=new e(a,k,c,!!j),a.data(S,g),g}function s(a){return a.charAt(0).toUpperCase()+a.slice(1)}function t(a,b){var d,e,f=b.charAt(0).toUpperCase()+b.slice(1),g=(b+" "+rb.join(f+" ")+f).split(" "),h=0;if(qb[b])return a.css(qb[b]);for(;d=g[h++];)if((e=a.css(d))!==c)return qb[b]=d,e}function u(a,b){return Math.ceil(parseFloat(t(a,b)))}function v(a,b){this._ns="tip",this.options=b,this.offset=b.offset,this.size=[b.width,b.height],this.init(this.qtip=a)}function w(a,b){this.options=b,this._ns="-modal",this.init(this.qtip=a)}function x(a){this._ns="ie6",this.init(this.qtip=a)}var y,z,A,B,C,D=!0,E=!1,F=null,G="x",H="y",I="width",J="height",K="top",L="left",M="bottom",N="right",O="center",P="flipinvert",Q="shift",R={},S="qtip",T="data-hasqtip",U="data-qtip-id",V=["ui-widget","ui-tooltip"],W="."+S,X="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),Y=S+"-fixed",Z=S+"-default",$=S+"-focus",_=S+"-hover",ab=S+"-disabled",bb="_replacedByqTip",cb="oldtitle",db={ie:function(){for(var a=4,c=b.createElement("div");(c.innerHTML="<!--[if gt IE "+a+"]><i></i><![endif]-->")&&c.getElementsByTagName("i")[0];a+=1);return a>4?a:0/0}(),iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||E};z=e.prototype,z._when=function(a){return d.when.apply(d,a)},z.render=function(a){if(this.rendered||this.destroyed)return this;var b,c=this,e=this.options,f=this.cache,g=this.elements,h=e.content.text,i=e.content.title,j=e.content.button,k=e.position,l=("."+this._id+" ",[]);return d.attr(this.target[0],"aria-describedby",this._id),f.posClass=this._createPosClass((this.position={my:k.my,at:k.at}).my),this.tooltip=g.tooltip=b=d("<div/>",{id:this._id,"class":[S,Z,e.style.classes,f.posClass].join(" "),width:e.style.width||"",height:e.style.height||"",tracking:"mouse"===k.target&&k.adjust.mouse,role:"alert","aria-live":"polite","aria-atomic":E,"aria-describedby":this._id+"-content","aria-hidden":D}).toggleClass(ab,this.disabled).attr(U,this.id).data(S,this).appendTo(k.container).append(g.content=d("<div />",{"class":S+"-content",id:this._id+"-content","aria-atomic":D})),this.rendered=-1,this.positioning=D,i&&(this._createTitle(),d.isFunction(i)||l.push(this._updateTitle(i,E))),j&&this._createButton(),d.isFunction(h)||l.push(this._updateContent(h,E)),this.rendered=D,this._setWidget(),d.each(R,function(a){var b;"render"===this.initialize&&(b=this(c))&&(c.plugins[a]=b)}),this._unassignEvents(),this._assignEvents(),this._when(l).then(function(){c._trigger("render"),c.positioning=E,c.hiddenDuringWait||!e.show.ready&&!a||c.toggle(D,f.event,E),c.hiddenDuringWait=E}),y.api[this.id]=this,this},z.destroy=function(a){function b(){if(!this.destroyed){this.destroyed=D;var a,b=this.target,c=b.attr(cb);this.rendered&&this.tooltip.stop(1,0).find("*").remove().end().remove(),d.each(this.plugins,function(){this.destroy&&this.destroy()});for(a in this.timers)clearTimeout(this.timers[a]);b.removeData(S).removeAttr(U).removeAttr(T).removeAttr("aria-describedby"),this.options.suppress&&c&&b.attr("title",c).removeAttr(cb),this._unassignEvents(),this.options=this.elements=this.cache=this.timers=this.plugins=this.mouse=F,delete y.api[this.id]}}return this.destroyed?this.target:(a===D&&"hide"!==this.triggering||!this.rendered?b.call(this):(this.tooltip.one("tooltiphidden",d.proxy(b,this)),!this.triggering&&this.hide()),this.target)},B=z.checks={builtin:{"^id$":function(a,b,c,e){var f=c===D?y.nextid:c,g=S+"-"+f;f!==E&&f.length>0&&!d("#"+g).length?(this._id=g,this.rendered&&(this.tooltip[0].id=this._id,this.elements.content[0].id=this._id+"-content",this.elements.title[0].id=this._id+"-title")):a[b]=e},"^prerender":function(a,b,c){c&&!this.rendered&&this.render(this.options.show.ready)},"^content.text$":function(a,b,c){this._updateContent(c)},"^content.attr$":function(a,b,c,d){this.options.content.text===this.target.attr(d)&&this._updateContent(this.target.attr(c))},"^content.title$":function(a,b,c){return c?(c&&!this.elements.title&&this._createTitle(),void this._updateTitle(c)):this._removeTitle()},"^content.button$":function(a,b,c){this._updateButton(c)},"^content.title.(text|button)$":function(a,b,c){this.set("content."+b,c)},"^position.(my|at)$":function(a,b,c){"string"==typeof c&&(this.position[b]=a[b]=new A(c,"at"===b))},"^position.container$":function(a,b,c){this.rendered&&this.tooltip.appendTo(c)},"^show.ready$":function(a,b,c){c&&(!this.rendered&&this.render(D)||this.toggle(D))},"^style.classes$":function(a,b,c,d){this.rendered&&this.tooltip.removeClass(d).addClass(c)},"^style.(width|height)":function(a,b,c){this.rendered&&this.tooltip.css(b,c)},"^style.widget|content.title":function(){this.rendered&&this._setWidget()},"^style.def":function(a,b,c){this.rendered&&this.tooltip.toggleClass(Z,!!c)},"^events.(render|show|move|hide|focus|blur)$":function(a,b,c){this.rendered&&this.tooltip[(d.isFunction(c)?"":"un")+"bind"]("tooltip"+b,c)},"^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)":function(){if(this.rendered){var a=this.options.position;this.tooltip.attr("tracking","mouse"===a.target&&a.adjust.mouse),this._unassignEvents(),this._assignEvents()}}}},z.get=function(a){if(this.destroyed)return this;var b=i(this.options,a.toLowerCase()),c=b[0][b[1]];return c.precedance?c.string():c};var eb=/^position\.(my|at|adjust|target|container|viewport)|style|content|show\.ready/i,fb=/^prerender|show\.ready/i;z.set=function(a,b){if(this.destroyed)return this;{var c,e=this.rendered,f=E,g=this.options;this.checks}return"string"==typeof a?(c=a,a={},a[c]=b):a=d.extend({},a),d.each(a,function(b,c){if(e&&fb.test(b))return void delete a[b];var h,j=i(g,b.toLowerCase());h=j[0][j[1]],j[0][j[1]]=c&&c.nodeType?d(c):c,f=eb.test(b)||f,a[b]=[j[0],j[1],c,h]}),h(g),this.positioning=D,d.each(a,d.proxy(j,this)),this.positioning=E,this.rendered&&this.tooltip[0].offsetWidth>0&&f&&this.reposition("mouse"===g.position.target?F:this.cache.event),this},z._update=function(a,b){var c=this,e=this.cache;return this.rendered&&a?(d.isFunction(a)&&(a=a.call(this.elements.target,e.event,this)||""),d.isFunction(a.then)?(e.waiting=D,a.then(function(a){return e.waiting=E,c._update(a,b)},F,function(a){return c._update(a,b)})):a===E||!a&&""!==a?E:(a.jquery&&a.length>0?b.empty().append(a.css({display:"block",visibility:"visible"})):b.html(a),this._waitForContent(b).then(function(a){c.rendered&&c.tooltip[0].offsetWidth>0&&c.reposition(e.event,!a.length)}))):E},z._waitForContent=function(a){var b=this.cache;return b.waiting=D,(d.fn.imagesLoaded?a.imagesLoaded():d.Deferred().resolve([])).done(function(){b.waiting=E}).promise()},z._updateContent=function(a,b){this._update(a,this.elements.content,b)},z._updateTitle=function(a,b){this._update(a,this.elements.title,b)===E&&this._removeTitle(E)},z._createTitle=function(){var a=this.elements,b=this._id+"-title";a.titlebar&&this._removeTitle(),a.titlebar=d("<div />",{"class":S+"-titlebar "+(this.options.style.widget?k("header"):"")}).append(a.title=d("<div />",{id:b,"class":S+"-title","aria-atomic":D})).insertBefore(a.content).delegate(".qtip-close","mousedown keydown mouseup keyup mouseout",function(a){d(this).toggleClass("ui-state-active ui-state-focus","down"===a.type.substr(-4))}).delegate(".qtip-close","mouseover mouseout",function(a){d(this).toggleClass("ui-state-hover","mouseover"===a.type)}),this.options.content.button&&this._createButton()},z._removeTitle=function(a){var b=this.elements;b.title&&(b.titlebar.remove(),b.titlebar=b.title=b.button=F,a!==E&&this.reposition())},z._createPosClass=function(a){return S+"-pos-"+(a||this.options.position.my).abbrev()},z.reposition=function(c,e){if(!this.rendered||this.positioning||this.destroyed)return this;this.positioning=D;var f,g,h,i,j=this.cache,k=this.tooltip,l=this.options.position,m=l.target,n=l.my,o=l.at,p=l.viewport,q=l.container,r=l.adjust,s=r.method.split(" "),t=k.outerWidth(E),u=k.outerHeight(E),v=0,w=0,x=k.css("position"),y={left:0,top:0},z=k[0].offsetWidth>0,A=c&&"scroll"===c.type,B=d(a),C=q[0].ownerDocument,F=this.mouse;if(d.isArray(m)&&2===m.length)o={x:L,y:K},y={left:m[0],top:m[1]};else if("mouse"===m)o={x:L,y:K},(!r.mouse||this.options.hide.distance)&&j.origin&&j.origin.pageX?c=j.origin:!c||c&&("resize"===c.type||"scroll"===c.type)?c=j.event:F&&F.pageX&&(c=F),"static"!==x&&(y=q.offset()),C.body.offsetWidth!==(a.innerWidth||C.documentElement.clientWidth)&&(g=d(b.body).offset()),y={left:c.pageX-y.left+(g&&g.left||0),top:c.pageY-y.top+(g&&g.top||0)},r.mouse&&A&&F&&(y.left-=(F.scrollX||0)-B.scrollLeft(),y.top-=(F.scrollY||0)-B.scrollTop());else{if("event"===m?c&&c.target&&"scroll"!==c.type&&"resize"!==c.type?j.target=d(c.target):c.target||(j.target=this.elements.target):"event"!==m&&(j.target=d(m.jquery?m:this.elements.target)),m=j.target,m=d(m).eq(0),0===m.length)return this;m[0]===b||m[0]===a?(v=db.iOS?a.innerWidth:m.width(),w=db.iOS?a.innerHeight:m.height(),m[0]===a&&(y={top:(p||m).scrollTop(),left:(p||m).scrollLeft()})):R.imagemap&&m.is("area")?f=R.imagemap(this,m,o,R.viewport?s:E):R.svg&&m&&m[0].ownerSVGElement?f=R.svg(this,m,o,R.viewport?s:E):(v=m.outerWidth(E),w=m.outerHeight(E),y=m.offset()),f&&(v=f.width,w=f.height,g=f.offset,y=f.position),y=this.reposition.offset(m,y,q),(db.iOS>3.1&&db.iOS<4.1||db.iOS>=4.3&&db.iOS<4.33||!db.iOS&&"fixed"===x)&&(y.left-=B.scrollLeft(),y.top-=B.scrollTop()),(!f||f&&f.adjustable!==E)&&(y.left+=o.x===N?v:o.x===O?v/2:0,y.top+=o.y===M?w:o.y===O?w/2:0)}return y.left+=r.x+(n.x===N?-t:n.x===O?-t/2:0),y.top+=r.y+(n.y===M?-u:n.y===O?-u/2:0),R.viewport?(h=y.adjusted=R.viewport(this,y,l,v,w,t,u),g&&h.left&&(y.left+=g.left),g&&h.top&&(y.top+=g.top),h.my&&(this.position.my=h.my)):y.adjusted={left:0,top:0},j.posClass!==(i=this._createPosClass(this.position.my))&&k.removeClass(j.posClass).addClass(j.posClass=i),this._trigger("move",[y,p.elem||p],c)?(delete y.adjusted,e===E||!z||isNaN(y.left)||isNaN(y.top)||"mouse"===m||!d.isFunction(l.effect)?k.css(y):d.isFunction(l.effect)&&(l.effect.call(k,this,d.extend({},y)),k.queue(function(a){d(this).css({opacity:"",height:""}),db.ie&&this.style.removeAttribute("filter"),a()})),this.positioning=E,this):this},z.reposition.offset=function(a,c,e){function f(a,b){c.left+=b*a.scrollLeft(),c.top+=b*a.scrollTop()}if(!e[0])return c;var g,h,i,j,k=d(a[0].ownerDocument),l=!!db.ie&&"CSS1Compat"!==b.compatMode,m=e[0];do"static"!==(h=d.css(m,"position"))&&("fixed"===h?(i=m.getBoundingClientRect(),f(k,-1)):(i=d(m).position(),i.left+=parseFloat(d.css(m,"borderLeftWidth"))||0,i.top+=parseFloat(d.css(m,"borderTopWidth"))||0),c.left-=i.left+(parseFloat(d.css(m,"marginLeft"))||0),c.top-=i.top+(parseFloat(d.css(m,"marginTop"))||0),g||"hidden"===(j=d.css(m,"overflow"))||"visible"===j||(g=d(m)));while(m=m.offsetParent);return g&&(g[0]!==k[0]||l)&&f(g,1),c};var gb=(A=z.reposition.Corner=function(a,b){a=(""+a).replace(/([A-Z])/," $1").replace(/middle/gi,O).toLowerCase(),this.x=(a.match(/left|right/i)||a.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(a.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase(),this.forceY=!!b;var c=a.charAt(0);this.precedance="t"===c||"b"===c?H:G}).prototype;gb.invert=function(a,b){this[a]=this[a]===L?N:this[a]===N?L:b||this[a]},gb.string=function(a){var b=this.x,c=this.y,d=b!==c?"center"===b||"center"!==c&&(this.precedance===H||this.forceY)?[c,b]:[b,c]:[b];return a!==!1?d.join(" "):d},gb.abbrev=function(){var a=this.string(!1);return a[0].charAt(0)+(a[1]&&a[1].charAt(0)||"")},gb.clone=function(){return new A(this.string(),this.forceY)},z.toggle=function(a,c){var e=this.cache,f=this.options,g=this.tooltip;if(c){if(/over|enter/.test(c.type)&&e.event&&/out|leave/.test(e.event.type)&&f.show.target.add(c.target).length===f.show.target.length&&g.has(c.relatedTarget).length)return this;e.event=d.event.fix(c)}if(this.waiting&&!a&&(this.hiddenDuringWait=D),!this.rendered)return a?this.render(1):this;if(this.destroyed||this.disabled)return this;var h,i,j,k=a?"show":"hide",l=this.options[k],m=(this.options[a?"hide":"show"],this.options.position),n=this.options.content,o=this.tooltip.css("width"),p=this.tooltip.is(":visible"),q=a||1===l.target.length,r=!c||l.target.length<2||e.target[0]===c.target;return(typeof a).search("boolean|number")&&(a=!p),h=!g.is(":animated")&&p===a&&r,i=h?F:!!this._trigger(k,[90]),this.destroyed?this:(i!==E&&a&&this.focus(c),!i||h?this:(d.attr(g[0],"aria-hidden",!a),a?(this.mouse&&(e.origin=d.event.fix(this.mouse)),d.isFunction(n.text)&&this._updateContent(n.text,E),d.isFunction(n.title)&&this._updateTitle(n.title,E),!C&&"mouse"===m.target&&m.adjust.mouse&&(d(b).bind("mousemove."+S,this._storeMouse),C=D),o||g.css("width",g.outerWidth(E)),this.reposition(c,arguments[2]),o||g.css("width",""),l.solo&&("string"==typeof l.solo?d(l.solo):d(W,l.solo)).not(g).not(l.target).qtip("hide",d.Event("tooltipsolo"))):(clearTimeout(this.timers.show),delete e.origin,C&&!d(W+'[tracking="true"]:visible',l.solo).not(g).length&&(d(b).unbind("mousemove."+S),C=E),this.blur(c)),j=d.proxy(function(){a?(db.ie&&g[0].style.removeAttribute("filter"),g.css("overflow",""),"string"==typeof l.autofocus&&d(this.options.show.autofocus,g).focus(),this.options.show.target.trigger("qtip-"+this.id+"-inactive")):g.css({display:"",visibility:"",opacity:"",left:"",top:""}),this._trigger(a?"visible":"hidden")},this),l.effect===E||q===E?(g[k](),j()):d.isFunction(l.effect)?(g.stop(1,1),l.effect.call(g,this),g.queue("fx",function(a){j(),a()})):g.fadeTo(90,a?1:0,j),a&&l.target.trigger("qtip-"+this.id+"-inactive"),this))},z.show=function(a){return this.toggle(D,a)},z.hide=function(a){return this.toggle(E,a)},z.focus=function(a){if(!this.rendered||this.destroyed)return this;var b=d(W),c=this.tooltip,e=parseInt(c[0].style.zIndex,10),f=y.zindex+b.length;return c.hasClass($)||this._trigger("focus",[f],a)&&(e!==f&&(b.each(function(){this.style.zIndex>e&&(this.style.zIndex=this.style.zIndex-1)}),b.filter("."+$).qtip("blur",a)),c.addClass($)[0].style.zIndex=f),this},z.blur=function(a){return!this.rendered||this.destroyed?this:(this.tooltip.removeClass($),this._trigger("blur",[this.tooltip.css("zIndex")],a),this)},z.disable=function(a){return this.destroyed?this:("toggle"===a?a=!(this.rendered?this.tooltip.hasClass(ab):this.disabled):"boolean"!=typeof a&&(a=D),this.rendered&&this.tooltip.toggleClass(ab,a).attr("aria-disabled",a),this.disabled=!!a,this)},z.enable=function(){return this.disable(E)},z._createButton=function(){var a=this,b=this.elements,c=b.tooltip,e=this.options.content.button,f="string"==typeof e,g=f?e:"Close tooltip";b.button&&b.button.remove(),b.button=e.jquery?e:d("<a />",{"class":"qtip-close "+(this.options.style.widget?"":S+"-icon"),title:g,"aria-label":g}).prepend(d("<span />",{"class":"ui-icon ui-icon-close",html:"&times;"})),b.button.appendTo(b.titlebar||c).attr("role","button").click(function(b){return c.hasClass(ab)||a.hide(b),E})},z._updateButton=function(a){if(!this.rendered)return E;var b=this.elements.button;a?this._createButton():b.remove()},z._setWidget=function(){var a=this.options.style.widget,b=this.elements,c=b.tooltip,d=c.hasClass(ab);c.removeClass(ab),ab=a?"ui-state-disabled":"qtip-disabled",c.toggleClass(ab,d),c.toggleClass("ui-helper-reset "+k(),a).toggleClass(Z,this.options.style.def&&!a),b.content&&b.content.toggleClass(k("content"),a),b.titlebar&&b.titlebar.toggleClass(k("header"),a),b.button&&b.button.toggleClass(S+"-icon",!a)},z._storeMouse=function(a){return(this.mouse=d.event.fix(a)).type="mousemove",this},z._bind=function(a,b,c,e,f){if(a&&c&&b.length){var g="."+this._id+(e?"-"+e:"");return d(a).bind((b.split?b:b.join(g+" "))+g,d.proxy(c,f||this)),this}},z._unbind=function(a,b){return a&&d(a).unbind("."+this._id+(b?"-"+b:"")),this},z._trigger=function(a,b,c){var e=d.Event("tooltip"+a);return e.originalEvent=c&&d.extend({},c)||this.cache.event||F,this.triggering=a,this.tooltip.trigger(e,[this].concat(b||[])),this.triggering=E,!e.isDefaultPrevented()},z._bindEvents=function(a,b,c,e,f,g){var h=c.filter(e).add(e.filter(c)),i=[];h.length&&(d.each(b,function(b,c){var e=d.inArray(c,a);e>-1&&i.push(a.splice(e,1)[0])}),i.length&&(this._bind(h,i,function(a){var b=this.rendered?this.tooltip[0].offsetWidth>0:!1;(b?g:f).call(this,a)}),c=c.not(h),e=e.not(h))),this._bind(c,a,f),this._bind(e,b,g)},z._assignInitialEvents=function(a){function b(a){return this.disabled||this.destroyed?E:(this.cache.event=a&&d.event.fix(a),this.cache.target=a&&d(a.target),clearTimeout(this.timers.show),void(this.timers.show=l.call(this,function(){this.render("object"==typeof a||c.show.ready)},c.prerender?0:c.show.delay)))}var c=this.options,e=c.show.target,f=c.hide.target,g=c.show.event?d.trim(""+c.show.event).split(" "):[],h=c.hide.event?d.trim(""+c.hide.event).split(" "):[];this._bind(this.elements.target,["remove","removeqtip"],function(){this.destroy(!0)},"destroy"),/mouse(over|enter)/i.test(c.show.event)&&!/mouse(out|leave)/i.test(c.hide.event)&&h.push("mouseleave"),this._bind(e,"mousemove",function(a){this._storeMouse(a),this.cache.onTarget=D}),this._bindEvents(g,h,e,f,b,function(){return this.timers?void clearTimeout(this.timers.show):E}),(c.show.ready||c.prerender)&&b.call(this,a)},z._assignEvents=function(){var c=this,e=this.options,f=e.position,g=this.tooltip,h=e.show.target,i=e.hide.target,j=f.container,k=f.viewport,l=d(b),q=(d(b.body),d(a)),r=e.show.event?d.trim(""+e.show.event).split(" "):[],s=e.hide.event?d.trim(""+e.hide.event).split(" "):[];d.each(e.events,function(a,b){c._bind(g,"toggle"===a?["tooltipshow","tooltiphide"]:["tooltip"+a],b,null,g)}),/mouse(out|leave)/i.test(e.hide.event)&&"window"===e.hide.leave&&this._bind(l,["mouseout","blur"],function(a){/select|option/.test(a.target.nodeName)||a.relatedTarget||this.hide(a)}),e.hide.fixed?i=i.add(g.addClass(Y)):/mouse(over|enter)/i.test(e.show.event)&&this._bind(i,"mouseleave",function(){clearTimeout(this.timers.show)}),(""+e.hide.event).indexOf("unfocus")>-1&&this._bind(j.closest("html"),["mousedown","touchstart"],function(a){var b=d(a.target),c=this.rendered&&!this.tooltip.hasClass(ab)&&this.tooltip[0].offsetWidth>0,e=b.parents(W).filter(this.tooltip[0]).length>0;b[0]===this.target[0]||b[0]===this.tooltip[0]||e||this.target.has(b[0]).length||!c||this.hide(a)}),"number"==typeof e.hide.inactive&&(this._bind(h,"qtip-"+this.id+"-inactive",o,"inactive"),this._bind(i.add(g),y.inactiveEvents,o)),this._bindEvents(r,s,h,i,m,n),this._bind(h.add(g),"mousemove",function(a){if("number"==typeof e.hide.distance){var b=this.cache.origin||{},c=this.options.hide.distance,d=Math.abs;(d(a.pageX-b.pageX)>=c||d(a.pageY-b.pageY)>=c)&&this.hide(a)}this._storeMouse(a)}),"mouse"===f.target&&f.adjust.mouse&&(e.hide.event&&this._bind(h,["mouseenter","mouseleave"],function(a){return this.cache?void(this.cache.onTarget="mouseenter"===a.type):E}),this._bind(l,"mousemove",function(a){this.rendered&&this.cache.onTarget&&!this.tooltip.hasClass(ab)&&this.tooltip[0].offsetWidth>0&&this.reposition(a)})),(f.adjust.resize||k.length)&&this._bind(d.event.special.resize?k:q,"resize",p),f.adjust.scroll&&this._bind(q.add(f.container),"scroll",p)},z._unassignEvents=function(){var c=this.options,e=c.show.target,f=c.hide.target,g=d.grep([this.elements.target[0],this.rendered&&this.tooltip[0],c.position.container[0],c.position.viewport[0],c.position.container.closest("html")[0],a,b],function(a){return"object"==typeof a});e&&e.toArray&&(g=g.concat(e.toArray())),f&&f.toArray&&(g=g.concat(f.toArray())),this._unbind(g)._unbind(g,"destroy")._unbind(g,"inactive")},d(function(){q(W,["mouseenter","mouseleave"],function(a){var b="mouseenter"===a.type,c=d(a.currentTarget),e=d(a.relatedTarget||a.target),f=this.options;b?(this.focus(a),c.hasClass(Y)&&!c.hasClass(ab)&&clearTimeout(this.timers.hide)):"mouse"===f.position.target&&f.position.adjust.mouse&&f.hide.event&&f.show.target&&!e.closest(f.show.target[0]).length&&this.hide(a),c.toggleClass(_,b)}),q("["+U+"]",X,o)}),y=d.fn.qtip=function(a,b,e){var f=(""+a).toLowerCase(),g=F,i=d.makeArray(arguments).slice(1),j=i[i.length-1],k=this[0]?d.data(this[0],S):F;return!arguments.length&&k||"api"===f?k:"string"==typeof a?(this.each(function(){var a=d.data(this,S);if(!a)return D;if(j&&j.timeStamp&&(a.cache.event=j),!b||"option"!==f&&"options"!==f)a[f]&&a[f].apply(a,i);else{if(e===c&&!d.isPlainObject(b))return g=a.get(b),E;a.set(b,e)}}),g!==F?g:this):"object"!=typeof a&&arguments.length?void 0:(k=h(d.extend(D,{},a)),this.each(function(a){var b,c;return c=d.isArray(k.id)?k.id[a]:k.id,c=!c||c===E||c.length<1||y.api[c]?y.nextid++:c,b=r(d(this),c,k),b===E?D:(y.api[c]=b,d.each(R,function(){"initialize"===this.initialize&&this(b)}),void b._assignInitialEvents(j))}))},d.qtip=e,y.api={},d.each({attr:function(a,b){if(this.length){var c=this[0],e="title",f=d.data(c,"qtip");if(a===e&&f&&"object"==typeof f&&f.options.suppress)return arguments.length<2?d.attr(c,cb):(f&&f.options.content.attr===e&&f.cache.attr&&f.set("content.text",b),this.attr(cb,b))}return d.fn["attr"+bb].apply(this,arguments)},clone:function(a){var b=(d([]),d.fn["clone"+bb].apply(this,arguments));return a||b.filter("["+cb+"]").attr("title",function(){return d.attr(this,cb)}).removeAttr(cb),b}},function(a,b){if(!b||d.fn[a+bb])return D;var c=d.fn[a+bb]=d.fn[a];d.fn[a]=function(){return b.apply(this,arguments)||c.apply(this,arguments)}}),d.ui||(d["cleanData"+bb]=d.cleanData,d.cleanData=function(a){for(var b,c=0;(b=d(a[c])).length;c++)if(b.attr(T))try{b.triggerHandler("removeqtip")}catch(e){}d["cleanData"+bb].apply(this,arguments)}),y.version="2.2.1",y.nextid=0,y.inactiveEvents=X,y.zindex=15e3,y.defaults={prerender:E,id:E,overwrite:D,suppress:D,content:{text:D,attr:"title",title:E,button:E},position:{my:"top left",at:"bottom right",target:E,container:E,viewport:E,adjust:{x:0,y:0,mouse:D,scroll:D,resize:D,method:"flipinvert flipinvert"},effect:function(a,b){d(this).animate(b,{duration:200,queue:E})}},show:{target:E,event:"mouseenter",effect:D,delay:90,solo:E,ready:E,autofocus:E},hide:{target:E,event:"mouseleave",effect:D,delay:0,fixed:E,inactive:E,leave:"window",distance:E},style:{classes:"",widget:E,width:E,height:E,def:D},events:{render:F,move:F,show:F,hide:F,toggle:F,visible:F,hidden:F,focus:F,blur:F}};var hb,ib="margin",jb="border",kb="color",lb="background-color",mb="transparent",nb=" !important",ob=!!b.createElement("canvas").getContext,pb=/rgba?\(0, 0, 0(, 0)?\)|transparent|#123456/i,qb={},rb=["Webkit","O","Moz","ms"];if(ob)var sb=a.devicePixelRatio||1,tb=function(){var a=b.createElement("canvas").getContext("2d");return a.backingStorePixelRatio||a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||1}(),ub=sb/tb;else var vb=function(a,b,c){return"<qtipvml:"+a+' xmlns="urn:schemas-microsoft.com:vml" class="qtip-vml" '+(b||"")+' style="behavior: url(#default#VML); '+(c||"")+'" />'};d.extend(v.prototype,{init:function(a){var b,c;c=this.element=a.elements.tip=d("<div />",{"class":S+"-tip"}).prependTo(a.tooltip),ob?(b=d("<canvas />").appendTo(this.element)[0].getContext("2d"),b.lineJoin="miter",b.miterLimit=1e5,b.save()):(b=vb("shape",'coordorigin="0,0"',"position:absolute;"),this.element.html(b+b),a._bind(d("*",c).add(c),["click","mousedown"],function(a){a.stopPropagation()},this._ns)),a._bind(a.tooltip,"tooltipmove",this.reposition,this._ns,this),this.create()},_swapDimensions:function(){this.size[0]=this.options.height,this.size[1]=this.options.width},_resetDimensions:function(){this.size[0]=this.options.width,this.size[1]=this.options.height},_useTitle:function(a){var b=this.qtip.elements.titlebar;return b&&(a.y===K||a.y===O&&this.element.position().top+this.size[1]/2+this.options.offset<b.outerHeight(D))},_parseCorner:function(a){var b=this.qtip.options.position.my;return a===E||b===E?a=E:a===D?a=new A(b.string()):a.string||(a=new A(a),a.fixed=D),a},_parseWidth:function(a,b,c){var d=this.qtip.elements,e=jb+s(b)+"Width";return(c?u(c,e):u(d.content,e)||u(this._useTitle(a)&&d.titlebar||d.content,e)||u(d.tooltip,e))||0},_parseRadius:function(a){var b=this.qtip.elements,c=jb+s(a.y)+s(a.x)+"Radius";return db.ie<9?0:u(this._useTitle(a)&&b.titlebar||b.content,c)||u(b.tooltip,c)||0},_invalidColour:function(a,b,c){var d=a.css(b);return!d||c&&d===a.css(c)||pb.test(d)?E:d},_parseColours:function(a){var b=this.qtip.elements,c=this.element.css("cssText",""),e=jb+s(a[a.precedance])+s(kb),f=this._useTitle(a)&&b.titlebar||b.content,g=this._invalidColour,h=[];return h[0]=g(c,lb)||g(f,lb)||g(b.content,lb)||g(b.tooltip,lb)||c.css(lb),h[1]=g(c,e,kb)||g(f,e,kb)||g(b.content,e,kb)||g(b.tooltip,e,kb)||b.tooltip.css(e),d("*",c).add(c).css("cssText",lb+":"+mb+nb+";"+jb+":0"+nb+";"),h},_calculateSize:function(a){var b,c,d,e=a.precedance===H,f=this.options.width,g=this.options.height,h="c"===a.abbrev(),i=(e?f:g)*(h?.5:1),j=Math.pow,k=Math.round,l=Math.sqrt(j(i,2)+j(g,2)),m=[this.border/i*l,this.border/g*l];return m[2]=Math.sqrt(j(m[0],2)-j(this.border,2)),m[3]=Math.sqrt(j(m[1],2)-j(this.border,2)),b=l+m[2]+m[3]+(h?0:m[0]),c=b/l,d=[k(c*f),k(c*g)],e?d:d.reverse()},_calculateTip:function(a,b,c){c=c||1,b=b||this.size;var d=b[0]*c,e=b[1]*c,f=Math.ceil(d/2),g=Math.ceil(e/2),h={br:[0,0,d,e,d,0],bl:[0,0,d,0,0,e],tr:[0,e,d,0,d,e],tl:[0,0,0,e,d,e],tc:[0,e,f,0,d,e],bc:[0,0,d,0,f,e],rc:[0,0,d,g,0,e],lc:[d,0,d,e,0,g]};return h.lt=h.br,h.rt=h.bl,h.lb=h.tr,h.rb=h.tl,h[a.abbrev()]},_drawCoords:function(a,b){a.beginPath(),a.moveTo(b[0],b[1]),a.lineTo(b[2],b[3]),a.lineTo(b[4],b[5]),a.closePath()},create:function(){var a=this.corner=(ob||db.ie)&&this._parseCorner(this.options.corner);return(this.enabled=!!this.corner&&"c"!==this.corner.abbrev())&&(this.qtip.cache.corner=a.clone(),this.update()),this.element.toggle(this.enabled),this.corner},update:function(b,c){if(!this.enabled)return this;var e,f,g,h,i,j,k,l,m=this.qtip.elements,n=this.element,o=n.children(),p=this.options,q=this.size,r=p.mimic,s=Math.round;b||(b=this.qtip.cache.corner||this.corner),r===E?r=b:(r=new A(r),r.precedance=b.precedance,"inherit"===r.x?r.x=b.x:"inherit"===r.y?r.y=b.y:r.x===r.y&&(r[b.precedance]=b[b.precedance])),f=r.precedance,b.precedance===G?this._swapDimensions():this._resetDimensions(),e=this.color=this._parseColours(b),e[1]!==mb?(l=this.border=this._parseWidth(b,b[b.precedance]),p.border&&1>l&&!pb.test(e[1])&&(e[0]=e[1]),this.border=l=p.border!==D?p.border:l):this.border=l=0,k=this.size=this._calculateSize(b),n.css({width:k[0],height:k[1],lineHeight:k[1]+"px"}),j=b.precedance===H?[s(r.x===L?l:r.x===N?k[0]-q[0]-l:(k[0]-q[0])/2),s(r.y===K?k[1]-q[1]:0)]:[s(r.x===L?k[0]-q[0]:0),s(r.y===K?l:r.y===M?k[1]-q[1]-l:(k[1]-q[1])/2)],ob?(g=o[0].getContext("2d"),g.restore(),g.save(),g.clearRect(0,0,6e3,6e3),h=this._calculateTip(r,q,ub),i=this._calculateTip(r,this.size,ub),o.attr(I,k[0]*ub).attr(J,k[1]*ub),o.css(I,k[0]).css(J,k[1]),this._drawCoords(g,i),g.fillStyle=e[1],g.fill(),g.translate(j[0]*ub,j[1]*ub),this._drawCoords(g,h),g.fillStyle=e[0],g.fill()):(h=this._calculateTip(r),h="m"+h[0]+","+h[1]+" l"+h[2]+","+h[3]+" "+h[4]+","+h[5]+" xe",j[2]=l&&/^(r|b)/i.test(b.string())?8===db.ie?2:1:0,o.css({coordsize:k[0]+l+" "+(k[1]+l),antialias:""+(r.string().indexOf(O)>-1),left:j[0]-j[2]*Number(f===G),top:j[1]-j[2]*Number(f===H),width:k[0]+l,height:k[1]+l}).each(function(a){var b=d(this);b[b.prop?"prop":"attr"]({coordsize:k[0]+l+" "+(k[1]+l),path:h,fillcolor:e[0],filled:!!a,stroked:!a}).toggle(!(!l&&!a)),!a&&b.html(vb("stroke",'weight="'+2*l+'px" color="'+e[1]+'" miterlimit="1000" joinstyle="miter"'))})),a.opera&&setTimeout(function(){m.tip.css({display:"inline-block",visibility:"visible"})},1),c!==E&&this.calculate(b,k)},calculate:function(a,b){if(!this.enabled)return E;var c,e,f=this,g=this.qtip.elements,h=this.element,i=this.options.offset,j=(g.tooltip.hasClass("ui-widget"),{});return a=a||this.corner,c=a.precedance,b=b||this._calculateSize(a),e=[a.x,a.y],c===G&&e.reverse(),d.each(e,function(d,e){var h,k,l;
e===O?(h=c===H?L:K,j[h]="50%",j[ib+"-"+h]=-Math.round(b[c===H?0:1]/2)+i):(h=f._parseWidth(a,e,g.tooltip),k=f._parseWidth(a,e,g.content),l=f._parseRadius(a),j[e]=Math.max(-f.border,d?k:i+(l>h?l:-h)))}),j[a[c]]-=b[c===G?0:1],h.css({margin:"",top:"",bottom:"",left:"",right:""}).css(j),j},reposition:function(a,b,d){function e(a,b,c,d,e){a===Q&&j.precedance===b&&k[d]&&j[c]!==O?j.precedance=j.precedance===G?H:G:a!==Q&&k[d]&&(j[b]=j[b]===O?k[d]>0?d:e:j[b]===d?e:d)}function f(a,b,e){j[a]===O?p[ib+"-"+b]=o[a]=g[ib+"-"+b]-k[b]:(h=g[e]!==c?[k[b],-g[b]]:[-k[b],g[b]],(o[a]=Math.max(h[0],h[1]))>h[0]&&(d[b]-=k[b],o[b]=E),p[g[e]!==c?e:b]=o[a])}if(this.enabled){var g,h,i=b.cache,j=this.corner.clone(),k=d.adjusted,l=b.options.position.adjust.method.split(" "),m=l[0],n=l[1]||l[0],o={left:E,top:E,x:0,y:0},p={};this.corner.fixed!==D&&(e(m,G,H,L,N),e(n,H,G,K,M),(j.string()!==i.corner.string()||i.cornerTop!==k.top||i.cornerLeft!==k.left)&&this.update(j,E)),g=this.calculate(j),g.right!==c&&(g.left=-g.right),g.bottom!==c&&(g.top=-g.bottom),g.user=this.offset,(o.left=m===Q&&!!k.left)&&f(G,L,N),(o.top=n===Q&&!!k.top)&&f(H,K,M),this.element.css(p).toggle(!(o.x&&o.y||j.x===O&&o.y||j.y===O&&o.x)),d.left-=g.left.charAt?g.user:m!==Q||o.top||!o.left&&!o.top?g.left+this.border:0,d.top-=g.top.charAt?g.user:n!==Q||o.left||!o.left&&!o.top?g.top+this.border:0,i.cornerLeft=k.left,i.cornerTop=k.top,i.corner=j.clone()}},destroy:function(){this.qtip._unbind(this.qtip.tooltip,this._ns),this.qtip.elements.tip&&this.qtip.elements.tip.find("*").remove().end().remove()}}),hb=R.tip=function(a){return new v(a,a.options.style.tip)},hb.initialize="render",hb.sanitize=function(a){if(a.style&&"tip"in a.style){var b=a.style.tip;"object"!=typeof b&&(b=a.style.tip={corner:b}),/string|boolean/i.test(typeof b.corner)||(b.corner=D)}},B.tip={"^position.my|style.tip.(corner|mimic|border)$":function(){this.create(),this.qtip.reposition()},"^style.tip.(height|width)$":function(a){this.size=[a.width,a.height],this.update(),this.qtip.reposition()},"^content.title|style.(classes|widget)$":function(){this.update()}},d.extend(D,y.defaults,{style:{tip:{corner:D,mimic:E,width:6,height:6,border:D,offset:0}}});var wb,xb,yb="qtip-modal",zb="."+yb;xb=function(){function a(a){if(d.expr[":"].focusable)return d.expr[":"].focusable;var b,c,e,f=!isNaN(d.attr(a,"tabindex")),g=a.nodeName&&a.nodeName.toLowerCase();return"area"===g?(b=a.parentNode,c=b.name,a.href&&c&&"map"===b.nodeName.toLowerCase()?(e=d("img[usemap=#"+c+"]")[0],!!e&&e.is(":visible")):!1):/input|select|textarea|button|object/.test(g)?!a.disabled:"a"===g?a.href||f:f}function c(a){k.length<1&&a.length?a.not("body").blur():k.first().focus()}function e(a){if(i.is(":visible")){var b,e=d(a.target),h=f.tooltip,j=e.closest(W);b=j.length<1?E:parseInt(j[0].style.zIndex,10)>parseInt(h[0].style.zIndex,10),b||e.closest(W)[0]===h[0]||c(e),g=a.target===k[k.length-1]}}var f,g,h,i,j=this,k={};d.extend(j,{init:function(){return i=j.elem=d("<div />",{id:"qtip-overlay",html:"<div></div>",mousedown:function(){return E}}).hide(),d(b.body).bind("focusin"+zb,e),d(b).bind("keydown"+zb,function(a){f&&f.options.show.modal.escape&&27===a.keyCode&&f.hide(a)}),i.bind("click"+zb,function(a){f&&f.options.show.modal.blur&&f.hide(a)}),j},update:function(b){f=b,k=b.options.show.modal.stealfocus!==E?b.tooltip.find("*").filter(function(){return a(this)}):[]},toggle:function(a,e,g){var k=(d(b.body),a.tooltip),l=a.options.show.modal,m=l.effect,n=e?"show":"hide",o=i.is(":visible"),p=d(zb).filter(":visible:not(:animated)").not(k);return j.update(a),e&&l.stealfocus!==E&&c(d(":focus")),i.toggleClass("blurs",l.blur),e&&i.appendTo(b.body),i.is(":animated")&&o===e&&h!==E||!e&&p.length?j:(i.stop(D,E),d.isFunction(m)?m.call(i,e):m===E?i[n]():i.fadeTo(parseInt(g,10)||90,e?1:0,function(){e||i.hide()}),e||i.queue(function(a){i.css({left:"",top:""}),d(zb).length||i.detach(),a()}),h=e,f.destroyed&&(f=F),j)}}),j.init()},xb=new xb,d.extend(w.prototype,{init:function(a){var b=a.tooltip;return this.options.on?(a.elements.overlay=xb.elem,b.addClass(yb).css("z-index",y.modal_zindex+d(zb).length),a._bind(b,["tooltipshow","tooltiphide"],function(a,c,e){var f=a.originalEvent;if(a.target===b[0])if(f&&"tooltiphide"===a.type&&/mouse(leave|enter)/.test(f.type)&&d(f.relatedTarget).closest(xb.elem[0]).length)try{a.preventDefault()}catch(g){}else(!f||f&&"tooltipsolo"!==f.type)&&this.toggle(a,"tooltipshow"===a.type,e)},this._ns,this),a._bind(b,"tooltipfocus",function(a,c){if(!a.isDefaultPrevented()&&a.target===b[0]){var e=d(zb),f=y.modal_zindex+e.length,g=parseInt(b[0].style.zIndex,10);xb.elem[0].style.zIndex=f-1,e.each(function(){this.style.zIndex>g&&(this.style.zIndex-=1)}),e.filter("."+$).qtip("blur",a.originalEvent),b.addClass($)[0].style.zIndex=f,xb.update(c);try{a.preventDefault()}catch(h){}}},this._ns,this),void a._bind(b,"tooltiphide",function(a){a.target===b[0]&&d(zb).filter(":visible").not(b).last().qtip("focus",a)},this._ns,this)):this},toggle:function(a,b,c){return a&&a.isDefaultPrevented()?this:void xb.toggle(this.qtip,!!b,c)},destroy:function(){this.qtip.tooltip.removeClass(yb),this.qtip._unbind(this.qtip.tooltip,this._ns),xb.toggle(this.qtip,E),delete this.qtip.elements.overlay}}),wb=R.modal=function(a){return new w(a,a.options.show.modal)},wb.sanitize=function(a){a.show&&("object"!=typeof a.show.modal?a.show.modal={on:!!a.show.modal}:"undefined"==typeof a.show.modal.on&&(a.show.modal.on=D))},y.modal_zindex=y.zindex-200,wb.initialize="render",B.modal={"^show.modal.(on|blur)$":function(){this.destroy(),this.init(),this.qtip.elems.overlay.toggle(this.qtip.tooltip[0].offsetWidth>0)}},d.extend(D,y.defaults,{show:{modal:{on:E,effect:D,blur:D,stealfocus:D,escape:D}}}),R.viewport=function(c,d,e,f,g,h,i){function j(a,b,c,e,f,g,h,i,j){var k=d[f],s=u[a],t=v[a],w=c===Q,x=s===f?j:s===g?-j:-j/2,y=t===f?i:t===g?-i:-i/2,z=q[f]+r[f]-(n?0:m[f]),A=z-k,B=k+j-(h===I?o:p)-z,C=x-(u.precedance===a||s===u[b]?y:0)-(t===O?i/2:0);return w?(C=(s===f?1:-1)*x,d[f]+=A>0?A:B>0?-B:0,d[f]=Math.max(-m[f]+r[f],k-C,Math.min(Math.max(-m[f]+r[f]+(h===I?o:p),k+C),d[f],"center"===s?k-x:1e9))):(e*=c===P?2:0,A>0&&(s!==f||B>0)?(d[f]-=C+e,l.invert(a,f)):B>0&&(s!==g||A>0)&&(d[f]-=(s===O?-C:C)+e,l.invert(a,g)),d[f]<q&&-d[f]>B&&(d[f]=k,l=u.clone())),d[f]-k}var k,l,m,n,o,p,q,r,s=e.target,t=c.elements.tooltip,u=e.my,v=e.at,w=e.adjust,x=w.method.split(" "),y=x[0],z=x[1]||x[0],A=e.viewport,B=e.container,C=(c.cache,{left:0,top:0});return A.jquery&&s[0]!==a&&s[0]!==b.body&&"none"!==w.method?(m=B.offset()||C,n="static"===B.css("position"),k="fixed"===t.css("position"),o=A[0]===a?A.width():A.outerWidth(E),p=A[0]===a?A.height():A.outerHeight(E),q={left:k?0:A.scrollLeft(),top:k?0:A.scrollTop()},r=A.offset()||C,("shift"!==y||"shift"!==z)&&(l=u.clone()),C={left:"none"!==y?j(G,H,y,w.x,L,N,I,f,h):0,top:"none"!==z?j(H,G,z,w.y,K,M,J,g,i):0,my:l}):C},R.polys={polygon:function(a,b){var c,d,e,f={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10},adjustable:E},g=0,h=[],i=1,j=1,k=0,l=0;for(g=a.length;g--;)c=[parseInt(a[--g],10),parseInt(a[g+1],10)],c[0]>f.position.right&&(f.position.right=c[0]),c[0]<f.position.left&&(f.position.left=c[0]),c[1]>f.position.bottom&&(f.position.bottom=c[1]),c[1]<f.position.top&&(f.position.top=c[1]),h.push(c);if(d=f.width=Math.abs(f.position.right-f.position.left),e=f.height=Math.abs(f.position.bottom-f.position.top),"c"===b.abbrev())f.position={left:f.position.left+f.width/2,top:f.position.top+f.height/2};else{for(;d>0&&e>0&&i>0&&j>0;)for(d=Math.floor(d/2),e=Math.floor(e/2),b.x===L?i=d:b.x===N?i=f.width-d:i+=Math.floor(d/2),b.y===K?j=e:b.y===M?j=f.height-e:j+=Math.floor(e/2),g=h.length;g--&&!(h.length<2);)k=h[g][0]-f.position.left,l=h[g][1]-f.position.top,(b.x===L&&k>=i||b.x===N&&i>=k||b.x===O&&(i>k||k>f.width-i)||b.y===K&&l>=j||b.y===M&&j>=l||b.y===O&&(j>l||l>f.height-j))&&h.splice(g,1);f.position={left:h[0][0],top:h[0][1]}}return f},rect:function(a,b,c,d){return{width:Math.abs(c-a),height:Math.abs(d-b),position:{left:Math.min(a,c),top:Math.min(b,d)}}},_angles:{tc:1.5,tr:7/4,tl:5/4,bc:.5,br:.25,bl:.75,rc:2,lc:1,c:0},ellipse:function(a,b,c,d,e){var f=R.polys._angles[e.abbrev()],g=0===f?0:c*Math.cos(f*Math.PI),h=d*Math.sin(f*Math.PI);return{width:2*c-Math.abs(g),height:2*d-Math.abs(h),position:{left:a+g,top:b+h},adjustable:E}},circle:function(a,b,c,d){return R.polys.ellipse(a,b,c,c,d)}},R.svg=function(a,c,e){for(var f,g,h,i,j,k,l,m,n,o=(d(b),c[0]),p=d(o.ownerSVGElement),q=o.ownerDocument,r=(parseInt(c.css("stroke-width"),10)||0)/2;!o.getBBox;)o=o.parentNode;if(!o.getBBox||!o.parentNode)return E;switch(o.nodeName){case"ellipse":case"circle":m=R.polys.ellipse(o.cx.baseVal.value,o.cy.baseVal.value,(o.rx||o.r).baseVal.value+r,(o.ry||o.r).baseVal.value+r,e);break;case"line":case"polygon":case"polyline":for(l=o.points||[{x:o.x1.baseVal.value,y:o.y1.baseVal.value},{x:o.x2.baseVal.value,y:o.y2.baseVal.value}],m=[],k=-1,i=l.numberOfItems||l.length;++k<i;)j=l.getItem?l.getItem(k):l[k],m.push.apply(m,[j.x,j.y]);m=R.polys.polygon(m,e);break;default:m=o.getBBox(),m={width:m.width,height:m.height,position:{left:m.x,top:m.y}}}return n=m.position,p=p[0],p.createSVGPoint&&(g=o.getScreenCTM(),l=p.createSVGPoint(),l.x=n.left,l.y=n.top,h=l.matrixTransform(g),n.left=h.x,n.top=h.y),q!==b&&"mouse"!==a.position.target&&(f=d((q.defaultView||q.parentWindow).frameElement).offset(),f&&(n.left+=f.left,n.top+=f.top)),q=d(q),n.left+=q.scrollLeft(),n.top+=q.scrollTop(),m},R.imagemap=function(a,b,c){b.jquery||(b=d(b));var e,f,g,h,i,j=(b.attr("shape")||"rect").toLowerCase().replace("poly","polygon"),k=d('img[usemap="#'+b.parent("map").attr("name")+'"]'),l=d.trim(b.attr("coords")),m=l.replace(/,$/,"").split(",");if(!k.length)return E;if("polygon"===j)h=R.polys.polygon(m,c);else{if(!R.polys[j])return E;for(g=-1,i=m.length,f=[];++g<i;)f.push(parseInt(m[g],10));h=R.polys[j].apply(this,f.concat(c))}return e=k.offset(),e.left+=Math.ceil((k.outerWidth(E)-k.width())/2),e.top+=Math.ceil((k.outerHeight(E)-k.height())/2),h.position.left+=e.left,h.position.top+=e.top,h};var Ab,Bb='<iframe class="qtip-bgiframe" frameborder="0" tabindex="-1" src="javascript:\'\';"  style="display:block; position:absolute; z-index:-1; filter:alpha(opacity=0); -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";"></iframe>';d.extend(x.prototype,{_scroll:function(){var b=this.qtip.elements.overlay;b&&(b[0].style.top=d(a).scrollTop()+"px")},init:function(c){var e=c.tooltip;d("select, object").length<1&&(this.bgiframe=c.elements.bgiframe=d(Bb).appendTo(e),c._bind(e,"tooltipmove",this.adjustBGIFrame,this._ns,this)),this.redrawContainer=d("<div/>",{id:S+"-rcontainer"}).appendTo(b.body),c.elements.overlay&&c.elements.overlay.addClass("qtipmodal-ie6fix")&&(c._bind(a,["scroll","resize"],this._scroll,this._ns,this),c._bind(e,["tooltipshow"],this._scroll,this._ns,this)),this.redraw()},adjustBGIFrame:function(){var a,b,c=this.qtip.tooltip,d={height:c.outerHeight(E),width:c.outerWidth(E)},e=this.qtip.plugins.tip,f=this.qtip.elements.tip;b=parseInt(c.css("borderLeftWidth"),10)||0,b={left:-b,top:-b},e&&f&&(a="x"===e.corner.precedance?[I,L]:[J,K],b[a[1]]-=f[a[0]]()),this.bgiframe.css(b).css(d)},redraw:function(){if(this.qtip.rendered<1||this.drawing)return this;var a,b,c,d,e=this.qtip.tooltip,f=this.qtip.options.style,g=this.qtip.options.position.container;return this.qtip.drawing=1,f.height&&e.css(J,f.height),f.width?e.css(I,f.width):(e.css(I,"").appendTo(this.redrawContainer),b=e.width(),1>b%2&&(b+=1),c=e.css("maxWidth")||"",d=e.css("minWidth")||"",a=(c+d).indexOf("%")>-1?g.width()/100:0,c=(c.indexOf("%")>-1?a:1)*parseInt(c,10)||b,d=(d.indexOf("%")>-1?a:1)*parseInt(d,10)||0,b=c+d?Math.min(Math.max(b,d),c):b,e.css(I,Math.round(b)).appendTo(g)),this.drawing=0,this},destroy:function(){this.bgiframe&&this.bgiframe.remove(),this.qtip._unbind([a,this.qtip.tooltip],this._ns)}}),Ab=R.ie6=function(a){return 6===db.ie?new x(a):E},Ab.initialize="render",B.ie6={"^content|style$":function(){this.redraw()}}})}(window,document);installer/dup-installer/assets/index.php000064400000000017151336065400014447 0ustar00<?php
//silentinstaller/dup-installer/assets/inc.js.php000064400000013225151336065400014531 0ustar00<?php defined('ABSPATH') || defined('DUPXABSPATH') || exit; ?>
<script>
	//Unique namespace
	DUPX = new Object();
	DUPX.Util = new Object();
    DUPX.Const = new Object();
	DUPX.GLB_DEBUG =  <?php echo ($_GET['debug'] || $GLOBALS['DEBUG_JS']) ? 'true' : 'false'; ?>;

	DUPX.parseJSON = function(mixData) {
		try {
			var parsed = JSON.parse(mixData);
			return parsed;
		} catch (e) {
			console.log("JSON parse failed - 1");
			console.log(mixData);
		}

		if (mixData.indexOf('[') > -1 && mixData.indexOf('{') > -1) {
			if (mixData.indexOf('{') < mixData.indexOf('[')) {
				var startBracket = '{';
				var endBracket = '}';
			} else {
				var startBracket = '[';
				var endBracket = ']';
			}
		} else if (mixData.indexOf('[') > -1 && mixData.indexOf('{') === -1) {
			var startBracket = '[';
			var endBracket = ']';
		} else {
			var startBracket = '{';
			var endBracket = '}';
		}
		
		var jsonStartPos = mixData.indexOf(startBracket);
		var jsonLastPos = mixData.lastIndexOf(endBracket);
		if (jsonStartPos > -1 && jsonLastPos > -1) {
			var expectedJsonStr = mixData.slice(jsonStartPos, jsonLastPos + 1);
			try {
				var parsed = JSON.parse(expectedJsonStr);
				return parsed;
			} catch (e) {
				console.log("JSON parse failed - 2");
				console.log(mixData);
				throw e;
				return false;
			}
		}
		throw "could not parse the JSON";
		return false;
	}

	DUPX.showProgressBar = function ()
	{
		DUPX.animateProgressBar('progress-bar');
		$('#ajaxerr-area').hide();
		$('#progress-area').show();
	}

	DUPX.hideProgressBar = function ()
	{
		$('#progress-area').hide(100);
		$('#ajaxerr-area').fadeIn(400);
	}

	DUPX.animateProgressBar = function(id) {
		//Create Progress Bar
		var $mainbar   = $("#" + id);
		$mainbar.progressbar({ value: 100 });
		$mainbar.height(25);
		runAnimation($mainbar);

		function runAnimation($pb) {
			$pb.css({ "padding-left": "0%", "padding-right": "90%" });
			$pb.progressbar("option", "value", 100);
			$pb.animate({ paddingLeft: "90%", paddingRight: "0%" }, 3500, "linear", function () { runAnimation($pb); });
		}
	}

	DUPX.initToggle = function() {
        $("body").on('click', "*[data-type~='toggle']", DUPX.toggleClick);

        var hasFailedReq = false;
        $("*[data-type~='auto'][data-status='fail']").each(function(){
            hasFailedReq = true;
            $(this).trigger('click');
        });

        $("*[data-type~='auto'][data-status='warn']").each(function(){
            if (hasFailedReq) {
                return ;
            }

            $(this).trigger('click');
        });
    }

	DUPX.toggleAllReqs = function(id) {
		$(id + " *[data-type='toggle auto']").each(function() {
			$(this).trigger('click');
		});
	}

    DUPX.toggleAllNotices = function(id) {
		$(id + " *[data-type='toggle']").each(function() {
			$(this).trigger('click');
		});
	}

	DUPX.toggleClick = function()
	{
		var src	   = 0;
		var id     = $(this).attr('data-target');
		var text   = $(this).text().replace(/\+|\-/, "");
		var icon   = $(this).find('i.fa');
		var target = $(id);
		var list   = new Array();

		var style = [
		{ open:   "fa-minus-square",
		  close:  "fa-plus-square"
		},
		{ open:   "fa-caret-down",
		  close:  "fa-caret-right"
		}];

		//Create src
		for (i = 0; i < style.length; i++) {
			if ($(icon).hasClass(style[i].open) || $(icon).hasClass(style[i].close)) {
				src = i;
				break;
			}
		}

		//Build remove list
		for (i = 0; i < style.length; i++) {
			list.push(style[i].open);
			list.push(style[i].close);
		}

		$(icon).removeClass(list.join(" "));
		if (target.is(':hidden') ) {
			(icon.length)
				? $(icon).addClass(style[src].open )
				: $(this).html("- " + text );
			target.show().removeClass('no-display');
		} else {
			(icon.length)
				? $(icon).addClass(style[src].close)
				: $(this).html("+ " + text );
			target.hide();
		}
	}

	DUPX.Util.formatBytes = function (bytes,decimals)
	{
		if(bytes == 0) return '0 Byte';
		var k = 1000;
		var dm = decimals + 1 || 3;
		var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
		var i = Math.floor(Math.log(bytes) / Math.log(k));
		return (bytes / Math.pow(k, i)).toPrecision(dm) + ' ' + sizes[i];
	}

	$(document).ready(function()
    {
        $('body').on( "click", ".copy-to-clipboard-block button", function(e) {
            e.preventDefault();
            var button = $(this);
            var buttonText = button.html();
            var textarea = button.parent().find("textarea")[0];

            textarea.select();

            try {
                message = document.execCommand('copy') ? "Copied to Clipboard" : 'Unable to copy';
            } catch (err) {
                console.log(err);
            }

            button.html(message);

            setTimeout(function () {
                button.text(buttonText);
            }, 2000);
        });

		<?php if (DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) : ?>
			$("div.dupx-debug input[type=hidden], div.dupx-debug textarea").each(function() {
				var label = '<label>' + $(this).attr('name') + ':</label>';
				$(this).before(label);
				$(this).after('<br/>');
			 });
			 $("div.dupx-debug input[type=hidden]").each(function() {
				$(this).attr('type', 'text');
			 });

			 $("div.dupx-debug").prepend('<div class="dupx-debug-hdr">Debug View</div>');
		<?php endif; ?>

		DUPX.loadQtip = function()
		{
			//Look for tooltip data
			$('i[data-tooltip!=""]').qtip({
				content: {
					attr: 'data-tooltip',
					title: {
						text: function() { return  $(this).attr('data-tooltip-title'); }
					}
				},
				style: {
					classes: 'qtip-light qtip-rounded qtip-shadow',
					width: 500
				},
				 position: {
					my: 'top left',
					at: 'bottom center'
				}
			});
		}

		DUPX.loadQtip();

	});

</script>
<?php
DUPX_U_Html::js();installer/dup-installer/assets/images/ui-bg_glass_75_e6e6e6_1x400.png000064400000000406151336065400021227 0ustar00�PNG


IHDR���DbKGD���1�	pHYsHHF�k>HIDAT8�cx��0�F�ѳgύ��ax1��e&ë8��!obަ2��fx���#3�ǵ��>��QD�@�$.5o%tEXtdate:create2017-01-28T18:04:15+00:00?S%tEXtdate:modify2017-01-28T18:04:15+00:00NE�IEND�B`�installer/dup-installer/assets/images/ui-icons_2e83ff_256x240.png000064400000010705151336065400020424 0ustar00�PNG


IHDR��IJ�PLTE.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.����oYtRNS3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
��b�J��mߜGc?o�h�@^�bKGD�H	pHYsHHF�k>dIDATx��]c۶�H�阒]�K���d��%٫뺮��lm���w]��|�p��X�m�-��}<�w(1$��	;�F�@��%��?����B,Lh{�t���#��T@�/?j�9	m��N� #���+`��`��I�
��_�-s�ʹU0�M��[��
s�4`x��š�#��
�D<�~؀�K��.4�]`��PDDDDDDĈq����Ek@����A�~�*���	!Y���X�`hv3\LX�Ot�J2b�ؓl�QI<��� �6�-X�lֈ�6�H��|=j�`E�iq���Cv:�q���C?�?���x�,�r*t�ݻ}|;kP�4���d�Y���f���K��~[	>�X:+�i����ĆQV9\����e�'���A�tOS�:7��2����YsxM�ہ��B��&���z�>n�C��@��r@�*a�ӝ��%��MFDDDDDD�T�ߖ���H,���E���RU��n
ب<��V-
@�/Nm�թ��������Hw����*�+��#��$o�e�{�% �7\X��ǀ���2��~0��&n��sbA,�D��
�A�V�I��|�
�Og���鴋�	�7�y	7Jf����:_�w^�H	v{/O�9���<���Y�`+�� HRٰ����[��?��
�����=���c""""""F�˽�sG�<*k9c��E�8薽�������zfm��r�1�N������nq�w��&=O�\}K`
#���2��~��L�|?�m>�\�f�͹�:}�4ᦋ���{�)�n[��
�̰E
KY��D�ۇ-��	�+�Kl=�Ӄ��L`љ�|�%��n�	a�	���N�#��5�	(4��?����EDDDD\o�W�Ffq;��\E��_������,���W!%�zE!F�¶.�(USHQ0d�w)T���8#p,�x�B��K���� *�x��X��E�e������
K솎%mK�X~s�FE���~������tdc�a��I���1��Af4��dH��c�G�S�B`��0�wev`����"�{��	�.�GDDDD�,d�O�6�k"qk��Me�fS_����U��KŌ&g~>n� �H�})��L���F%8(�)r���!�[4统qQk�0�m[Le���_�7���0�@>1 X0A��Z���Vc�E�V ���Lt�k�3�EJ��44�Zﮊ�N`rt�>`�˥�	�	�
A��HBLH�@��c���Uq=j������cM����2�s����J��CL�iR �NQ�������0=��Yi�-�|4�V��]��]��B^�ޞ���_H�����$�<�$�	
a����=��d@�	(Z�Ap_�}�~s���:�N{DC>����m�^��ƒ����S�&�, ;�N����&�B} ��<_A��B]H�u��N(B0�{h���1�IK���Ds��j����'��M���8�.�ӫ1�h3�df}mq��	��n�U{��L�o�z\=?@	((��e�|=ơ麄�C�i����1r<|�OO�;�
`�H��p�Qy�zԈu�����Z���V��Ʋ�!�)��5m�C��2�Ly�g�;���֑�R���jW�a@��@V�L�&W���ru=Z
�̥�=U���5}���������7�;b(�����nP&�s��k�4����8�ͥ��0���1�U�W�v�k�18dq���T��ՌE]qH8������G�F�����K���'��r����Or�r�̧��6"fp��T�^3c��"�����n��Mم-�/��W=�tJ,�X�)���{�P
Rm|K��>mX�8v5h��<������_{ꘀ�Y�F�|&_G;&�>^�����W⁃�&�K���(��81�EB@F&��;"L���'wfw��E-6��o&/̫'X�e,>~�ee��|��A����=)	d��Q�`}P[���K��N��˂����/�~)����O[d�O=�3E�l5'Y�$?��7�m��Tzզ.�\��.��` WE���"""""v�)��V���<��K�ZX.Ex�~Ч)��ߚ����W_}�5|��s��/!?��'poդ���tC3����@�Q�)��t��`���b!,dY9�6A2���������/튮���n�t�TK>���#]�L;zq�J��r���²[��\-t�ҽ�5
@�ͷϟ��n�T@��+;�c���Qh�C*���T�ڙ��A<Sku�µb�E
/��$�Z���.e�j�����_ʤrWaB6d���(��S�s[�|���竕
/5R���(�4X�����76��`3|���P�p�'�H~<R?M�2�)�  ��g��Vp��B�n�=�|W�ͬ\��V0_�81Oׄ�Kz||lP_��ω���lxX;ǀ�Ju<��Ng[��]=�(�#]������p�P�a���i���s�f��
V�z�]ౚ����z>�Vr�?�f�?����
�Q�1�T`��} H�k���,{�VZˋT��ϛ�?I̯u�QK�LM�e͆��~��q������y�m0�9�S�;���j�����5 ��i��Q��]7k0�U�ޭ���G�kX����3#���lY��_Цx����j޶9��`�#
M	[z��KuO_z˿Dܭ��*��kOJ�(7��n��\�e�
I�T�ƨ�l�/�U������߶uw�.�~���;#�r��.�����8
�o# 5L��h>1�i�����p��V�M?�/u7��0� X@��L��+M�+�����{��Fkt�{�ŧ89�0`��. ĀC�R+\��/��t�R����;
�TӲ���]�aL���|�efđ��	�>�ۣ��G�|�P`P��8C1K՛�A�̍<�2��ۂ��K�r�l@L
L��������8�@�E>`n����PNԍ,��p�����E��Ɔ���Z�FlÎ;���F��7��Ȯ;�
��s�wSz)g7�{r�s��S��gȋ��(߄~�AWytX�$�NV����R�_��<6�p.�O�8�O[�OdDk>_��O�O�}���JS���d��mV�?�W(_��m� ��j��~=H IԁF>T/��{*]IGJ@i��qam�NF|Q�5���0+���E�S8�:�v�`p~v���j:B����p96�o�ys%��������
�|@H�����]��+�@��t]W�k}}���7��Fʮr���A�����B���\m�-�_�2PY8�����x�ՎN�.h�~��@+7��z5������t�_/�����/�?���0�S>��)���z�i0n�/�B����`{D��W���#`����B��o���[,�g��FVЁ�pP߾���C]Bz�� ��,X�����X�fԃ����A�:H�� k�7��d�Z9��oc}o�]�0�vd�:R]�0�ve���]刈����j����у����|
	?�+(��OǍ�+	�#��ys���ߍ�n�p���Fru<��.HȺotM�3h���}��߆P}�������˗��v�����P�}mǀ���?��W��Z@���������}��������@��@��FD�������l�%tEXtdate:create2016-07-13T10:21:59+00:00��%tEXtdate:modify2016-07-13T09:26:54+00:00�͠tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�installer/dup-installer/assets/images/ui-icons_454545_256x240.png000064400000015520151336065400020201 0ustar00�PNG


IHDR�E�r@bKGDE�;�-	pHYsHHF�k>mIDATx��{leG}�?g�K��$����U�!�>T��؈�J��i6A"�V��R%;��"��*UP)�
�/���z�RJ�F��QP��z��BQH�VU������5sμ�9��^�3ߕ��{~��7s�7��<���.��`���� c���Ab/�@�[�V�D��0��3AX9�0�N��_�B��&��>~�>�
c�;ab�D�ߎE����Qz�'k���M�ayԉ�6�!�:u:�:@RŤ�B�yDD���'�L��-�f�]S��q!�f�
S�Q�&�S��7MC��r==3dJ��{��f�Z���S0�Ms��:0K٦g�ʿ��&H�U�=�mc�4�i?UĔG��U4�hc��Qb�]�!�hL���W/
����@������pxh8�~�|�A��Qf?�ێ�1f¸����=u����Q�GJH��p����PϠI�w״m췥���ԧ>2���"�WÓP&{��n���T:s�f�q���H@���.c�I�����~S�s+�^|B�n�29�dH����]��v�-ˌ-m�e�h�>�����q&ت��g�9x�#c�n�~!����pxh8�4^/
����o�#�Z@��S���^�4� KZKP�d�9���C@F[�����,��a+����]8��v��K�qHl�w9ק�84�KB��ץ|��&��#��[�\C����`��R��!�����:�F
z��C���6��)A���T1wU.I�җ!4��ig�3w��������E:��q7����n�0uA���mP��y
�T�K(5ͬ�lNæb�T���rw�DV�]��t�e4���7�
�L���[��C��0��P��&��0���+�+�
����@������pxh8�4����Y��`��O����E�Z<��h�\J!��䞋��j
�;TK�Vr�0��ͬq�cˇ��u���a����p����E{B�w"�K��5���n-��c"w�v�T�6
T�hzီ|6�ŝ���Ι��N{	t��]��K��^m1(�6��m�3��'�R�f���`Ô�� �_�>��j�,�*�-E)�e��{�U�,��
\u���oV��:
`o��m�Ke�t��_W�O��dW3���Z
Քrv|�~^�g��`jyc���p�*���f��b�]M5��9��.��L��N��q+%����ۯ�0�vc�c�J��EM5���kk�#I�<���x_��	�I#0D�w��4xh8�4^/
��^c���
����d�r��DM{w�Q�t�e�{��^�`��b�r./��M:0գ��*���z���`]|S�B�(�e)�h͎/V����ܮ�"aO!�o�
,�u�^���Љ�^�=�z��t`�WeCC�MQϱo��0q��%���U�o?�<��@6��HG/���������uAQ-_�u||���ִ*2l��ٍ�uG�@� j
!�B��r�����	q�L!*)�h����.�V�{3���-��!�w�$dP�*�����/P[�t1���l3�hl�y�p������0b��g�L�} �3���$�%\/��.)TwQ�"uK7d�+�2�!�@������pxh8�4�'�aY$m��f�6�lB'�.D��
��Р��x7S�x��tI��eW�e}���d0�R�W��^ݢ��0](U�݋T�x����|��T�|����@v�^Df׹Lb��(�2��H��0n8;���_�Q�O��}D���&3{��Y��W�w��5*��e˗?�̖�G�
�:H iZӖ)/MP���(:�!�/�|B��[i����:�Gf
�L�`�~��:z$aa���^����ʭ|P�- kbݞ<ەL&�xJ�AABȼ�Hvᑢ�[�yS��ə�w�NJuy��%pw�0�_a"z��x���� �3i�1|��=����@����%�JW����A��m�\���
��l��X�m9+�(��)������S��� or��ro*E`�Z��1��&=�ޗ�g�!�Rt<<�A.-V���+�l�|����suK��,&�ȇ��%����y�q�s��(A�K�*�q^�~���anb�1`�6��G�P�a�&.�	�)b���muL��I���fnE! k̠Ò�c��m���c�ȱD�-B֥֙�D`:G��e�tQ	��7�0���0��������YQ�Ӕ،?�mb�/�e׸L{8�<�
q�{��X4��$s���D@���s�9����e8�\c(���Y���"�r���7��q6�u-	|��B���R��ix!��9^P�HD����g�t7K���|��2��"�.�t���V����w�E�u>�b�������f���a?q�h'y'r�y���#\��&��
o+��Ԫ���|�Y�%�_Hp��"����k��1��*ɫ���U[��&x�9�xA��s�mf�e��<�_����7�;y�6m���i
�
:�[��)�EB���7̰����8f��CH��`⾿�h�)�����}�(�%m���'��&���
;��(�ݚ!�{:^����R��@���N���Kү"�*�<�V�敡�=��o�h~q���+`6I��i�I<#�����Z=^IE\`�0]1���%�D��A��^�a0f��,���c %[�Gxh8�4^/�����rdh9�����M7L)-�ӂ-���?K(����stբ�h-?�:��[ڧC�r�]�G�(�YB�3�|�C|
l�eXW��_�x�V8Ɗ�b����bQ����7����V�4J�]������l!��=�
D?��'a`^���a�q��8��:-��O��YP��x�ۀ���֝��X�5Q"�Gִ����W}���
���I>ȓ<�c��b�YV
6=��*��ۿ�-\��įi|��BH���J_F�Wx�CWғ�_�K�`B]J��"}�`�_R��β��&nDsp����t%G-�^���V����yIc�b�9.hM�u�K��ĭ��6T���6��5Ko(�
%Hz߲�:.��n�z�ōO>���c��lpVZM_gڰ�C�v��eG{����<_d�����0՗e���N�%N�y�ƍ��Ȅp��~�Ú�/���k�������n������|��(G�����#.�s��9�J�ۇ��l���[��6�ɻ�&�.X���{�����SDf�†�<����y?O�~��ƅDP���*~b���gco��s{;�����'�Z9�Z��.��O�孁���e��U�~?�Ӆ1N3��ڶD�(��1Gx�x�k�S�H�I~ی?O�����k���,��i�(���ׁۈ�{.�h�_���5�؋�nF�7��0Q��O����S5�:�'���/��ա���J�r����
�.���KN�wu�e��r>n��-�U�$U`I�v%�����.A�U����e�d��
��;�Ә:�+�a&�XĎ �y����������������G�с���	��"�4��pxh8�4^��	@d6�((�Ԕ{�C::[�>�H,
�ɴNVN����hr.�~N������Z��`�3�᝼���K��Q�|$�%�t��!�Vn%�=�*�7����f��g(�m!fy��"�k�I6Y�/�eZ�ٳ���+��z�g�6W8ɦbQ%�y�{9����Ï�*ŕ�#�7��b-t��X�͕8y��nO�{]�!ټ�*���\� �(��p�2.�H�ٙ�d�.�^Z�(N��&�l�2�&k�	�U&ף���#~�.���7�����6���58A7����}P:��BlkU�[�8�)�j�w0�$��W� �!s\�������QF�n(qRK��:'�X���@����=$��x����|�5:��@��]���2�S�i�.�&��
��$`
8�t����S =�&[#�߫��U3���Wҳq��^H{���➇�Z��4������"��A��H��#����U��0+̱�1�Ɏ�;���O9���"�D�E
�C+n�U:�|a��ɔ�M|�?H�����W1�$~=�k��U�џ�V������V����l{��7�	�����^�;<�,�t[�����T"�3SU9l��˾�H���x^�&�a�@���)�E��&�<<B4�(b����p�����Ƶ\˫\�u�f����7r����������^��Ci�[��.��h���_�^��mD�"DD�_3��e������e��X�	�,�B@�fU���/�?���g���B�R���C�&��2��P�8��@3ZtS�<����v7�^#�另�;c'�Nȹ����6�g[�J!Az^ ?�<̯�oɛ�_s[Kg{(e�}�E�~J��,�m<<�����U���g
"&B%�7�~�{�/
G�l�4^���j����Ԓt���cA��0\(�����ܓ�Ԡ�Q�8��YN�Bݝ�?[���R��$�k���\�{�u���׾~�Q��q�)�8���z:G�G��UK�:�
07��6�-��
WMY<�����
��2�Ѱ��$5�&v�}%��8�)#9&)/��K^2�+��B̳�i���\Ҥ����V�}�LD���1/i��n�]2č��>��I?U�7x���G�4�c�*�i��
�5)ñ>�wH�����f5[q���O�.���d&J_�~W\`G{�
|-���e/���Чk��d� E�����(���N�i�v=��C`�̲�Z���+��%m
)s�!ī�6Fei�N��%���O*㪞v,s��@��%���4���tS/<E�%��0wr��k{ʉ2b�6ɻ��*���;�����zs�]�۝,�B��!,ų�uM�zȐ"�={����O��E����۴��w80��ۙ��%�\PL����
��H�[/
����@������G����9��A�Pi�G
ѫ+!��'��^��u'þ��:�Z�@�LxZ�:�Ɩ����oQA_�RR�`��E��,���~�]M�y_��xD�$��&J�B�k�Q�@����3����=�A_��هA`��RN�#�"��tX��孋�0Z죡�Ԭa�t����R��Mi�C-k��r�a�fH4@�C��ܓ���-��`$�~���Ul�$^�Ufr)�0�*-C�n9W-��@M�1��a���@7�g!�7
?̣|�l�R��/ᭁytX5��L݇��p�����@������pxh8�`:{�1����J��5��#;���ǾD"-��s�ct�Ln3�<D��B���d1w]���=4H�α�'�!���r�+t��d����eG���{h	@�.���k�q���v�e�5V�h.0�©|U������
��C��u����k��G��O��C��Y�	�"@�E�"mNzP�S,��1���rzk�M}�����y�.�{+j{���xL��wE^DPk�$�3�cA�Y�~Y���
�/�C�H�F�����<m�47Ṟ�Q�3��Wa�o�~o�)�C�d݇��E�ƀl7�(̢b��s��ڸ���<<�Fx�~?@��m
����@������v@]��<���=���~��WD�`��.��f���~�o��ʈ�n�VA{_��ե�M����
�^��y��M�Q|��ߟ^-{�~��>������Ѓ
��(��g��X���7��i��&�X
5WJ"�*V���J6s{��I��w�oO_��5~���YX�w(�R��!�m���)^�'��D������ɸ�����5�=�@��+���~���j�yQ`O�`�$�D��<B�F0C<�^%�@��?t�k3�}�@����{�^�y��U��|���pS�nĦ�t���e��=��$�v��>`��H_�B���T#%].Xx��D�ѫ�OR��2�E���\K"��R\T|��:m�O���
�x��*y
=���2��~����/?J,����+%q�	�W�ޛ���3����?ܕ�?����
�^��e�����	+R����oҎ�5س�~�o����Bo
l8�4^/
����@�!��/ON�G����ۮ2t]��С8�cݮ5�z=7��������ˮ���g��@�/�aE[��y#�3�#z��7L�.|��
��(cR�c�S��m�Q�$�6�ץ{D���a�{T�_j8�4^/
����@ñ`�/���_g�"d���`�ɾ���0�
���{�����
�����C�j����_9��jD�Ջa�~?�	dc�[�����0�*a��������,&
0��&�+���O�B4!��1��~��Ix���>�8�c��&�G)�j���I�����=@�5@�v�&J?��Q�l�Ç@��Q�����?��^����%tEXtdate:create2016-07-13T10:21:59+00:00��%tEXtdate:modify2016-07-13T09:26:54+00:00�͠tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�installer/dup-installer/assets/images/ui-bg_glass_55_fbf9ee_1x400.png000064400000000517151336065400021370 0ustar00�PNG


IHDR���A�bKGD������	X��	pHYsHHF�k>�IDATH���!
A���bl����A1{�V�Y0i�x��x�v����D�K_��O��9�a�Ք��}��^�JaȌ�0b�vBA�$,�Q���"_44���=�Sqc�yE��I�W
<kA���i�0��<a$S��y.%tEXtdate:create2017-01-28T18:04:16+00:00�I�%tEXtdate:modify2017-01-28T18:04:16+00:00��&IEND�B`�installer/dup-installer/assets/images/ui-bg_glass_65_ffffff_1x400.png000064400000000317151336065400021452 0ustar00�PNG


IHDR�G#7vbKGD݊�	pHYsHHF�k>IDAT(�ch`��p��h��4�i%tEXtdate:create2017-01-28T18:04:15+00:00?S%tEXtdate:modify2017-01-28T18:04:15+00:00NE�IEND�B`�installer/dup-installer/assets/images/index.php000064400000000017151336065400015714 0ustar00<?php
//silentinstaller/dup-installer/assets/images/ui-icons_cd0a0a_256x240.png000064400000010705151336065400020457 0ustar00�PNG


IHDR��IJ�PLTE�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

4�v�YtRNS3P���/"Uq@f`2�
!<BHK Z#'1S,�4���j���8E���|��������)��Q$�
��b�J��mߜGc?o�h�@^�bKGD�H	pHYsHHF�k>dIDATx��]c۶�H�阒]�K���d��%٫뺮��lm���w]��|�p��X�m�-��}<�w(1$��	;�F�@��%��?����B,Lh{�t���#��T@�/?j�9	m��N� #���+`��`��I�
��_�-s�ʹU0�M��[��
s�4`x��š�#��
�D<�~؀�K��.4�]`��PDDDDDDĈq����Ek@����A�~�*���	!Y���X�`hv3\LX�Ot�J2b�ؓl�QI<��� �6�-X�lֈ�6�H��|=j�`E�iq���Cv:�q���C?�?���x�,�r*t�ݻ}|;kP�4���d�Y���f���K��~[	>�X:+�i����ĆQV9\����e�'���A�tOS�:7��2����YsxM�ہ��B��&���z�>n�C��@��r@�*a�ӝ��%��MFDDDDDD�T�ߖ���H,���E���RU��n
ب<��V-
@�/Nm�թ��������Hw����*�+��#��$o�e�{�% �7\X��ǀ���2��~0��&n��sbA,�D��
�A�V�I��|�
�Og���鴋�	�7�y	7Jf����:_�w^�H	v{/O�9���<���Y�`+�� HRٰ����[��?��
�����=���c""""""F�˽�sG�<*k9c��E�8薽�������zfm��r�1�N������nq�w��&=O�\}K`
#���2��~��L�|?�m>�\�f�͹�:}�4ᦋ���{�)�n[��
�̰E
KY��D�ۇ-��	�+�Kl=�Ӄ��L`љ�|�%��n�	a�	���N�#��5�	(4��?����EDDDD\o�W�Ffq;��\E��_������,���W!%�zE!F�¶.�(USHQ0d�w)T���8#p,�x�B��K���� *�x��X��E�e������
K솎%mK�X~s�FE���~������tdc�a��I���1��Af4��dH��c�G�S�B`��0�wev`����"�{��	�.�GDDDD�,d�O�6�k"qk��Me�fS_����U��KŌ&g~>n� �H�})��L���F%8(�)r���!�[4统qQk�0�m[Le���_�7���0�@>1 X0A��Z���Vc�E�V ���Lt�k�3�EJ��44�Zﮊ�N`rt�>`�˥�	�	�
A��HBLH�@��c���Uq=j������cM����2�s����J��CL�iR �NQ�������0=��Yi�-�|4�V��]��]��B^�ޞ���_H�����$�<�$�	
a����=��d@�	(Z�Ap_�}�~s���:�N{DC>����m�^��ƒ����S�&�, ;�N����&�B} ��<_A��B]H�u��N(B0�{h���1�IK���Ds��j����'��M���8�.�ӫ1�h3�df}mq��	��n�U{��L�o�z\=?@	((��e�|=ơ麄�C�i����1r<|�OO�;�
`�H��p�Qy�zԈu�����Z���V��Ʋ�!�)��5m�C��2�Ly�g�;���֑�R���jW�a@��@V�L�&W���ru=Z
�̥�=U���5}���������7�;b(�����nP&�s��k�4����8�ͥ��0���1�U�W�v�k�18dq���T��ՌE]qH8������G�F�����K���'��r����Or�r�̧��6"fp��T�^3c��"�����n��Mم-�/��W=�tJ,�X�)���{�P
Rm|K��>mX�8v5h��<������_{ꘀ�Y�F�|&_G;&�>^�����W⁃�&�K���(��81�EB@F&��;"L���'wfw��E-6��o&/̫'X�e,>~�ee��|��A����=)	d��Q�`}P[���K��N��˂����/�~)����O[d�O=�3E�l5'Y�$?��7�m��Tzզ.�\��.��` WE���"""""v�)��V���<��K�ZX.Ex�~Ч)��ߚ����W_}�5|��s��/!?��'poդ���tC3����@�Q�)��t��`���b!,dY9�6A2���������/튮���n�t�TK>���#]�L;zq�J��r���²[��\-t�ҽ�5
@�ͷϟ��n�T@��+;�c���Qh�C*���T�ڙ��A<Sku�µb�E
/��$�Z���.e�j�����_ʤrWaB6d���(��S�s[�|���竕
/5R���(�4X�����76��`3|���P�p�'�H~<R?M�2�)�  ��g��Vp��B�n�=�|W�ͬ\��V0_�81Oׄ�Kz||lP_��ω���lxX;ǀ�Ju<��Ng[��]=�(�#]������p�P�a���i���s�f��
V�z�]ౚ����z>�Vr�?�f�?����
�Q�1�T`��} H�k���,{�VZˋT��ϛ�?I̯u�QK�LM�e͆��~��q������y�m0�9�S�;���j�����5 ��i��Q��]7k0�U�ޭ���G�kX����3#���lY��_Цx����j޶9��`�#
M	[z��KuO_z˿Dܭ��*��kOJ�(7��n��\�e�
I�T�ƨ�l�/�U������߶uw�.�~���;#�r��.�����8
�o# 5L��h>1�i�����p��V�M?�/u7��0� X@��L��+M�+�����{��Fkt�{�ŧ89�0`��. ĀC�R+\��/��t�R����;
�TӲ���]�aL���|�efđ��	�>�ۣ��G�|�P`P��8C1K՛�A�̍<�2��ۂ��K�r�l@L
L��������8�@�E>`n����PNԍ,��p�����E��Ɔ���Z�FlÎ;���F��7��Ȯ;�
��s�wSz)g7�{r�s��S��gȋ��(߄~�AWytX�$�NV����R�_��<6�p.�O�8�O[�OdDk>_��O�O�}���JS���d��mV�?�W(_��m� ��j��~=H IԁF>T/��{*]IGJ@i��qam�NF|Q�5���0+���E�S8�:�v�`p~v���j:B����p96�o�ys%��������
�|@H�����]��+�@��t]W�k}}���7��Fʮr���A�����B���\m�-�_�2PY8�����x�ՎN�.h�~��@+7��z5������t�_/�����/�?���0�S>��)���z�i0n�/�B����`{D��W���#`����B��o���[,�g��FVЁ�pP߾���C]Bz�� ��,X�����X�fԃ����A�:H�� k�7��d�Z9��oc}o�]�0�vd�:R]�0�ve���]刈����j����у����|
	?�+(��OǍ�+	�#��ys���ߍ�n�p���Fru<��.HȺotM�3h���}��߆P}�������˗��v�����P�}mǀ���?��W��Z@���������}��������@��@��FD�������l�%tEXtdate:create2016-07-13T10:21:59+00:00��%tEXtdate:modify2016-07-13T09:26:54+00:00�͠tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�installer/dup-installer/assets/images/ui-icons_222222_256x240.png000064400000015412151336065400020162 0ustar00�PNG


IHDR�E�r@bKGD"�b�	pHYsHHF�k>'IDATx��{he�}�?g����{��1)�����]K&qq�U�4kbiK�R(H��B��P(I�vJ�_��ӮIV�@nB�5i�N��iG�jq�&
~A#Q����rX'����9�:�ܫ{�3�E{�=�y�o~3g~��Mp�&��1Xxh8<�#dlЅ�Mx1�&��$�5~��V��	��c�$�ױ���,��	��ƹ�i���N:�Z
��ߊY���>�"�B��H!�������-C�u�8t�}����8�!�B��	*�OF�.[�aͲ��l��B&���1h�>��M]hN���4MAb��̐!(�hE�1�5jձcO�<6�e7�,e���S(�f�o�16+3�y
JR|{�^3�^����{�88������~'����pxh8<4��
�g����������2�n6e̘�����{�����Q����pӀ��P�A��iۺߖ�f�S����(�D��'�L�6=����T:s�f�q��羀l��.c�I
���ǧ�=�i���M�>��ڠLN{U��&������&��{u��o����.�.��4~#����pxh8<4��
�g��Û��p���^i����/�0���TW�c����Q��� �@)��y��u}`L��Uc��%T�������ȥ
�A��R��@�?��P�-`����BKl�
b����Z}�������Ш��͢uJ��%U�]�K2��e
ts�Y���@,ee���豅r��jcܭs��M�n�0
A���mP��y
�D�K(5�,�lN�&b�D�m�rwYDV����t�e$��謷�
�L���[��C��0O��	P��&��0���+�;�
�g���3@������pxh8<4����Y��`��O����F�Z<��h�\J!c��`����j
�;TK�Vr�0��ʹqc�cGz�䟾c�[ ̕P5�t�h�)���ti���З߭ty��׎����&��M/Е����S���u����@��݅���n���b�9��`y�9�󉡔�Ya�SX�0e���q�J`nB���g����b�����3���4P�- k�**�@HC�z(}�򯂬�U����cj2��=��Ob����3�
���R��05���1U�\8SMi�U��}���΀�l�Hl�N�
���J��q+%e�7s���"�<։�ּ�z���M�L�T��ƾP�1f�1i�Ѹ��Vp������pxh8<4�z�A��+ o`�I_�R�����~�~��f��սh`�Ic�K�h����Q�p��xx`=�j�`]|S�B�(����(��v���F3�4v�؁6��T��4
���5���:���*��-D#�n6��a��J<U���~�y(�1��(,�|t�z�}��d��j��0u]PT��-D}@����
�n�+[�Ύ� A�B�T���(V� K������BT<𑹗[F{m��=��-�ڤ����$��.��JR�U
j��:X��e�n�e���bՅ��"C	��e2�@�Ј�݂�	�Ѱ��xxh8<4��
��1@kX6I��<��M*�Љ�Ѣ�+�b���04(�.�M3Z�<]&i�UuY�a�^2�w�ͻ�ɨn�U�@�n����E�4
���O�Us�.J���}��dw�Ed�p��� �me^f���mF
gg�����T��G4�Ѱ����m��������N��է��N�c�����������5�L�xi���D��9�|��%ܔ�h�P=�áb����o�p�VBG�X ,�#E��+�\�^��oʼdM��ɳ]�d����.�@ 䮚��D���e��FU6'g6��)��52p|��f��X�_a�"z��x���� �w�.c�t�
�
�g���3@ñ�`"�i��K�9���s
D07�
ӕS��E�oC�Y�Z�l'N��~_Sƞ��y���a��xK�������z�-&|(�ϜC�K�����Xg�d����5Ig��8k8YTL=�,/
]s��w-~��t�����e�	^�~�&6vh�}�Զ�:g��?m�bG!����1�:O8���]�%��2�����v
�E�@�5"�6	Y�rXcRb��ݎ���E%���`�#�D��r¤��Z�:�ϛ!�x�R��h�!��}v�۴��ϳ����x�y}FrA1#�*�u�T�?>��!�x#�~��G���k���@3K@�:>P�R����M�A|��e]K�g�F.B����t�l�OY d��!(v�V�X��%m�#��I[RR�`2�T��	��H��w�Y�u=��b�YPEc�U%�&@�Ĺ�]��}�q���o7*�G�L�
��e�QX�5�U����-����³��8| ���_�ݟ��5\�5�p�VH^��\
�Fآ��a��a��5�l1�4[�#�b�o�P�1�E��is��wMJ'5�T���06�B|I�,b�����`�ՈP���X�k��B�$�[��-E�OHt�|�3�D�(i��d9�N6@x/ؠm�(�#�wj�P�t��/Z���obq%[:��3^�~a��5���5���|E닃�^�E��$�L�-���_s,
߫��㕔Ņ�&��
�_�,�������#F�}����&���.��<4��
�g���O��rdh9�����M7L(5꓂.���?M(�����stզ��-?�:��[ڧC�r�]�'��YB�2�l�C|
l�eXS��pG��0KcI��~�u�L0/��y�Lt�r�I�?�R�%�����-�w�Ƿ�h��$L�J�V���Ϳ�Ӣ,���g�
x�_7��l��4�*��u�M+�@�x�<}���q>��<�#��`�i�
:=��*��ۿ�{��)��_�8hs���������p�CWғ�K�`B]H��"}���_P�N���t�Q�l��1Y�Q�h+����&?��x�5:�	֘aY�ҭ���=\��En������.�Yʸ��J���E%uTj5�����F�'�����b;[��v�ט4�u��6]�lkw�3�÷���,: �%&��
�[|��|��|Yi�q`:�����qXc�2+u|~/�wrz�[j-�I>#���,�9�Q:�#,2����5@�@%��S@@6ÅJ�{��6��{��)h���W�~q]����t��<�+|�'�0O�a����6���3�U��HW������l;�����'�Z9�Z\�o��O�嵁���e�e�Ƣ[o��da����rEm&�ʧ�������3m���6��=�g�^S��x
Hj���mi�(v��ۈ�{.�h�_���%�8��nF�7y{����O���FS5�:����/��ա���W�P�H+b�����Gx��/9��I�Yy�.����M�t�T�eە,�ѿ�-�R���e�d��
��;�Ә:�9k��T�5��m���������E�G��|\Wu���ǣ��@^L��E�
��4��
�g���y��;
J'U��䐎N׷�<�p2m���ӫ��.Z������Z5<� V
,��p�3��w�=~�3j��ǿě�#����ʭ�|�S��f�yk��=C�n1]�C�'I_O��*,�J՞�D\\I���}�E�\�$�M�(�E��\�߮�?ƫw
�����NJ��E�b�6��t�z�:<��u��d��k��vs!��PfM��7dT����3	��*S,�AZl+N����l�R�&{�I��T�G�O�*�M~�;�����XFS��j����^�Q���N�n3�Z��0Ne�R�]�3�8��<�$@�˜c.�t�=�.{e��'�TI�s��u���>-?B��p���?��X�J	$�x�QJ}�!#��Ո2�Ht!VɽV�\'��Y�3�6����6Yu��JOAa�[5e���]p9=7����t�_�y��?�OS���<V��q.��Ի���;�8�~��YE����KSȀ��Xjq@M�
���/�p�X�۴�[�S��c7�'S6	�E� ������_Ձ'�_��)^3�b�h���+Z	��"rLz�ZA��#��[��'?�Z7{mZl�Ӭ�Q�De+^��o�*D��g��r؈;/�."�HF�Ƴ5�)F	��2�c.�W�~�`����VEl���6�R��8ظ�ky�k�.����`��Fp7pps"�"��KR{(us�[�%6
u�s�ͻ���,BD����/�ȷ�_Pt?�Y�Vy�.s���Y�3����3���\�V*#��y�f2j��g���A��Ѣ�
�g�-�5����Fh�-1�9�v��<�s	�����m�� =/�_f�WX�M�&�לi�†RvٗQt��_��"����Q<�(�1[��_~��b"T z3��sxh8��������p�`Z�/�NΧ���F��{�"p�i`��
�gsO��s�.�G}��t<��9�ug���g�R`���&��X�t�岇�}�	�����7���2J�X�e\��	08j=�XJ�Ql�l���x�6z(\5Q��I�=�l
8�7Ɏ��E�a4�O�;�-�M�1Iy�vV�y^�b�EN��sQ���Cw[
�2	��V�Ǽ�	o�yw�7J����K'�Tu�l�>_�i���T��<͛<�iM
�p������7�YMW���=�ӡl(����u�+���^j��>3��2N묳}��jH�Q
RT�Ȣ�� ���n�fݮ�~�+��c�iQ��<
����Ma=��|�*����
�$@'��Ԍ��ǕqUO;�5~@��eI�2��9�w��"��O�~��s��s��k{‰��$�m��>����v�z��^2���v�ow�`a������4c��M C����b�>����q:��o�=�-�p`_2�ng:6K��XV,����2�Ǿ��6��
�g���3@�� ��ś�sa���R��WWB
g-N�;F[��Ւa�A�V�L�F�<-m
VbMC����7���K)�X��P�y�
�s�~��=�����<�ܒ�{�x!�=����Ãq�R��l�]���/��� 0�l)'�}�#�^tX��孋�t�8FC�Y�$)�PUBE�(~��Ҟ��V�2^��*SL�H�l��S��'IA[������Z���x-V�"ȥ�J�+���\�|�5u�W��nLJ�k�ܟ���(0�0����JyꞄ���a���f��g����6��
�g���3@Ñg��[�}��Z����Q�k?ҳ=��z�I$Т�:�9FW��m�x��:\(�W���+��e���F�9�,��*�!Gh�D��L��8�[v��o����)�A�a�K�5�S/�)^c����(��W�H�N�W8T�r=op��p]MC�O?���*��
D΢Ob/�hs�0�ڜb�9�1C�9-����o�ۿ���ԗ��u���Q��Fc���|W�%@�HB�2�9�����/Dx�D`�U:�Ƈ�gi����"`�%��ᄽ
������t
�E`t���6�2k�)P�E�ѿO,�?�k��_�yh(/����=@��u
�g���3@������v@]��<���]���~��WD�`��.��f���~�o��ʈ�N�VA�߈�ե�M����
�^��y��M�Q|��ߛ^-{o�~��>��w���Ѓ
��(��g��X���ץ�i��&�X
u��D�U���͕l� ��ғޥ�ߞ���k������PH�H�C�J�~��S�@O�� �׋�ѓy7���
�k {��25���of����ϫ�o���{��'!�'��Z%��q�*)�g���C\���#��\���'�0���P_���WL��7��&AlJ���\��� Z��p��,���Y�x��j�c�����O�(6z�I�V�� u�:ג��T��D��O��9�ׄ�Q<��*y
=���2��~����/?J,����WJ�Q�W�>����W��u�?��#G��/���4�"�K���{㧏�',I��ҟ综E;���|R�ݠ��~��W�7i8�6����pxh8<4��
��r�<}8� kG�o;��u�C��P��v�)��A�<$��ց;��{l��� ���� �#`�F���C�!f�	Ӆ/`7��(��0R!9�9�z���@%!/m�]���Ad�hv�G�����3@������pxh8<4{���P/ 3@�}��	B&�^�16�{.
����ߠa�Q�o
���2l���mt���!\%@�X���?5��ճa�~
��ʠM65wk��a�)T��F��_�
2�$�x�5�_9!�VxRd�1!}����'�`�$���Uԇ��r�?�	�Q
�`7`�.��k����_V����zԄ��p�]]�GO�LXCk�3�%tEXtdate:create2016-07-13T10:21:59+00:00��%tEXtdate:modify2016-07-13T09:26:54+00:00�͠tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�installer/dup-installer/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png000064400000000430151336065400023231 0ustar00�PNG


IHDRd2��bKGD���1�	pHYsHHF�k>ZIDAT�cx|��Nhã����2<hc�_�p/��n,�
�[_n�g���p=����w2\je�X�pa�&�s��b8�p��"����Y{%tEXtdate:create2017-01-28T18:04:16+00:00�I�%tEXtdate:modify2017-01-28T18:04:16+00:00��&IEND�B`�installer/dup-installer/assets/images/ui-bg_glass_95_fef1ec_1x400.png000064400000000514151336065400021362 0ustar00�PNG


IHDR���A�bKGD������	X��	pHYsHHF�k>�IDATH��ϱ
a����\!V��J#X���ЋD}�
.f�>���>��P�կx���x���q��жuɚq���f+��6���[��\�‡����כW�T4r��6:]V:�,
(�Ŵ�8�yG-(d��	H%tEXtdate:create2017-01-28T18:04:16+00:00�I�%tEXtdate:modify2017-01-28T18:04:16+00:00��&IEND�B`�installer/dup-installer/assets/images/ui-bg_glass_75_dadada_1x400.png000064400000000406151336065400021425 0ustar00�PNG


IHDR���DbKGD���1�	pHYsHHF�k>HIDAT8�cx��a�"��[�n{1�qc��po"�?3}`xR���1�s?��^^bxu��u)�뉣h��W�%R�|%tEXtdate:create2017-01-28T18:04:16+00:00�I�%tEXtdate:modify2017-01-28T18:04:16+00:00��&IEND�B`�installer/dup-installer/assets/images/ui-icons_888888_256x240.png000064400000015527151336065400020235 0ustar00�PNG


IHDR�E�r@bKGD�I�( 	pHYsHHF�k>tIDATx��{le�}�?g�
k�u��J�>D�C�^�Q���M��H��*MU��
h�(*$H���R�*j�	�D�]����)Ż(M6��F�6!6�-
�xI���i�-�� HN�8��s�uι��g�����f����7��3����ƣ��7�x^/2&�v&v^DL�	l6I�-�o?��cn��D Iy�e�#d0+�0�3��~�����0�g'L�V���[��R�C:B�~(��)$q�vXu�B@��E@`H�NG��`TA�%=]�qAw��J)��u)�9�:e9d`V��0�A{�=��BS*�ڦ�S��gFA�-(D��R˷@�"����g'�U�,eSwʿ���j��*�)l[����.HLyϰ��9�����j�a�I6��MR~��~�nG�ٕ�3�
����@������pxh8�4~=@>���(��mE��3a\`~��=u����Q����[�f3W��A���i��oK}3wէ�gV�����,j���n2��*ߕ���m��M�]
y=��xn"�co�.�L"�7]��EC�:dHz�E@W�.�f+^�eƦ6vռE4��O���`��̴�.�)l�:��7����){�_Я��~"����pxh8�4^/
����/�#�\@��S��^�T�0sZs1�J�1�Pr��h�w�V��E�g���S��T��Q5�[	\B���O
`+�˾>}����\�6��/0��k�g���1[
�Kh��l�Xʿ��_�Z�^IA���^�N�4v���OW=%i^�<��9�t�f �2����С��B�Hg�6���!u�\ҭZ�&蒶�
�2����s	���U�]��i�T����� ��]�Uaq;]�A
�:�rG-3�<F�n��*�ݴ�T�ݯ	4<;�������@������pxh8�4^ysh�,ux��$\j��"Z-�mo��SJ��9���{�
���e˹[
�\�fָ�ұ��y�2LT��0�K@�9Լ��Ţ=���?Х��B���=c"��v�T�6
Tokza���9T���s&�6��ո���v�� }3�':��[�5�)�,�xU!��҃@}����U� �kc��
ꈡ����Y,]��`&߬('u*�^�v	��O�wu�?}2�&�C����Ȗr�}ݾ^g�[`�yc*�9s�"���f_��b��
uuT?�M���f�

e���ۏ�0e�vb�c�J��EM%�6���Po��l�M`n�~Esչd�j|�z��)miOq/{�ک��Jq���A�G������pxh8�4^��a��+ ����ʥ�5�݃F�����+��Y�&{�˾���I�
�z��\e�X�����oJ}Hȯ�iW��)~�n��m߮ɞh�����l*7TP3k���XJ7R"�����"NX�U�}ٔއA���/(qW�\���v6�$2�
��-��˶Ezd��j��0u]PT{�[�:>>�LDkZ�Y���ֺ�14�ZC�WU���b�d�12zB���Y�$i".�~A�i=�����Œ��۪>���E��AI�b�\Ϋ�������
c6��O�SB\��ɅJ#"�RE�Ȱ_'�I.�aluI��������	��YX^/
����@����=h��$i3�7[��d:Qu!Ztw�Ul�~F��Ż�b�k�K"$-c��.�3���@�,�y�;i�-�JӉR�޽H���!���ɷjN��;��Ldw�Ed�p��� fO�,�j�T�q��������+
򩸹�h[@Vef��6KV��x��\�b���|���l}_�$U+�W!��?o[�����y�B(�p3
��r_�5P�2ݚ�la�˱*�x��GXG$�`�W~9?�r+��y�-k��d����.�@ <]�����#<R�y0/��99����T����^w�
����.�?0�ꠁ{�]0j"<�v�g��Qxh8�4^��$S�L��@����oԆ�5	�l\q+�VN�!��߆���j��L�b-����=UK<��׳�6��R���?S�j����b�s�'�\
>U��\Z,��W����4Ig��9��L�1�sa��R���O�^�.�P����(�>�K��\�c�6m^�um
��Ql��g�"�y[ө�D�/����[V�*3谨�X�m�@[�q�X#r,a��5�	kLK"0���񢐻(����q��A�O�VP�U
j�(�iJ�l�Wq���l�i�����x�S�� T!s��XD@��s�9�k��y8��\a���Y���"�r������v֗u-	��v!���H�
���
�4<��@��(B$"Pd�V�Z��5Ɯ��	�ߦ�����s0k��B�5h$�=�dpϪ�_�@0+�����4@"h�O�t���c�ky5�v��z�K���\��1@ޒZ��]��B�_.܋ؿ�!�I�Xd��WpW0�Z%y9�s9�jaK���0��h�sN��,�lU�����X!����h�f!�2.)��0����� 6�B|Iq/�Ӽ��0�jD��F[,�5�
!m`�-������$�J~1w�WQ�J�D#"YO��
�6hV�Q��5C��t��/���7	�8�-*�"����_E�U�y0�x�+Cxg�h|����+`6H��i�A|]�����Z=^JE\`20
�~]���f 5X��`?S�0��Q^��?J�1�%[�Gxh8�4^/{��S�"��rؘ���ɛn�RZԧ[v�-�P����O��I'�Z~tt����O�N�z����q����g���آ�4��X�����ԃ,s�e��q�9
,2�)�^���Ķ/�����(��rS?�=<��B|W{|�&~�OO�������
�t�q���uZt�E��A��)n��7
�;O&-��+�D쏬iEcG����F�	?�c|�Ǹ��54�:�,lz��O�l	�7s��'~C���%B�f�2:`��ě਒�T��T��bjn�
F�E���,�,p�n��F4'өkLWr�"�P[oa��o��s��k�qNkҭ����\��n������.�Y�xS�V(A����q��t+/ԫ-�u�p0w�-z��4��ƴaY�=zt���n�g~��2�7Y,,耄��L
d�=|�|�|Y�p�z��?2�\���f�˼��\~'f�{�[j,�	>#���(�9�a:��,��وK� �x�R�.  ��B%�f6����n�ϻV���/Σ������� %O��+|���!��I��6���3�e��HW���O�� vXIK�O�rZ�8���g�g8=C��2�9Ǫ[�P��B'���rAmK"zʻ�!����
���m���6�뱾�3����y5����ܓ��"�[<
�J��sϏ��U9Z^��8_�fD!Zq��_\��- ��-`<uQS,�y����b�]z@h`�*�*GZ�����>��)����D�g��鲔��iqIb.JXT���bj�k�$��M��1^�K6�<��˿�9��C_��fr��E���M~���8]�T�xX��u5�_<���t_0PA���𶀆�@������p4O"�qGA餦�����v�GbQ��p�rz��E��3�3�U
�6����+��$�q?�W
1��X�K<�8�
���[����sC!��}E~5C~=C�n1[x�LO
��g�U�X���=�����̪�y�hs��l(&U�'/qg�v�|�^�8Sx(��o(�B�x�e�\�ӑ�����ľ�U��s���:�҅ͅ2k
W�!�B�Ԝ�i�
V���EO�f�X6�g�A5�kOد2���jS��6ۼ�[J���S��j����Q��:(���Z��0Ne
�Z�]L2�$����4@��8�B,��,�Nj(�t'�8.��JC�L�K�U���i��5�#�Xx�#|�U:��@��m��??d,^q5�L!�]�Mr��I4�pZ��;��>�g@��M�F�K�)(�}�f��U�.�{���]��~5��5������>�"����$c�����+�ן?��Q��c�#
�mK-6�)࿁���_�Y�n��G+��:�|a������"�~ϯ��ٯb�q�~=�+���,j�?�M��y
9"�y��D��ʍn��g����6-z<�,+tK�����xW"����'l��˾�H��[yJ�&�a�@�~/�9�"�a�%�$iѣ��6.S��8ظ�+y�+�*�o�jo�mp-���k��1	�u����%�=�����-�"�
��4wq�-��Ր�E���K
�|�Uf�G�
-��Ua]X�r���x.�\���˅h�:"����LF�dF���5p���f�覊�)n�Yͣ�n��Fh�
1{�'��\��<ϫlik)$H�䇙�5��%y�kni�b
��/���O���E���OjZ�<�,�b�������P	���p�+�@��<[��/
���#/�Z�wp6�$�5�D��E�����
���|6w�^>7��{ԇ�Nĭ��Pw���f�>��k�7�/��c͗=��cM��ﴯ߁A�E`�q��:N*��N��Q��b�UG�`��ʟ�Ƴ���Cᨉ"��5�w5�.��&�v;����.ܱ��7e$�$��y�K�YE<[�y�8����M
n�m%�U�4@��[��&����EC�(�.�/��b���C��>Z�1�_P�O�^�;�����!�N�wc��l�^���]`C1�L�����8GO{�
<��fpY�8���:�X�! ��W�Z���Vc��ʺ��b���+����_ݖ�fp9U�4��u
*��QD�I�3cv�1e\�ݎe�(ֲ$��ؿ��.�]��z�)�/�>�>.|mO9Q��HN
�P��{����;�=�YJ���7'�[��ɂ-����b<
Xӌ�2��@}�޺Pw������aŨ�M�	lqG{R\p��Dx�s��T3�X�ؓ����@������pxh8��ѱx��e l TZ�B��H�a�e�c��t*ZHF��b52�iiS�[:�DH�S
�))%��_rp�S���eUӮ@��*I�3�*�C�
3��=���&�&5�CB���`����Ê�,o]���~����]3�t������ح�jXe�x����0CTA3œy �5�{�t����!k@QV+Vr��
3�e!�̰Bː�ۓ��O�A����԰‰	#	���U4V��D�ч�D����*Oݕ��<:�Xl��Bxh8�L`������pxh8�4y0�؃���J��k5��#;��ǮD"-�鞺#t�Ln3ã|��Áysɩ�q�v��A2t�>�}�<���Jw�Z,ӱ:�-�*��%��A$-�lp�I�d���5�S/���BGs�iN�z,v�~�79P�r5�q��p]MM�O?�m���~"g�ǀ����9VhAmn`��0G�)�����ԧ_ԇ��U�����W�1}�3�y
A�����p��;d��U��>X����J��x��<mV5'Ṟ�a�0�Wa��s��w��A2�����<w�F}b@�`fQ���=�{Ɂ�h����s<���5P�ŏ�.�_�px[@������pxh82��P�~���G�Mt��M���-�v@]���ܠ�.߰�	�����~��K�9�4}��6��. �/n�:��&"O�'�"�'G�SH��;U�k�A��'��U峕_������4]|]̅�+%�w~�tUFD�w_���/}�����e��7��%~�B*E����K����e�Uپ^̀���Y��`]�����2���Y��O�ޯF��g��E��OB�O���Z5��v�*)���*�C��63ه
��(��/�w0��zP_���WL��
7��AlJ���(�� ��p��
,���Y����j�c����w�(6z�I�V�?+�_�Ԓ�༔���D��O+��9�7��Q��*y
=���2��|��/?J,����+%q�{^�?�@�r_O�ץ�����^��c�A�o���.�J��㻏�,K��ҟ��E;��7|B`�N�]�a�+�/i8�5����pxh8�4^/
�hr?<}4� [��o���u�#�bP�u���\��������l�{l��V��{h��102p�1#=�СG�y����/��(�b0V!9�9�z��&@%!m�]���A�ju�G�����@������pxh8�4�W&��P? @�y��)B���	6��SY&�ϰak�����ͽY6��pakݞ�}���(|�!,���W/�	���/��A�lj�֮�x�)T�I#}ˏ�YL`2eM�)���
w�B4!��1����FIx���>�8�c��&�G)�j���I�����}@�5��V�&J?��	Y����!�\=jb��<�����h�jo%tEXtdate:create2016-07-13T10:21:59+00:00��%tEXtdate:modify2016-07-13T09:26:54+00:00�͠tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�installer/dup-installer/views/view.s1.base.php000064400000240710151336065400015406 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */
/* @var $archive_config DUPX_ArchiveConfig */
/* @var $installer_state DUPX_InstallerState */

require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.archive.config.php');
require_once($GLOBALS['DUPX_INIT'].'/ctrls/classes/class.ctrl.extraction.php');

$is_wpconfarc_present = file_exists(DUPX_Package::getWpconfigArkPath());
//ARCHIVE FILE
if ( file_exists($GLOBALS['FW_PACKAGE_PATH']) ) {
    $arcCheck = 'Pass';
} else {
    if ($is_wpconfarc_present) {
        $arcCheck = 'Warn';
    } else {
        $arcCheck = 'Fail';
    }
}
$arcSize = file_exists($GLOBALS['FW_PACKAGE_PATH']) ? @filesize($GLOBALS['FW_PACKAGE_PATH']) : 0;
$arcSize = is_numeric($arcSize) ? $arcSize : 0;

$installer_state   = DUPX_InstallerState::getInstance();
$mh_manager        = DUPX_Custom_Host_Manager::getInstance();
$is_overwrite_mode = ($installer_state->mode === DUPX_InstallerMode::OverwriteInstall);
$is_wordpress      = DUPX_Server::isWordPress();
$is_dbonly         = $GLOBALS['DUPX_AC']->exportOnlyDB;
$managed_host      = $mh_manager->isManaged();

//REQUIRMENTS
$req       = array();
$req['05'] = $arcCheck;
$req['10'] = DUPX_Server::is_dir_writable($GLOBALS['DUPX_ROOT']) ? 'Pass' : 'Fail';
$req['20'] = function_exists('mysqli_connect') ? 'Pass' : 'Fail';
$req['30'] = DUPX_Server::$php_version_safe ? 'Pass' : 'Fail';
$req['40'] = $managed_host === false ? 'Pass' : 'Fail';
$all_req   = in_array('Fail', $req) ? 'Fail' : 'Pass';

//NOTICES
$openbase            = ini_get("open_basedir");
$datetime1           = $GLOBALS['DUPX_AC']->created;
$datetime2           = date("Y-m-d H:i:s");
$fulldays            = round(abs(strtotime($datetime1) - strtotime($datetime2)) / 86400);
$root_path           = DupLiteSnapLibIOU::safePath($GLOBALS['DUPX_ROOT'], true);
$wpconf_path         = "{$root_path}/wp-config.php";
$max_time_zero       = ($GLOBALS['DUPX_ENFORCE_PHP_INI']) ? false : @set_time_limit(0);
$max_time_size       = 314572800;  //300MB
$max_time_ini        = ini_get('max_execution_time');
$max_time_warn       = (is_numeric($max_time_ini) && $max_time_ini < 31 && $max_time_ini > 0) && $arcSize > $max_time_size;
$parentWordFencePath = DUPX_Server::parentWordfencePath();

$notice       = array();
$notice['10'] = !$is_overwrite_mode ? 'Good' : 'Warn';
$notice['20'] = !$is_wpconfarc_present ? 'Good' : 'Warn';
if ($is_dbonly) {
    $notice['25'] = $is_wordpress ? 'Good' : 'Warn';
}
$notice['30'] = $fulldays <= 180 ? 'Good' : 'Warn';

$packagePHP      = $GLOBALS['DUPX_AC']->version_php;
$currentPHP      = DUPX_Server::$php_version;
$packagePHPMajor = intval($packagePHP);
$currentPHPMajor = intval($currentPHP);
$notice['45']    = ($packagePHPMajor === $currentPHPMajor || $GLOBALS['DUPX_AC']->exportOnlyDB) ? 'Good' : 'Warn';

$notice['50'] = empty($openbase) ? 'Good' : 'Warn';
$notice['60'] = !$max_time_warn ? 'Good' : 'Warn';
$notice['70'] = $GLOBALS['DUPX_AC']->mu_mode == 0 ? 'Good' : 'Warn';
$notice['80'] = !$GLOBALS['DUPX_AC']->is_outer_root_wp_config_file ? 'Good' : 'Warn';
if ($GLOBALS['DUPX_AC']->exportOnlyDB) {
    $notice['90'] = 'Good';
} else {
    $notice['90'] = (!$GLOBALS['DUPX_AC']->is_outer_root_wp_content_dir) ? 'Good' : 'Warn';
}

$space_free    = @disk_free_space($GLOBALS['DUPX_ROOT']);
$archive_size  = file_exists($GLOBALS['FW_PACKAGE_PATH']) ? filesize($GLOBALS['FW_PACKAGE_PATH']) : 0;
$notice['100'] = ($space_free && $archive_size > $space_free) ? 'Warn' : 'Good';
$notice['110'] = $parentWordFencePath === false ? 'Good' : 'Warn';

$all_notice = in_array('Warn', $notice) ? 'Warn' : 'Good';

//SUMMATION
$req_success = ($all_req == 'Pass');
$req_notice  = ($all_notice == 'Good');
$all_success = ($req_success && $req_notice);
$agree_msg   = "To enable this button the checkbox above under the 'Terms & Notices' must be checked.";

$shell_exec_unzip_path  = DUPX_Server::get_unzip_filepath();
$shell_exec_zip_enabled = ($shell_exec_unzip_path != null);
$zip_archive_enabled    = class_exists('ZipArchive') ? 'Enabled' : 'Not Enabled';
$archive_config         = DUPX_ArchiveConfig::getInstance();
?>

<form id="s1-input-form" method="post" class="content-form" autocomplete="off">
<input type="hidden" name="view" value="step1" />
<input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('step1'); ?>"> 
<input type="hidden" name="ctrl_action" value="ctrl-step1" />
<input type="hidden" name="ctrl_csrf_token" value="<?php echo DUPX_U::esc_attr(DUPX_CSRF::generate('ctrl-step1')); ?>"> 
<input type="hidden" name="secure-pass" value="<?php echo DUPX_U::esc_html($_POST['secure-pass']); ?>" />
<input type="hidden" name="secure-archive" value="<?php echo DUPX_U::esc_html($_POST['secure-archive']); ?>" />    
<input type="hidden" id="s1-input-form-extra-data" name="extra_data" />

<div class="hdr-main">
    Step <span class="step">1</span> of 4: Deployment
    <div class="sub-header">This step will extract the archive file contents.</div>
</div>

<!-- ====================================
SETUP TYPE:
==================================== -->
<div class="hdr-sub1 toggle-hdr" data-type="toggle" data-target="#s1-area-setup-type" style="display:none">
    <a id="s1-area-setup-type-link"><i class="fa fa-plus-square"></i>Overview</a>
</div>
<div id="s1-area-setup-type" style="display:none">

    <!-- STANDARD INSTALL -->
    <input type="radio" id="setup-type-fresh" name="setup_type" value="1" checked="true" onclick="DUPX.toggleSetupType()" />
    <label for="setup-type-fresh"><b>Standard Install</b></label>
    <i class="fas fa-question-circle fa-sm"
       data-tooltip-title="Standard Install"
       data-tooltip="A standard install is the default way Duplicator has always worked.  Setup your package in an empty directory and run the installer."></i>
    <br/>
    <div class="s1-setup-type-sub" id="s1-setup-type-sub-1">
        <input type="checkbox" name="setup-backup-files" id="setup-backup-files-fresh" />
        <label for="setup-backup-files-fresh">Backup Existing Files</label><br/>
        <input type="checkbox" name="setup-remove-files" id="setup-remove-files-fresh" />
        <label for="setup-remove-files-fresh">Remove Existing Files</label><br/>
    </div><br/>

    <!-- OVERWRITE INSTALL -->
    <input type="radio" id="setup-type-overwrite" name="setup_type" value="2" onclick="DUPX.toggleSetupType()" />
    <label for="setup-type-overwrite"><b>Overwrite Install</b></label>
    <i class="fas fa-question-circle fa-sm"
       data-tooltip-title="Overwrite Install"
       data-tooltip="An Overwrite Install allows Duplicator to overwrite an existing WordPress Site."></i><br/>
    <div class="s1-setup-type-sub" id="s1-setup-type-sub-2">
        <input type="checkbox" name="setup-backup-files" id="setup-backup-files-overwrite" />
        <label for="setup-backup-files-overwrite">Backup Existing Files</label><br/>
        <input type="checkbox" name="setup-remove-files" id="setup-remove-files-overwrite" />
        <label for="setup-remove-files-overwrite">Remove Existing Files</label><br/>
        <input type="checkbox" name="setup-backup-database" id="setup-backup-database-overwrite" />
        <label for="setup-backup-database-overwrite">Backup Existing Database</label> <br/>
    </div><br/>

    <!-- DB-ONLY INSTALL -->
    <input type="radio" id="setup-type-db" name="setup_type" value="3" onclick="DUPX.toggleSetupType()" />
    <label for="setup-type-db"><b>Database Only Install</b></label>
    <i class="fas fa-question-circle fa-sm"
       data-tooltip-title="Database Only"
       data-tooltip="A database only install allows Duplicator to connect to a database and install only the database."></i><br/>
    <div class="s1-setup-type-sub" id="s1-setup-type-sub-3">
        <input type="checkbox" name="setup-backup-database" id="setup-backup-database-db" />
        <label for="setup-backup-database-db">Backup Existing Database</label> <br/>
    </div><br/>
</div>


<!-- ====================================
ARCHIVE
==================================== -->
<div class="hdr-sub1 toggle-hdr" data-type="toggle auto" data-target="#s1-area-archive-file">
    <a id="s1-area-archive-file-link"><i class="fa fa-plus-square"></i>Overview</a>
</div>
<div id="s1-area-archive-file" style="display:none" class="hdr-sub1-area">
    <div id="tabs">
        <ul>
            <li><a href="#tabs-1">Package Details</a></li>
        </ul>
        <div id="tabs-1">

            <table class="s1-archive-local">
                <tr>
                    <td colspan="2"><div class="hdr-sub3">Site Details</div></td>
                </tr>
                <tr>
                    <td>Site:</td>
                    <td><?php echo DUPX_U::esc_html($GLOBALS['DUPX_AC']->blogname); ?> </td>
                </tr>
                <tr>
                    <td>Url:</td>
                    <td><?php echo DUPX_U::esc_html($GLOBALS['DUPX_AC']->url_old); ?> </td>
                </tr>
                <tr>
                    <td>Notes:</td>
                    <td><?php echo strlen($GLOBALS['DUPX_AC']->package_notes) ? DUPX_U::esc_html($GLOBALS['DUPX_AC']->package_notes) : " - no notes - "; ?></td>
                </tr>
                <?php if ($GLOBALS['DUPX_AC']->exportOnlyDB) : ?>
                    <tr>
                        <td>Mode:</td>
                        <td>Archive only database was enabled during package package creation.</td>
                    </tr>
                <?php endif; ?>
            </table>

            <table class="s1-archive-local">
                <tr>
                    <td colspan="2"><div class="hdr-sub3">Archive Details</div></td>
                </tr>
                <tr>
                    <td style="vertical-align:top">Status:</td>
                    <td>
                        <?php if ($req['05'] == 'Fail' || $req['05'] == 'Warn') : ?>
                            <span class="dupx-fail" style="font-style:italic">
                                    Archive validation issue detected. <br/>
                                    <small>Please see validation section below for full details.</small>
                            </span>
                        <?php else : ?>
                            <span class="dupx-pass">Archive file successfully detected.</span>
                        <?php endif; ?>
                    </td>
                </tr>
                <tr>
                    <td>Path:</td>
                    <td><?php echo DUPX_U::esc_html($root_path); ?> </td>
                </tr>
                <tr>
                    <td>Size:</td>
                    <td><?php echo DUPX_U::readableByteSize($arcSize); ?> </td>
                </tr>
            </table>
        </div>
        <!--div id="tabs-2"><p>Content Here</p></div-->
    </div>
</div><br/>


<!-- ====================================
OPTIONS
==================================== -->
<div class="hdr-sub1 toggle-hdr" data-type="toggle" data-target="#s1-area-adv-opts">
    <a href="javascript:void(0)"><i class="fa fa-plus-square"></i>Options</a>
</div>
<div id="s1-area-adv-opts" class="hdr-sub1-area" style="display:none">
    <div class="help-target">
        <?php DUPX_View_Funcs::helpIconLink('step1'); ?>
    </div>

    <div id="tabs-opts">
        <ul>
            <li><a href="#tabs-opts-1">General</a></li>
            <li><a href="#tabs-opts-2">Advanced</a></li>
        </ul>
        <div id="tabs-opts-1">

            <div class="hdr-sub3">Extraction Settings</div>
            <table class="dupx-opts dupx-advopts">
                <tr>
                    <td>Extraction:</td>
                    <td>
                        <?php
                        $options    = array();
                        $extra_attr = ($arcCheck == 'Warn' && $is_wpconfarc_present) ? ' selected="selected"' : '';
                        $options[]  = '<option '.($is_wpconfarc_present ? '' : 'disabled').$extra_attr.' value="manual">Manual Archive Extraction '.($is_wpconfarc_present ? '' : '*').'</option>';
                        if ($archive_config->isZipArchive()) {
                            //ZIP-ARCHIVE
                            $extra_attr = ('Pass' == $arcCheck && $zip_archive_enabled && !$shell_exec_zip_enabled) ? ' selected="selected"' : '';
                            $extra_attr .= ('Pass' != $arcCheck || !$zip_archive_enabled) ? ' disabled="disabled"' : '';
                            $options[]  = '<option value="ziparchive"'.$extra_attr.'>PHP ZipArchive</option>';

                            //SHELL-EXEC UNZIP
                            $extra_attr = ('Pass' != $arcCheck || !$shell_exec_zip_enabled) ? ' disabled="disabled"' : '';
                            $extra_attr .= ('Pass' == $arcCheck && $shell_exec_zip_enabled) ? ' selected="selected"' : '';
                            $options[]  = '<option value="shellexec_unzip"'.$extra_attr.'>Shell Exec Unzip</option>';
                        } else { // DUPARCHIVE
                            $extra_attr = ('Pass' == $arcCheck) ? ' selected="selected"' : 'disabled="disabled"';
                            $options[]  = '<option value="duparchive"'.$extra_attr.'>DupArchive</option>';
                        }
                        $num_selections = count($options);
                        ?>
                        <select id="archive_engine" name="archive_engine" size="<?php echo DUPX_U::esc_attr($num_selections); ?>">
                            <?php echo implode('', $options); ?>
                        </select><br/>
                        <?php if (!$is_wpconfarc_present): ?>
                            <span class="sub-notes">
                                *Option enabled when archive has been pre-extracted
                                <a href="https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=pre_extracted#faq-installer-015-q" target="_blank">[more info]</a>
                            </span>
                        <?php endif; ?>
                    </td>
                </tr>
                <tr>
                    <td style="vertical-align: top;padding-top: 10px;">Archive Action:</td>
                    <td id="archive_action_wrapper">
                        <select id="archive_action_input" name="<?php echo DUP_LITE_Extraction::INPUT_NAME_ARCHIVE_ACTION; ?>" class="input-item">
                            <option value="<?php echo DUP_LITE_Extraction::ACTION_DO_NOTHING; ?>" selected="selected">
                                Extract files over current files
                            </option>
                            <option value="<?php echo DUP_LITE_Extraction::ACTION_REMOVE_WP_FILES; ?>">
                                Remove WP core and content and extract
                            </option>
                            <option value="<?php echo DUP_LITE_Extraction::ACTION_REMOVE_ALL_FILES; ?>">
                                Remove all files and extract
                            </option>
                        </select>
                        <div class="sub-note" style="margin-top:5px; max-width:98%; font-size:10px">
                            <div class="archive-action-note archive-action-<?php echo DUP_LITE_Extraction::ACTION_DO_NOTHING; ?>">
                                Note: <b>Files are extracted over existing files.</b> After install, the destination folder will contain a combination of the old
                                site files and the files extracted from the archive.  This option is the most conservative option for those who want to make sure
                                they do not want to lose data.
                            </div>
                            <div class="archive-action-note archive-action-<?php echo DUP_LITE_Extraction::ACTION_REMOVE_ALL_FILES; ?> no-display">
                                Note: Before extracting the package files, <b>all files and folders in the installation folder will be removed</b> except for folders
                                that contain WordPress installations or Duplicator backup folders. This option is recommended for those who want to delete all files
                                related to old installations or external applications.
                            </div>
                            <div class="archive-action-note archive-action-<?php echo DUP_LITE_Extraction::ACTION_REMOVE_WP_FILES; ?> no-display">
                                Note: Before extracting the package files, <b>all current WordPress core and content files and folders will be removed</b> 
                                (wp-include, wp-content ... ) This option is for those who want to avoid having old site media mixed with new but have other
                                files/folders in the home path that they don't want to delete.
                            </div>
                        </div>
                    </td>
                </tr>
            </table><br/><br/>

        </div>
        <!-- ================
        TAB 2 -->
        <div id="tabs-opts-2">

            <div class="hdr-sub3">File Settings</div>
            <table class="dupx-opts dupx-advopts">
                <tr>
                    <td valign="top">Config Files:</td>
                    <td>
                        <select name="config_mode" id="config_mode" onchange="DUPX.toggleConfigMode(this)">
                            <option value="NEW" data-title="Details: Ceates new config files streamlined to ensure no conflicts are created.">Create New (recommended)</option>
                            <optgroup label="Advanced">
                                <option value="RESTORE" data-title="Details: Retains old config files from the server where the package was created.">Restore Original from Archive.zip/daf</option>
                                <option value="IGNORE" data-title="Details: This option does not create or import any config files.">Ignore All</option>
                            </optgroup>
                        </select> <br/>
                        <span class="config-files-helper">
                            This option creates new streamlined config files to help ensure no conflicts are created.  It also controls how
                            the htaccess, user.ini and web.config are applied in step 3 of this installer.
                            <?php DUPX_View_Funcs::helpLink('step1', '[more info]'); ?>
                        </span>

                    </td>
                </tr>
                <tr>
                    <td>Permissions:</td>
                    <td>
                        <input type="checkbox" name="set_file_perms" id="set_file_perms" value="1" onclick="jQuery('#file_perms_value').prop('disabled', !jQuery(this).is(':checked'));"/>
                        <label for="set_file_perms">All Files</label><input name="file_perms_value" id="file_perms_value" style="width:45px; margin-left:7px;" value="644" disabled> &nbsp;
                        <input type="checkbox" name="set_dir_perms" id="set_dir_perms" value="1" onclick="jQuery('#dir_perms_value').prop('disabled', !jQuery(this).is(':checked'));"/>
                        <label for="set_dir_perms">All Directories</label><input name="dir_perms_value" id="dir_perms_value" style="width:45px; margin-left:7px;" value="755" disabled>
                    </td>
                </tr>
                <tr>
                    <td>File Times:</td>
                    <td>
                        <input type="radio" name="zip_filetime" id="zip_filetime_now" value="current" checked="checked" />
                        <label class="radio" for="zip_filetime_now" title='Set the files current date time to now'>Current</label> &nbsp;
                        <input type="radio" name="zip_filetime" id="zip_filetime_orginal" value="original" />
                        <label class="radio" for="zip_filetime_orginal" title="Keep the files date time the same">Original</label>
                    </td>
                </tr>
            </table><br/>


            <div class="hdr-sub3">Utilities</div>
            <table class="dupx-opts dupx-advopts">
                <tr>
                    <td>Safe Mode:</td>
                    <td>
                        <select name="exe_safe_mode" id="exe_safe_mode" onchange="DUPX.onSafeModeSwitch();">
                            <option value="0">Off</option>
                            <option value="1">Basic</option>
                            <option value="2">Advanced</option>
                        </select>
                    </td>
                </tr>
                <?php if (!$archive_config->isZipArchive()): ?>
                    <tr>
                        <td>Client-Kickoff:</td>
                        <td>
                            <input type="checkbox" name="clientside_kickoff" id="clientside_kickoff" value="1" checked/>
                            <label for="clientside_kickoff" style="font-weight: normal">Browser drives the archive engine.</label>
                        </td>
                    </tr>
                <?php endif; ?>
                <tr>
                    <td>Testing:</td>
                    <td>
                        <a href="javascript:void(0)" target="db-test" onclick="DUPX.openDBValidationWindow(); return false;">[Perform Quick Database Connection Test]</a>
                    </td>
                </tr>
                <tr>
                    <td>Logging:</td>
                    <td>
                        <input type="radio" name="logging" id="logging-light" value="<?php echo DUPX_Log::LV_DEFAULT; ?>" checked="true"> <label for="logging-light" class="radio">Light</label> &nbsp;
                        <input type="radio" name="logging" id="logging-detailed" value="<?php echo DUPX_Log::LV_DETAILED; ?>"> <label for="logging-detailed" class="radio">Detailed</label> &nbsp;
                        <input type="radio" name="logging" id="logging-debug" value="<?php echo DUPX_Log::LV_DEBUG; ?>"> <label for="logging-debug" class="radio">Debug</label> &nbsp;
                        <input type="radio" name="logging" id="logging-h-debug" value="<?php echo DUPX_Log::LV_HARD_DEBUG; ?>"> <label for="logging-h-debug" class="radio">Verbose Debug</label>
                    </td>
                </tr>
            </table>
        </div>
    </div>
</div><br/>


<!-- ====================================
VALIDATION
==================================== -->
<div class="hdr-sub1 toggle-hdr s1-hdr-sys-setup-hdr" data-type="toggle" data-target="#s1-area-sys-setup">
    <a id="s1-area-sys-setup-link"><i class="fa fa-plus-square"></i>Validation</a>
    <div class="<?php echo ( $req_success) ? 'status-badge-pass' : 'status-badge-fail'; ?>	">
        <?php echo ( $req_success) ? 'Pass' : 'Fail'; ?>
    </div>
</div>
<div id="s1-area-sys-setup" style="display:none" class="hdr-sub1-area">
    <div class='info-top'>The system validation checks help to make sure the system is ready for install.</div>

    <!-- REQUIREMENTS -->
    <div class="s1-reqs" id="s1-reqs-all">
        <div class="header">
            <table class="s1-checks-area">
                <tr>
                    <td class="title">Requirements <small>(must pass)</small></td>
                    <td class="toggle"><a href="javascript:void(0)" onclick="DUPX.toggleAllReqs('#s1-reqs-all')">[toggle]</a></td>
                </tr>
            </table>
        </div>

        <!-- REQ 05 -->
        <?php
        $status = strtolower($req['05']);
        ?>
        <div class="status <?php echo DUPX_U::esc_attr($status); ?>"><?php echo DUPX_U::esc_html($req['05']); ?></div>
        <div class="title" data-status="<?php echo DUPX_U::esc_attr($status); ?>" data-type="toggle auto" data-target="#s1-reqs05">
            <i class="fa fa-caret-right"></i> Archive Check
        </div>
        <div class="info" id="s1-reqs05">
            <table class="s1-archive-local">
                <tr>
                    <td colspan="2"><div class="hdr-sub3">Archive Details</div></td>
                </tr>
                <tr>
                    <td style="vertical-align:top">Status:</td>
                    <td>
                        <span class="dupx-fail">
                        <?php if ($arcCheck == 'Fail' || $arcCheck == 'Warn') : ?>
                            An archive/installer mismatch has been detected.  Each archive file has a unique installer file associated with it for security reasons.
                            Be sure to download the installer.php and archive.zip/daf files from the same package line in the Duplicator Packages screen
                            located in the WordPress admin.  The correct installer can also be found inside of the archive.zip/daf file named "installer-backup.php".
                            <br/><br/>
                            <?php if ($arcCheck == 'Warn') : ?>
                                Users can still proceed with the install by choosing Manual Archive Extraction to ignore this message, but must manually
                                extract the archive themselves.
                            <?php else : ?>
                                If the contents of the archive were manually transferred to this location without the archive.zip/daf file (e.g. FTP).  Then
                                simply create a temp archive.zip/daf file named with the correct archive name.  To get the original archive name go to WordPress
                                Admin ❯ Duplicator ❯ Package Line ❯ Details ❯ Archive Name and place the file in the same directory as the installer.php file.
                                The temp file will not need to contain any data.   Afterward, refresh this page and continue with the install process.
                            <?php endif; ?>
                        </span>
                        <?php else : ?>
                            <span class="dupx-pass">Archive file successfully detected.</span>
                        <?php endif; ?>
                    </td>
                </tr>
                <tr>
                    <td>Path:</td>
                    <td><?php echo DUPX_U::esc_html($root_path); ?> </td>
                </tr>
                <tr>
                    <td>Size:</td>
                    <td><?php echo DUPX_U::readableByteSize($arcSize); ?> </td>
                </tr>
            </table>
        </div>

        <!-- REQ 10 -->
        <?php
        $status = strtolower($req['10']);
        ?>
        <div class="status <?php echo DUPX_U::esc_attr($status); ?>"><?php echo DUPX_U::esc_html($req['10']); ?></div>
        <div class="title" data-status="<?php echo DUPX_U::esc_attr($status); ?>" data-type="toggle auto" data-target="#s1-reqs10">
            <i class="fa fa-caret-right"></i> Permissions
        </div>
        <div class="info" id="s1-reqs10">
            <table>
                <tr>
                    <td><b>Deployment Path:</b> </td>
                    <td><i><?php echo "{$GLOBALS['DUPX_ROOT']}"; ?></i> </td>
                </tr>
                <tr>
                    <td><b>Suhosin Extension:</b> </td>
                    <td><?php echo extension_loaded('suhosin') ? "<i class='dupx-fail'>Enabled</i>" : "<i class='dupx-pass'>Disabled</i>"; ?> </td>
                </tr>
                <tr>
                    <td><b>PHP Safe Mode:</b> </td>
                    <td><?php echo (DUPX_Server::$php_safe_mode_on) ? "<i class='dupx-fail'>Enabled</i>" : "<i class='dupx-pass'>Disabled</i>"; ?> </td>
                </tr>
            </table><br/>

            The deployment path must be writable by PHP in order to extract the archive file.  Incorrect permissions and extension such as
            <a href="https://suhosin.org/stories/index.html" target="_blank">suhosin</a> can sometimes interfere with PHP being able to write/extract files.
            Please see the <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-055-q" target="_blank">FAQ permission</a> help link for complete details.
            PHP with <a href='http://php.net/manual/en/features.safe-mode.php' target='_blank'>safe mode</a> should be disabled.  If Safe Mode is enabled then
            please contact your hosting provider or server administrator to disable PHP safe mode.
        </div>

        <!-- REQ 20 -->
        <div class="status <?php echo strtolower($req['20']); ?>"><?php echo DUPX_U::esc_html($req['20']); ?></div>
        <div class="title" data-status="<?php echo strtolower($req['20']); ?>" data-type="toggle auto" data-target="#s1-reqs20"><i class="fa fa-caret-right"></i> PHP Mysqli</div>
        <div class="info" id="s1-reqs20">
            Support for the PHP <a href='http://us2.php.net/manual/en/mysqli.installation.php' target='_blank'>mysqli extension</a> is required.
            Please contact your hosting provider or server administrator to enable the mysqli extension.  <i>The detection for this call uses
                the function_exists('mysqli_connect') call.</i>
        </div>

        <!-- REQ 30 -->
        <div class="status <?php echo strtolower($req['30']); ?>"><?php echo DUPX_U::esc_html($req['30']); ?></div>
        <div class="title" data-status="<?php echo strtolower($req['30']); ?>" data-type="toggle auto" data-target="#s1-reqs30"><i class="fa fa-caret-right"></i> PHP Version</div>
        <div class="info" id="s1-reqs30">
            This server is running: <b>PHP <?php echo DUPX_Server::$php_version ?></b>. <i>A minimum of PHP 5.3.8+ is required. PHP 7.0+ is recommended.</i>
            <br/><br/>

            If this requirement fails contact your host or server administrator and let them know you would like to upgrade your PHP version.
            For more information on this topic see the FAQ titled <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-licensing-017-q" target="_blank">What version of PHP Does Duplicator Support?</a>
        </div>

        <!-- REQ 40 -->
        <div class="status <?php echo strtolower($req['40']); ?>"><?php echo DUPX_U::esc_html($req['40']); ?></div>
        <div class="title" data-status="<?php echo strtolower($req['40']); ?>" data-type="toggle auto" data-target="#s1-reqs40">
            <i class="fa fa-caret-right"></i> Managed Hosts
        </div>
        <div class="info" id="s1-reqs40">
            <p>
            <?php if ($managed_host !== false): ?>
                The installer has detected that this server is possibly in a managed hosting setup. The followings checks
                have been made which will not allow the installer to continue.
            <?php else: ?>
                Current host is not managed.
            <?php endif; ?>
            </p>
            <ul>
                <li>
                    <b>Managed system: </b>
                        <?php
                        if (is_string($managed_host)) {
                            $hostLabel = $mh_manager->getHosting($managed_host)->getLabel();
                            echo "<span class='maroon'>It appears the installer is being executed on \"{$hostLabel}\".  Managed hosting is not "
                            . "presently supported in Duplicator Lite. Please upgrade to Duplicator Pro to use this hosting platform.</span>";
                        } else {
                            echo  "<span class='green'>No restrictions have been found for this host.</span>";
                        }
                        ?>
                </li>
                <li>
                    <b>Configuration file: </b><?php echo $mh_manager->wpConfigIsNotWriteable()
                        ? "<span class='maroon'>The WordPress configuration file (wp-config.php) must be accessible and writeable to the installer</span>"
                        : "<span class='green'>The wp-config.php is accessible to the installer.</span>" ?>
                </li>
                <li>
                    <b>Core Directories: </b><?php echo $mh_manager->notAccessibleCoreDirPresent() > 0
                        ? "<span class='maroon'>The WordPress core directories wp-admin, wp-content and wp-includes must be accessible and writeable to the installer</span>"
                        : "<span class='green'>The WordPress core directories are accessible to the installer</span>"; ?>
                </li>
            </ul>
        </div>
    </div><br/>

    <!-- ====================================
    NOTICES  -->
    <div class="s1-reqs" id="s1-notice-all">
        <div class="header">
            <table class="s1-checks-area">
                <tr>
                    <td class="title">Notices <small>(optional)</small></td>
                    <td class="toggle"><a href="javascript:void(0)" onclick="DUPX.toggleAllNotices('#s1-notice-all')">[toggle]</a></td>
                </tr>
            </table>
        </div>

        <!-- NOTICE 10: OVERWRITE INSTALL -->
        <?php if ($is_overwrite_mode && $is_wordpress) : ?>
            <div class="status fail">Warn</div>
            <div class="title" data-status="warn" data-type="toggle auto" data-target="#s1-notice10"><i class="fa fa-caret-right"></i> Overwrite Install</div>
            <div class="info" id="s1-notice10">
                <?php if ($GLOBALS['DUPX_AC']->installSiteOverwriteOn || $is_dbonly) { ?>
                    <div class="gray-panel warn-text gray-panel-overwrite">
                        <i class="fas fa-exclamation-triangle fa-lg"></i> WARNING: The Duplicator installer file is currently placed in a location that has an existing WordPress site!
                        Continuing with this install process will <u>overwrite</u> all existing files and the database associated with this WordPress site.  Only continue
                        with this process if this site is no longer needed.<br/>
                    </div>
                <?php } ?>
                <p style="font-size:14px">
                    <b><i class="fas fa-folder-open"></i> Deployment Path:</b> <i><?php echo "{$GLOBALS['DUPX_ROOT']}"; ?></i>
                </p>
                <?php if ($GLOBALS['DUPX_AC']->installSiteOverwriteOn || $is_dbonly) { ?>
                    <p>
                        Duplicator is in "Overwrite Install " mode because it has detected an existing WordPress site at the deployment path above.  This mode allows for the installer
                        to be dropped directly into an existing WordPress site and overwrite its contents.   Any content inside of the archive file
                        will <u>overwrite</u> the existing contents in the deployment path above.  To continue choose one of these options:
                    </p>

                    <ol>
                        <li>Ignore this notice and continue with the install to overwrite this WordPress site.</li>
                        <li>Move the installer and archive to an <u>empty directory</u>.  Then install from there to keep this site intact.</li>
                    </ol>

                    <p style="color:maroon">
                        <b>Notice:</b> Existing content such as plugin/themes/images will still show-up after the install is complete if they did not already exist in
                        the archive file. For example, if plugin X is in the current site but that same plugin X <u>does not exist</u> in the archive file
                        then that plugin will display as a disabled plugin after the install is completed. The same concept with themes, images and files apply.
                        This will not impact the site's operation, and the behavior is expected since the install process only extracts the archive files to the deployment
                        path.
                    </p>

                    <p>
                        <b>Recommendation:</b> It is recommended you only overwrite WordPress sites that have no value, such as a temporary staging site. On step 2
                        of this installer you will be given the option to change the database if needed.  However, by default the current sites database will be
                        replaced with the one in this Duplicator package.
                    </p>
                    <?php
                } else {
                    ?>
                    <p>
                        Duplicator works best by placing the installer and archive files into an empty directory.  If a wp-config.php file is found in the extraction
                        directory it might indicate that a pre-existing WordPress site exists which can lead to a bad install.
                    </p>
                    <b>Options:</b>
                    <ul style="margin-bottom: 0">
                        <li>If the archive was already manually extracted then <a href="javascript:void(0)" onclick="DUPX.getManaualArchiveOpt()">[Enable Manual Archive Extraction]</a></li>
                        <li>Empty the directory of all files, except for the installer.php and archive.zip/daf files.</li>
                        <li>Advanced Users: Can attempt to manually remove the wp-config file only if the archive was manually extracted.</li>
                    </ul>
                    <?php
                }
                ?>
            </div>

            <!-- NOTICE 20: ARCHIVE EXTRACTED -->
        <?php elseif ($is_wpconfarc_present && file_exists("{$root_path}/dup-installer")) : ?>
            <div class="status fail">Warn</div>
            <div class="title" data-type="toggle" data-target="#s1-notice20"><i class="fa fa-caret-right"></i> Archive Extracted</div>
            <div class="info" id="s1-notice20">
                <b>Deployment Path:</b> <i><?php echo "{$GLOBALS['DUPX_ROOT']}"; ?></i>
                <br/><br/>

                The installer has detected that the archive file has been extracted to the deployment path above.  To continue choose one of these options:

                <ol>
                    <li>Skip the extraction process by <a href="javascript:void(0)" onclick="DUPX.getManaualArchiveOpt()">[enabling manual archive extraction]</a> </li>
                    <li>Ignore this message and continue with the install process to re-extract the archive file.</li>
                </ol>

                <small>Note: This test looks for a file named <i>dup-wp-config-arc__[HASH].txt</i> in the dup-installer directory.  If the file exists then this notice is shown.
                    The <i>dup-wp-config-arc__[HASH].txt</i> file is created with every archive and removed once the install is complete.  For more details on this process see the
                    <a href="https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=config_arc_exists#faq-installer-015-q" target="_blank">manual extraction FAQ</a>.</small>
            </div>
        <?php endif; ?>

        <!-- NOTICE 25: DATABASE ONLY -->
        <?php if ($is_dbonly && !$is_wordpress) : ?>
            <div class="status fail">Warn</div>
            <div class="title" data-type="toggle" data-target="#s1-notice25"><i class="fa fa-caret-right"></i> Database Only</div>
            <div class="info" id="s1-notice25">
                <b>Deployment Path:</b> <i><?php echo "{$GLOBALS['DUPX_ROOT']}"; ?></i>
                <br/><br/>

                The installer has detected that a WordPress site does not exist at the deployment path above. This installer is currently in 'Database Only' mode because that is
                how the archive was created.  If core WordPress site files do not exist at the path above then they will need to be placed there in order for a WordPress site
                to properly work.  To continue choose one of these options:

                <ol>
                    <li>Place this installer and archive at a path where core WordPress files already exist to hide this message. </li>
                    <li>Create a new package that includes both the database and the core WordPress files.</li>
                    <li>Ignore this message and install only the database (for advanced users only).</li>
                </ol>

                <small>Note: This test simply looks for the directories <?php echo DUPX_Server::$wpCoreDirsList; ?> and a wp-config.php file.  If they are not found in the
                    deployment path above then this notice is shown.</small>

            </div>
        <?php endif; ?>

        <!-- NOTICE 30 -->
        <div class="status <?php echo ($notice['30'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['30']); ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice30"><i class="fa fa-caret-right"></i> Package Age</div>
        <div class="info" id="s1-notice30">
            This package is <?php echo "{$fulldays}"; ?> day(s) old. Packages older than 180 days might be considered stale.  It is recommended to build a new
            package unless your aware of the content and its data.  This is message is simply a recommendation.
        </div>


        <!-- NOTICE 40:
        Legacy PHP 5.2 Version check (Removed) -->


        <!-- NOTICE 45 -->
        <div class="status <?php echo ($notice['45'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo $notice['45']; ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice45"><i class="fa fa-caret-right"></i> PHP Version Mismatch</div>
        <div class="info" id="s1-notice45">
            <?php
            $cssStyle   = $notice['45'] == 'Good' ? 'color:green' : 'color:red';
            echo "<b style='{$cssStyle}'>You are migrating site from PHP {$packagePHP} to PHP {$currentPHP}</b>.<br/>"
            ."If this servers PHP version is different from the PHP version of where the package was created it might cause problems with various parts of your website
                    and/or plugins and themes.   It is highly recommended to try and use the same version of PHP if you are able to do so.  This is simply a warning
                    and in the event no problems arise then you can igonre this message.<br/>";
            ?>
        </div>

        <!-- NOTICE 50 -->
        <div class="status <?php echo ($notice['50'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['50']); ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice50"><i class="fa fa-caret-right"></i> PHP Open Base</div>
        <div class="info" id="s1-notice50">
            <b>Open BaseDir:</b> <i><?php echo $notice['50'] == 'Good' ? "<i class='dupx-pass'>Disabled</i>" : "<i class='dupx-fail'>Enabled</i>"; ?></i>
            <br/><br/>

            If <a href="http://php.net/manual/en/ini.core.php#ini.open-basedir" target="_blank">open_basedir</a> is enabled and your
            having issues getting your site to install properly; please work with your host and follow these steps to prevent issues:
            <ol style="margin:7px; line-height:19px">
                <li>Disable the open_basedir setting in the php.ini file</li>
                <li>If the host will not disable, then add the path below to the open_basedir setting in the php.ini<br/>
                    <i style="color:maroon">"<?php echo str_replace('\\', '/', dirname(__FILE__)); ?>"</i>
                </li>
                <li>Save the settings and restart the web server</li>
            </ol>
            Note: This warning will still show if you choose option #2 and open_basedir is enabled, but should allow the installer to run properly.  Please work with your
            hosting provider or server administrator to set this up correctly.
        </div>

        <!-- NOTICE 60 -->
        <div class="status <?php echo ($notice['60'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['60']); ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice60"><i class="fa fa-caret-right"></i> PHP Timeout</div>
        <div class="info" id="s1-notice60">
            <b>Archive Size:</b> <?php echo DUPX_U::readableByteSize($arcSize) ?>  <small>(detection limit is set at <?php echo DUPX_U::readableByteSize($max_time_size) ?>) </small><br/>
            <b>PHP max_execution_time:</b> <?php echo "{$max_time_ini}"; ?> <small>(zero means not limit)</small> <br/>
            <b>PHP set_time_limit:</b> <?php echo ($max_time_zero) ? '<i style="color:green">Success</i>' : '<i style="color:maroon">Failed</i>' ?>
            <br/><br/>

            The PHP <a href="http://php.net/manual/en/info.configuration.php#ini.max-execution-time" target="_blank">max_execution_time</a> setting is used to
            determine how long a PHP process is allowed to run.  If the setting is too small and the archive file size is too large then PHP may not have enough
            time to finish running before the process is killed causing a timeout.
            <br/><br/>

            Duplicator attempts to turn off the timeout by using the
            <a href="http://php.net/manual/en/function.set-time-limit.php" target="_blank">set_time_limit</a> setting.   If this notice shows as a warning then it is
            still safe to continue with the install.  However, if a timeout occurs then you will need to consider working with the max_execution_time setting or extracting the
            archive file using the 'Manual Archive Extraction' method.
            Please see the	<a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-100-q" target="_blank">FAQ timeout</a> help link for more details.
        </div>


        <!-- NOTICE 8 -->
        <div class="status <?php echo ($notice['70'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['70']); ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice70"><i class="fa fa-caret-right"></i> WordPress Multisite</div>
        <div class="info" id="s1-notice70">
            <b>Status:</b> <?php echo $notice['70'] == 'Good' ? 'This archive is not a Multisite' : 'This is an unsupported Multisite archive'; ?>
            <br/><br/>

            Duplicator does not support WordPress Multisite (MU) migrations.  We recommend using Duplicator Pro which currently supports full Multisite migrations and
            subsite to  standalone site migrations.
            <br/><br/>
            While it is not recommended you can still continue with the build of this package.  Please note that after the install the site may not be working correctly.
            Additional manual custom configurations will need to be made to finalize this Multisite migration.

            <i><a href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_is_mu_warn_exe&utm_campaign=duplicator_pro' target='_blank'>[upgrade to pro]</a></i>
        </div>

        <!-- NOTICE 80 -->
        <div class="status <?php echo ($notice['80'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['80']); ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice80"><i class="fa fa-caret-right"></i> WordPress wp-config Location</div>
        <div class="info" id="s1-notice80">
            If the wp-config.php file was moved up one level and out of the WordPress root folder in the package creation site then this test will show a warning.
            <br/><br/>
            This Duplicator installer will place this wp-config.php file in the WordPress setup root folder of this installation site to help stabilize the install process.
            This process will not break anything in your installation site, but the details are here for your information.
        </div>

        <!-- NOTICE 90 -->
        <div class="status <?php echo ($notice['90'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['90']); ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice90"><i class="fa fa-caret-right"></i> WordPress wp-content Location</div>
        <div class="info" id="s1-notice90">
            If the wp-content directory was moved and not located at the WordPress root folder in the package creation site then this test will show a warning.
            <br/><br/>
            Duplicator Installer will place this wp-content directory in the WordPress setup root folder of this installation site. It will not break anything in your installation
            site. It is just for your information.
        </div>

        <!-- NOTICE 100 -->
        <div class="status <?php echo ($notice['100'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['100']); ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice100"><i class="fa fa-caret-right"></i> Sufficient Disk Space</div>
        <div class="info" id="s1-notice100">
            <?php
            echo ($notice['100'] == 'Good') ? 'You have sufficient disk space in your machine to extract the archive.' : 'You don’t have sufficient disk space in your machine to extract the archive. Ask your host to increase disk space.'
            ?>
        </div>

        <!-- NOTICE 110 -->
        <div class="status <?php echo ($notice['110'] == 'Good') ? 'pass' : 'fail' ?>"><?php echo DUPX_U::esc_html($notice['110']); ?></div>
        <div class="title" data-type="toggle" data-target="#s1-notice110"><i class="fa fa-caret-right"></i> Wordfence</div>
        <div class="info" id="s1-notice110">
            <b>Wordfence Firewall:</b> <?php echo ($notice['110'] == 'Warn') ? "<span style='color:red;'>detected at {$parentWordFencePath}</span>" : "<span style='color:green;'>not detected</span>"; ?>
            <p>
                The Wordfence Web Application Firewall is a PHP based, application level firewall that filters out malicious
                requests to your site. Sometimes Wordfence returns false positives on requests done during the installation process,
                because of which it might fail. We recommend turning off the Wordfence firewall of the WordPress instance located at the mentioned path.
            </p>
        </div>

    </div>

</div>
<br/><br/>


<?php if ($req_success && $arcCheck != 'Fail') : ?>
<div id="s1-warning-check">
    <?php if ($is_overwrite_mode && $is_wordpress) { ?>
        <input id="accept-overwrite" name="accept-overwrite" type="checkbox" onclick="DUPX.acceptWarning()" />
        <label for="accept-overwrite">Continue with site overwrite mode*</label><br/>
    <?php } ?>
    <input id="accept-warnings" name="accpet-warnings" type="checkbox" onclick="DUPX.acceptWarning()" />
    <label for="accept-warnings">I have read and accept all <a href="javascript:void(0)" onclick="DUPX.viewTerms()">terms &amp; notices</a>*<br/>
        <small style="font-style:italic">* required to continue</small>
    </label><br/>
</div>
<?php include ('view.s1.terms.php'); ?>
<br/><br/>
<br/><br/>
<?php endif; ?>


<?php if (!$req_success || $arcCheck == 'Fail') : ?>
    <div class="s1-err-msg">
        <i>
            This installation will not be able to proceed until the setup and validation sections above both pass. Please adjust your servers settings or contact your
            server administrator, hosting provider or visit the resources below for additional help.
        </i>
        <div style="padding:10px">
            &raquo; <a href="https://snapcreek.com/duplicator/docs/faqs-tech/" target="_blank">Technical FAQs</a> <br/>
            &raquo; <a href="https://snapcreek.com/support/docs/" target="_blank">Online Documentation</a> <br/>
        </div>
    </div>
<?php else : ?>
    <div class="footer-buttons">
        <button id="s1-deploy-btn" type="button" title="<?php echo DUPX_U::esc_attr($agree_msg); ?>" onclick="DUPX.processNext()"  class="default-btn"> Next <i class="fa fa-caret-right"></i> </button>
    </div>
<?php endif; ?>

</form>

<!-- =========================================
VIEW: STEP 1 - DB QUICK TEST
========================================= -->
<form id="s1-dbtest-form" method="post" target="_blank" autocomplete="off">
    <input type="hidden" name="dbonlytest" value="1" />
    <input type="hidden" name="view" value="step2" />
    <input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('step2'); ?>">
    <input type="hidden" name="secure-pass" value="<?php echo DUPX_U::esc_attr($_POST['secure-pass']); ?>" />
    <input type="hidden" name="secure-archive" value="<?php echo DUPX_U::esc_attr($_POST['secure-archive']); ?>" />
</form>


<!-- =========================================
VIEW: STEP 1 - AJAX RESULT
Auto Posts to view.step2.php
========================================= -->
<form id='s1-result-form' method="post" class="content-form" style="display:none" autocomplete="off">

    <div class="dupx-logfile-link"><?php DUPX_View_Funcs::installerLogLink(); ?></div>
    <div class="hdr-main">
        Step <span class="step">1</span> of 4: Deployment
        <div class="sub-header">This step will extract the archive file contents.</div>
    </div>

    <!--  POST PARAMS -->
    <div class="dupx-debug">
        <i>Step 1 - AJAX Response</i>
        <input type="hidden" name="view" value="step2" />
        <input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('step2'); ?>">
        <input type="hidden" name="secure-pass" value="<?php echo DUPX_U::esc_attr($_POST['secure-pass']); ?>" />
        <input type="hidden" name="secure-archive" value="<?php echo DUPX_U::esc_attr($_POST['secure-archive']); ?>" />
        <input type="hidden" name="logging" id="ajax-logging"  />
        <input type="hidden" name="config_mode" id="ajax-config-mode" />
        <input type="hidden" name="exe_safe_mode" id="exe-safe-mode"  value="0" />
        <input type="hidden" name="json" id="ajax-json" />
        <textarea id='ajax-json-debug' name='json_debug_view'></textarea>
        <input type='submit' value='manual submit'>
    </div>

    <!--  PROGRESS BAR -->
    <div id="progress-area">
        <div style="width:500px; margin:auto">
            <div style="font-size:1.7em; margin-bottom:20px"><i class="fas fa-circle-notch fa-spin"></i> Extracting Archive Files<span id="progress-pct"></span></div>
            <div id="progress-bar"></div>
            <h3> Please Wait...</h3><br/><br/>
            <i>Keep this window open during the extraction process.</i><br/>
            <i>This can take several minutes.</i>
        </div>
    </div>

    <!--  AJAX SYSTEM ERROR -->
    <div id="ajaxerr-area" style="display:none">
        <p>Please try again an issue has occurred.</p>
        <div style="padding: 0px 10px 10px 0px;">
            <div id="ajaxerr-data">An unknown issue has occurred with the file and database setup process.  Please see the <?php DUPX_View_Funcs::installerLogLink(); ?> file for more details.</div>
            <div style="text-align:center; margin:10px auto 0px auto">
                <br/>
                <input type="button" class="default-btn" onclick="DUPX.hideErrorResult()" value="&laquo; Try Again" />
                <br/><br/>
                <i style='font-size:11px'>See online help for more details at <a href='https://snapcreek.com/ticket' target='_blank'>snapcreek.com</a></i>
            </div>
        </div>
    </div>
</form>

<script>
    DUPX.openDBValidationWindow = function ()
    {
        console.log('test');
        $('#s1-dbtest-form').submit();
    }

    DUPX.toggleSetupType = function ()
    {
        var val = $("input:radio[name='setup_type']:checked").val();
        $('div.s1-setup-type-sub').hide();
        $('#s1-setup-type-sub-' + val).show(200);
    };

    DUPX.getManaualArchiveOpt = function ()
    {
        $("html, body").animate({scrollTop: $(document).height()}, 1500);
        $("div[data-target='#s1-area-adv-opts']").find('i.fa').removeClass('fa-plus-square').addClass('fa-minus-square');
        $('#s1-area-adv-opts').show(1000);
        $('select#archive_engine').val('manual').focus();
    };

    DUPX.startExtraction = function ()
    {
        var isManualExtraction = ($("#archive_engine").val() == "manual");
        var zipEnabled = <?php echo DupLiteSnapLibStringU::boolToString($archive_config->isZipArchive()); ?>;

        $("#operation-text").text("Extracting Archive Files");

        if (zipEnabled || isManualExtraction) {
            DUPX.runStandardExtraction();
        } else {
            DUPX.kickOffDupArchiveExtract();
        }
    }

    DUPX.processNext = function ()
    {
        DUPX.startExtraction();
    };

    DUPX.updateProgressPercent = function (percent)
    {
        var percentString = '';
        if (percent > 0) {
            percentString = ' ' + percent + '%';
        }
        $("#progress-pct").text(percentString);
    };

    DUPX.clearDupArchiveStatusTimer = function ()
    {
        if (DUPX.dupArchiveStatusIntervalID != -1) {
            clearInterval(DUPX.dupArchiveStatusIntervalID);
            DUPX.dupArchiveStatusIntervalID = -1;
        }
    };

    DUPX.getCriticalFailureText = function (failures)
    {
        var retVal = null;

        if ((failures !== null) && (typeof failures !== 'undefined')) {
            var len = failures.length;

            for (var j = 0; j < len; j++) {
                failure = failures[j];

                if (failure.isCritical) {
                    retVal = failure.description;
                    break;
                }
            }
        }

        return retVal;
    };

    DUPX.DAWSProcessingFailed = function (errorText)
    {
        DUPX.clearDupArchiveStatusTimer();
        $('#ajaxerr-data').html(errorText);
        DUPX.hideProgressBar();
    }

    DUPX.handleDAWSProcessingProblem = function (errorText, pingDAWS) {

        DUPX.DAWS.FailureCount++;

        if (DUPX.DAWS.FailureCount <= DUPX.DAWS.MaxRetries) {
            var callback = DUPX.pingDAWS;

            if (pingDAWS) {
                console.log('!!!PING FAILURE #' + DUPX.DAWS.FailureCount);
            } else {
                console.log('!!!KICKOFF FAILURE #' + DUPX.DAWS.FailureCount);
                callback = DUPX.kickOffDupArchiveExtract;
            }

            DUPX.throttleDelay = 9;	// Equivalent of 'low' server throttling
            console.log('Relaunching in ' + DUPX.DAWS.RetryDelayInMs);
            setTimeout(callback, DUPX.DAWS.RetryDelayInMs);
        } else {
            console.log('Too many failures.');
            DUPX.DAWSProcessingFailed(errorText);
        }
    };


    DUPX.handleDAWSCommunicationProblem = function (xHr, pingDAWS, textStatus, page)
    {
        DUPX.DAWS.FailureCount++;

        if (DUPX.DAWS.FailureCount <= DUPX.DAWS.MaxRetries) {

            var callback = DUPX.pingDAWS;

            if (pingDAWS) {
                console.log('!!!PING FAILURE #' + DUPX.DAWS.FailureCount);
            } else {
                console.log('!!!KICKOFF FAILURE #' + DUPX.DAWS.FailureCount);
                callback = DUPX.kickOffDupArchiveExtract;
            }
            console.log(xHr);
            DUPX.throttleDelay = 9;	// Equivalent of 'low' server throttling
            console.log('Relaunching in ' + DUPX.DAWS.RetryDelayInMs);
            setTimeout(callback, DUPX.DAWS.RetryDelayInMs);
        } else {
            console.log('Too many failures.');
            DUPX.ajaxCommunicationFailed(xHr, textStatus, page);
        }
    };

// Will either query for status or push it to continue the extraction
    DUPX.pingDAWS = function ()
    {
        console.log('pingDAWS:start');
        var request = new Object();
        var isClientSideKickoff = DUPX.isClientSideKickoff();

        if (isClientSideKickoff) {
            console.log('pingDAWS:client side kickoff');
            request.action = "expand";
            request.client_driven = 1;
            request.throttle_delay = DUPX.throttleDelay;
            request.worker_time = DUPX.DAWS.PingWorkerTimeInSec;
        } else {
            console.log('pingDAWS:not client side kickoff');
            request.action = "get_status";
        }

        console.log("pingDAWS:action=" + request.action);

        $.ajax({
            type: "POST",
            timeout: DUPX.DAWS.PingWorkerTimeInSec * 2000, // Double worker time and convert to ms
            url: DUPX.DAWS.Url,
            data: JSON.stringify(request),
            success: function (respData, textStatus, xHr) {
                try {
                    var data = DUPX.parseJSON(respData);
                } catch (err) {
                    console.error(err);
                    console.error('JSON parse failed for response data: ' + respData);
                    console.log('AJAX error. textStatus=');
                    console.log(textStatus);
                    DUPX.handleDAWSCommunicationProblem(xHr, true, textStatus, 'ping');
                    return false;
                }

                DUPX.DAWS.FailureCount = 0;
                console.log("pingDAWS:AJAX success. Resetting failure count");

                // DATA FIELDS
                // archive_offset, archive_size, failures, file_index, is_done, timestamp

                if (typeof (data) != 'undefined' && data.pass == 1) {

                    console.log("pingDAWS:Passed");

                    var status = data.status;
                    var percent = Math.round((status.archive_offset * 100.0) / status.archive_size);

                    console.log("pingDAWS:updating progress percent");
                    DUPX.updateProgressPercent(percent);

                    var criticalFailureText = DUPX.getCriticalFailureText(status.failures);

                    if (status.failures.length > 0) {
                        console.log("pingDAWS:There are failures present. (" + status.failures.length) + ")";
                    }

                    if (criticalFailureText === null) {
                        console.log("pingDAWS:No critical failures");
                        if (status.is_done) {

                            console.log("pingDAWS:archive has completed");
                            if (status.failures.length > 0) {

                                console.log(status.failures);
                                var errorMessage = "pingDAWS:Problems during extract. These may be non-critical so continue with install.\n------\n";
                                var len = status.failures.length;

                                for (var j = 0; j < len; j++) {
                                    failure = status.failures[j];
                                    errorMessage += failure.subject + ":" + failure.description + "\n";
                                }

                                alert(errorMessage);
                            }

                            DUPX.clearDupArchiveStatusTimer();
                            console.log("pingDAWS:calling finalizeDupArchiveExtraction");
                            DUPX.finalizeDupArchiveExtraction(status);
                            console.log("pingDAWS:after finalizeDupArchiveExtraction");

                            var dataJSON = JSON.stringify(data);

                            // Don't stop for non-critical failures - just display those at the end

                            $("#ajax-logging").val($("input:radio[name=logging]:checked").val());
                            $("#ajax-config-mode").val($("#config_mode").val());
                            $("#ajax-json").val(escape(dataJSON));

<?php if (!DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) : ?>
                                setTimeout(function () {
                                    $('#s1-result-form').submit();
                                }, 500);
<?php endif; ?>
                            //$('#progress-area').fadeOut(1000);
                            //Failures aren't necessarily fatal - just record them for later display

                            $("#ajax-json-debug").val(dataJSON);
                        } else if (isClientSideKickoff) {
                            console.log('pingDAWS:Archive not completed so continue ping DAWS in 500');
                            setTimeout(DUPX.pingDAWS, 500);
                        }
                    } else {
                        console.log("pingDAWS:critical failures present");
                        // If we get a critical failure it means it's something we can't recover from so no purpose in retrying, just fail immediately.
                        var errorString = 'Error Processing Step 1<br/>';

                        errorString += criticalFailureText;

                        DUPX.DAWSProcessingFailed(errorString);
                    }
                } else {
                    var errorString = 'Error Processing Step 1<br/>';
                    errorString += data.error;

                    DUPX.handleDAWSProcessingProblem(errorString, true);
                }
            },
            error: function (xHr, textStatus) {
                console.log('AJAX error. textStatus=');
                console.log(textStatus);
                DUPX.handleDAWSCommunicationProblem(xHr, true, textStatus, 'ping');
            }
        });
    };


    DUPX.isClientSideKickoff = function ()
    {
        return $('#clientside_kickoff').is(':checked');
    }

    DUPX.areConfigFilesPreserved = function ()
    {
        return $('#config_mode').is(':checked');
    }

    DUPX.kickOffDupArchiveExtract = function ()
    {
        console.log('kickOffDupArchiveExtract:start');
        var $form = $('#s1-input-form');
        var request = new Object();
        var isClientSideKickoff = DUPX.isClientSideKickoff();

        request.action = "start_expand";
        request.restore_directory = '<?php echo DUPX_U::esc_js($root_path); ?>';
        request.worker_time = DUPX.DAWS.KickoffWorkerTimeInSec;
        request.client_driven = isClientSideKickoff ? 1 : 0;
        request.throttle_delay = DUPX.throttleDelay;
        request.filtered_directories = ['dup-installer'];

        var requestString = JSON.stringify(request);

        if (!isClientSideKickoff) {
            console.log('kickOffDupArchiveExtract:Setting timer');
            // If server is driving things we need to poll the status
            DUPX.dupArchiveStatusIntervalID = setInterval(DUPX.pingDAWS, DUPX.DAWS.StatusPeriodInMS);
        } else {
            console.log('kickOffDupArchiveExtract:client side kickoff');
        }

        console.log("daws url=" + DUPX.DAWS.Url);
        console.log("requeststring=" + requestString);

        $.ajax({
            type: "POST",
            timeout: DUPX.DAWS.KickoffWorkerTimeInSec * 2000, // Double worker time and convert to ms
            url: DUPX.DAWS.Url + '&daws_action=start_expand',
            data: requestString,
            beforeSend: function () {
                DUPX.showProgressBar();
                $form.hide();
                $('#s1-result-form').show();
                DUPX.updateProgressPercent(0);
            },
            success: function (respData, textStatus, xHr) {
                try {
                    var data = DUPX.parseJSON(respData);
                } catch (err) {
                    console.error(err);
                    console.error('JSON parse failed for response data: ' + respData);
                    console.log('kickOffDupArchiveExtract:AJAX error. textStatus=', textStatus);
                    DUPX.handleDAWSCommunicationProblem(xHr, false, textStatus);
                    return false;
                }
                console.log('kickOffDupArchiveExtract:success');
                if (typeof (data) != 'undefined' && data.pass == 1) {

                    var criticalFailureText = DUPX.getCriticalFailureText(status.failures);

                    if (criticalFailureText === null) {

                        var dataJSON = JSON.stringify(data);

                        //RSR TODO:Need to check only for FATAL errors right now - have similar failure check as in pingdaws
                        DUPX.DAWS.FailureCount = 0;
                        console.log("kickOffDupArchiveExtract:Resetting failure count");

                        $("#ajax-json-debug").val(dataJSON);
                        if (typeof (data) != 'undefined' && data.pass == 1) {

                            if (isClientSideKickoff) {
                                console.log('kickOffDupArchiveExtract:Initial ping DAWS in 500');
                                setTimeout(DUPX.pingDAWS, 500);
                            }

                        } else {
                            $('#ajaxerr-data').html('Error Processing Step 1');
                            DUPX.hideProgressBar();
                        }
                    } else {
                        // If we get a critical failure it means it's something we can't recover from so no purpose in retrying, just fail immediately.
                        var errorString = 'kickOffDupArchiveExtract:Error Processing Step 1<br/>';
                        errorString += criticalFailureText;
                        DUPX.DAWSProcessingFailed(errorString);
                    }
                } else {
                    if ('undefined' !== typeof data.isWPAlreadyExistsError
                            && data.isWPAlreadyExistsError) {
                        DUPX.DAWSProcessingFailed(data.error);
                    } else {
                        var errorString = 'kickOffDupArchiveExtract:Error Processing Step 1<br/>';
                        errorString += data.error;
                        DUPX.handleDAWSProcessingProblem(errorString, false);
                    }
                }
            },
            error: function (xHr, textStatus) {

                console.log('kickOffDupArchiveExtract:AJAX error. textStatus=', textStatus);
                DUPX.handleDAWSCommunicationProblem(xHr, false, textStatus);
            }
        });
    };

    DUPX.finalizeDupArchiveExtraction = function (dawsStatus)
    {
        console.log("finalizeDupArchiveExtraction:start");
        var $form = $('#s1-input-form');
        $("#s1-input-form-extra-data").val(JSON.stringify(dawsStatus));
        console.log("finalizeDupArchiveExtraction:after stringify dawsstatus");
        var formData = $form.serialize();

        $.ajax({
            type: "POST",
            timeout: 30000,
            url: window.location.href,
            data: formData,
            success: function (respData, textStatus, xHr) {
                try {
                    var data = DUPX.parseJSON(respData);
                } catch (err) {
                    console.error(err);
                    console.error('JSON parse failed for response data: ' + respData);
                    console.log("finalizeDupArchiveExtraction:error");
                    console.log(xHr.statusText);
                    console.log(xHr.getAllResponseHeaders());
                    console.log(xHr.responseText);
                    return false;
                }
                console.log("finalizeDupArchiveExtraction:success");
            },
            error: function (xHr) {
                console.log("finalizeDupArchiveExtraction:error");
                console.log(xHr.statusText);
                console.log(xHr.getAllResponseHeaders());
                console.log(xHr.responseText);
            }
        });
    };

    /**
     * Performs Ajax post to either do a zip or manual extract and then create db
     */
    DUPX.runStandardExtraction = function ()
    {
        var $form = $('#s1-input-form');

        //3600000 = 60 minutes
        //If the extraction takes longer than 30 minutes then user
        //will probably want to do a manual extraction or even FTP
        $.ajax({
            type: "POST",
            timeout: 3600000,
            cache: false,
            url: window.location.href,
            data: $form.serialize(),
            beforeSend: function () {
                DUPX.showProgressBar();
                $form.hide();
                $('#s1-result-form').show();
            },
            success: function (data, textStatus, xHr) {
                $("#ajax-json-debug").val(data);
                var dataJSON = data;
                data = DUPX.parseJSON(data, xHr, textStatus);
                if (false === data) {
                    return;
                }
                $("#ajax-json-debug").val(dataJSON);
                if (typeof (data) != 'undefined' && data.pass == 1) {
                    $("#ajax-logging").val($("input:radio[name=logging]:checked").val());
                    $("#ajax-config-mode").val($("#config_mode").val());
                    $("#ajax-json").val(escape(dataJSON));

<?php if (!DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) : ?>
                        setTimeout(function () {
                            $('#s1-result-form').submit();
                        }, 500);
<?php endif; ?>
                   // $('#progress-area').fadeOut(1000);
                } else {
                    $('#ajaxerr-data').html('Error Processing Step 1');
                    DUPX.hideProgressBar();
                }
            },
            error: function (xHr) {
                DUPX.ajaxCommunicationFailed(xHr, '', 'extract');
            }
        });
    };

    DUPX.ajaxCommunicationFailed = function (xhr, textStatus, page)
    {
        var status = "<b>Server Code:</b> " + xhr.status + "<br/>";
        status += "<b>Status:</b> " + xhr.statusText + "<br/>";
        status += "<b>Response:</b> " + xhr.responseText + "<hr/>";

        if (textStatus && textStatus.toLowerCase() == "timeout" || textStatus.toLowerCase() == "service unavailable") {

            var default_timeout_message = "<b>Recommendation:</b><br/>";
            default_timeout_message += "See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?180116102141#faq-trouble-100-q'>this FAQ item</a> for possible resolutions.";
            default_timeout_message += "<hr>";
            default_timeout_message += "<b>Additional Resources...</b><br/>";
            default_timeout_message += "With thousands of different permutations it's difficult to try and debug/diagnose a server. If you're running into timeout issues and need help we suggest you follow these steps:<br/><br/>";
            default_timeout_message += "<ol>";
            default_timeout_message += "<li><strong>Contact Host:</strong> Tell your host that you're running into PHP/Web Server timeout issues and ask them if they have any recommendations</li>";
            default_timeout_message += "<li><strong>Dedicated Help:</strong> If you're in a time-crunch we suggest that you contact <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?180116150030#faq-resource-030-q'>professional server administrator</a>. A dedicated resource like this will be able to work with you around the clock to the solve the issue much faster than we can in most cases.</li>";
            default_timeout_message += "<li><strong>Consider Upgrading:</strong> If you're on a budget host then you may run into constraints. If you're running a larger or more complex site it might be worth upgrading to a <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?180116150030#faq-resource-040-q'>managed VPS server</a>. These systems will pretty much give you full control to use the software without constraints and come with excellent support from the hosting company.</li>";
            default_timeout_message += "<li><strong>Contact SnapCreek:</strong> We will try our best to help configure and point users in the right direction, however these types of issues can be time-consuming and can take time from our support staff.</li>";
            default_timeout_message += "</ol>";

            if (page) {
                switch (page) {
                    default:
                        status += default_timeout_message;
                        break;
                    case 'extract':
                        status += "<b>Recommendation:</b><br/>";
                        status += "See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=extract_recommendation#faq-installer-015-q'>this FAQ item</a> for possible resolutions.<br/><br/>";
                        break;
                    case 'ping':
                        status += "<b>Recommendation:</b><br/>";
                        status += "See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?180116152758#faq-trouble-030-q'>this FAQ item</a> for possible resolutions.<br/><br/>";
                        break;
                    case 'delete-site':
                        status += "<b>Recommendation:</b><br/>";
                        status += "See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?180116153643#faq-installer-120-q'>this FAQ item</a> for possible resolutions.<br/><br/>";
                        break;
                }
            } else {
                status += default_timeout_message;
            }

        } else if ((xhr.status == 403) || (xhr.status == 500)) {
            status += "<b>Recommendation:</b><br/>";
            status += "See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-120-q'>this FAQ item</a> for possible resolutions.<br/><br/>"
        } else if ((xhr.status == 0) || (xhr.status == 200)) {
            status += "<b>Recommendation:</b><br/>";
            status += "Possible server timeout! Performing a 'Manual Extraction' can avoid timeouts.";
            status += "See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=server_timeout_man_extract#faq-installer-015-q'>this FAQ item</a> for a complete overview.<br/><br/>"
        } else {
            status += "<b>Additional Resources:</b><br/> ";
            status += "&raquo; <a target='_blank' href='https://snapcreek.com/duplicator/docs/'>Help Resources</a><br/>";
            status += "&raquo; <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/'>Technical FAQ</a>";
        }

        $('#ajaxerr-data').html(status);
        DUPX.hideProgressBar();
    };

    DUPX.parseJSON = function (mixData, xHr, textStatus) {
        try {
            var parsed = JSON.parse(mixData);
            return parsed;
        } catch (e) {
            console.log("JSON parse failed - 1");
        }

        var jsonStartPos = mixData.indexOf('{');
        var jsonLastPos = mixData.lastIndexOf('}');
        if (jsonStartPos > -1 && jsonLastPos > -1) {
            var expectedJsonStr = mixData.slice(jsonStartPos, jsonLastPos + 1);
            try {
                var parsed = JSON.parse(expectedJsonStr);
                return parsed;
            } catch (e) {
                console.log("JSON parse failed - 2");
                DUPX.ajaxCommunicationFailed(xHr, textStatus, 'extract');
                return false;
            }
        }
        DUPX.ajaxCommunicationFailed(xHr, textStatus, 'extract');
        return false;
    }

    /** Go back on AJAX result view */
    DUPX.hideErrorResult = function ()
    {
        $('#s1-result-form').hide();
        $('#s1-input-form').show(200);
    }

    /** Config Mode Changes */
    DUPX.toggleConfigMode = function(select)
    {
        var $notes  = $('.config-files-helper');
        var $data   = $(select).find('option:selected').attr('data-title');
        $notes.html($data).hide();
        $notes.html($data).show(400);
    }

    /**
     * Accetps Usage Warning */
    DUPX.acceptWarning = function ()
    {
        if ($('#s1-warning-check :checkbox').not(':checked').length === 0) {
            $("#s1-deploy-btn").removeAttr("disabled");
            $("#s1-deploy-btn").removeAttr("title");
        } else {
            $("#s1-deploy-btn").attr("disabled", "true");
            $("#s1-deploy-btn").attr("title", "<?php echo DUPX_U::esc_js($agree_msg); ?>");
        }
    };

    DUPX.onSafeModeSwitch = function ()
    {
        var mode = $('#exe_safe_mode').val();
        if (mode == 0) {
            $("#config_mode").removeAttr("disabled");
        } else if (mode == 1 || mode == 2) {
            $("#config_mode").val("NEW");
            $("#config_mode").attr("disabled", true);
            $('#config_mode option:eq(0)').prop('selected', true)
        }

        $('#exe-safe-mode').val(mode);
    };

//DOCUMENT LOAD
    $(document).ready(function () {
        DUPX.DAWS = new Object();
        DUPX.DAWS.Url = window.location.href + '?is_daws=1&daws_csrf_token=<?php echo urlencode(DUPX_CSRF::generate('daws')); ?>';
        DUPX.DAWS.StatusPeriodInMS = 5000;
        DUPX.DAWS.PingWorkerTimeInSec = 9;
        DUPX.DAWS.KickoffWorkerTimeInSec = 6; // Want the initial progress % to come back quicker

        DUPX.DAWS.MaxRetries = 10;
        DUPX.DAWS.RetryDelayInMs = 8000;

        DUPX.dupArchiveStatusIntervalID = -1;
        DUPX.DAWS.FailureCount = 0;
        DUPX.throttleDelay = 0;

        //INIT Routines
        DUPX.initToggle();
        $("#tabs").tabs();
        $("#tabs-opts").tabs();
        DUPX.acceptWarning();

        $('#archive_action_wrapper').each(function () {
            let paramWrapper = $(this);
            let noteWrapper = paramWrapper.find('.sub-note');

            paramWrapper.find('.input-item').change(function () {
                noteWrapper.find('.archive-action-note').hide();
                noteWrapper.find('.archive-action-' + $(this).val()).show(500);
            });
        });
<?php
$isWindows = DUPX_U::isWindows();
if (!$isWindows) {
    ?>
            $('#set_file_perms').trigger("click");
            $('#set_dir_perms').trigger("click");
    <?php
}
?>
        DUPX.toggleSetupType();

<?php echo (!$all_success) ? "$('#s1-area-sys-setup-link').trigger('click');" : ""; ?>
    });
</script>
installer/dup-installer/views/view.help.php000064400000130263151336065400015103 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
	//The help for both pro and lite are shared.  Pro is where the master lives.  Use the flag below to
    //indicate if this help lives in lite or pro
	//$pro_version = true;

$open_section = filter_input(INPUT_GET, 'open_section', FILTER_UNSAFE_RAW, array('options' => array('default' => '')));

?>
<div class="hdr-main">
    HELP
</div>
<!-- =========================================
HELP FORM -->
<div id="main-help">
<div class="help-online"><br/>
	<i class="far fa-file-alt fa-sm"></i> For complete help visit
	<a href="https://snapcreek.com/support/docs/" target="_blank">Duplicator Migration and Backup Online Help</a> <br/>
	<small>Features available only in Duplicator Pro are flagged with a <sup>pro</sup> tag.</small>
</div>

<?php
$sectionId = 'section-security';
$expandClass =  $sectionId == $open_section ? 'open' : 'close';
?>
<section id="<?php echo $sectionId; ?>" class="expandable <?php echo $expandClass; ?>" >
    <h2 class="header expand-header">Installer Security</h2>
    <div class="content" >
        <a name="help-s1-init"></a>
        <div id="dup-help-installer" class="help-page">
            The installer allows for two basic types of security: password and filename-based.<br/><br/>

            <b>Password Security</b><br/>
            The installer can provide basic password protection, with the password being set at package creation time.  The password input on this screen
            must be entered before proceeding with an install.   This setting is optional and can be turned on/off via the package creation screens.
            <br/>
            <small>
            Note: If you do not recall the password then login to the site where the package was created and click the details of the package to view the
            original password. To validate the password just typed you can toggle the view by clicking on the lock icon.   For detail on how to override
            this setting visit the online FAQ for
            <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-030-q" target="_blankopen_section">more details</a>.
            </small>
            <br/><br/>

            <b>Filename Security</b><br/>
            When you attempt an <i class="maroon">"Overwrite Install"</i> using the "installer.php" filename on a public server (non localhost) and have
            not set a password, the installer will prompt for the filename of the associated archive.zip/daf file.  This is to prevent an outside entity
            from executing the installer.  To complete the install, simply copy the filename of the archive and paste (or type) it into the
            archive filename box.<br/>

            <small>
            Note: Using a hashed installer name (Settings ❯ Packages), renaming the installer to something unique (e.g. installer_932fe.php), setting
            a password or installing from localhost will cause the archive filename to no longer be required.
            </small>
            <br/><br/>

            <table class="help-opt">
                <tr>
                    <th class="col-opt">Option</th>
                    <th>Details</th>
                </tr>
                <tr>
                    <td class="col-opt">Locked</td>
                    <td>
                        "Locked" means a password is protecting each step of the installer.  This option is recommended on all installers
                        that are accessible via a public URL but not required.
                    </td>
                </tr>
                <tr>
                    <td class="col-opt">Unlocked</td>
                    <td>
                        "Unlocked" means that if your installer is on a public server that anyone can access it.  This is a less secure way to run your installer. If you are running the
                        installer very quickly then removing all the installer files, then the chances of exposing it is going to be low depending	on your sites access history.
                        <br/><br/>

                        While it is not required to	have a password set it is recommended.  If your URL has little to no traffic or has never been the target of an attack
                        then running the installer without a password is going to be relatively safe if ran quickly.  However, a password is always a good idea.  Also, it is
                        absolutely required and recommended to remove <u>all</u> installer files after installation is completed by logging into the WordPress admin and
                        following the Duplicator prompts.
                    </td>
                </tr>
            </table>
            <br/>
            Note: Even though the installer has a password protection feature, it should only be used for the short term while the installer is being used. All installer files should and
            must be removed after the install is completed.  Files should not to be left on the server for any long duration of time to prevent any security related issues.
        </div>
    </div>
</section>

<!-- ============================================
STEP 1
============================================== -->
<?php
$sectionId = 'section-step-1';
$expandClass =  $sectionId == $open_section ? 'open' : 'close';
?>
<section id="<?php echo $sectionId; ?>" class="expandable <?php echo $expandClass; ?>" >
    <h2 class="header expand-header">Step <span class="step">1</span> of 4: Deployment</h2>
    <div class="content" >
        <a class="help-target" name="help-s1"></a>
        <div id="dup-help-scanner" class="help-page">
            There are currently several modes that the installer can be in.  The mode will be shown at the top of each screen. Below is an overview of the various modes.

            <table class="help-opt">
            <tr>
                <th class="col-opt">Option</th>
                <th>Details</th>
            </tr>
            <tr>
                <td class="col-opt">Standard Install</td>
                <td>
                    This mode indicates that the installer and archive have been placed into an empty directory and the site is ready for a fresh/new redeployment.
                    This is the most common mode and the mode that has been around the longest.
                </td>
            </tr>
            <tr>
                <td class="col-opt">Standard Install <br/> Database Only</td>
                <td>
                    This mode indicates that the installer and archive were manually moved or transferred to a location and that only the Database will be installed
                    at this location.
                </td>
            </tr>
            <tr>
                <td class="col-opt">Overwrite Install</td>
                <td>
                    This mode indicates that the installer was started in a location that contains an existing site.  With this mode <b>the existing site will be overwritten</b> with
                    the contents of the archive.zip/daf and the database.sql file.  This is an advanced option and users should be pre-paired to know that state of their database
                    and archive site files ahead of time.
                </td>
            </tr>
            <tr>
                <td class="col-opt">Overwrite Install <br/> Database Only <sup>pro</sup></td>
                <td>
                    This mode indicates that the installer was started in a location that contains an existing site.  With this mode <b>the existing site will be overwritten</b> with
                    the contents of the database.sql file.  This is an advanced option and users should be pre-paired to know that state of their database and site files ahead of time.
                </td>
            </tr>
            </table>
            <br/><br/>


            Step 1 of the installer is separated into four sections for pro and three for lite.  Below is an overview of each area:
            <br/><br/>

            <h3>Archive</h3>
            This is the archive file the installer must use in order to extract the web site files and database.   The 'Name' is a unique key that
            ties both the archive and installer together.   The installer needs the archive file name to match the 'Name' value exactly character for character in order
            for	this section to get a pass status.
            <br/><br/>
            If the archive name	is ever changed then it should be renamed back to the 'Name' value in order for the installer to properly identify it as part of a
            complete package.  Additional information such as the archive size and the package notes are mentioned in this section.
            <br/><br/>

            <h3>Validation</h3>
            This section shows the installers system requirements and notices.  All requirements must pass in order to proceed to Step 2.  Each requirement will show
            a <b class="dupx-pass">Pass</b>/<b class="dupx-fail">Fail</b> status.  Notices on the other hand are <u>not</u> required in order to continue with the install.
            <br/><br/>

            Notices are simply checks that will help you identify any possible issues that might occur.  If this section shows a
            <b class="dupx-pass">Good</b>/<b class="dupx-fail">Warn</b> for various checks. 	Click on the title link and	read the overview for how to solve the test.
            <br/><br/>

            <h3>Multisite <sup>pro</sup></h3>
            The multisite option allows users with a Pro Business or Gold license to perform additional multi-site tasks.  All licenses can backup & migrate standalone sites
            and full multisite networks. Multisite Plus+ (business and above) adds the  ability to install a subsite as a standalone site.
            <br/><br/>

            <h3>Options</h3>
            The options for step 1 can help better prepare your site should your server need additional settings beyond most general configuration.
            <table class="help-opt">
                <tr>
                    <th class="col-opt">Option</th>
                    <th>Details</th>
                </tr>
                <tr>
                    <td colspan="2" class="section">General Options</td>
                </tr>
                <tr>
                    <td class="col-opt">Extraction</td>
                    <td>
                        <b>Manual Archive Extraction</b><br/>
                        Set the Extraction value to "Manual Archive Extraction" when the archive file has already been manually extracted on the server.  This can be done through your hosts
                        control panel such as cPanel or by your host directly. This setting can be helpful if you have a large archive files or are having issues with the installer extracting
                        the file due to timeout issues.
                        <br/><br/>

                        <b>PHP ZipArchive</b><br/>
                        This extraction method will use the PHP <a href="http://php.net/manual/en/book.zip.php" target="_blank">ZipArchive</a> code to extract the archive zip file.
                        <br/><br/>

                        <b>Shell-Exec Unzip</b><br/>
                        This extraction method will use the PHP <a href="http://php.net/manual/en/function.shell-exec.php" target="_blank">shell_exec</a> to call the system unzip
                        command on the server.  This is the default mode that is used if its avail on the server.
                        <br/><br/>

                    </td>
                </tr>
                <tr>
                    <td class="col-opt">Permissions</td>
                    <td>
                        <b>All Files:</b> Check the 'All Files' check-box and enter in the desired <a href="http://php.net/manual/en/function.chmod.php" target="_blank">chmod command</a>
                        to recursively set the octal value on all the files being extracted. Typically this value is 644 on most servers and hosts.
                        <br/><br/>

                        <b>All Directories:</b> Check the 'All Directories' check-box and enter in the desired <a href="http://php.net/manual/en/function.chmod.php" target="_blank">chmod command</a>
                        to recursively set octal value on all the directories being extracted.  Typically this value is 755 on most servers and hosts.
                        <br/><br/>
                        <i>Note: These settings only apply to Linux operating systems</i>
                    </td>
                </tr>
                <tr>
                    <td colspan="2" class="section">Advanced Options</td>
                </tr>
                <tr>
                    <td class="col-opt">Safe Mode</td>
                    <td>
                        Safe mode is designed to configure the site with specific options at install time to help over come issues that may happen during the install were the site
                        is having issues.  These options should only be used if you run into issues after you have tried to run an install.
                        <br/><br/>
                        <b>Basic:</b> This safe mode option will disable all the plugins at install time.  When this option is set you will need to re-enable all plugins after the
                        install has full ran.
                        <br/><br/>

                        <b>Advanced:</b> This option applies all settings used in basic and will also de-activate and reactivate your theme when logging in for the first time.  This
                        options should be used only if the Basic option did not work.
                    </td>
                </tr>
                <tr>
                    <td class="col-opt">Config Files </td>
                    <td>
                        When dealing with configuration files (.htaccess, web.config and .user.ini) the installer can apply different modes:
                        <br/><br/>

                        <b>Create New:</b> This is the default recommended option which will create either a new .htaccess or web.config file.  The new file is streamlined to help
                        guarantee no conflicts are created during install.   The config files generated with this mode will be simple and basic.  The WordFence .user.ini file if
                        present will be removed.
                        <br/><br/>

                        <b>Restore Original:</b> This option simply renames the .htaccess__[HASH] or web.config.orig	files to .htaccess or web.config. The *.orig files come from the original
                        web server where the package was built.	Please note this option will cause issues with the install process if the configuration files are not properly setup to
                        handle the new server environment.  This is an	advanced option and should only be used if you know how to properly configure your web servers configuration.
                        <br/><br/>

                        <b>Ignore All:</b> This option simply does nothing.  No files are backed up, nothing is renamed or created.  This advanced option assumes you already have your
                        config files setup and know how they should behave in the new environment.  When the package is build it will always create a .htaccess__[HASH] or web.config.orig.
                        Since these files are already in the archive file they will show up when the archive is extracted.
                        <br/><br/>

                        <b>Additional Notes:</b>
                        Inside the archive.zip will be a copy of the original .htaccess (Apache) or the web.config (IIS) files that were setup with your packaged site.  They are both
                        renamed to .htaccess__[HASH] and web.config.orig.  When using either 'Create New' or 'Restore Original' any existing config files  will	be backed up with a .bak extension.
                        <i>None of these changes are made until Step 3 is completed, to avoid any issues the .htaccess might cause during the install</i>
                        <br/><br/>
                    </td>
                </tr>

                <tr>
                    <td class="col-opt">File Times</td>
                    <td>When the archive is extracted should it show the current date-time or keep the original time it had when it was built.  This setting will be applied to
                    all files and directories.</td>
                </tr>
                <tr>
                    <td class="col-opt">Logging</td>
                    <td>
                        The level of detail that will be sent to the log file (installer-log.txt).  The recommend setting for most installs should be 'Light'.
                        Note if you use Debug the amount of data written can be very large.  Debug is only recommended for support.
                    </td>
                </tr>

            </table>
            <br/><br/>

            <h3>Notices</h3>
            To proceed with the install users must check the checkbox labeled " I have read and accept all terms &amp; notices".   This means you accept the term of using the software
            and are aware of any notices.
        </div>
    </div>
</section>

<!-- ============================================
STEP 2
============================================== -->
<?php
$sectionId = 'section-step-2';
$expandClass =  $sectionId == $open_section ? 'open' : 'close';
?>
<section id="<?php echo $sectionId; ?>" class="expandable <?php echo $expandClass; ?>" >
    <h2 class="header expand-header">Step <span class="step">2</span> of 4: Install Database</h2>
    <div class="content" >
        <a class="help-target" name="help-s2"></a>
        <div id="dup-help-step1" class="help-page">

            <h3>Basic/cPanel:</h3>
            There are currently two options you can use to perform the database setup.  The "Basic" option requires knowledge about the existing server and on most hosts
            will require that the database be setup ahead of time.  The cPanel option is for hosts that support <a href="http://cpanel.com/" target="_blank">cPanel Software</a>.
            This option will automatically show you the existing databases and users on your cPanel server and allow you to create new databases directly
            from the installer.
            <br/><br/>

            <h3>cPanel Login <sup>pro</sup></h3>
            <i>The cPanel connectivity option is only available for Duplicator Pro.</i>
            <table class="help-opt">
                <tr>
                    <th class="col-opt">Option</th>
                    <th>Details</th>
                </tr>
                <tr>
                    <td class="col-opt">Host</td>
                    <td>This should be the primary domain account URL that is associated with your host.  Most hosts will require you to register a primary domain name.
                    This should be the URL that you place in the host field.  For example if your primary domain name is "mysite.com" then you would enter in
                    "https://mysite.com:2083".  The port 2038 is the common	port number that cPanel works on.  If you do not know your primary domain name please contact your
                    hosting provider or server administrator.</td>
                </tr>
                <tr>
                    <td class="col-opt">Username</td>
                    <td>The cPanel username used to login to your cPanel account.  <i>This is <b>not</b> the same thing as your WordPress administrator account</i>.
                    If your unsure of this name please contact your hosting provider or server administrator.</td>
                </tr>
                <tr>
                    <td class="col-opt">Password</td>
                    <td>The password of the cPanel user</td>
                </tr>
                <tr>
                    <td class="col-opt">Troubleshoot</td>
                    <td>
                        <b>Common cPanel Connection Issues:</b><br/>
                        - Your host does not use <a href="http://cpanel.com/" target="_blank">cPanel Software</a> <br/>
                        - Your host has disabled cPanel API access <br/>
                        - Your host has configured cPanel to work differently (please contact your host) <br/>
                        - View a list of valid cPanel <a href='https://snapcreek.com/wordpress-hosting/' target='_blank'>Supported Hosts</a>
                    </td>
                </tr>
            </table>
            <br/><br/>

            <!-- DATABASE SETUP-->
            <h3>Setup</h3>
            The database setup options allow you to connect to an existing database or in the case of cPanel connect or create a new database.
            <table class="help-opt">
                <tr>
                    <th class="col-opt">Option</th>
                    <th>Details</th>
                </tr>
                <tr>
                    <td class="col-opt">Action</td>
                    <td>
                        <b>Create New Database:</b> Will attempt to create a new database if it does not exist.  When using the 'Basic' option this option will not work on many
                        hosting	providers as the ability to create new databases is normally locked down.  If the database does not exist then you will need to login to your
                        control panel and create the database.  If your host supports 'cPanel' then you can use this option to create a new database after logging in via your
                        cPanel account.
                        <br/><br/>

                        <b>Connect and Remove All Data:</b> This options will DELETE all tables in the database you are connecting to.  Please make sure you have
                        backups of all your data before using an portion of the installer, as this option WILL remove all data.
                        <br/><br/>

                        <b>Connect and Backup Any Existing Data:</b><sup>pro</sup> This options will RENAME all tables in the database you are connecting to with a prefix of
                        "<?php echo $GLOBALS['DB_RENAME_PREFIX'] ?>".
                        <br/><br/>

                        <b>Manual SQL Execution:</b><sup>pro</sup> This options requires that you manually run your own SQL import to an existing database before running the installer.
                        When this action is selected the dup-database__[hash].sql file found inside the dup-installer folder of the archive.zip file will NOT be ran.   The database your connecting to should already
                        be a valid WordPress installed database.  This option is viable when you need to run advanced search and replace options on the database.
                        <br/><br/>

                    </td>
                </tr>
                <tr>
                    <td class="col-opt">Host</td>
                    <td>The name of the host server that the database resides on.  Many times this will be 'localhost', however each hosting provider will have it's own naming
                    convention please check with your server administrator or host to valid for sure the name needed.  To add a port number just append it to the host i.e.
                    'localhost:3306'.</td>
                </tr>
                <tr>
                    <td class="col-opt">Database</td>
                    <td>The name of the database to which this installation will connect and install the new tables and data into.  Some hosts will require a prefix while others
                    do not.  Be sure to know exactly how your host requires the database name to be entered.</td>
                </tr>
                <tr>
                    <td class="col-opt">User</td>
                    <td>The name of a MySQL database server user. This is special account that has privileges to access a database and can read from or write to that database.
                    <i>This is <b>not</b> the same thing as your WordPress administrator account</i>.</td>
                </tr>
                <tr>
                    <td class="col-opt">Password</td>
                    <td>The password of the MySQL database server user.</td>
                </tr>

            </table>
            <br/><br/>

            <!-- OPTIONS-->
            <h3>Options</h3>
            <table class="help-opt">
                <tr>
                    <th class="col-opt">Option</th>
                    <th>Details</th>
                </tr>
                <tr>
                    <td class="col-opt">Prefix<sup>pro*</sup></td>
                    <td>By default, databases are prefixed with the cPanel account's username (for example, myusername_databasename).  However you can ignore this option if
                    your host does not use the default cPanel username prefix schema.  Check the 'Ignore cPanel Prefix' and the username prefixes will be ignored.
                    This will still require you to enter in the cPanels required setup prefix if they require one.  The checkbox will be set to read-only if your host has
                    disabled prefix settings.  Please see your host full requirements when using the cPanel options.</td>
                </tr>
                <tr>
                    <td class="col-opt">Legacy</td>
                    <td>When creating a database table, the Mysql version being used may not support the collation type of the Mysql version where the table was created.
                    In this scenario, the installer will fallback to a legacy collation type to try and create the table. This value should only be checked if you receive an error when
                    testing the database.
                    <br/><br/>
                    For example, if the database was created on MySQL 5.7 and the tables collation type was 'utf8mb4_unicode_520_ci', however your trying to run the installer
                    on an older MySQL 5.5 engine that does not support that type then an error will be thrown.  If this option is checked  then the legacy setting will try to
                    use 'utf8mb4_unicode_520', then 'utf8mb4', then 'utf8' and so on until it runs out of options.
                    <br/><br/>
                    For more information about this feature see the online FAQ question titled
                    <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-110-q" target="_blank">"What is compatibility mode & 'unknown collation' errors"</a>
                    </td>
                </tr>
                <tr>
                    <td class="col-opt">Spacing</td>
                    <td>The process will remove utf8 characters represented as 'xC2' 'xA0' and replace with a uniform space.  Use this option if you find strange question
                    marks in you posts</td>
                </tr>
                <tr>
                    <td class="col-opt">Mode</td>
                    <td>The MySQL mode option will allow you to set the mode for this session.  It is very useful when running into conversion issues.  For a full overview please
                    see the	<a href="https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html" target="_blank">MySQL mode documentation</a> specific to your version.</td>
                </tr>
                <tr>
                    <td class="col-opt">Objects</td>
                    <td>Allow or Ignore  objects for 'Views', 'Stored Procedures", and 'DEFINER' statements.   Typically the defaults for these settings should be used.
                    In the event you see an error such as "'Access denied; you need (at least one of) the SUPER privilege(s) for this operation" then changing the value
                    for each operation should be considered.
                    </td>
                </tr>                
                <tr>
                    <td class="col-opt">Charset</td>
                    <td>When the database is populated from the SQL script it will use this value as part of its connection.  Only change this value if you know what your
                    databases character set should be.</td>
                </tr>
                <tr>
                    <td class="col-opt">Collation</td>
                    <td>When the database is populated from the SQL script it will use this value as part of its connection.  Only change this value if you know what your
                    databases collation set should be.</td>
                </tr>
            </table>
            <sup>*cPanel Only Option</sup>
            <br/><br/>

            <h3>Validation</h3>
            Testing the database connection is important and can help isolate possible issues that may arise with database version and compatibility issues.

            <table class="help-opt">
                <tr>
                    <th class="col-opt">Option</th>
                    <th>Details</th>
                </tr>
                <tr>
                    <td class="col-opt">Test<br/>Database</td>
                    <td>
                        The 'Test Database' button will help validate if the connection parameters are correct for this server and help with details about any issues
                        that may arise.
                    </td>
                </tr>
                <tr>
                    <td class="col-opt">Troubleshoot</td>
                    <td>
                        <b>Common Database Connection Issues:</b><br/>
                        - Double check case sensitive values 'User', 'Password' &amp; the 'Database Name' <br/>
                        - Validate the database and database user exist on this server <br/>
                        - Check if the database user has the correct permission levels to this database <br/>
                        - The host 'localhost' may not work on all hosting providers <br/>
                        - Contact your hosting provider for the exact required parameters <br/>
                        - Visit the online resources 'Common FAQ page' <br/>

                    </td>
                </tr>
            </table>
        </div>
    </div>
</section>

<!-- ============================================
STEP 3
============================================== -->
<?php
$sectionId = 'section-step-3';
$expandClass =  $sectionId == $open_section ? 'open' : 'close';
?>
<section id="<?php echo $sectionId; ?>" class="expandable <?php echo $expandClass; ?>" >
    <h2 class="header expand-header">Step <span class="step">3</span> of 4: Update Data</h2>
    <div class="content" >
        <a class="help-target" name="help-s3"></a>
        <div id="dup-help-step2" class="help-page">

            <!-- SETTINGS-->
            <h3>New Settings</h3>
            These are the new values (URL, Path and Title) you can update for the new location at which your site will be installed at.
            <br/><br/>

            <h3>Replace <sup>pro</sup></h3>
            This section will allow you to add as many custom search and replace items that you would like.  For example you can search for other URLs to replace.  Please use high
            caution when using this feature as it can have unintended consequences as it will search the entire database.   It is recommended to only use highly unique items such as
            full URL or file paths with this option.
            <br/><br/>

            <!-- ADVANCED OPTS -->
            <h3>Options</h3>
            <table class="help-opt">
                <tr>
                    <th class="col-opt">Option</th>
                    <th>Details</th>
                </tr>
                <tr>
                    <td colspan="2" class="section">New Admin Account</td>
                </tr>
                <tr>
                    <td class="col-opt">Username</td>
                    <td>A new WordPress username to create.  This will create a new WordPress administrator account.  Please note that usernames are not changeable from the within the UI.</td>
                </tr>
                <tr>
                    <td class="col-opt">Password</td>
                    <td>The new password for the new user.  Must be at least 6 characters long.</td>
                </tr>
                <tr>
                    <td colspan="2" class="section">Scan Options</td>
                </tr>
                <tr>
                    <td class="col-opt">Cleanup <sup>pro</sup></td>
                    <td>The checkbox labeled Remove schedules &amp; storage endpoints will empty the Duplicator schedule and storage settings.  This is recommended to keep enabled so that you do not have unwanted schedules and storage options enabled.</td>
                </tr>
                <tr>
                    <td class="col-opt">Old URL</td>
                    <td>The old URL of the original values that the package was created with.  These values should not be changed, unless you know the underlying reasons</td>
                </tr>
                <tr>
                    <td class="col-opt">Old Path</td>
                    <td>The old path of the original values that the package was created with.  These values should not be changed, unless you know the underlying reasons</td>
                </tr>
                <tr>
                    <td class="col-opt">Site URL</td>
                    <td> For details see WordPress <a href="http://codex.wordpress.org/Changing_The_Site_URL" target="_blank">Site URL</a> &amp; <a href="http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory" target="_blank">Alternate Directory</a>.  If you're not sure about this value then leave it the same as the new setup URL.</td>
                </tr>
                <tr>
                    <td class="col-opt">Scan Tables</td>
                    <td>Select the tables to be updated. This process will update all of the 'Old Settings' with the new 'Setup' settings. Hold down the 'ctrl key' to select/deselect multiple.</td>
                </tr>
                <tr>
                    <td class="col-opt">Activate Plugins</td>
                    <td>These plug-ins are the plug-ins that were activated when the package was created and represent the plug-ins that will be activated after the install.</td>
                </tr>
                <tr>
                    <td class="col-opt">Update email domains</td>
                    <td>The domain portion of all email addresses will be updated if this option is enabled.</td>
                </tr>
                <tr>
                    <td class="col-opt">Full Search</td>
                    <td>Full search forces a scan of every single cell in the database. If it is not checked then only text based columns are searched which makes the update process much faster.
                    Use this option if you have issues with data not updating correctly.</td>
                </tr>
                <tr>
                    <td class="col-opt">Post GUID</td>
                    <td>If your moving a site keep this value checked. For more details see the <a href="https://wordpress.org/support/article/changing-the-site-url/#important-guid-note" target="_blank">notes on GUIDS</a>.	Changing values in the posts table GUID column can change RSS readers to evaluate that the posts are new and may show them in feeds again.</td>
                </tr>
                <tr>
                    <td class="col-opt">Cross search <sup>pro</sup></td>
                    <td>
                        This option enables the searching and replacing of subsite domains and paths that link to each other.  <br>
                        Check this option if hyperlinks of at least one subsite point to another subsite.<br>
                        Uncheck this option there if there are at least <?php echo MAX_SITES_TO_DEFAULT_ENABLE_CORSS_SEARCH ?> subsites and no subsites hyperlinking to each other (Checking this option in this scenario would unnecessarily load your server).<br><br>
                        Check this option If you unsure if you need this option.<br></td>
                </tr>
                <tr>
                    <td class="col-opt"> Max size check for serialize objects</td>
                    <td>
                        Large serialized objects can cause a fatal error when Duplicator attempts to transform them. <br>
                        If a fatal error is generated, lower this limit. <br>
                        If a warning of this type appears in the final report <br>
                        <pre style="white-space: pre-line;">
                            DATA-REPLACE ERROR: Serialization
                            ENGINE: serialize data too big to convert; data len: XXX Max size: YYY
                            DATA: .....
                        </pre>
                        And you think that the serialized object is necessary you can increase the limit or <b>set it to 0 to have no limit</b>.
                    </td>
                </tr>
                <tr>
                    <td colspan="2" class="section">WP-Config File</td>
                </tr>
                <tr>
                    <td class="col-opt">Config SSL</td>
                    <td>Turn off SSL support for WordPress. This sets FORCE_SSL_ADMIN in your wp-config file to false if true, otherwise it will create the setting if not set.  The "Enforce on Login"
                        will turn off SSL support for WordPress Logins.</td>
                </tr>
                <tr>
                    <td class="col-opt">Config Cache</td>
                    <td>Turn off Cache support for WordPress. This sets WP_CACHE in your wp-config file to false if true, otherwise it will create the setting if not set.  The "Keep Home Path"
                    sets WPCACHEHOME in your wp-config file to nothing if true, otherwise nothing is changed.</td>
                </tr>
            </table>
        </div>
    </div>
</section>

<!-- ============================================
STEP 4
============================================== -->
<?php
$sectionId = 'section-step-4';
$expandClass =  $sectionId == $open_section ? 'open' : 'close';
?>
<section id="<?php echo $sectionId; ?>" class="expandable <?php echo $expandClass; ?>" >
    <h2 class="header expand-header">Step <span class="step">4</span> of 4: Test Site</h2>
    <div class="content" >
        <a class="help-target" name="help-s4"></a>
        <div id="dup-help-step3" class="help-page">
            <h3>Final Steps</h3>

            <b>Review Install Report</b><br/>
            The install report is designed to give you a synopsis of the possible errors and warnings that may exist after the installation is completed.
            <br/><br/>

            <b>Test Site</b><br/>
            After the install is complete run through your entire site and test all pages and posts.
            <br/><br/>

            <b>Final Security Cleanup</b><br/>
            When completed with the installation please delete all installation files.  <b>Leaving these files on your server can be a security risk!</b>   You can remove
            all these files by logging into your WordPress admin and following the remove notification links or by deleting these file manually.   Be sure these files/directories are removed.  Optionally
            it is also recommended to remove the archive.zip/daf file.
            <ul>
                <li>dup-installer</li>
                <li>installer.php</li>
                <li>installer-backup.php</li>
                <li>dup-installer-bootlog__[HASH].txt</li>
                <li>archive.zip/daf</li>
            </ul>
        </div>
    </div>
</section>

<?php
$sectionId = 'section-troubleshoot';
$expandClass =  $sectionId == $open_section ? 'open' : 'close';
?>
<section id="<?php echo $sectionId; ?>" class="expandable <?php echo $expandClass; ?>" >
    <h2 class="header expand-header">Troubleshooting Tips</h2>
    <div class="content" >
        <a class="help-target" name="help-s5"></a>
        <div id="troubleshoot" class="help-page">

            <div style="padding: 0px 10px 10px 10px;">
                <b>Common Quick Fix Issues:</b>
                <ul>
                    <li>Use a <a href='https://snapcreek.com/wordpress-hosting/' target='_blank'>Duplicator approved hosting provider</a></li>
                    <li>Validate directory and file permissions (see below)</li>
                    <li>Validate web server configuration file (see below)</li>
                    <li>Clear your browsers cache</li>
                    <li>Deactivate and reactivate all plugins</li>
                    <li>Resave a plugins settings if it reports errors</li>
                    <li>Make sure your root directory is empty</li>
                </ul>

                <b>Permissions:</b><br/>
                Not all operating systems are alike.  Therefore, when you move a package (zip file) from one location to another the file and directory permissions may not always stick.  If this is the case then check your WordPress directories and make sure it's permissions are set to 755. For files make sure the permissions are set to 644 (this does not apply to windows servers).   Also pay attention to the owner/group attributes.  For a full overview of the correct file changes see the <a href='http://codex.wordpress.org/Hardening_WordPress#File_permissions' target='_blank'>WordPress permissions codex</a>
                <br/><br/>

                <b>Web server configuration files:</b><br/>
                For Apache web server the root .htaccess file was copied to .htaccess__[HASH]. A new stripped down .htaccess file was created to help simplify access issues.  For IIS web server the web.config file was copied to web.config.orig, however no new web.config file was created.  If you have not altered this file manually then resaving your permalinks and resaving your plugins should resolve most all changes that were made to the root web configuration file.   If your still experiencing issues then open the .orig file and do a compare to see what changes need to be made. <br/><br/><b>Plugin Notes:</b><br/> It's impossible to know how all 3rd party plugins function.  The Duplicator attempts to fix the new install URL for settings stored in the WordPress options table.   Please validate that all plugins retained there settings after installing.   If you experience issues try to bulk deactivate all plugins then bulk reactivate them on your new duplicated site. If you run into issues were a plugin does not retain its data then try to resave the plugins settings.
                <br/><br/>

                 <b>Cache Systems:</b><br/>
                 Any type of cache system such as Super Cache, W3 Cache, etc. should be emptied before you create a package.  Another alternative is to include the cache directory in the directory exclusion path list found in the options dialog. Including a directory such as \pathtowordpress\wp-content\w3tc\ (the w3 Total Cache directory) will exclude this directory from being packaged. In is highly recommended to always perform a cache empty when you first fire up your new site even if you excluded your cache directory.
                 <br/><br/>

                 <b>Trying Again:</b><br/>
                 If you need to retry and reinstall this package you can easily run the process again by deleting all files except the installer and package file and then browse to the installer again.
                 <br/><br/>

                 <b>Additional Notes:</b><br/>
                 If you have made changes to your PHP files directly this might have an impact on your duplicated site.  Be sure all changes made will correspond to the sites new location.
                 Only the package (zip file) and the installer (php file) should be in the directory where you are installing the site.  Please read through our knowledge base before submitting any issues.
                 If you have a large log file that needs evaluated please email the file, or attach it to a help ticket.
            </div>
        </div>
    </div>
</section>

<div style="text-align:center; margin-top: 28px;">For additional help please visit <a href="https://snapcreek.com/support/docs/" target="_blank">Duplicator Migration and Backup Online Help</a></div>


</div>

<script>
$(document).ready(function ()
{
    //Disable href for toggle types
    $("section.expandable .expand-header").click(function() {
        var section = $(this).parent();
        if(section.hasClass('open')) {
            section.removeClass('open').addClass('close');
        } else {
             section.removeClass('close').addClass('open');
        }
    });

    <?php if (!empty($open_section)) { ?>
        $("html, body").animate({ scrollTop: $('#<?php echo $open_section; ?>').offset().top }, 1000);
    <?php } ?>

});
</script>
<!-- END OF VIEW HELP -->
installer/dup-installer/views/view.init1.php000064400000013306151336065400015175 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

$page_url = DUPX_HTTP::get_request_uri();

$security = DUPX_Security::getInstance();

if ($security->getSecurityType() == DUPX_Security::SECURITY_NONE) {
    DUPX_HTTP::post_with_html($page_url, array(
        'action_step' => '1',
        'csrf_token' => DUPX_CSRF::generate('step1')
    ));
    exit;
}

//POSTBACK: valid security
if ($security->securityCheck()) {
    DUPX_HTTP::post_with_html($page_url,
        array(
            'action_step' => '1',
            'csrf_token' => DUPX_CSRF::generate('step1'),
            'secure-pass' => $_POST['secure-pass'],
            'secure-archive' => $_POST['secure-archive']
        )
    );
    exit;
}
$page_err = isset($_POST['secure-try'])  ? 1 : 0;

switch (DUPX_Security::getInstance()->getSecurityType()) {
    case DUPX_Security::SECURITY_PASSWORD:
        $errorMsg = 'Invalid Password! Please try again...';
        break;
    case DUPX_Security::SECURITY_ARCHIVE:
        $errorMsg = 'Invalid Archive name! Please try again...';
        break;
    case DUPX_Security::SECURITY_NONE:
    default:
        $errorMsg = '';
        break;
}

$css_why_display = ($GLOBALS['DUPX_STATE']->mode === DUPX_InstallerMode::OverwriteInstall) ? "" : "no-display";
$archive_name    = isset($_POST['secure-archive']) ? $_POST['secure-archive'] : '';

?>

<style>
    div#content {min-height: 250px}
    div#content-inner {min-height: 250px}
    form#i1-pass-form {min-height: 250px}
    div.footer-buttons {position: static}
</style>

<!-- =========================================
VIEW: STEP 0 - PASSWORD -->
<form method="post" id="i1-pass-form" class="content-form"  data-parsley-validate="" autocomplete="off">
    <input type="hidden" name="view" value="secure" />
    <input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('secure'); ?>">
    <input type="hidden" name="secure-try" value="1" />

    <div class="hdr-main">
        Installer Security
    </div>

    <?php if ($page_err) : ?>
        <div class="error-pane">
            <p><?php echo $errorMsg; ?></p>
        </div>
    <?php endif; ?>

    <div class="margin-top-0 margin-bottom-2">
        <div class="text-right" >
            <a href="javascript:void(0)" id="pass-quick-link" class="link-style" onclick="jQuery('#pass-quick-help-info').toggleClass('no-display');" >
                Why do I see this screen?
            </a>
        </div>
        <div id="pass-quick-help-info" class="box info <?php echo $css_why_display?>">
            This screen will show under the following conditions:
            <ul>
                <li>
                    <b>Password Protection:</b> If the file was password protected when it was created then the password input below should
                    be enabled.  If the input is disabled then no password was set.
                </li>
                <li>
                    <b>Simple Installer Name:</b> If no password is set and you are performing an <i class="maroon">"Overwrite Install"</i> on a public server
                    (non localhost) without a secure installer.php file name (i.e. [hash]_installer.php).  Then users will need to enter the archive file for
                    a valid security check.  If the Archive File Name input is disabled then it can be ignored.
                </li>
            </ul>
        </div>
    </div>

    <div id="wrapper_item_secure-pass" class="param-wrapper margin-bottom-2">
        <label for="secure-pass">Password:</label>
        <?php
        $attrs = array();
        if ($security->getSecurityType() == $security::SECURITY_PASSWORD) {
            $attrs['required'] = 'required';
        } else {
            $attrs['placeholder'] = 'Password not enabled';
            $attrs['disabled'] = 'disabled';
        }
        DUPX_U_Html::inputPasswordToggle('secure-pass', 'secure-pass', array(), $attrs);
        ?>
    </div>

    <?php if ($GLOBALS['DUPX_STATE']->mode === DUPX_InstallerMode::OverwriteInstall) : ?>
        <div id="wrapper_item_secure-archive" class="param-wrapper margin-bottom-4">
            <label for="param_item_secure-archive">Archive File Name:</label>
            <div>
                <input
                    type="text"
                    id="param_item_secure-archive"
                    name="secure-archive"
                    value="<?php echo $archive_name; ?>"
                    class="input-item"
                    placeholder="example: [full-unique-name]_archive.zip"
                    <?php echo ($security->getSecurityType() == $security::SECURITY_ARCHIVE ? '' : 'disabled'); ?>>
                <div class="sub-note">
                    <?php DUPX_View_Funcs::helpLink('secure', 'How to get archive file name?'); ?>
                </div>
            </div>
        </div>
    <?php endif;?>

    <div class="footer-buttons" >
        <div class="content-center" >
            <button type="submit" name="secure-btn" id="secure-btn" class="default-btn" onclick="DUPX.checkPassword()">
                Submit
            </button>
        </div>
    </div>
</form>

<script>
    /**
     * Submits the password for validation
     */
    DUPX.checkPassword = function ()
    {
        var $form = $('#i1-pass-form');
        $form.parsley().validate();
        if (!$form.parsley().isValid()) {
            return;
        }
        $form.submit();
    }

    //DOCUMENT LOAD
    $(document).ready(function()
    {
        $('#secure-pass').focus();
        $('#param_item_secure-archive').focus();
    });
</script>
<!-- END OF VIEW INIT 1 -->installer/dup-installer/views/view.s1.terms.php000064400000010473151336065400015627 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<!-- ====================================
TERMS & NOTICES DIALOG
==================================== -->
<div id="dialog-terms" title="Terms and Notices" style="display:none">
	<div id="s1-warning-msg">
		<b>TERMS &amp; NOTICES</b> <br/><br/>

		<b>Disclaimer:</b>
		The Duplicator software and installer should be used at your own risk.  Users should always back up or have backups of your database and files before running this installer.
		If you're not sure about how to use this tool then please enlist the guidance of a technical professional.  <u>Always</u> test this installer in a sandbox environment
		before trying to deploy into a production environment.  Be sure that if anything happens during the install that you have a backup recovery plan in place.   By accepting
		this agreement the users of this software do not hold liable Snapcreek LLC or any of its affiliates liable for any issues that might occur during use of this software.
		<br/><br/>

		<b>Database:</b>
		Do not connect to an existing database unless you are 100% sure you want to remove all of it's data. Connecting to a database that already exists will permanently
		DELETE all data in that database. This tool is designed to populate and fill a database with NEW data from a duplicated database using the SQL script in the
		package name above.
		<br/><br/>

		<b>Setup:</b>
		Only the archive and installer file should be in the install directory, unless you have manually extracted the package and selected the
		'Manual Archive Extraction' option under options. All other files will be OVERWRITTEN during install.  Make sure you have full backups of all your databases and files
		before continuing with an installation. Manual extraction requires that all contents in the package are extracted to the same directory as the installer file.
		Manual extraction is only needed when your server does not support the ZipArchive extension.  Please see the online help for more details.
		<br/><br/>

		<b>After Install:</b> When you are done with the installation you must remove these files/directories:
		<ul>
			<li>dup-installer</li>
			<li>installer.php</li>
			<li>installer-backup.php</li>
			<li>dup-installer-bootlog__[HASH].txt</li>
			<!--li>dup-wp-config-arc_[HASH].txt</li-->
			<li>[HASH]_archive.zip/daf</li>
		</ul>

		These files contain sensitive information and should not remain on a production system for system integrity and security protection.
		<br/><br/>

		<b>License Overview</b><br/>
		Duplicator is licensed under the GPL v3 https://www.gnu.org/licenses/gpl-3.0.en.html including the following disclaimers and limitation of liability.
		<br/><br/>

		<b>Disclaimer of Warranty</b><br/>
		THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
		PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
		FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
		THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
		<br/><br/>

		<b>Limitation of Liability</b><br/>
		IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS
		PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
		PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO
		OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
		<br/><br/>

	</div>
</div>

<script>
/**
 * View the terms an notices section */
DUPX.viewTerms = function ()
{
	$( "#dialog-terms" ).dialog({
	  resizable: false,
	  height: 600,
	  width: 550,
	  modal: true,
	  position: { my: 'top', at: 'top+150' },
	  buttons: {
		"OK": function() {
			$(this).dialog("close");
		}
	  }
	});
}
</script>installer/dup-installer/views/view.exception.php000064400000002710151336065400016144 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
    $log_link = './'.$GLOBALS["LOG_FILE_NAME"];
    $attr_log_link = DUPX_U::esc_attr($log_link);
?>
<div class="dupx-logfile-link"><?php DUPX_View_Funcs::installerLogLink(); ?></div>
<div class="hdr-main">
	Exception error
</div><br/>
<div id="ajaxerr-data">
    <b style="color:#B80000;">INSTALL ERROR!</b>
    <p>
        Message: <b><?php echo DUPX_U::esc_html($exceptionError->getMessage()); ?></b><br>
        Please see the <?php DUPX_View_Funcs::installerLogLink(); ?> file for more details.
        <?php
        if ($exceptionError instanceof DupxException) {
            if ($exceptionError->haveFaqLink()) {
            ?>
        <br>
        See FAQ: <a href="<?php echo $exceptionError->getFaqLinkUrl (); ?>" ><?php echo $exceptionError->getFaqLinkLabel(); ?></a>

        <?php
            }
            if (strlen($longMsg = $exceptionError->getLongMsg())) {
                echo '<br><br>'.$longMsg;
            }
        }
        ?>
    </p>
    <hr>
    Trace:
    <pre class="exception-trace"><?php
    echo $exceptionError->getTraceAsString();
    ?></pre>
</div>
<div style="text-align:center; margin:10px auto 0px auto">
    <!--<input type="button" class="default-btn" onclick="DUPX.hideErrorResult()" value="&laquo; Try Again" /><br/><br/>-->
    <i style='font-size:11px'>See online help for more details at <a href='https://snapcreek.com/ticket' target='_blank'>snapcreek.com</a></i>
</div>
installer/dup-installer/views/view.s2.basic.php000064400000036223151336065400015560 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */
/* @var $state DUPX_InstallerState */

$state             = $GLOBALS['DUPX_STATE'];
$is_standard_mode  = $state->mode == DUPX_InstallerMode::StandardInstall;
$is_overwrite_mode = ($state->mode == DUPX_InstallerMode::OverwriteInstall && $GLOBALS['DUPX_AC']->installSiteOverwriteOn);

if ($is_standard_mode) {

    $ovr_dbhost = NULL;
    $ovr_dbname = NULL;
    $ovr_dbuser = NULL;
    $ovr_dbpass = NULL;

    $dbhost = $GLOBALS['DUPX_AC']->dbhost;
    $dbname = $GLOBALS['DUPX_AC']->dbname;
    $dbuser = $GLOBALS['DUPX_AC']->dbuser;
    $dbpass = $GLOBALS['DUPX_AC']->dbpass;

    $dbFormDisabledString = '';
} else {
    $wpConfigPath       = "{$GLOBALS['DUPX_ROOT']}/wp-config.php";
    $outerWPConfigPath  = dirname($GLOBALS['DUPX_ROOT'])."/wp-config.php";
    require_once($GLOBALS['DUPX_INIT'].'/lib/config/class.wp.config.tranformer.php');
    $config_transformer = file_exists($wpConfigPath) ? new DupLiteWPConfigTransformer($wpConfigPath) : new DupLiteWPConfigTransformer($outerWPConfigPath);

    function dupxGetDbConstVal($constName)
    {
        if ($GLOBALS['config_transformer']->exists('constant', $constName)) {
            $configVal = $GLOBALS['config_transformer']->get_value('constant', $constName);
            $constVal  = htmlspecialchars($configVal);
        } else {
            $constVal = '';
        }
        return $constVal;
    }
    $ovr_dbhost = dupxGetDbConstVal('DB_HOST');
    $ovr_dbname = dupxGetDbConstVal('DB_NAME');
    $ovr_dbuser = dupxGetDbConstVal('DB_USER');
    $ovr_dbpass = dupxGetDbConstVal('DB_PASSWORD');

    $dbhost = '';
    $dbname = '';
    $dbuser = '';
    $dbpass = '';
}
?>

<!-- =========================================
BASIC PANEL -->
<div class="hdr-sub1 toggle-hdr" data-type="toggle" data-target="#s2-db-basic">
    <a href="javascript:void(0)"><i class="fa fa-minus-square"></i>Setup</a>
</div>
<div id="s2-db-basic" class="dupx-panel-area">
    <div class="hdr-sub3">Database Connection</div>
    
    <?php if ($is_overwrite_mode) : ?>
        <div id="s2-db-basic-overwrite" class="gray-panel" >
            <b style='color:maroon'>Ready to connect to existing sites database? </b><br/>
            <div class="warn-text">
                The existing sites database settings should have been applied below.  If you want to connect to this database and replace all its data then keep these values.
                To use different database settings click the 'Reset button' to clear the values.  To apply the current sites database use the 'Apply Button'.
                <br/><br/>

                <i><i class="fas fa-exclamation-triangle fa-sm"></i> Warning: Please note that reusing an existing site's database will <u>overwrite</u> all of its data. If you're not 100% sure about
                    using these database settings, then create a new database and use the new credentials instead.</i>
            </div>

            <div class="btn-area">
                <input id="overwrite-btn-apply" type="button" value="Apply" class="overwrite-btn" onclick="DUPX.checkOverwriteParameters()">
                <input id="overwrite-btn-reset" type="button" value="Reset" class="overwrite-btn" onclick="DUPX.resetParameters()">
            </div>
        </div>
    <?php endif; ?>
    <table class="dupx-opts">
        <tr>
            <td>Action:</td>
            <td>
                <select name="dbaction" id="dbaction">
                    <?php if ($is_standard_mode) : ?>
                        <option value="create">Create New Database</option>
                    <?php endif; ?>
                    <option value="empty" selected>Remove All Data</option>
                    <option value="null" disabled="disabled">Backup and Rename Existing Tables (Pro Only)</option>
                    <option value="null" disabled="disabled">Manual SQL Execution (Pro Only)</option>
                </select>
            </td>
        </tr>
        <tr>
            <td>Host:</td>
            <td><input type="text" name="dbhost" id="dbhost" required="true" value="<?php echo htmlspecialchars($dbhost); ?>" placeholder="localhost" /></td>
        </tr>
        <tr>
            <td>Database:</td>
            <td>
                <input type="text" name="dbname" id="dbname" required="true" value="<?php echo htmlspecialchars($dbname); ?>"  placeholder="new or existing database name"  />
                <div class="s2-warning-emptydb">
                    Warning: The selected 'Action' above will remove <u>all data</u> from this database!
                </div>
                <div class="s2-warning-renamedb">
                    Notice: The selected 'Action' will rename <u>all existing tables</u> from the database name above with a prefix '<?php echo DUPX_U::esc_html($GLOBALS['DB_RENAME_PREFIX']); ?>'.
                    The prefix is only applied to existing tables and not the new tables that will be installed.
                </div>
                <div class="s2-warning-manualdb">
                    Notice: The 'Manual SQL execution' action will prevent the SQL script in the archive from running. The database above should already be
                    pre-populated with data which will be updated in the next step. No data in the database will be modified until after Step 3 runs.
                </div>
            </td>
        </tr>
        <tr><td>User:</td><td><input type="text" name="dbuser" id="dbuser" required="true" value="<?php echo DUPX_U::esc_attr($dbuser); ?>" placeholder="valid database username" /></td></tr>
        <tr>
            <td>Password:</td>
            <td>
                <?php
                DUPX_U_Html::inputPasswordToggle('dbpass', 'dbpass', array(), array(
                    'placeholder' => 'valid database user password',
                    'value'       => $dbpass
                ));
                ?>
            </td>
        </tr>
    </table>
</div>
<br/>


<?php if (!$is_dbtest_mode) : ?>
    <!-- =========================================
    OPTIONS -->
    <div class="hdr-sub1 toggle-hdr" id="s2-opts-hdr-basic" data-type="toggle" data-target="#s2-opts-basic">
        <a href="javascript:void(0)"><i class="fa fa-plus-square"></i>Options</a>
    </div>
    <div id="s2-opts-basic" class="s2-opts hdr-sub1-area dupx-panel-area" style="display:none;">
        <div class="help-target">
            <?php DUPX_View_Funcs::helpIconLink('step2'); ?>
        </div>
        <div class="hdr-sub3">Database Configuration</div>
        <table class="dupx-opts dupx-advopts dupx-advopts-space">
            <tr>
                <td>Legacy:</td>
                <td><input type="checkbox" name="dbcollatefb" id="dbcollatefb" value="1" /> <label for="dbcollatefb">Apply legacy collation fallback support for unknown collations types</label></td>
            </tr>
            <tr>
                <td>Spacing:</td>
                <td><input type="checkbox" name="dbnbsp" id="dbnbsp" value="1" /> <label for="dbnbsp">Fix non-breaking space characters</label></td>
            </tr>
            <tr>
                <td style="vertical-align:top">Mode:</td>
                <td>
                    <input type="radio" name="dbmysqlmode" id="dbmysqlmode_1" checked="true" value="DEFAULT"/> <label for="dbmysqlmode_1">Default</label> &nbsp;
                    <input type="radio" name="dbmysqlmode" id="dbmysqlmode_2" value="DISABLE"/> <label for="dbmysqlmode_2">Disable</label> &nbsp;
                    <input type="radio" name="dbmysqlmode" id="dbmysqlmode_3" value="CUSTOM"/> <label for="dbmysqlmode_3">Custom</label> &nbsp;
                    <div id="dbmysqlmode_3_view" style="display:none; padding:5px">
                        <input type="text" name="dbmysqlmode_opts" value="" /><br/>
                        <small>Separate additional <?php
                            DUPX_View_Funcs::helpLink('step2', 'sql modes');
                            ?> with commas &amp; no spaces.<br/>
                            Example: <i>NO_ENGINE_SUBSTITUTION,NO_ZERO_IN_DATE,...</i>.</small>
                    </div>
                </td>
            </tr>
        </table>

        <table class="dupx-opts dupx-advopts">
            <tr>
                <td style="width:130px">Objects:</td>
                <td><input type="checkbox" name="dbobj_views" id="dbobj_views" checked="true" /><label for="dbobj_views">Enable View Creation</label></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="checkbox" name="dbobj_procs" id="dbobj_procs" checked="true" /><label for="dbobj_procs">Enable Stored Procedure Creation</label></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="checkbox" name="dbobj_funcs" id="dbobj_funcs" checked="true" /><label for="dbobj_funcs">Enable Function Creation</label></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="checkbox" name="db_remove_definer" id="db_remove_definer"/><label for="db_remove_definer">Remove DEFINER from CREATE queries</label></td>
            </tr>
            <tr>
                <td>Charset:</td>
                <td>
                    <input type="text" name="dbcharset" id="dbcharset" value="<?php echo DUPX_U::esc_attr($_POST['dbcharset']); ?>" /> 
                </td>
            </tr>
            <tr>
                <td>Collation: </td>
                <td>
                    <input type="text" name="dbcollate" id="dbcollate" value="<?php echo DUPX_U::esc_attr($_POST['dbcollate']); ?>" />
                </td>
            </tr>
        </table>
    </div><br/>
<?php endif; ?>



<!-- =========================================
BASIC: DB VALIDATION -->
<div class="hdr-sub1 toggle-hdr" data-type="toggle" data-target="#s2-dbtest-area-basic">
    <a href="javascript:void(0)"><i class="fa fa-minus-square"></i>Validation</a>
</div>

<div id="s2-dbtest-area-basic" class="s2-dbtest-area hdr-sub1-area">
    <div id="s2-dbrefresh-basic">
        <a href="javascript:void(0)" onclick="DUPX.testDBConnect()"><i class="fa fa-sync"></i> Retry Test</a>
    </div>
    <div style="clear:both"></div>
    <div id="s2-dbtest-hb-basic" class="s2-dbtest-hb">
        <div class="message">
              <b><i class="far fa-check-circle"></i> Please validate database setup by clicking the 'Test Database' button.</b><br/>
              <i>This test checks to make sure the database is ready for install.</i>
        </div>
    </div>
</div>

<br/><br/><br/>
<br/><br/><br/>

<div class="footer-buttons">
    <?php if ($is_dbtest_mode) : ?>
        <div style="text-align: center; font-size:11px; margin-top: -20px">
            <button id="s2-dbtest-btn-basic" type="button" onclick="DUPX.testDBConnect()" class="default-btn" /><i class="fas fa-database fa-sm"></i> Test Database</button>
            <br/><br/>
            Notice: This a database only connection view.<br/>  
            To continue with the install, close this browser window/tab.
        </div>
    <?php else : ?>
        <button id="s2-dbtest-btn-basic" type="button" onclick="DUPX.testDBConnect()" class="default-btn" /><i class="fas fa-database fa-sm"></i> Test Database</button>
        <button id="s2-next-btn-basic" type="button" onclick="DUPX.confirmDeployment()" class="default-btn disabled" disabled="true"
            title="The 'Test Database' connectivity requirements must pass to continue with install!">
        Next <i class="fa fa-caret-right"></i>
    </button>
<?php endif; ?>
</div>

<script>
    /**
     *  Bacic Action Change  */
    DUPX.basicDBActionChange = function ()
    {
        var action = $('#dbaction').val();
        $('#s2-basic-pane .s2-warning-manualdb').hide();
        $('#s2-basic-pane .s2-warning-emptydb').hide();
        $('#s2-basic-pane .s2-warning-renamedb').hide();
        switch (action) {
            case 'create':
                break;
            case 'empty':
                $('#s2-basic-pane .s2-warning-emptydb').show(300);
                break;
            case 'rename':
                $('#s2-basic-pane .s2-warning-renamedb').show(300);
                break;
            case 'manual':
                $('#s2-basic-pane .s2-warning-manualdb').show(300);
                break;
        }
    };

//DOCUMENT INIT
    $(document).ready(function ()
    {
        $("#dbaction").on("change", DUPX.basicDBActionChange);
        DUPX.basicDBActionChange();

        $("input[name=dbmysqlmode]").click(function () {
            ($(this).val() == 'CUSTOM')
                    ? $('#dbmysqlmode_3_view').show()
                    : $('#dbmysqlmode_3_view').hide();
        });

        //state = 'enabled', 'disable', 'toggle'
        DUPX.basicDBToggleImportMode = function (state)
        {
            state = typeof state !== 'undefined' ? state : 'enabled';
            var $inputs = $("#s2-db-basic").find("input[type=text]");

            switch (state) {
                case 'readonly':
                    $inputs.each(function () {
                        $(this).attr('readonly', true).css('border', 'none');
                    });
                    break;
                case 'enable':
                    $inputs.each(function () {
                        $(this).removeAttr('readonly').css('border', '1px solid silver');
                    });
                    break;
                case 'toggle':
                    var readonly = $('input#dbhost').is('[readonly]');
                    if (readonly) {
                        $inputs.each(function () {
                            $(this).removeAttr('readonly').css('border', '1px solid silver');
                        });
                    } else {
                        $inputs.each(function () {
                            $(this).attr('readonly', true).css('border', 'none');
                        });
                    }
                    break;
            }
        }

        DUPX.checkOverwriteParameters = function (dbhost, dbname, dbuser, dbpass)
        {
            $("#dbhost").val(<?php echo "'{$ovr_dbhost}'" ?>);
            $("#dbname").val(<?php echo "'{$ovr_dbname}'" ?>);
            $("#dbuser").val(<?php echo "'{$ovr_dbuser}'" ?>);
            $("#dbpass").val(<?php echo "'{$ovr_dbpass}'" ?>);
            DUPX.basicDBToggleImportMode('readonly');
            $("#s2-db-basic-setup").show();
        }

        DUPX.fillInPlaceHolders = function ()
        {
            $("#dbhost").attr('placeholder', <?php echo "'{$ovr_dbhost}'" ?>);
            $("#dbname").attr('placeholder', <?php echo "'{$ovr_dbname}'" ?>);
            $("#dbuser").attr('placeholder', <?php echo "'{$ovr_dbuser}'" ?>);
            $("#dbpass").attr('placeholder', <?php echo "'{$ovr_dbpass}'" ?>);
        }

        DUPX.resetParameters = function ()
        {
            $("#dbhost").val('').attr('placeholder', 'localhost');
            $("#dbname").val('').attr('placeholder', 'new or existing database name');
            $("#dbuser").val('').attr('placeholder', 'valid database user name');
            $("#dbpass").val('').attr('placeholder', 'valid database user password');
            DUPX.basicDBToggleImportMode('enable');
        }

<?php if ($is_overwrite_mode) : ?>
            DUPX.fillInPlaceHolders();
            $('#overwrite-btn-apply').click();
<?php endif; ?>

    });
</script>
installer/dup-installer/views/view.security.error.php000064400000002405151336065400017146 0ustar00<?php
/**
 *
 * @package templates/default
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="robots" content="noindex,nofollow">
    <title>Duplicator</title>
    <link rel="apple-touch-icon" sizes="180x180" href="favicon/apple-touch-icon.png">
    <link rel="icon" type="image/png" sizes="32x32" href="favicon/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="16x16" href="favicon/favicon-16x16.png">
    <link rel="manifest" href="favicon/site.webmanifest">
    <link rel="mask-icon" href="favicon/safari-pinned-tab.svg">
    <link rel="shortcut icon" href="favicon/favicon.ico">
    <meta name="msapplication-TileColor" content="#da532c">
    <meta name="msapplication-config" content="favicon/browserconfig.xml">
    <meta name="theme-color" content="#ffffff">
</head>
<body id="security-error" style="font-family:verdana;">
<div>
    <h2>DUPLICATOR: SECURITY CHECK</h2>
    An invalid request was made.<br/>
    Message: Invalid token validation <br/><br/>
    In order to protect this request from unauthorized access please restart this install process by browsing to the installer.php file or hashed file.
</div>
</body>
</html>installer/dup-installer/views/view.s2.cpnl.lite.php000064400000004035151336065400016363 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

?>

<div class="s2-gopro">
    <h2>cPanel Connectivity</h2>

<?php if (DUPX_U::isURLActive("https://{$_SERVER['HTTP_HOST']}", 2083)): ?>
	<div class='s2-cpanel-login'>
		<b>Login to this server's cPanel</b><br/>
		<a href="<?php echo DUPX_U::esc_url('https://'.$_SERVER['SERVER_NAME'].':2083'); ?>" target="cpanel" style="color:#fff">[<?php echo DUPX_U::esc_html($_SERVER['SERVER_NAME']); ?>:2083]</a>
	</div>
<?php else : ?>
	<div class='s2-cpanel-off'>
		<b>This server does not appear to support cPanel!</b><br/>
		Consider <a href="https://snapcreek.com/wordpress-hosting/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_install_no_cpanel&utm_campaign=duplicator_pro" target="cpanel" style="color:#fff;font-weight:bold">upgrading</a> to a host that does.<br/>
	</div>
<?php endif; ?>


    <div style="text-align: center; font-size: 14px">
        Want <span style="font-style: italic;">even easier</span> installs?  
        <a target="_blank" href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&amp;utm_medium=wordpress_plugin&amp;utm_content=free_install_step2&amp;utm_campaign=duplicator_pro"><b>Duplicator Pro</b></a>
        allows the following <b>right from the installer:</b>
    </div>
    <ul>
        <li>Directly login to cPanel</li>
        <li>Instantly create new databases &amp; users</li>
        <li>Preview and select existing databases  &amp; users</li>
    </ul>
    <small>
        Note: Hosts that support cPanel provide remote access to server resources, allowing operations such as direct database and user creation.
        Since the <a target="_blank" href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_install_cpanel_note&utm_campaign=duplicator_pro">Duplicator Pro</a>
        installer can directly access cPanel, it dramatically speeds up your workflow.
    </small>
</div>installer/dup-installer/views/view.s2.dbtest.php000064400000056444151336065400015773 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */
?>

<script id="s2-dbtest-hb-template" type="text/x-handlebars-template">
	<!-- REQUIREMENTS -->
	<div class="hdr-sub4 s2-reqs-hdr" data-type="toggle" data-target="#s2-reqs-all" >
		<i class="fa fa-caret-right"></i> Requirements <small class='db-check'>(must pass)</small>
		<div class="{{reqStyle payload.reqsPass}}">{{reqText payload.reqsPass}}</div>
	</div>
	<div class="s2-reqs" id="s2-reqs-all" style="border-bottom:none">

		<!-- ==================================
		REQ 10: VERIFY HOST CONNECTION -->
		<div class="status {{reqStyle payload.reqs.10.pass}}">{{reqText payload.reqs.10.pass}}</div>
		<div class="title" data-type="toggle" data-target="#s2-reqs10"><i class="fa fa-caret-right"></i> {{payload.reqs.10.title}}</div>
		<div class="info s2-reqs10" id="s2-reqs10">
			<div class="sub-title">STATUS</div>
			{{{getInfo payload.reqs.10.pass payload.reqs.10.info}}}<br/>

			<div class="sub-title">DETAILS</div>
			This test checks that the database user is allowed to connect to the database server.  It validates on the user name, password and host values.
			The check does not take into account the database name or the user permissions. A database user must first exist and have access to the host
			database server before any additional checks can be made.

			<table>
				<tr>
					<td>Host:</td>
					<td>{{payload.in.dbhost}}</td>
				</tr>
				<tr>
					<td>User:</td>
					<td>{{payload.in.dbuser}}</td>
				</tr>
				<tr>
					<td>Password:</td>
					<td>{{{payload.in.dbpass}}}</td>
				</tr>
			</table><br/>

			<div class="sub-title">TROUBLESHOOT</div>
			<ul>
				<li>Check that the 'Host' name settings are correct via your hosts documentation.</li>
				<li>On some servers, the default name 'localhost' will not work. Be sure to contact your hosting provider.</li>
				<li>Triple check the 'User' and 'Password' values are correct.</li>
				<li>
					Check to make sure the 'User' has been added as a valid database user
					<ul class='vids'>
						<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=FfX-B-h3vo0" target="_video">Add database user in phpMyAdmin</a></li>
						<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=peLby12mi0Q" target="_video">Add database user in cPanel older versions</a></li>
						<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=CHwxXGPnw48" target="_video">Add database user in cPanel newer versions</a></li>
					</ul>
				</li>
				<li>If using the 'Basic' option then try using the <a href="javascript:void(0)" onclick="DUPX.togglePanels('cpanel')">'cPanel'</a> option.</li>
				<li><i class="far fa-file-code"> </i> <a href='{{{faqURL}}}#faq-installer-100-q' target='_help'>I'm running into issues with the Database what can I do?</a></li>
			</ul>
		</div>

		<!-- ==================================
		REQ 20: CHECK DATABASE VERSION -->
		<div class="status {{reqStyle payload.reqs.20.pass}}">{{reqText payload.reqs.20.pass}}</div>
		<div class="title" data-type="toggle" data-target="#s2-reqs20"><i class="fa fa-caret-right"></i> {{payload.reqs.20.title}}</div>
		<div class="info" id="s2-reqs20">
			<div class="sub-title">STATUS</div>
			{{{getInfo payload.reqs.20.pass payload.reqs.20.info}}}<br/>

			<div class="sub-title">DETAILS</div>
			The minimum supported database server is MySQL Server 5.0 or the <a href="https://mariadb.com/kb/en/mariadb/mariadb-vs-mysql-compatibility/" target="_blank">MariaDB equivalent</a>.
			Versions prior to MySQL 5.0 are over 10 years old and will not be compatible with Duplicator.  If your host is using a legacy version, please ask them
			to upgrade the MySQL database engine to a more recent version.
			<br/><br/>

			<div class="sub-title">TROUBLESHOOT</div>
			<ul>
				<li>Contact your host and have them upgrade your MySQL server.</li>
				<li><i class="far fa-file-code"></i> <a href='{{{faqURL}}}#faq-installer-100-q' target='_help'>I'm running into issues with the Database what can I do?</a></li>
			</ul>
		</div>

		<!-- ==================================
		REQ 30: Create New Database: BASIC -->
		{{#if_eq payload.in.dbaction "create"}}
			<div class="status {{reqStyle payload.reqs.30.pass}}">{{reqText payload.reqs.30.pass}}</div>
			<div class="title" data-type="toggle" data-target="#s2-reqs30"><i class="fa fa-caret-right"></i> {{payload.reqs.30.title}}</div>
			<div class="info" id="s2-reqs30">
				<div class="sub-title">STATUS</div>
				{{{getInfo payload.reqs.30.pass payload.reqs.30.info}}}
				<br/>

				<div class="sub-title">DETAILS</div>
				This test checks if the database can be created by the database user.  The test will attempt to create and drop the database name provided as part
				of the overall test.
				<br/><br/>

				<div class="sub-title">TROUBLESHOOT</div>
				<ul>
					<li>
						Check the database user privileges:
						<ul class='vids'>
							<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=FfX-B-h3vo0" target="_video">Add database user in phpMyAdmin</a></li>
							<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=peLby12mi0Q" target="_video">Add database user in cPanel older versions</a></li>
							<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=CHwxXGPnw48" target="_video">Add database user in cPanel newer versions</a></li>
						</ul>
					</li>
					<li>If using the 'Basic' option then try using the <a href="javascript:void(0)" onclick="DUPX.togglePanels('cpanel')">'cPanel'</a> option.</li>
					<li><i class="far fa-file-code"></i> <a href='{{{faqURL}}}#faq-installer-100-q' target='_help'>I'm running into issues with the Database what can I do?</a></li>
				</ul>

			</div>
		{{/if_eq}}


		<!-- ==================================
		REQ 40: CONFIRM DATABASE VISIBILITY -->
		{{#if_neq payload.in.dbaction "create"}}
			<div class="status {{reqStyle payload.reqs.40.pass}}">{{reqText payload.reqs.40.pass}}</div>
			<div class="title" data-type="toggle" data-target="#s2-reqs40"><i class="fa fa-caret-right"></i> {{payload.reqs.40.title}}</div>
			<div class="info s2-reqs40" id="s2-reqs40">
				<div class="sub-title">STATUS</div>
				{{{getInfo payload.reqs.40.pass payload.reqs.40.info}}}<br/>

				<div class="sub-title">DETAILS</div>
				This test checks if the database user is allowed to connect or view the database.   This test will not be ran if the 'Create New Database' action is selected.
				<br/><br/>

				<b>Databases visible to user [{{payload.in.dbuser}}]</b> <br/>
				<div class="db-list">
					{{#each payload.databases}}
						{{@index}}. {{this}}<br/>
					{{else}}
						<i>No databases are viewable to database user [{{payload.in.dbuser}}]</i> <br/>
					{{/each}}
				</div><br/>

				<div class="sub-title">TROUBLESHOOT</div>
				<ul>
					<li>Check the database user privileges.</li>
					<li>
						Check to make sure the 'User' has been added as a valid database user
						<ul class='vids'>
							<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=FfX-B-h3vo0" target="_video">Add database user in phpMyAdmin</a></li>
							<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=peLby12mi0Q" target="_video">Add database user in cPanel older versions</a></li>
							<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=CHwxXGPnw48" target="_video">Add database user in cPanel newer versions</a></li>
						</ul>
					</li>
					<li><i class="far fa-file-code"></i> <a href='{{{faqURL}}}#faq-installer-100-q' target='_help'>I'm running into issues with the Database what can I do?</a></li>
				</ul>
			</div>
		{{/if_neq}}

		<!-- ==================================
		REQ 50: Manual SQL Execution -->
		{{#if_eq payload.in.dbaction "manual"}}
			<div class="status {{reqStyle payload.reqs.50.pass}}">{{reqText payload.reqs.50.pass}}</div>
			<div class="title" data-type="toggle" data-target="#s2-reqs50"><i class="fa fa-caret-right"></i> {{payload.reqs.50.title}}</div>
			<div class="info" id="s2-reqs50">
				<div class="sub-title">STATUS</div>
				{{{getInfo payload.reqs.50.pass payload.reqs.50.info}}}
				<br/>

				<div class="sub-title">DETAILS</div>
				This test checks if the database looks to represents a base WordPress install. Since this option is advanced it is left upto the user to
				have the correct database tables installed.
				<br/><br/>

			</div>
		{{/if_eq}}


		<!-- ==================================
		REQ 60: VALIDATE USER PERMISSIONS -->
		<div class="status {{reqStyle payload.reqs.60.pass}}">{{reqText payload.reqs.60.pass}}</div>
		<div class="title" data-type="toggle" data-target="#s2-reqs60"><i class="fa fa-caret-right"></i> {{payload.reqs.60.title}}</div>
		<div class="info s2-reqs60" id="s2-reqs60">
			<div class="sub-title">STATUS</div>
			{{{getInfo payload.reqs.60.pass payload.reqs.60.info}}}<br/>

			<div class="sub-title">DETAILS</div>
			This test checks the privileges a user has when working with tables.  Below is a list of all the privileges that the user can currently view.  In order
			to successfully use Duplicator all of the privileges are required.
			<br/><br/>

			<div class="sub-title">TABLE PRIVILEDGES ON [{{payload.in.dbname}}]</div>
			<div class="tbl-list">
				<b>Create:</b> {{{getTablePerms payload.tblPerms.[create]}}} <br/>
				<b>Select:</b> {{{getTablePerms payload.tblPerms.[select]}}} <br/>
				<b>Insert:</b> {{{getTablePerms payload.tblPerms.[insert]}}} <br/>
				<b>Update:</b> {{{getTablePerms payload.tblPerms.[update]}}} <br/>
				<b>Delete:</b> {{{getTablePerms payload.tblPerms.[delete]}}} <br/>
				<b>Drop:  </b> {{{getTablePerms payload.tblPerms.[drop]}}} <br/>
			</div><br/>

			<div class="sub-title">TROUBLESHOOT</div>
			<ul>
				<li>Validate that the database user is correct per your hosts documentation</li>
					<li>
						Check to make sure the 'User' has been granted the correct privileges
						<ul class='vids'>
							<li><i class="fa fa-video-camera"></i>  <a href='https://www.youtube.com/watch?v=UU9WCC_-8aI' target='_video'>How to grant user privileges in cPanel</a></li>
							<li><i class="fa fa-video-camera"></i> <a href="https://www.youtube.com/watch?v=FfX-B-h3vo0" target="_video">How to grant user privileges in phpMyAdmin</a></li>
						</ul>
					</li>
				<li><i class="far fa-file-code"></i> <a href='{{{faqURL}}}#faq-installer-100-q' target='_help'>I'm running into issues with the Database what can I do?</a></li>
			</ul>
		</div>

		<!-- ==================================
		REQ 70: CHECK COLLATION CAPABILITY -->
		<div class="status {{noticeStyle payload.reqs.70.pass}}">{{reqText payload.reqs.70.pass}}</div>
		<div class="title" data-type="toggle" data-target="#s2-reqs70"><i class="fa fa-caret-right"></i> {{payload.reqs.70.title}}</div>
		<div class="info s2-reqs70" id="s2-reqs70">
			<div class="sub-title">STATUS</div>
			{{{getInfo payload.reqs.70.pass payload.reqs.70.info}}}<br/>

			<div class="sub-title">DETAILS</div>
			This test checks to make sure this database can support the collations required by the original database.
			<br/><br/>

			<b>Required collations</b> <br/>
			<table class="collation-list">
				{{#each payload.collationStatus as |item|}}
					<tr>
						<td>{{item.name}}:</td>
						<td>
							{{#if item.found}}
								<span class='dupx-pass'>Pass</span>
							{{else}}
								<span class='dupx-fail'>Fail</span>
							{{/if}}
						</td>
					</tr>
				{{else}}
					<tr><td style='font-weight:normal'>This test was not ran.</td></tr>
				{{/each}}
			</table><br/>

			<div class="sub-title">TROUBLESHOOT</div>
			<ul>
				<li><i class="far fa-file-code"></i> <a href='{{{faqURL}}}#faq-installer-110-q' target='_help'>What is Compatibility mode & 'Unknown Collation' errors?</a></li>
			</ul>

		</div>

		<!-- ==================================
		REQ 80: CHECK GTID -->
		<div class="status {{noticeStyle payload.reqs.80.pass}}">{{reqText payload.reqs.80.pass}}</div>
			<div class="title" data-type="toggle" data-target="#s2-reqs80"><i class="fa fa-caret-right"></i> {{payload.reqs.80.title}}</div>
			<div class="info s2-reqs80" id="s2-reqs80">
				<div class="sub-title">STATUS</div>
				{{{getInfo payload.reqs.80.pass payload.reqs.80.info}}}<br/>

				<div class="sub-title">DETAILS</div>
				This test checks to make sure the database server should not have GTID mode enabled.
				<br/><br/>
				<div class="sub-title">TROUBLESHOOT</div>
				<ul>
					<li><i class="far fa-file-code"></i> <a href='https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html' target='_help'>What is GTID?</a></li>
				</ul>
			</div>

		</div>

	</div>

	

	<!-- ==================================
	NOTICES
	================================== -->
	<div class="hdr-sub4 s2-notices-hdr" data-type="toggle" data-target="#s2-notices-all">
		<i class="fa fa-caret-right"></i> Notices <small class='db-check'>(optional)</small>
		<div class="{{optionalNoticeStyle payload.noticesPass}}">{{noticeText payload.noticesPass}}</div>
	</div>
	<div class="s2-reqs" id="s2-notices-all">

		<!-- ==================================
		NOTICE 10: TABLE CASE CHECK-->
		<div class="status {{optionalNoticeStyle payload.notices.10.pass}}">{{noticeText payload.notices.10.pass}}</div>
		<div class="title" data-type="toggle" data-target="#s2-notice10" style="border-top:none"><i class="fa fa-caret-right"></i> {{payload.notices.10.title}}</div>
		<div class="info" id="s2-notice10">
			<div class="sub-title">STATUS</div>
			{{{getInfo payload.notices.10.pass payload.notices.10.info}}}<br/>

			<div class="sub-title">DETAILS</div>
			This test checks if any tables have upper case characters as part of the name.   On some systems creating tables with upper case can cause issues if the server
			setting for <a href="https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html" target="_help">lower_case_table_names</a> is set to zero and upper case
			table names exist.
			<br/><br/>

			<div class="sub-title">TROUBLESHOOT</div>
			<ul>
				<li>
					In the my.cnf (my.ini) file set the <a href="https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_lower_case_table_names" target="_help">lower_case_table_names</a>
					to 1 or 2 and restart the server.
				</li>
				<li><i class="fa fa-external-link"></i> <a href='http://www.inmotionhosting.com/support/website/general-server-setup/edit-mysql-my-cnf' target='_help'>How to edit MySQL config files my.cnf (linux) or my.ini (windows) files</a></li>
			</ul>
		</div>

        <!-- ==================================
		NOTICE 20: SOURCE SITE CONTAINED TRIGGERS-->
        <div class="status {{optionalNoticeStyle payload.notices.20.pass}}">{{noticeText payload.notices.20.pass}}</div>
        <div class="title" data-type="toggle" data-target="#s2-notice20" style="border-top:none"><i class="fa fa-caret-right"></i> {{payload.notices.20.title}}</div>
        <div class="info" id="s2-notice20">
            <div class="sub-title">STATUS</div>
            {{#if payload.notices.20.pass}}
                <p>{{payload.notices.20.info}}</p>
            {{else}}
                <p>The source site contains Triggers which can optionally be imported after the install process is complete. </p>
                <div class="sub-title">DETAILS</div>
                <p>
                    Triggers are not being imported alongside the rest of the database, because they may cause unintended behavior during the install process.
                    It is recommeded that you copy the queries to a seperate document and save them for later.  After the install process is
                    completed and you have logged into your WordPress Admin you can then add the triggers if needed.
                    <br/><br/>
                    For a quick overview on how to add these triggers back to your site checkout this
                    <a href="https://www.siteground.com/tutorials/phpmyadmin/" target="_blank">phpMyAdmin Tutorial</a>.   See the section
                    titled "How to Run MySQL Queries" to run the queries below.
                </p>
                <div class="copy-to-clipboard-block">
                    <button type="button" class="default-btn">Copy Queries To Clipboard</button>
                    <textarea readonly="readonly">{{payload.notices.20.info}}</textarea>
                </div>
            {{/if}}
        </div>

	</div>
</script>


<script>
//HANDLEBAR HOOKS
Handlebars.registerHelper('if_eq',		function(a, b, opts) { return (a == b) ? opts.fn(this) : opts.inverse(this);});
Handlebars.registerHelper('if_neq',		function(a, b, opts) { return (a != b) ? opts.fn(this) : opts.inverse(this);});
Handlebars.registerHelper('faqURL',		function() { return "https://snapcreek.com/duplicator/docs/faqs-tech/";});
Handlebars.registerHelper('reqText',	function(req)  {
	switch(req) {
		case 0:
			return "Fail";
			break;
  		case 1:
		  return "Pass";
		  break;
		case 2:
		  return "Warn";
		  break;
		case -1:
		default:
		  return "";
	}
});
Handlebars.registerHelper('reqStyle',	function(req)  { 
	switch (req) {
		case 0:
			return "status-badge-fail"
			break;
		case 1:
			return "status-badge-pass"
			break;
		case 2:
			return "status-badge-warn"
			break;
		case -1:
		default:
			return "";
	}
});
Handlebars.registerHelper('noticeStyle',function(req)  { 
	switch (req) {
		case 0:
			return "status-badge-fail"
			break;
		case 1:
			return "status-badge-pass"
			break;
		case 2:
			return "status-badge-warn"
			break;
		case -1:
		default:
			return "";
	}
});
Handlebars.registerHelper('optionalNoticeStyle',function(req)  { 
	switch (req) {
		case 0:
			return "status-badge-warn"
			break;
		case 1:
			return "status-badge-pass"
			break;
		case -1:
		default:
			return "";
	}
});
Handlebars.registerHelper('noticeText', function(warn) { if  (warn == -1) {return ""}; return (warn) ? "Good" : "Warn";});
Handlebars.registerHelper('getInfo',	function(pass, info) {
	return (pass && pass != -1)
		? "<div class='success-msg'>" + info + "</div>"
		: "<div class='error-msg'>" + info + "</div>";
});
Handlebars.registerHelper('getTablePerms',	function(perm) {
	if (perm == -1) {
		return "<span class='dupx-warn'>Requires Dependency</span>";
	} else if (perm == 0) {
		return "<span class='dupx-fail'>Fail</span>";
	} else {
		return "<span class='dupx-pass'>Pass</span>";
	}
});


/**
 * Shows results of database connection
 * Timeout (45000 = 45 secs) */
DUPX.testDBConnect = function ()
{
	//Validate input data
	var $formInput = $('#s2-input-form');
	$formInput.parsley().validate();
	if (!$formInput.parsley().isValid()) {
		return;
	}

	var $dbArea;
	var $dbResult;
	var $dbButton;

	$dbArea   = $('#s2-basic-pane .s2-dbtest-area');
	$dbResult = $('#s2-dbtest-hb-basic');
	$dbButton = $('#s2-dbtest-btn-basic');

	$dbArea.show(250);
	$dbResult.html("<div class='message'><i class='fas fa-question-circle fa-sm'></i>&nbsp;Running Database Validation. <br/>  Please wait...</div>");
	$dbButton.attr('disabled', 'true');

	if (document.location.href.indexOf('?') > -1) {
        var ajax_url = document.location.href + "&dbtest=1";
    } else {
        var ajax_url = document.location.href + "?dbtest=1";
    }

	$.ajax({
		type: "POST",
		timeout: 25000,
		dataType: "text",
		url: ajax_url,
		data: $('#s2-input-form').serialize(),
		success: function (respData, textStatus, xHr) {
			try {
                var data = DUPX.parseJSON(respData);
            } catch(err) {
                console.error(err);
                console.error('JSON parse failed for response data: ' + respData);
				console.log(data);
				var msg  = "<b>Error Processing Request</b> <br/> An error occurred while testing the database connection! Please Try Again...<br/> ";
				msg		+= "<small>If the error persists contact your host for database connection requirements.</small><br/> ";
				msg		+= "<small>Status details: " + textStatus + "</small>";
				$dbResult.html("<div class='message dupx-fail'>" + msg + "</div>");
				<?php if (DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) : ?>
					var jsonStr = JSON.stringify(data, null, 2);
					$('#debug-dbtest-json').val(jsonStr);
				<?php endif; ?>
                return false;
            }
			DUPX.intTestDBResults(data, $dbResult);
		},
		error: function (data) {
			console.log(data);
			var msg  = "<b>Error Processing Request</b> <br/> An error occurred while testing the database connection! Please Try Again...<br/> ";
			msg		+= "<small>If the error persists contact your host for database connection requirements.</small><br/> ";
			msg		+= "<small>Status details: " + data.statusText + "</small>";
			$dbResult.html("<div class='message dupx-fail'>" + msg + "</div>");
			<?php if (DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) : ?>
				var jsonStr = JSON.stringify(data, null, 2);
				$('#debug-dbtest-json').val(jsonStr);
			<?php endif; ?>
		},
		complete: function (data) {
			$dbButton.removeAttr('disabled');
		}
	});


};

//Process Ajax Template
DUPX.intTestDBResults = function(data, result)
{
	//Patch for PHP 5.2 json_encode issues
	if(typeof data != 'object')
	{
	   var data = jQuery.parseJSON(data);
	}

    $('#s2-input-form input[name="dbcolsearchreplace"]').val(JSON.stringify(data.payload.collationReplaceList));

	var resultID = $(result).attr('id');
	var mode     = '-' + data.payload.in.mode;
	var template = $('#s2-dbtest-hb-template').html();
	var templateScript = Handlebars.compile(template);
	var html = templateScript(data);
	result.html(html);

	//Make all id attributes unique to basic or cpanel areas
	//otherwise id will no longer be unique
	$("div#" + resultID + " div[id]").each(function() {
		var attr = this.id;
		$(this).attr('id', attr + mode);
	});

	$("div#" + resultID + " div[data-target]").each(function() {
		var attr = $(this).attr('data-target');
		$(this).attr('data-target', attr + mode);
	});

	var $divReqsAll		= $('div#s2-reqs-all' + mode);
	var $divNoticeAll	= $('div#s2-notices-all' + mode);
	var $btnNext		= $('#s2-next-btn' + mode);
	var $btnTestDB		= $('#s2-dbtest-btn' + mode);
	var $divRetry		= $('#s2-dbrefresh' + mode);

	$divRetry.show();
	$btnTestDB.removeAttr('disabled').removeClass('disabled');
	$btnNext.removeAttr('disabled').removeClass('disabled');

	if (data.payload.reqsPass == 1 || data.payload.reqsPass == 2) {
		$btnTestDB.addClass('disabled').attr('disabled', 'true');
		if (data.payload.reqsPass == 1) {
			$divReqsAll.hide()
		}
	} else {
		$btnNext.addClass('disabled').attr('disabled', 'true');
		$divReqsAll.show();
	}

	data.payload.noticesPass ? $divNoticeAll.hide() : $divNoticeAll.show();

	if ((data.payload.reqsPass == 1 || data.payload.reqsPass == 2) && data.payload.noticesPass == 1) {
		$btnTestDB.addClass('disabled').attr('disabled', 'true');
	}

	$('div#s2-db-basic :input').on('keyup', {'mode': mode}, DUPX.resetDBTest);
	$('div#s2-db-basic select#dbaction').on('change', {'mode': mode}, DUPX.resetDBTest);
	$('table#s2-cpnl-db-opts :input').on('keyup', {'mode': mode}, DUPX.resetDBTest);

	<?php if (DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) : ?>
		var jsonStr = JSON.stringify(data, null, 2);
		$('#debug-dbtest-json').val(jsonStr);
	<?php endif; ?>
}

DUPX.resetDBTest = function(e)
{
	var $btnNext		= $('#s2-next-btn' + e.data.mode);
	var $btnTestDB		= $('#s2-dbtest-btn' + e.data.mode);
	var $divTestArea	= $('#s2-dbtest-hb'+ e.data.mode);

	$btnTestDB.removeAttr('disabled').removeClass('disabled');
	$btnNext.addClass('disabled').attr('disabled', 'true');
	$divTestArea.html("<div class='sub-message'>To continue click the 'Test Database' button to retest the database setup.</div>");
}
</script>
installer/dup-installer/views/view.s4.php000064400000044235151336065400014504 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

$_POST['exe_safe_mode']	= isset($_POST['exe_safe_mode']) ? DUPX_U::sanitize_text_field($_POST['exe_safe_mode']) : 0;

$url_new_rtrim  = rtrim(DUPX_U::sanitize_text_field($_POST['url_new']), "/");
$admin_base		= basename($GLOBALS['DUPX_AC']->wplogin_url);
$admin_redirect ="{$url_new_rtrim}/wp-admin/admin.php?page=duplicator-tools&tab=diagnostics";

$safe_mode		= DUPX_U::sanitize_text_field($_POST['exe_safe_mode']);
$admin_redirect = "{$admin_redirect}&sm={$safe_mode}" ;
$admin_redirect = urlencode($admin_redirect);
$admin_url_qry  = (strpos($admin_base, '?') === false) ? '?' : '&';
$admin_login	= "{$url_new_rtrim}/{$admin_base}{$admin_url_qry}redirect_to={$admin_redirect}";

// Few machines doen's have utf8_decode
if (!function_exists('utf8_decode')) {
    function utf8_decode($s) {
        $s = (string) $s;
        $len = strlen($s);
        for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) {
            switch ($s[$i] & "\xF0") {
                case "\xC0":
                case "\xD0":
                    $c = (\ord($s[$i] & "\x1F") << 6) | \ord($s[++$i] & "\x3F");
                    $s[$j] = $c < 256 ? \chr($c) : '?';
                    break;
                case "\xF0":
                    ++$i;
                    // no break
                case "\xE0":
                    $s[$j] = '?';
                    $i += 2;
                    break;
                default:
                    $s[$j] = $s[$i];
            }
        }
        return substr($s, 0, $j);
    }
}
//Sanitize
$json_result = true;
$_POST['json'] = isset($_POST['json']) ? DUPX_U::esc_attr($_POST['json']) : 'json data not set';
$json_data   = utf8_decode(urldecode($_POST['json']));
$json_decode = json_decode($json_data);
if ($json_decode == NULL || $json_decode == FALSE) {
    $json_data  = "{'json reset invalid form value sent.  Possible site script attempt'}";
    $json_result = false;
}

?>

<script>
	DUPX.getAdminLogin = function()
    {
		if ($('input#auto-delete').is(':checked')) {
			var action = encodeURIComponent('&action=installer');
			window.open(<?php echo str_replace('\\/', '/', json_encode($admin_login)); ?> + action, '_blank');
		} else {
			window.open(<?php echo str_replace('\\/', '/', json_encode($admin_login)); ?>, '_blank');
		}
	};
</script>

<!-- =========================================
VIEW: STEP 4- INPUT -->
<form id='s4-input-form' method="post" class="content-form" style="line-height:20px" autocomplete="off">
	<input type="hidden" name="url_new" id="url_new" value="<?php echo DUPX_U::esc_attr($url_new_rtrim); ?>" />
	<div class="logfile-link"><?php DUPX_View_Funcs::installerLogLink(); ?></div>

	<div class="hdr-main">
		Step <span class="step">4</span> of 4: Test Site
	</div><br/>

	<!--  POST PARAMS -->
	<div class="dupx-debug">
		<i>Step 4 - Page Load</i>
		<input type="hidden" name="view" value="step4" />
		<input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('step4'); ?>">
		<input type="hidden" name="exe_safe_mode" id="exe-safe-mode" value="<?php echo DUPX_U::esc_attr($_POST['exe_safe_mode']); ?>" />
	</div>

	<table class="s4-final-step">
		<tr style="vertical-align: top">
			<td style="padding-top:10px">
				<button type="button" class="s4-final-btns" onclick="DUPX.getAdminLogin()">
                    <i class="fab fa-wordpress fa-lg"></i> &nbsp; Admin Login
                </button>
			</td>
			<td>
				Login to the WordPress Admin to finalize this install.<br/>
				<input type="checkbox" name="auto-delete" id="auto-delete" checked="true"/>
				<label for="auto-delete">Auto delete installer files after login <small>(recommended)</small></label>
			</td>
		</tr>
	</table>

    <!-- WARN: SAFE MODE MESSAGES -->
    <div class="s4-final-steps" style="display:<?php echo ($safe_mode > 0 ? 'block' : 'none')?>">
        <b><i class="fa fa-exclamation-triangle"></i> SAFE MODE:</b>
        Safe mode has <u>deactivated</u> all plugins except for Duplicator. Please be sure to enable your plugins after logging in.  If you notice that problems
        arise when activating more than one plugin at a time, then it is recommended to active them one-by-one to isolate the plugin that could be causing the issue.
    </div>

    <!-- WARN: FINAL STEPS -->
	<div class="s4-final-steps">
		<b><i class="fa fa-exclamation-triangle"></i> IMPORTANT FINAL STEPS:</b> Login into the WordPress Admin to remove all <?php 
        DUPX_View_Funcs::helpLink('step4', 'installation files'); ?> and finalize the install process.  This install is <u>NOT</u> complete until all installer
        files have been completely removed.  Leaving any of the installer files on this server can lead to security issues.
	</div><br/>

    <?php
    $nManager = DUPX_NOTICE_MANAGER::getInstance();
    if ($json_decode && $json_decode->step1->query_errs > 0) {
        $linkAttr = './'.DUPX_U::esc_attr($GLOBALS["LOG_FILE_NAME"]);
        $longMsg  = <<<LONGMSG
        Queries that error during the deploy step are logged to the <a href="{$linkAttr}" target="dup-installer">install-log.txt</a> file and
and marked with an **ERROR** status.   If you experience a few errors (under 5), in many cases they can be ignored as long as your site is working correctly.
However if you see a large amount of errors or you experience an issue with your site then the error messages in the log file will need to be investigated.
<br/><br/>

<b>COMMON FIXES:</b>
<ul>
    <li>
        <b>Unknown collation:</b> See Online FAQ:
        <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-110-q" target="_blank">What is Compatibility mode & 'Unknown collation' errors?</a>
    </li>
    <li>
        <b>Query Limits:</b> Update MySQL server with the <a href="https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html" target="_blank">max_allowed_packet</a>
        setting for larger payloads.
    </li>
</ul>
LONGMSG;

        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'STEP 2 - INSTALL NOTICES ('.$json_decode->step1->query_errs.')',
            'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
            'longMsg' => $longMsg,
            'longMsgMode'=> DUPX_NOTICE_ITEM::MSG_MODE_HTML,
            'sections' => array('database'),
            'priority' => 5,
            'open' => true
        ));
    }

    if ($json_decode && $json_decode->step3->errsql_sum > 0) {
        $longMsg = <<<LONGMSG
            Update errors that show here are queries that could not be performed because the database server being used has issues running it.  Please validate the query, if
			it looks to be of concern please try to run the query manually.  In many cases if your site performs well without any issues you can ignore the error.
LONGMSG;

        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'STEP 3 - UPDATE NOTICES ('.$json_decode->step3->errsql_sum.')',
            'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
            'longMsg' => $longMsg,
            'sections' => array('database'),
            'priority' => 5,
            'open' => true
        ));
    }

    if ($json_decode && $json_decode->step3->errkey_sum > 0) {
        $longMsg = <<<LONGMSG
            Notices should be ignored unless issues are found after you have tested an installed site. This notice indicates that a primary key is required to run the
            update engine. Below is a list of tables and the rows that were not updated.  On some databases you can remove these notices by checking the box 'Enable Full Search'
            under options in step3 of the installer.
            <br/><br/>
            <small>
                <b>Advanced Searching:</b><br/>
                Use the following query to locate the table that was not updated: <br/>
                <i>SELECT @row := @row + 1 as row, t.* FROM some_table t, (SELECT @row := 0) r</i>
            </small>
LONGMSG;

        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'TABLE KEY NOTICES  ('.$json_decode->step3->errkey_sum.')',
            'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
            'longMsg' => $longMsg,
            'longMsgMode'=> DUPX_NOTICE_ITEM::MSG_MODE_HTML,
            'sections' => array('database'),
            'priority' => 5,
            'open' => true
        ));
    }

    if ($json_decode && $json_decode->step3->errser_sum > 0) {
        $longMsg = <<<LONGMSG
            Notices should be ignored unless issues are found after you have tested an installed site.  The SQL below will show data that may have not been
            updated during the serialization process.  Best practices for serialization notices is to just re-save the plugin/post/page in question.
LONGMSG;

        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'SERIALIZATION NOTICES  ('.$json_decode->step3->errser_sum.')',
            'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
            'longMsg' => $longMsg,
            'sections' => array('search_replace'),
            'priority' => 5,
            'open' => true
        ));
    }

    $numGeneralNotices = $nManager->countFinalReportNotices('general', DUPX_NOTICE_ITEM::NOTICE, '>=');
    if ($numGeneralNotices == 0) {
        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'No general notices',
            'level' => DUPX_NOTICE_ITEM::INFO,
            'sections' => array('general'),
            'priority' => 5
        ));
    } else {
        $longMsg = <<<LONGMSG
            The following is a list of notices that may need to be fixed in order to finalize your setup. These values should only be investigated if you're running into
            issues with your site. For more details see the <a href="https://codex.wordpress.org/Editing_wp-config.php" target="_blank">WordPress Codex</a>.
LONGMSG;

        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'Info',
            'level' => DUPX_NOTICE_ITEM::INFO,
            'longMsg' => $longMsg,
            'longMsgMode'=> DUPX_NOTICE_ITEM::MSG_MODE_HTML,
            'sections' => array('general'),
            'priority' => 5,
            'open' => true
        ));
    }

    $numDbNotices = $nManager->countFinalReportNotices('database', DUPX_NOTICE_ITEM::NOTICE, '>=');
    if ($numDbNotices == 0) {
        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'No errors in database',
            'level' => DUPX_NOTICE_ITEM::INFO,
            'longMsg' => '',
            'sections' => 'database',
            'priority' => 5
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'query_err_counts');
    } else if ($numDbNotices <= 10) {
        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'Some errors in the database ('.$numDbNotices.')',
            'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
            'longMsg' => '',
            'sections' => 'database',
            'priority' => 5
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'query_err_counts');
    } else if ($numDbNotices <= 100) {
        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'Errors in the database ('.$numDbNotices.')',
            'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
            'longMsg' => '',
            'sections' => 'database',
            'priority' => 5
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'query_err_counts');
    } else {
        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'Many errors in the database ('.$numDbNotices.')',
            'level' => DUPX_NOTICE_ITEM::CRITICAL,
            'longMsg' => '',
            'sections' => 'database',
            'priority' => 5
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'query_err_counts');
    }


    $numSerNotices = $nManager->countFinalReportNotices('search_replace', DUPX_NOTICE_ITEM::NOTICE, '>=');
    if ($numSerNotices == 0) {
        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'No search and replace data errors',
            'level' => DUPX_NOTICE_ITEM::INFO,
            'longMsg' => '',
            'sections' => 'search_replace',
            'priority' => 5
        ));
    }

    $numFilesNotices = $nManager->countFinalReportNotices('files', DUPX_NOTICE_ITEM::NOTICE, '>=');

    if ($numFilesNotices == 0) {
        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'No files extraction errors',
            'level' => DUPX_NOTICE_ITEM::INFO,
            'longMsg' => '',
            'sections' => 'files',
            'priority' => 5
        ));
    }

    $nManager->sortFinalReport();
    $nManager->finalReportLog(array('general','files','database','search_replace'));
    ?>

	<div class="s4-go-back">
		Additional Details:
		<ul style="margin-top: 1px">
			<li>
                <a href="javascript:void(0)" onclick="$('#s4-install-report').toggle(400)">Review Migration Report</a><br/><br>
                <table class='s4-report-results' style="width:100%">
                    <tbody>
                        <tr>
                            <td>Files notices</td>
                            <td>(<?php echo $numFilesNotices; ?>)</td>
                            <td> <?php $nManager->getSectionErrLevelHtml('files'); ?></td>
                        </tr>
                        <tr>
                            <td>Database Notices</td>
                            <td>(<?php echo $numDbNotices; ?>)</td>
                            <td><?php $nManager->getSectionErrLevelHtml('database'); ?></td>
                        </tr>
                        <tr>
                            <td>Search &amp; Replace Notices</td>
                            <td>(<?php echo $numSerNotices; ?>)</td>
                            <td> <?php $nManager->getSectionErrLevelHtml('search_replace'); ?></td>
                        </tr>
                        <tr>
                            <td>General Notices</td>
                            <td>(<?php echo $numGeneralNotices; ?>)</td>
                            <td><?php $nManager->getSectionErrLevelHtml('general'); ?></td>
                        </tr>
                    </tbody>
                </table><br>
			</li>
			<li>
				Review this sites <a href="<?php echo DUPX_U::esc_attr($url_new_rtrim); ?>" target="_blank">front-end</a> or
				re-run the installer and <a href="<?php echo DUPX_U::esc_url("{$url_new_rtrim}/installer.php"); ?>">go back to step 1</a>
			</li>
            <?php
            $wpconfigNotice = $nManager->getFinalReporNoticeById('wp-config-changes');
            $htaccessNotice = $nManager->getFinalReporNoticeById('htaccess-changes');
            if ($wpconfigNotice) {
                print("<li>Please validate ".$wpconfigNotice->longMsg."</li>");
            }
            if ($htaccessNotice) {
                print("<li>Please validate ".$htaccessNotice->longMsg."</li>");
            }
            ?>
			<li>For additional help and questions visit the <a href='https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=inst4_step4_troubleshoot' target='_blank'>online FAQs</a></li>
		</ul>
	</div>

	<!-- ========================
	INSTALL REPORT -->
	<div id="s4-install-report" style='display:none'>
		<table class='s4-report-results' style="width:100%">
			<tr><th colspan="4"><i class="fas fa-database fa-sm"></i> Database Report</th></tr>
			<tr style="font-weight:bold">
				<td style="width:150px"></td>
				<td>Tables</td>
				<td>Rows</td>
				<td>Cells</td>
			</tr>
			<tr data-bind="with: status.step1">
				<td>Created</td>
				<td><span data-bind="text: table_count"></span></td>
				<td><span data-bind="text: table_rows"></span></td>
				<td>n/a</td>
			</tr>
			<tr data-bind="with: status.step3">
				<td>Scanned</td>
				<td><span data-bind="text: scan_tables"></span></td>
				<td><span data-bind="text: scan_rows"></span></td>
				<td><span data-bind="text: scan_cells"></span></td>
			</tr>
			<tr data-bind="with: status.step3">
				<td>Updated</td>
				<td><span data-bind="text: updt_tables"></span></td>
				<td><span data-bind="text: updt_rows"></span></td>
				<td><span data-bind="text: updt_cells"></span></td>
			</tr>
		</table>
		<br/>

        <div id="s4-notice-reports" class="report-sections-list">
            <?php
                $nManager->displayFinalRepostSectionHtml('files' , 'Files notices report');
                $nManager->displayFinalRepostSectionHtml('database' , 'Database Notices');
                $nManager->displayFinalRepostSectionHtml('search_replace' , 'Search &amp; Replace Notices');
                $nManager->displayFinalRepostSectionHtml('general' , 'General Notices');
            ?>
        </div>

	</div><br/><br/>

	<div class='s4-connect' style="display:none">
		<a href='http://snapcreek.com/support/docs/faqs/' target='_blank'>FAQs</a> |
		<a href='https://snapcreek.com' target='_blank'>Support</a>
	</div><br/>

    <?php  
        // Switched to Get Duplicator Pro wording based on split testing results
        $key = 'free_inst_s3btn_dp1324';
        $txt = 'Get Duplicator Pro!';
	?>
    
    

	<div class="s4-gopro-btn">
		<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=duplicator_pro&utm_content=<?php echo DUPX_U::esc_attr($key);?>" target="_blank">
			<?php echo DUPX_U::esc_html($txt);?>
		</a>
	</div>
	<br/><br/><br/>
</form>

<script>
<?php if ($json_result) : ?>
	MyViewModel = function() {
		this.status = <?php echo $json_data; ?>;
		var errorCount =  this.status.step1.query_errs || 0;
		(errorCount >= 1 )
			? $('#s4-install-report-count').css('color', '#BE2323')
			: $('#s4-install-report-count').css('color', '#197713')
	};
	ko.applyBindings(new MyViewModel());
<?php else: ?>
	console.log("Cross site script attempt detected, unable to create final report!");
<?php endif; ?>

//DOCUMENT LOAD
$(document).ready(function () {

    //INIT Routines
    DUPX.initToggle();
	$("#tabs").tabs();

});
</script>



installer/dup-installer/views/view.s3.php000064400000062216151336065400014502 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

	//-- START OF VIEW STEP 3
	$_POST['dbaction'] = isset($_POST['dbaction']) ? DUPX_U::sanitize_text_field($_POST['dbaction']) : 'create';
	
	if (isset($_POST['dbhost'])) {
		$post_db_host = DUPX_U::sanitize_text_field($_POST['dbhost']);
		$_POST['dbhost'] = trim($post_db_host);
	} else {
		$_POST['dbhost'] = null;
	}
	
	if (isset($_POST['dbname'])) {
		$post_db_name = DUPX_U::sanitize_text_field($_POST['dbname']);
		$_POST['dbname'] = trim($post_db_name);
	} else {
		$_POST['dbname'] = null;
	}	 
	
	if (isset($_POST['dbuser'])) {
		$post_db_user = DUPX_U::sanitize_text_field($_POST['dbuser']);
		$_POST['dbuser'] = trim($post_db_user);
	} else {
		$_POST['dbuser'] = null;
	}
	
	if (isset($_POST['dbpass'])) {
		$_POST['dbpass'] = $_POST['dbpass'];
	} else {
		$_POST['dbpass'] = null;
	}
	
	if (isset($_POST['dbhost'])) {
		$post_db_host = DUPX_U::sanitize_text_field($_POST['dbhost']);
		$_POST['dbport'] = parse_url($post_db_host, PHP_URL_PORT);
	} else {
		$_POST['dbport'] = 3306;
	}

	if (!empty($_POST['dbport'])) {
		$_POST['dbport'] = DUPX_U::sanitize_text_field($_POST['dbport']);
	} else {
		$_POST['dbport'] = 3306;
	}
	
	$_POST['exe_safe_mode']	= isset($_POST['exe_safe_mode']) ? DUPX_U::sanitize_text_field($_POST['exe_safe_mode']) : 0;

	$dbh = DUPX_DB::connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpass'], $_POST['dbname'], $_POST['dbport']);

	$all_tables = DUPX_DB::getTables($dbh);
	$active_plugins = DUPX_U::getActivePlugins($dbh);
	$old_path = $GLOBALS['DUPX_AC']->wproot;

	// RSR TODO: need to do the path too?
	$new_path = $GLOBALS['DUPX_ROOT'];
	$new_path = ((strrpos($old_path, '/') + 1) == strlen($old_path)) ? DUPX_U::addSlash($new_path) : $new_path;
	$empty_schedule_display = (DUPX_U::$on_php_53_plus) ? 'table-row' : 'none';
?>

<!-- =========================================
VIEW: STEP 3- INPUT -->
<form id='s3-input-form' method="post" class="content-form" autocomplete="off">

	<div class="logfile-link">
		<?php DUPX_View_Funcs::installerLogLink(); ?>
	</div>
	<div class="hdr-main">
		Step <span class="step">3</span> of 4: Update Data
		<div class="sub-header">This step will update the database and config files to match your new sites values.</div>
	</div>

	<?php
		if ($_POST['dbaction'] == 'manual') {
			echo '<div class="dupx-notice s3-manaual-msg">Manual SQL execution is enabled</div>';
		}
	?>

	<!--  POST PARAMS -->
	<div class="dupx-debug">
		<i>Step 3 - Page Load</i>
		<input type="hidden" name="ctrl_action"	  value="ctrl-step3" />
		<input type="hidden" name="ctrl_csrf_token" value="<?php echo DUPX_CSRF::generate('ctrl-step3'); ?>"> 
		<input type="hidden" name="view"		  value="step3" />
		<input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('step3'); ?>">
		<input type="hidden" name="secure-pass"   value="<?php echo DUPX_U::esc_attr($_POST['secure-pass']); ?>" />
		<input type="hidden" name="secure-archive" value="<?php echo DUPX_U::esc_attr($_POST['secure-archive']); ?>" />
		<input type="hidden" name="logging"		  value="<?php echo DUPX_U::esc_attr($_POST['logging']); ?>" />
		<input type="hidden" name="dbhost"		  value="<?php echo DUPX_U::esc_attr($_POST['dbhost']); ?>" />
		<input type="hidden" name="dbuser" 		  value="<?php echo DUPX_U::esc_attr($_POST['dbuser']); ?>" />
		<input type="hidden" name="dbpass" 		  value="<?php echo DUPX_U::esc_attr($_POST['dbpass']); ?>" />
		<input type="hidden" name="dbname" 		  value="<?php echo DUPX_U::esc_attr($_POST['dbname']); ?>" />
		<input type="hidden" name="dbcharset" 	  value="<?php echo DUPX_U::esc_attr($_POST['dbcharset']); ?>" />
		<input type="hidden" name="dbcollate" 	  value="<?php echo DUPX_U::esc_attr($_POST['dbcollate']); ?>" />
		<input type="hidden" name="config_mode"	  value="<?php echo DUPX_U::esc_attr($_POST['config_mode']); ?>" />
		<input type="hidden" name="exe_safe_mode" id="exe-safe-mode" value="<?php echo DUPX_U::esc_attr($_POST['exe_safe_mode']); ?>" />
		<input type="hidden" name="json"		  value="<?php echo DUPX_U::esc_attr($_POST['json']); ?>" />
	</div>

	<div class="hdr-sub1 toggle-hdr" data-type="toggle" data-target="#s3-new-settings">
        <a href="javascript:void(0)"><i class="fa fa-minus-square"></i>Setup</a>
    </div>
    <div id="s3-new-settings">
        <table class="s3-opts">
            <tr>
                <td>Title:</td>
                <td><input type="text" name="blogname" id="blogname" value="<?php echo DUPX_U::esc_attr($GLOBALS['DUPX_AC']->blogname); ?>" /></td>
            </tr>
            <tr>
                <td>URL:</td>
                <td>
                    <input type="text" name="url_new" id="url_new" value="" />
                    <a href="javascript:DUPX.getNewURL('url_new')" style="font-size:12px">get</a>
                </td>
            </tr>
            <tr>
                <td>Path:</td>
                <td><input type="text" name="path_new" id="path_new" value="<?php echo DUPX_U::esc_attr($new_path); ?>" /></td>
            </tr>
        </table>
    </div>
    <br/>

    <!-- =========================
    SEARCH AND REPLACE -->
    <div class="hdr-sub1 toggle-hdr" data-type="toggle" data-target="#s3-custom-replace">
        <a href="javascript:void(0)"><i class="fa fa-plus-square"></i>Replace</a>
    </div>

    <div id="s3-custom-replace" class="hdr-sub1-area" style="display:none; text-align: center">
        <div class="help-target">
            <?php DUPX_View_Funcs::helpIconLink('step3'); ?>
        </div><br/>
		Add additional search and replace URLs to replace additional data.<br/>
		This option is available only in
		<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=duplicator_pro&utm_content=free_inst_replaceopts">Duplicator Pro</a>
    </div>
    <br/>
    
	<!-- ==========================
    OPTIONS -->
	<div class="hdr-sub1 toggle-hdr" data-type="toggle" data-target="#s3-adv-opts">
		<a href="javascript:void(0)"><i class="fa fa-plus-square"></i>Options</a>
	</div>
	<div id="s3-adv-opts" class="hdr-sub1-area" style="display:none;">

	<!-- START TABS -->
	<div id="tabs">
		<ul>
			<li><a href="#tabs-admin-account">Admin Account</a></li>
			<li><a href="#tabs-scan-options">Scan Options</a></li>
			<li><a href="#tabs-wp-config-file">WP-Config File</a></li>
		</ul>

		<!-- =====================
		ADMIN TAB -->
		<div id="tabs-admin-account">
			<div class="help-target">
				<?php DUPX_View_Funcs::helpIconLink('step3'); ?>
			</div><br/>

			<div class="hdr-sub3">New Admin Account</div>
			<div style="text-align: center">
				<i style="color:gray;font-size: 11px">This feature is optional.  If the username already exists the account will NOT be created or updated.</i>
			</div>

			<table class="s3-opts" style="margin-top:7px">
				<tr>
					<td>Username:</td>
					<td><input type="text" name="wp_username" id="wp_username" value="" title="4 characters minimum" placeholder="(4 or more characters)" /></td>
				</tr>
				<tr>
					<td>Password:</td>
					<td>
                        <?php
                        DUPX_U_Html::inputPasswordToggle('wp_password', 'wp_password', array(),
                            array(
                            'placeholder' => '(6 or more characters)',
                            'title' => '6 characters minimum'
                        ));
                        ?>
                </tr>
				<tr>
					<td>Email:</td>
					<td><input type="text" name="wp_mail" id="wp_mail" value="" title=""  placeholder="" /></td>
				</tr>
				<tr>
					<td>Nickname:</td>
					<td><input type="text" name="wp_nickname" id="wp_nickname" value="" title="if username is empty"  placeholder="(if username is empty)" /></td>
				</tr>
				<tr>
					<td>First name:</td>
					<td><input type="text" name="wp_first_name" id="wp_first_name" value="" title="optional"  placeholder="(optional)" /></td>
				</tr>
				<tr>
					<td>Last name:</td>
					<td><input type="text" name="wp_last_name" id="wp_last_name" value="" title="optional"  placeholder="(optional)" /></td>
				</tr>
			</table>
			<br/><br/>
		</div>

		<!-- =====================
		SCAN TAB -->
		<div id="tabs-scan-options">
			<div class="help-target">
				<?php DUPX_View_Funcs::helpIconLink('step3'); ?>
			</div><br/>
			<div class="hdr-sub3">Database Scan Options</div>
			<table  class="s3-opts">
				<tr>
					<td style="width:105px">Site URL:</td>
					<td style="white-space: nowrap">
						<input type="text" name="siteurl" id="siteurl" value="" />
						<a href="javascript:DUPX.getNewURL('siteurl')" style="font-size:12px">get</a><br/>
					</td>
				</tr>
				<tr valign="top">
					<td style="width:80px">Old URL:</td>
					<td>
						<input type="text" name="url_old" id="url_old" value="<?php echo DUPX_U::esc_attr($GLOBALS['DUPX_AC']->url_old); ?>" readonly="readonly"  class="readonly" />
						<a href="javascript:DUPX.editOldURL()" id="edit_url_old" style="font-size:12px">edit</a>
					</td>
				</tr>
				<tr valign="top">
					<td>Old Path:</td>
					<td>
						<input type="text" name="path_old" id="path_old" value="<?php echo DUPX_U::esc_attr($old_path); ?>" readonly="readonly"  class="readonly" />
						<a href="javascript:DUPX.editOldPath()" id="edit_path_old" style="font-size:12px">edit</a>
					</td>
				</tr>
			</table><br/>

			<table style="width:100%">
				<tr>
					<td style="padding-right:10px;width:50%">
						<b>Scan Tables:</b>
						<div class="s3-allnonelinks">
							<a href="javascript:void(0)" onclick="$('#tables option').prop('selected',true);">[All]</a>
							<a href="javascript:void(0)" onclick="$('#tables option').prop('selected',false);">[None]</a>
						</div><br style="clear:both" />
						<select id="tables" name="tables[]" multiple="multiple" style="width:100%;" size="10">
							<?php
							foreach( $all_tables as $table ) {
								echo '<option selected="selected" value="' . DUPX_U::esc_attr( $table ) . '">' . DUPX_U::esc_html($table) . '</option>';
							}
							?>
						</select>
					</td>
					<td style="width:50%">
						<b>Activate Plugins:</b>
						<?php echo ($_POST['exe_safe_mode'] > 0) ? '<small class="s3-warn">Safe Mode Enabled</small>' : '' ; ?>
						<div class="s3-allnonelinks" style="<?php echo ($_POST['exe_safe_mode']>0)? 'display:none':''; ?>">
							<a href="javascript:void(0)" onclick="$('#plugins option').prop('selected',true);">[All]</a>
							<a href="javascript:void(0)" onclick="$('#plugins option').prop('selected',false);">[None]</a>
						</div><br style="clear:both" />
						<select id="plugins" name="plugins[]" multiple="multiple" style="width:100%;"  size="10">
							<?php
							$selected_string = 'selected="selected"';
                            if ($_POST['exe_safe_mode'] > 0) {
                                foreach ($active_plugins as $plugin) {
                                    if (strpos($plugin, '/duplicator.php') !== false) {
                                        $label = dirname($plugin) == '.' ? $plugin : dirname($plugin);
                                        echo "<option {$selected_string} value='" . DUPX_U::esc_attr( $plugin ) . "'>" . DUPX_U::esc_html($label) . '</option>';
                                        break;
                                    }
                                }
                            } else {
                                foreach ($active_plugins as $plugin) {
                                    $label = dirname($plugin) == '.' ? $plugin : dirname($plugin);
                                    echo "<option {$selected_string} value='" . DUPX_U::esc_attr( $plugin ) . "'>" . DUPX_U::esc_html($label) . '</option>';
                                }
                            }
							?>
						</select>
					</td>
				</tr>
			</table>
			<br/>
			<input type="checkbox" name="search_replace_email_domain" id="search_replace_email_domain" value="1" /> <label for="search_replace_email_domain">Update email domains</label><br/>
			<input type="checkbox" name="fullsearch" id="fullsearch" value="1" /> <label for="fullsearch">Use Database Full Search Mode</label><br/>
			<input type="checkbox" name="postguid" id="postguid" value="1" /> <label for="postguid">Keep Post GUID Unchanged</label><br/>
            <label>
                <B>Max size check for serialize objects:</b>
                <input type="number"
                       name="<?php echo DUPX_CTRL::NAME_MAX_SERIALIZE_STRLEN_IN_M; ?>"
                       value="<?php echo DUPX_Constants::DEFAULT_MAX_STRLEN_SERIALIZED_CHECK_IN_M; ?>"
                       min="0" max="99" step="1" size="2"
                       style="width: 40px;width: 50px; text-align: center;" /> MB
            </label>
			<br/><br/>
		</div>
		
		<!-- =====================
		WP-CONFIG TAB -->
		<div id="tabs-wp-config-file">
			<div class="help-target">
				<?php DUPX_View_Funcs::helpIconLink('step3'); ?>
			</div><br/>
			<div class="hdr-sub3">WP-Config File</div>
			<?php
            require_once($GLOBALS['DUPX_INIT'].'/lib/config/class.wp.config.tranformer.php');
			$root_path		= $GLOBALS['DUPX_ROOT'];
			$root_path = $GLOBALS['DUPX_ROOT'];
			$wpconfig_ark_path	= ($GLOBALS['DUPX_AC']->installSiteOverwriteOn) ? "{$root_path}/dup-wp-config-arc__{$GLOBALS['DUPX_AC']->package_hash}.txt" : "{$root_path}/wp-config.php";

            if (file_exists($wpconfig_ark_path)) {
				$config_transformer = new DupLiteWPConfigTransformer($wpconfig_ark_path);
            } else {
                $config_transformer = null;
            }
            
			?>
			<table class="dupx-opts dupx-advopts">
                <?php
                if (file_exists($wpconfig_ark_path)) { ?>
				<tr>
					<td>Cache:</td>
					<td>
						<?php
						$wp_cache_val = false;
						if (!is_null($config_transformer) && $config_transformer->exists('constant', 'WP_CACHE')) {
							$wp_cache_val = $config_transformer->get_value('constant', 'WP_CACHE');
						}
						?>
						<input type="checkbox" name="cache_wp" id="cache_wp" <?php DupLiteSnapLibUIU::echoChecked($wp_cache_val);?> /> <label for="cache_wp">Keep Enabled</label>
					</td>
				</tr>
                <tr>
					<td></td>
                    <td>
						<?php
						$wpcachehome_val = '';
						if (!is_null($config_transformer) && $config_transformer->exists('constant', 'WPCACHEHOME')) {
							$wpcachehome_val = $config_transformer->get_value('constant', 'WPCACHEHOME');
						}
						?>
						<input type="checkbox" name="cache_path" id="cache_path" <?php DupLiteSnapLibUIU::echoChecked($wpcachehome_val);?> /> <label for="cache_path">Keep Home Path</label>
                        <br><br>
					</td>
				</tr>
				<tr>
					<td>SSL:</td>
					<td>
						<?php
						$force_ssl_admin_val = false;
						if (!is_null($config_transformer) && $config_transformer->exists('constant', 'FORCE_SSL_ADMIN')) {
							$force_ssl_admin_val = $config_transformer->get_value('constant', 'FORCE_SSL_ADMIN');
						}
						?>
						<input type="checkbox" name="ssl_admin" id="ssl_admin" <?php DupLiteSnapLibUIU::echoChecked($force_ssl_admin_val);?> /> <label for="ssl_admin">Enforce on Admin</label>
					</td>
				</tr>
                <?php } else { ?>
                <tr>
                    <td>wp-config.php not found</td>
                    <td>No action on the wp-config is possible.<br>
                        After migration, be sure to insert a properly modified wp-config for correct wordpress operation.</td>
                </tr>
                <?php } ?>
			</table><br/>
			<i>
				Need more control? With <a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=duplicator_pro&utm_content=wpconfig" target="_blank">Duplicator Pro</a> 
				you can change many wp-config settings automatically from this section, without having to manually edit the file.
			</i>
		</div>
	</div>
	<!-- END TABS -->
	</div>
	<br/><br/><br/><br/>


	<div class="footer-buttons">
		<button id="s3-next" type="button"  onclick="DUPX.runUpdate()" class="default-btn"> Next <i class="fa fa-caret-right"></i> </button>
	</div>
</form>

<!-- =========================================
VIEW: STEP 3 - AJAX RESULT  -->
<form id='s3-result-form' method="post" class="content-form" style="display:none" autocomplete="off">

	<div class="logfile-link"><?php DUPX_View_Funcs::installerLogLink(); ?></div>
	<div class="hdr-main">
		Step <span class="step">3</span> of 4: Update Data
		<div class="sub-header">This step will update the database and config files to match your new sites values.</div>
	</div>

	<!--  POST PARAMS -->
	<div class="dupx-debug">
		<i>Step 3 - AJAX Response</i>
		<input type="hidden" name="view"  value="step4" />
		<input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('step4'); ?>">
		<input type="hidden" name="secure-pass" value="<?php echo DUPX_U::esc_attr($_POST['secure-pass']); ?>" />
		<input type="hidden" name="secure-archive" value="<?php echo DUPX_U::esc_attr($_POST['secure-archive']); ?>" />
		<input type="hidden" name="logging" id="logging" value="<?php echo DUPX_U::esc_attr($_POST['logging']); ?>" />
		<input type="hidden" name="url_new" id="ajax-url_new"  />
		<input type="hidden" name="exe_safe_mode" id="ajax-exe-safe-mode" />
		<input type="hidden" name="json"    id="ajax-json" />
		<input type='submit' value='manual submit'>
	</div>

	<!--  PROGRESS BAR -->
	<div id="progress-area">
		<div style="width:500px; margin:auto">
			<div style="font-size:1.7em; margin-bottom:20px"><i class="fas fa-circle-notch fa-spin"></i> Processing Data Replacement</div>
			<div id="progress-bar"></div>
			<h3> Please Wait...</h3><br/><br/>
			<i>Keep this window open during the replacement process.</i><br/>
			<i>This can take several minutes.</i>
		</div>
	</div>

	<!--  AJAX SYSTEM ERROR -->
	<div id="ajaxerr-area" style="display:none">
		<p>Please try again an issue has occurred.</p>
		<div style="padding: 0px 10px 10px 10px;">
			<div id="ajaxerr-data">
                <b>Overview:</b><br/>
                An issue has occurred in step 3.  Please see the <?php DUPX_View_Funcs::installerLogLink(); ?> file for more details.
            </div>
			<div style="text-align:center; margin:10px auto 0px auto">
				<input type="button" onclick='DUPX.hideErrorResult2()' value="&laquo; Try Again"  class="default-btn" /><br/><br/>
				<i style='font-size:11px'>See online help for more details at <a href='https://snapcreek.com' target='_blank'>snapcreek.com</a></i>
			</div>
		</div>
	</div>
</form>

<script>
/** 
* Timeout (10000000 = 166 minutes) */
DUPX.runUpdate = function()
{
	//Validation
	var wp_username = $.trim($("#wp_username").val()).length || 0;
	var wp_password = $.trim($("#wp_password").val()).length || 0;
    var wp_mail = $.trim($("#wp_mail").val()).length || 0;


	if ( $.trim($("#url_new").val()) == "" )  {alert("The 'New URL' field is required!"); return false;}
	if ( $.trim($("#siteurl").val()) == "" )  {alert("The 'Site URL' field is required!"); return false;}

    if (wp_username >= 1) {
        if (wp_username < 4) {
            alert("The New Admin Account 'Username' must be four or more characters");
            return false;
        } else if (wp_password < 6) {
            alert("The New Admin Account 'Password' must be six or more characters");
            return false;
        } else if (wp_mail === 0) {
            alert("The New Admin Account 'mail' is required");
            return false;
        }
    }
    
	var nonHttp = false;
	var failureText = '';

	/* IMPORTANT - not trimming the value for good - just in the check */
	$('input[name="search[]"]').each(function() {
		var val = $(this).val();

		if(val.trim() != "") {
			if(val.length < 3) {
				failureText = "Custom search fields must be at least three characters.";
			}

			if(val.toLowerCase().indexOf('http') != 0) {
				nonHttp = true;
			}
		}
	});

	$('input[name="replace[]"]').each(function() {
		var val = $(this).val();
		if(val.trim() != "") {
			// Replace fields can be anything
			if(val.toLowerCase().indexOf('http') != 0) {
				nonHttp = true;
			}
		}
	});

	if(failureText != '') {
		alert(failureText);
		return false;
	}

	if(nonHttp) {
		if(confirm('One or more custom search and replace strings are not URLs.  Are you sure you want to continue?') == false) {
			return false;
		}
	}

	$.ajax({
		type: "POST",
		timeout: 10000000,
		url: window.location.href,
		data: $('#s3-input-form').serialize(),
		beforeSend: function() {
			DUPX.showProgressBar();
			$('#s3-input-form').hide();
			$('#s3-result-form').show();
		},
		success: function(respData, textStatus, xHr){
			try {
                var data = DUPX.parseJSON(respData);
            } catch(err) {
                console.error(err);
                console.error('JSON parse failed for response data: ' + respData);
				var status  = "<b>Server Code:</b> "	+ xHr.status		+ "<br/>";
				status += "<b>Status:</b> "			+ textStatus	+ "<br/>";
				status += "<b>Response:</b> "		+ xHr.responseText  + "<hr/>";
				status += "<b>Additional Troubleshooting Tips:</b><br/>";
				status += "- Check the <a href='./<?php echo DUPX_U::esc_attr($GLOBALS["LOG_FILE_NAME"]);?>' target='dup-installer'>dup-installer-log.txt</a> file for warnings or errors.<br/>";
				status += "- Check the web server and PHP error logs. <br/>";
				status += "- For timeout issues visit the <a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-100-q' target='_blank'>Timeout FAQ Section</a><br/>";
				$('#ajaxerr-data').html(status);
				DUPX.hideProgressBar();
                return false;
            }

            try {
                if (typeof(data) != 'undefined' && data.step3.pass == 1) {
                    $("#ajax-url_new").val($("#url_new").val());
                    $("#ajax-exe-safe-mode").val($("#exe-safe-mode").val());
                    $("#ajax-json").val(escape(JSON.stringify(data)));
                    <?php if (!DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) : ?>
                        setTimeout(function(){$('#s3-result-form').submit();}, 1000);
                    <?php endif; ?>
                } else {
                    if (typeof(data) != 'undefined' && data.step3.pass == -1) {
                        console.log(data);
                        let details = (data.step3.error_message.length > 0) ? data.step3.error_message : "No details found.";
                        $('#ajaxerr-data').append(`<br/><br/><b>Details:</b><br/> ${details}`);
                    }
                    DUPX.hideProgressBar();
                }
            } catch(err) {
                console.log(err);
                DUPX.hideProgressBar();
            }

		},
		error: function(xhr) {
			var status  = "<b>Server Code:</b> "	+ xhr.status		+ "<br/>";
			status += "<b>Status:</b> "			+ xhr.statusText	+ "<br/>";
			status += "<b>Response:</b> "		+ xhr.responseText  + "<hr/>";
			status += "<b>Additional Troubleshooting Tips:</b><br/>";
			status += "- Check the <a href='./<?php echo DUPX_U::esc_attr($GLOBALS["LOG_FILE_NAME"]);?>' target='dup-installer'>dup-installer-log.txt</a> file for warnings or errors.<br/>";
			status += "- Check the web server and PHP error logs. <br/>";
			status += "- For timeout issues visit the <a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-100-q' target='_blank'>Timeout FAQ Section</a><br/>";
			$('#ajaxerr-data').html(status);
			DUPX.hideProgressBar();
		}
	});
};

/**
 * Returns the windows active url */
DUPX.getNewURL = function(id)
{
	var filename = window.location.pathname.split('/').pop() || 'main.installer.php' ;
	var newVal	 = window.location.href.split("?")[0];
	newVal = newVal.replace("/" + filename, '');
	var last_slash = newVal.lastIndexOf("/");
	newVal = newVal.substring(0, last_slash);

	$("#" + id).val(newVal);
};

/**
 * Allows user to edit the package url  */
DUPX.editOldURL = function()
{
	var msg = 'This is the URL that was generated when the package was created.\n';
	msg += 'Changing this value may cause issues with the install process.\n\n';
	msg += 'Only modify  this value if you know exactly what the value should be.\n';
	msg += 'See "General Settings" in the WordPress Administrator for more details.\n\n';
	msg += 'Are you sure you want to continue?';

	if (confirm(msg)) {
		$("#url_old").removeAttr('readonly');
		$("#url_old").removeClass('readonly');
		$('#edit_url_old').hide('slow');
	}
};

/**
 * Allows user to edit the package path  */
DUPX.editOldPath = function()
{
	var msg = 'This is the SERVER URL that was generated when the package was created.\n';
	msg += 'Changing this value may cause issues with the install process.\n\n';
	msg += 'Only modify  this value if you know exactly what the value should be.\n';
	msg += 'Are you sure you want to continue?';

	if (confirm(msg)) {
		$("#path_old").removeAttr('readonly');
		$("#path_old").removeClass('readonly');
		$('#edit_path_old').hide('slow');
	}
};



/**
 * Go back on AJAX result view */
DUPX.hideErrorResult2 = function()
{
	$('#s3-result-form').hide();
	$('#s3-input-form').show(200);
};

//DOCUMENT LOAD
$(document).ready(function()
{
	setTimeout(function() {
		$('#wp_username').val('');
		$('#wp_password').val('');
	}, 900);
	$("#tabs").tabs();
	DUPX.getNewURL('url_new');
	DUPX.getNewURL('siteurl');
	DUPX.initToggle();
	$("#wp_password").passStrength({
			shortPass: 		"top_shortPass",
			badPass:		"top_badPass",
			goodPass:		"top_goodPass",
			strongPass:		"top_strongPass",
			baseStyle:		"top_testresult",
			userid:			"#wp_username",
			messageloc:		1
	});
});
</script>
installer/dup-installer/views/view.s2.base.php000064400000034304151336065400015407 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

require_once($GLOBALS['DUPX_INIT'] . '/classes/config/class.archive.config.php');

//-- START OF VIEW STEP 2
$archive_config  = DUPX_ArchiveConfig::getInstance();

$dbcharset = empty($archive_config->dbcharset)
				? $GLOBALS['DBCHARSET_DEFAULT']
				: $archive_config->dbcharset;
$_POST['dbcharset'] = isset($_POST['dbcharset']) ? trim($_POST['dbcharset']) : $dbcharset;

$dbcollate = empty($archive_config->dbcollation)
				? $GLOBALS['DBCOLLATE_DEFAULT']
				: $archive_config->dbcollation;
$_POST['dbcollate'] = isset($_POST['dbcollate']) ? trim($_POST['dbcollate']) : $dbcollate;

$_POST['exe_safe_mode'] = (isset($_POST['exe_safe_mode'])) ? DUPX_U::sanitize_text_field($_POST['exe_safe_mode']) : 0;
$is_dbtest_mode = isset($_POST['dbonlytest']) ? 1 : 0;

if (isset($_POST['logging'])) {
	$post_logging = DUPX_U::sanitize_text_field($_POST['logging']);
	$_POST['logging'] = trim($post_logging);
} else {
	$_POST['logging'] = 1;
}

$cpnl_supported =  DUPX_U::$on_php_53_plus ? true : false;
?>

<form id='s2-input-form' method="post" class="content-form"  autocomplete="off" data-parsley-validate="true" data-parsley-excluded="input[type=hidden], [disabled], :hidden">

	<?php if ($is_dbtest_mode) : ?>
		<div class="hdr-main">Database Validation	</div>
	<?php else : ?>
		<div class="dupx-logfile-link">
			<?php DUPX_View_Funcs::installerLogLink(); ?>
		</div>
		<div class="hdr-main">
			Step <span class="step">2</span> of 4: Install Database
			<div class="sub-header">This step will install the database from the archive.</div>
		</div>
		<div class="s2-btngrp">
			<input id="s2-basic-btn" type="button" value="Basic" class="active" onclick="DUPX.togglePanels('basic')" />
			<input id="s2-cpnl-btn" type="button" value="cPanel" class="in-active" onclick="DUPX.togglePanels('cpanel')" />
		</div>
	<?php endif; ?>

	<!--  POST PARAMS -->
	<div class="dupx-debug">
		<i>Step 2 - Page Load</i>
		<input type="hidden" name="view" value="step2" />
		<input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('step2'); ?>">
		<input type="hidden" name="secure-pass" value="<?php echo DUPX_U::esc_attr($_POST['secure-pass']); ?>" />
		<input type="hidden" name="secure-archive" value="<?php echo DUPX_U::esc_attr($_POST['secure-archive']); ?>" />		
		<input type="hidden" name="logging" id="logging" value="<?php echo DUPX_U::esc_attr($_POST['logging']); ?>" />
		<input type="hidden" name="dbcolsearchreplace"/>
		<input type="hidden" name="ctrl_action" value="ctrl-step2" />
		<input type="hidden" name="ctrl_csrf_token" value="<?php echo DUPX_CSRF::generate('ctrl-step2'); ?>">
		<input type="hidden" name="view_mode" id="s2-input-form-mode" />
		<input type="hidden" name="exe_safe_mode" id="exe-safe-mode"  value="<?php echo DUPX_U::esc_attr($_POST['exe_safe_mode']); ?>"/>
		<textarea name="dbtest-response" id="debug-dbtest-json"></textarea>
	</div>

	<!-- BASIC TAB -->
	<div id="s2-basic-pane">
		<?php require_once('view.s2.basic.php'); ?>
	</div>

	<!-- CPANEL TAB -->
	<div id="s2-cpnl-pane" style="display: none">
		<?php require_once('view.s2.cpnl.lite.php'); ?>
	</div>

    	<!-- VALIDATION -->
	<?php require_once('view.s2.dbtest.php');	?>
</form>


<!-- CONFIRM DIALOG -->
<div id="dialog-confirm" title="Install Confirmation" style="display:none">
	<div style="padding: 10px 0 25px 0">
		<b>Run installer with these settings?</b>
	</div>

	<b>Database Settings:</b><br/>
	<table style="margin-left:20px">
		<tr>
			<td><b>Server:</b></td>
			<td><i id="dlg-dbhost"></i></td>
		</tr>
		<tr>
			<td><b>Name:</b></td>
			<td><i id="dlg-dbname"></i></td>
		</tr>
		<tr>
			<td><b>User:</b></td>
			<td><i id="dlg-dbuser"></i></td>
		</tr>
	</table>
	<br/><br/>

	<small><i class="fa fa-exclamation-triangle fa-sm"></i> WARNING: Be sure these database parameters are correct! Entering the wrong information WILL overwrite an existing database.
		Make sure to have backups of all your data before proceeding.</small><br/>
</div>


<!-- =========================================
VIEW: STEP 2 - AJAX RESULT
Auto Posts to view.step3.php  -->
<form id='s2-result-form' method="post" class="content-form" style="display:none" autocomplete="off">

	<div class="dupx-logfile-link"><?php DUPX_View_Funcs::installerLogLink(); ?></div>
	<div class="hdr-main">
		Step <span class="step">2</span> of 4: Install Database
		<div class="sub-header">This step will install the database from the archive.</div>
	</div>

	<!--  POST PARAMS -->
	<div class="dupx-debug">
		<i>Step 2 - AJAX Response</i>
		<input type="hidden" name="view" value="step3" />
		<input type="hidden" name="csrf_token" value="<?php echo DUPX_CSRF::generate('step3'); ?>">
		<input type="hidden" name="secure-pass" value="<?php echo DUPX_U::esc_attr($_POST['secure-pass']); ?>" />
		<input type="hidden" name="secure-archive" value="<?php echo DUPX_U::esc_attr($_POST['secure-archive']); ?>" />
		<input type="hidden" name="logging" id="ajax-logging" />
		<input type="hidden" name="dbaction" id="ajax-dbaction" />
		<input type="hidden" name="dbhost" id="ajax-dbhost" />
		<input type="hidden" name="dbname" id="ajax-dbname" />
		<input type="hidden" name="dbuser" id="ajax-dbuser" />
		<input type="hidden" name="dbpass" id="ajax-dbpass" />
		<input type="hidden" name="dbcharset" id="ajax-dbcharset" />
		<input type="hidden" name="dbcollate" id="ajax-dbcollate" />
		<input type="hidden" name="exe_safe_mode" id="ajax-exe-safe-mode" />
		<input type="hidden" name="config_mode" value="<?php echo DUPX_U::esc_attr($_POST['config_mode']); ?>" />
		<input type="hidden" name="json"   id="ajax-json" />
		<input type='submit' value='manual submit'>
	</div>

	<!--  PROGRESS BAR -->
	<div id="progress-area">
		<div style="width:500px; margin:auto">
			<div style="font-size:1.7em; margin-bottom:20px"><i class="fas fa-circle-notch fa-spin"></i> Installing Database</div>
			<div id="progress-bar"></div>
			<h3> Please Wait...</h3><br/><br/>
			<i>Keep this window open during the creation process.</i><br/>
			<i>This can take several minutes.</i>
		</div>
	</div>

	<!--  AJAX SYSTEM ERROR -->
	<div id="ajaxerr-area" style="display:none">
		<p>Please try again an issue has occurred.</p>
		<div style="padding: 0px 10px 10px 0px;">
			<div id="ajaxerr-data">An unknown issue has occurred with the file and database setup process.  Please see the <?php DUPX_View_Funcs::installerLogLink(); ?> file for more details.</div>
			<div style="text-align:center; margin:10px auto 0px auto">
				<input type="button" onclick="$('#s2-result-form').hide();  $('#s2-input-form').show(200);  $('#dbchunk_retry').val(0);" value="&laquo; Try Again" class="default-btn" /><br/><br/>
				<i style='font-size:11px'>See online help for more details at <a href='https://snapcreek.com/' target='_blank'>snapcreek.com</a></i>
			</div>
		</div>
	</div>
</form>

<script>
	/**
	 *  Toggles the cpanel Login area  */
	DUPX.togglePanels = function (pane)
	{
		$('#s2-basic-pane, #s2-cpnl-pane').hide();
		$('#s2-basic-btn, #s2-cpnl-btn').removeClass('active in-active');
		var cpnlSupport = <?php echo var_export($cpnl_supported); ?>

		if (pane == 'basic') {
			$('#s2-input-form-mode').val('basic');
			$('#s2-basic-pane').show();
			$('#s2-basic-btn').addClass('active');
			$('#s2-cpnl-btn').addClass('in-active');
			if (! cpnlSupport) {
				$('#s2-opts-hdr-basic, div.footer-buttons').show();
			}
		} else {
			$('#s2-input-form-mode').val('cpnl');
			$('#s2-cpnl-pane').show();
			$('#s2-cpnl-btn').addClass('active');
			$('#s2-basic-btn').addClass('in-active');
			if (! cpnlSupport) {
				$('#s2-opts-hdr-cpnl, div.footer-buttons').hide();
			}
		}
	}


	/**
	 * Open an in-line confirm dialog*/
	DUPX.confirmDeployment= function ()
	{
        var dbhost = $("#dbhost").val();
		var dbname = $("#dbname").val();
		var dbuser = $("#dbuser").val();
		var dbchunk = $("#dbchunk").val();

		var $formInput = $('#s2-input-form');
		$formInput.parsley().validate();
		if (!$formInput.parsley().isValid()) {
			return;
		}

		$( "#dialog-confirm" ).dialog({
			resizable: false,
			height: "auto",
			width: 550,
			modal: true,
			position: { my: 'top', at: 'top+150' },
			buttons: {
				"OK": function() {
					DUPX.runDeployment();
					$(this).dialog("close");
				},
				Cancel: function() {
					$(this).dialog("close");
				}
			}
		});

		$('#dlg-dbhost').html(dbhost);
		$('#dlg-dbname').html(dbname);
		$('#dlg-dbuser').html(dbuser);
	}

	/**
	 * Performs Ajax post to extract files and create db
	 * Timeout (10000000 = 166 minutes) */
	DUPX.runDeployment = function (data)
	{
		var $formInput = $('#s2-input-form');
		var $formResult = $('#s2-result-form');
		var local_data = data;
        var dbhost = $("#dbhost").val();
        var dbname = $("#dbname").val();
        var dbuser = $("#dbuser").val();
        var dbchunk = $("#dbchunk").is(':checked');

		if(local_data === undefined && dbchunk == true){
		    local_data = {
		        continue_chunking: dbchunk == true,
                pos: 0,
                pass: 0,
                first_chunk: 1,
            };
        }else if(!dbchunk){
		    local_data = {};
        }
        var new_data = (local_data !== undefined) ? '&'+$.param(local_data) : '';

		$.ajax({
			type: "POST",
			timeout: 10000000,
			url: window.location.href,
			data: $formInput.serialize()+new_data,
			beforeSend: function () {
				DUPX.showProgressBar();
				$formInput.hide();
				$formResult.show();
			},
			success: function (respData, textStatus, xhr) {
				try {
					var data = DUPX.parseJSON(respData);
				} catch(err) {
					console.error(err);
					console.error('JSON parse failed for response data: ' + respData);
					var status  = "<b>Server Code:</b> "	+ xhr.status		+ "<br/>";
					status += "<b>Status:</b> "			+ xhr.statusText	+ "<br/>";
					status += "<b>Response:</b> "		+ xhr.responseText  + "<hr/>";

					if(textStatus && textStatus.toLowerCase() == "timeout" || textStatus.toLowerCase() == "service unavailable") {
						status += "<b>Recommendation:</b><br/>";
						status += "To resolve this problem please follow the instructions showing <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-100-q'>in the FAQ</a>.<br/><br/>";
					}
					else if((xhr.status == 403) || (xhr.status == 500)) {
						status += "<b>Recommendation</b><br/>";
						status += "See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-120-q'>this section</a> of the Technical FAQ for possible resolutions.<br/><br/>"
					}
					else if(xhr.status == 0) {
						status += "<b>Recommendation</b><br/>";
						status += "This may be a server timeout and performing a 'Manual Extract' install can avoid timeouts. See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?reload=1&utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=server_timeout_man_extract2#faq-installer-015-q'>this section</a> of the FAQ for a description of how to do that.<br/><br/>"
					} else {
						status += "<b>Additional Troubleshooting Tips:</b><br/> ";
						status += "&raquo; <a target='_blank' href='https://snapcreek.com/duplicator/docs/'>Help Resources</a><br/>";
						status += "&raquo; <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/'>Technical FAQ</a>";
					}

					$('#ajaxerr-data').html(status);
					DUPX.hideProgressBar();
					return false;
				}

			    if(local_data.continue_chunking){
                    DUPX.runDeployment(data);
                    return;
                }
				if (typeof (data) != 'undefined' && data.pass == 1)
				{
					$("#ajax-dbaction").val($("#dbaction").val());
					$("#ajax-dbhost").val(dbhost);
					$("#ajax-dbname").val(dbname);
					$("#ajax-dbuser").val(dbuser);
					$("#ajax-dbpass").val($("#dbpass").val());

					//Advanced Opts
					$("#ajax-dbcharset").val($("#dbcharset").val());
					$("#ajax-dbcollate").val($("#dbcollate").val());
					$("#ajax-logging").val($("#logging").val());
					$("#ajax-exe-safe-mode").val($("#exe-safe-mode").val());
					$("#ajax-json").val(escape(JSON.stringify(data)));

					<?php if (!DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) : ?>
						setTimeout(function () {$formResult.submit();}, 1000);
					<?php endif; ?>
					//$('#progress-area').fadeOut(1500);
				} else {
					if (data.error_message) {
						$('#ajaxerr-data').html(data.error_message);
					}
					DUPX.hideProgressBar();
				}
			},
			error: function (xhr, textStatus) {
				var status  = "<b>Server Code:</b> "	+ xhr.status		+ "<br/>";
				status += "<b>Status:</b> "			+ xhr.statusText	+ "<br/>";
				status += "<b>Response:</b> "		+ xhr.responseText  + "<hr/>";

				if(textStatus && textStatus.toLowerCase() == "timeout" || textStatus.toLowerCase() == "service unavailable") {
					status += "<b>Recommendation:</b><br/>";
					status += "To resolve this problem please follow the instructions showing <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-100-q'>in the FAQ</a>.<br/><br/>";
				}
				else if((xhr.status == 403) || (xhr.status == 500)) {
					status += "<b>Recommendation</b><br/>";
					status += "See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-120-q'>this section</a> of the Technical FAQ for possible resolutions.<br/><br/>"
				}
				else if(xhr.status == 0) {
					status += "<b>Recommendation</b><br/>";
					status += "This may be a server timeout and performing a 'Manual Extract' install can avoid timeouts. See <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/?reload=1&utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=server_timeout_man_extract3#faq-installer-015-q'>this section</a> of the FAQ for a description of how to do that.<br/><br/>"
				} else {
					status += "<b>Additional Troubleshooting Tips:</b><br/> ";
					status += "&raquo; <a target='_blank' href='https://snapcreek.com/duplicator/docs/'>Help Resources</a><br/>";
					status += "&raquo; <a target='_blank' href='https://snapcreek.com/duplicator/docs/faqs-tech/'>Technical FAQ</a>";
				}

				$('#ajaxerr-data').html(status);
				DUPX.hideProgressBar();
			}
		});
	};

	//DOCUMENT LOAD
	$(document).ready(function () {
		//Init		
        DUPX.togglePanels("basic");
		DUPX.initToggle();

	});
</script>installer/dup-installer/views/index.php000064400000000017151336065400014302 0ustar00<?php
//silentinstaller/dup-installer/index.php000064400000002573151336065400013156 0ustar00<?php
// This file all content is copied from the Duplicator Pro.
/**
 * redirect to installer.php if exists
 */

// for ngrok url and Local by Flywheel Live URL
if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {
    $host = $_SERVER['HTTP_X_ORIGINAL_HOST'];
} else {
    $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];//WAS SERVER_NAME and caused problems on some boxes
}
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER ['HTTPS'] = 'on';
}
$serverDomain  = 'http'.((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') ? 's' : '').'://'.$host;
$serverUrlSelf = preg_match('/^[\\\\\/]?$/', dirname($_SERVER['SCRIPT_NAME'])) ? '' : dirname($_SERVER['SCRIPT_NAME']);

define('DUPX_INIT', str_replace('\\', '/', dirname(__FILE__)));
define('DUPX_INIT_URL', $serverDomain.$serverUrlSelf);
define('DUPX_ROOT', preg_match('/^[\\\\\/]?$/', dirname(DUPX_INIT)) ? '/' : dirname(DUPX_INIT));
define('DUPX_ROOT_URL', $serverDomain.(preg_match('/^[\\\\\/]?$/', dirname($serverUrlSelf)) ? '' : dirname($serverUrlSelf)));

if (file_exists(DUPX_ROOT.'/installer.php')) {
    header('Location: '.DUPX_ROOT_URL.'/installer.php');
    die;
}

echo "Please browse to the 'installer.php' or [hash]_installer.php from your web browser to proceed with the install process!";
die;
installer/dup-installer/main.installer.php000064400000047725151336065400014777 0ustar00<?php
/*
 * Duplicator Website Installer
 * Copyright (C) 2020, Snap Creek LLC
 * website: snapcreek.com
 *
 * Duplicator Plugin is distributed under the GNU General Public License, Version 3,
 * June 2007. Copyright (C) 2007 Free Software Foundation, Inc., 51 Franklin
 * St, Fifth Floor, Boston, MA 02110, USA
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/** IDE HELPERS */
/* @var $GLOBALS['DUPX_AC'] DUPX_ArchiveConfig */

/** Absolute path to the Installer directory. - necessary for php protection */
if ( !defined('DUPXABSPATH') ) {
    define('DUPXABSPATH', dirname(__FILE__));
}

define('ERR_CONFIG_FOUND', 'A wp-config.php already exists in this location.  This error prevents users from accidentally overwriting a WordPress site or trying to install on top of an existing one.  Extracting an archive on an existing site will overwrite existing files and intermix files causing site incompatibility issues.<br/><br/>  It is highly recommended to place the installer and archive in an empty directory. If you have already manually extracted the archive file that is associated with this installer then choose option #1 below; other-wise consider the other options: <ol><li>Click &gt; Try Again &gt; Options &gt; choose "Manual Archive Extraction".</li><li>Empty the directory except for the archive.zip/daf and installer.php and try again.</li><li>Advanced users only can remove the existing wp-config.php file and try again.</li></ol>');

ob_start();
try {
    // for ngrok url and Local by Flywheel Live URL
    if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {
        $host = $_SERVER['HTTP_X_ORIGINAL_HOST'];
    } else {
        $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; //WAS SERVER_NAME and caused problems on some boxes
    }
    if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        $_SERVER ['HTTPS'] = 'on';
    }
    $serverDomain  = 'http'.((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') ? 's' : '').'://'.$host;
    $serverUrlSelf = preg_match('/^[\\\\\/]?$/', dirname($_SERVER['SCRIPT_NAME'])) ? '' : dirname($_SERVER['SCRIPT_NAME']);

    $GLOBALS['DUPX_INIT_URL'] = $serverDomain.$serverUrlSelf;
    $GLOBALS['DUPX_INIT']     = str_replace('\\', '/', dirname(__FILE__));
    $GLOBALS['DUPX_ROOT']     = preg_match('/^[\\\\\/]?$/', dirname($GLOBALS['DUPX_INIT'])) ? '/' : dirname($GLOBALS['DUPX_INIT']);
    $GLOBALS['DUPX_ROOT_URL'] = $serverDomain.(preg_match('/^[\\\\\/]?$/', dirname($serverUrlSelf)) ? '' : dirname($serverUrlSelf));

    require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.boot.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/class.csrf.php');
    
    /**
     * init constants and include
     */
    DUPX_Boot::init();
    DUPX_Log::setThrowExceptionOnError(true);

    // DUPX_Boot::initArchiveAndLog();
    require_once($GLOBALS['DUPX_INIT'].'/classes/class.installer.state.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/class.password.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/class.db.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/class.http.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/class.server.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/class.package.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.conf.srv.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.php');
    require_once($GLOBALS['DUPX_INIT'].'/classes/class.view.php');

    DUPX_U::init();
    DUPX_ServerConfig::init();

    $exceptionError = false;
    // DUPX_log::error thotw an exception
    DUPX_Log::setThrowExceptionOnError(true);

    // ?view=help
    if (!empty($_GET['view']) && 'help' == $_GET['view']) {
        $GLOBALS['VIEW'] = 'help';
    } else if (isset($_GET['is_daws']) && 1 == $_GET['is_daws']) { // For daws action
        $post_ctrl_csrf_token = isset($_GET['daws_csrf_token']) ? DUPX_U::sanitize_text_field($_GET['daws_csrf_token']) : '';
        if (DUPX_CSRF::check($post_ctrl_csrf_token, 'daws')) {
            $outer_root_path = dirname($GLOBALS['DUPX_ROOT']);
            if (
                (isset($_GET['daws_action']) && 'start_expand' == $_GET['daws_action'])
                &&
                (
                    !$GLOBALS['DUPX_AC']->installSiteOverwriteOn 
                    && (
                            file_exists($GLOBALS['DUPX_ROOT'].'/wp-config.php') 
                            || 
                            (
                                @file_exists($outer_root_path.'/wp-config.php') 
                                && 
                                !@file_exists($GLOBALS['DUPX_ROOT'].'/wp-settings.php')
                                && 
                                @file_exists($GLOBALS['DUPX_ROOT'].'/wp-admin') 
                                &&
                                @file_exists($GLOBALS['DUPX_ROOT'].'/wp-includes')
                            )
                        )
                )
            ) {
                $resp = array(
                    'pass' => 0,
                    'isWPAlreadyExistsError' => 1,
                    'error' => "<b style='color:#B80000;'>INSTALL ERROR!</b><br/>". ERR_CONFIG_FOUND,                    
                );
                echo DupLiteSnapJsonU::wp_json_encode($resp);
            } else {

                require_once($GLOBALS['DUPX_INIT'].'/lib/dup_archive/daws/daws.php');
                
                if (isset($_REQUEST['action'])) {
                    $params = $_REQUEST;
                    DupLiteSnapLibLogger::log('b');
                } else {
                    $json   = file_get_contents('php://input');
                    $params = json_decode($json, true);
                }
                
                $params['archive_filepath'] = $GLOBALS['FW_PACKAGE_PATH'];
                $daws = new DAWS();
                $daws->processRequest($params);
            }
            die('');
        } else {
            DUPX_Log::setThrowExceptionOnError(false);
            DUPX_Log::error("An invalid request was made to the 'DAWS' process.<br/>To protect this request from unauthorized access please "
            . "restart this install process again by browsing to the installer file!<br/><br/>");
        }        
    } else {
        if (!isset($_POST['archive'])) {
            $archive = DUPX_CSRF::getVal('archive');
            if (false !== $archive) {
                $_POST['archive'] = $archive;
            } else {
                // RSR TODO: Fail gracefully
                DUPX_Log::error("Archive parameter not specified");
            }
        }
        if (!isset($_POST['bootloader'])) {
            $bootloader = DUPX_CSRF::getVal('bootloader');
            if (false !== $bootloader) {
                $_POST['bootloader'] = $bootloader;
            } else {
                // RSR TODO: Fail gracefully
                DUPX_Log::error("Bootloader parameter not specified");
            }
        }
    }

    DUPX_InstallerState::init($GLOBALS['INIT']);

    if ($GLOBALS['DUPX_AC'] == null) {
        DUPX_Log::error("Can't initialize config globals! Please try to re-run installer.php");
    }

    //Password Check
    if ($GLOBALS['VIEW'] !== 'help' && !DUPX_Security::getInstance()->securityCheck()) {
        $GLOBALS['VIEW'] = 'secure';
    }

    // Constants which are dependent on the $GLOBALS['DUPX_AC']
    $GLOBALS['SQL_FILE_NAME']		= "dup-installer-data__{$GLOBALS['DUPX_AC']->package_hash}.sql";

    if($GLOBALS["VIEW"] == "step1") {
        $init_state = true;
    } else {
        $init_state = false;
    }

    // TODO: If this is the very first step
    $GLOBALS['DUPX_STATE'] = DUPX_InstallerState::getInstance($init_state);
    if ($GLOBALS['DUPX_STATE'] == null) {
        DUPX_Log::error("Can't initialize installer state! Please try to re-run installer.php");
    }

    if (!empty($GLOBALS['view'])) {
        $post_view = $GLOBALS['view'];
    } elseif (!empty($_POST['view'])) {
        $post_view = DUPX_U::sanitize_text_field($_POST['view']);
    } else {
        $post_view = '';
    }

    // CSRF checking
    if (!empty($post_view)) {
        $csrf_views = array(
            'secure',
            'step1',
            'step2',
            'step3',
            'step4',
        );

        if (in_array($post_view, $csrf_views)) {
            if (!isset($_POST['csrf_token']) || !DUPX_CSRF::check($_POST['csrf_token'], $post_view)) {
               require_once($GLOBALS['DUPX_INIT']."/views/view.security.error.php");
               die();
            }
        }
    }

    // for ngrok url and Local by Flywheel Live URL
    if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {
        $host = $_SERVER['HTTP_X_ORIGINAL_HOST'];
    } else {
        $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];//WAS SERVER_NAME and caused problems on some boxes
    }
    $GLOBALS['_CURRENT_URL_PATH'] = $host . dirname($_SERVER['PHP_SELF']);
    $GLOBALS['NOW_TIME']		  = @date("His");

    if (!chdir($GLOBALS['DUPX_INIT'])) {
        // RSR TODO: Can't change directories
        DUPX_Log::error("Can't change to directory ".$GLOBALS['DUPX_INIT']);
    }

    if (isset($_POST['ctrl_action'])) {
        $post_ctrl_csrf_token = isset($_POST['ctrl_csrf_token']) ? $_POST['ctrl_csrf_token'] : '';
        $post_ctrl_action = DUPX_U::sanitize_text_field($_POST['ctrl_action']);
        if (!DUPX_CSRF::check($post_ctrl_csrf_token, $post_ctrl_action)) {
            require_once($GLOBALS['DUPX_INIT']."/views/view.security.error.php");
            die();
        }
        //PASSWORD CHECK
        if (!DUPX_Security::getInstance()->securityCheck()) {
            DUPX_Log::error("Unauthorized Access:  Please provide a password!");
        }

        // the controllers must die in case of error
        DUPX_Log::setThrowExceptionOnError(false);
        switch ($post_ctrl_action) {
            case "ctrl-step1" :
                require_once($GLOBALS['DUPX_INIT'].'/ctrls/ctrl.s1.php');
                break;

            case "ctrl-step2" :
                require_once($GLOBALS['DUPX_INIT'].'/ctrls/ctrl.s2.dbtest.php');
                require_once($GLOBALS['DUPX_INIT'].'/ctrls/ctrl.s2.dbinstall.php');
                require_once($GLOBALS['DUPX_INIT'].'/ctrls/ctrl.s2.base.php');
                break;

            case "ctrl-step3" :
                require_once($GLOBALS['DUPX_INIT'].'/classes/class.engine.php');
                require_once($GLOBALS['DUPX_INIT'].'/ctrls/ctrl.s3.php');
                break;
            default:
                DUPX_Log::setThrowExceptionOnError(true);
                DUPX_Log::error('No valid action request');
        }
        DUPX_Log::setThrowExceptionOnError(true);
        DUPX_Log::error('Ctrl action problem');
    }
} catch (Exception $e) {
    $exceptionError = $e;
} catch (Error $e) {
    $exceptionError = $e;
}

/**
 * clean output
 */
$unespectOutput = ob_get_contents();
ob_clean();
if (!empty($unespectOutput)) {
    DUPX_Log::info('ERROR: Unespect output '.DUPX_Log::varToString($unespectOutput));
    $exceptionError = new Exception('Unespected output '.DUPX_Log::varToString($unespectOutput));
}

if ($exceptionError != false) {
    $GLOBALS["VIEW"] = 'exception';
    echo '<pre>'.$exceptionError->getMessage()."\n";
    echo "\tFILE:".$exceptionError->getFile().'['.$exceptionError->getLIne().']'."\n";
    echo "\tTRACE:\n".$exceptionError->getTraceAsString()."</pre>";
    die;
}

?><!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="robots" content="noindex,nofollow">
	<title>Duplicator</title>
    <link rel='stylesheet' href='assets/font-awesome/css/all.min.css' type='text/css' media='all' />

    <link rel="apple-touch-icon" sizes="180x180" href="favicon/apple-touch-icon.png">
    <link rel="icon" type="image/png" sizes="32x32" href="favicon/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="16x16" href="favicon/favicon-16x16.png">
    <link rel="manifest" href="favicon/site.webmanifest">
    <link rel="mask-icon" href="favicon/safari-pinned-tab.svg">
    <link rel="shortcut icon" href="favicon/favicon.ico">
    <meta name="msapplication-TileColor" content="#da532c">
    <meta name="msapplication-config" content="favicon/browserconfig.xml">
    <meta name="theme-color" content="#ffffff">

	<?php
		require_once($GLOBALS['DUPX_INIT'] . '/assets/inc.libs.css.php');
		require_once($GLOBALS['DUPX_INIT'] . '/assets/inc.css.php');
    ?>
    <script src="<?php echo $GLOBALS['DUPX_INIT_URL'];?>/assets/inc.libs.js?v=<?php echo $GLOBALS['DUPX_AC']->version_dup; ?>"></script>
    <?php
		require_once($GLOBALS['DUPX_INIT'] . '/assets/inc.js.php');
    ?>
</head>
<body id="body-<?php echo $GLOBALS["VIEW"]; ?>" >

<div id="content">

<!-- HEADER TEMPLATE: Common header on all steps -->
<table cellspacing="0" class="header-wizard">
	<tr>
		<td style="width:100%;">
			<div class="dupx-branding-header">Duplicator <?php echo ($GLOBALS["VIEW"] == 'help') ? 'help' : ''; ?></div>
		</td>
		<td class="wiz-dupx-version">
            <?php  if ($GLOBALS["VIEW"] !== 'help') { ?>
			<a href="javascript:void(0)" onclick="DUPX.openServerDetails()">version:&nbsp;<?php echo DUPX_U::esc_html($GLOBALS['DUPX_AC']->version_dup); ?></a>&nbsp;
			<?php DUPX_View_Funcs::helpLockLink(); ?>
			<div style="padding: 6px 0">
                <?php DUPX_View_Funcs::helpLink($GLOBALS["VIEW"]); ?>
			</div>
            <?php } ?>
		</td>
	</tr>
</table>

<div class="dupx-modes">
	<?php
		$php_enforced_txt = ($GLOBALS['DUPX_ENFORCE_PHP_INI']) ? '<i style="color:red"><br/>*PHP ini enforced*</i>' : '';
		$db_only_txt = ($GLOBALS['DUPX_AC']->exportOnlyDB) ? ' - Database Only]' : ']';
		$db_only_txt = $db_only_txt . $php_enforced_txt;

		if ($GLOBALS['DUPX_AC']->installSiteOverwriteOn) {
			echo  ($GLOBALS['DUPX_STATE']->mode === DUPX_InstallerMode::OverwriteInstall)
				? "<span class='dupx-overwrite'>[Overwrite Install{$db_only_txt}</span>"
				: "[Standard Install{$db_only_txt}";
		} else {
			echo "[Standard Install{$db_only_txt}";
		}
	?>
</div>

<?php

/****************************/
/*** NOTICE MANAGER TESTS ***/
//DUPX_NOTICE_MANAGER::testNextStepFullMessageData();
//DUPX_NOTICE_MANAGER::testNextStepMessaesLevels();
//DUPX_NOTICE_MANAGER::testFinalReporMessaesLevels();
//DUPX_NOTICE_MANAGER::testFinalReportFullMessages();
/****************************/

DUPX_NOTICE_MANAGER::getInstance()->nextStepLog();
// display and remove next step notices
DUPX_NOTICE_MANAGER::getInstance()->displayStepMessages();
?>

<!-- =========================================
FORM DATA: User-Interface views -->
<div id="content-inner">
	<?php
    if ($exceptionError === false) {
        try {
            ob_start();
            switch ($GLOBALS["VIEW"]) {
                case "secure" :
                    require_once($GLOBALS['DUPX_INIT'] . '/views/view.init1.php');
                    break;

                case "step1"   :
                    require_once($GLOBALS['DUPX_INIT'] . '/views/view.s1.base.php');
                    break;

                case "step2" :
                    require_once($GLOBALS['DUPX_INIT'] . '/views/view.s2.base.php');
                    break;

                case "step3" :
                    require_once($GLOBALS['DUPX_INIT'] . '/views/view.s3.php');
                    break;

                case "step4"   :
                    require_once($GLOBALS['DUPX_INIT'] . '/views/view.s4.php');
                    break;

                case "help"   :
                    require_once($GLOBALS['DUPX_INIT'] . '/views/view.help.php');
                    break;
                
                default :
                    echo "Invalid View Requested";
            }
        } catch (Exception $e) {
            /** delete view output **/
            ob_clean();
            $exceptionError = $e;
        }

        /** flush view output **/
        ob_end_flush();
    } else {
        DUPX_Log::info("--------------------------------------");
        DUPX_Log::info('EXCEPTION: '.$exceptionError->getMessage());
        DUPX_Log::info('TRACE:');
        DUPX_Log::info($exceptionError->getTraceAsString());
        DUPX_Log::info("--------------------------------------");
        /**
         *   $exceptionError call in view
         */
        require_once($GLOBALS['DUPX_INIT'] . '/views/view.exception.php');
    }
	?>
</div>
</div>


<!-- SERVER INFO DIALOG -->
<div id="dialog-server-details" title="Setup Information" style="display:none">
	<!-- DETAILS -->
	<div class="dlg-serv-info">
		<?php
			$ini_path 		= php_ini_loaded_file();
			$ini_max_time 	= ini_get('max_execution_time');
			$ini_memory 	= ini_get('memory_limit');
			$ini_error_path = DUPX_CTRL::renderPostProcessings(ini_get('error_log'));
		?>
         <div class="hdr">SERVER DETAILS</div>
		<label>Web Server:</label>  			<?php echo DUPX_U::esc_html($_SERVER['SERVER_SOFTWARE']); ?><br/>
        <label>PHP Version:</label>  			<?php echo DUPX_U::esc_html(DUPX_Server::$php_version); ?><br/>
		<?php
		$php_sapi_name = php_sapi_name();
		?>
		<label>PHP SAPI:</label>  				<?php echo DUPX_U::esc_html($php_sapi_name); ?><br/>
		<label>PHP ZIP Archive:</label> 		<?php echo class_exists('ZipArchive') ? 'Is Installed' : 'Not Installed'; ?> <br/>
		<label>PHP max_execution_time:</label>  <?php echo $ini_max_time === false ? 'unable to find' : DUPX_U::esc_html($ini_max_time); ?><br/>
		<label>PHP memory_limit:</label>  		<?php echo empty($ini_memory)      ? 'unable to find' : DUPX_U::esc_html($ini_memory); ?><br/>
		<label>Error Log Path:</label>  		<?php echo empty($ini_error_path)  ? 'unable to find' : '[installer_path]/dup-installer/php_error__[HASH].LOG'; ?><br/>

        <br/>
        <div class="hdr">PACKAGE BUILD DETAILS</div>
        <label>Plugin Version:</label>  		<?php echo DUPX_U::esc_html($GLOBALS['DUPX_AC']->version_dup); ?><br/>
        <label>WordPress Version:</label>  		<?php echo DUPX_U::esc_html($GLOBALS['DUPX_AC']->version_wp); ?><br/>
        <label>PHP Version:</label>             <?php echo DUPX_U::esc_html($GLOBALS['DUPX_AC']->version_php); ?><br/>
        <label>Database Version:</label>        <?php echo DUPX_U::esc_html($GLOBALS['DUPX_AC']->version_db); ?><br/>
        <label>Operating System:</label>        <?php echo DUPX_U::esc_html($GLOBALS['DUPX_AC']->version_os); ?><br/>

	</div>
</div>

<script>
DUPX.openServerDetails = function ()
{
	$("#dialog-server-details").dialog({
	  resizable: false,
	  height: "auto",
	  width: 700,
	  modal: true,
	  position: { my: 'top', at: 'top+150' },
	  buttons: {"OK": function() {$(this).dialog("close");} }
	});
}

$(document).ready(function ()
{
	//Disable href for toggle types
	$("a[data-type='toggle']").each(function() {
		$(this).attr('href', 'javascript:void(0)');
	});

});
</script>


<?php if (DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) :?>
<form id="form-debug" method="post" action="?debug=1" autocomplete="off" >
		<input id="debug-view" type="hidden" name="view" />
		<br/><hr size="1" />
		DEBUG MODE ON
		<br/><br/>
		<a href="javascript:void(0)"  onclick="$('#debug-vars').toggle()"><b>PAGE VARIABLES</b></a>
		<pre id="debug-vars"><?php print_r($GLOBALS); ?></pre>
	</form>

	<script>
		DUPX.debugNavigate = function(view)
		{
		//TODO: Write app that captures all ajax requets and logs them to custom console.
		}
	</script>
<?php endif; ?>


<!-- Used for integrity check do not remove:
DUPLICATOR_INSTALLER_EOF -->
</body>
</html>
<?php
ob_end_flush(); // Flush the output from the buffer
installer/dup-installer/classes/class.csrf.php000064400000012511151336065400015536 0ustar00<?php

defined('ABSPATH') || defined('DUPXABSPATH') || exit;


class DUPX_CSRF
{

    private static $packagHash = null;
    private static $mainFolder = null;

	/**
     * Session var name prefix
     * @var string
     */
    public static $prefix = '_DUPX_CSRF';
	
	/**
     * Stores all CSRF values: Key as CSRF name and Val as CRF value
     * @var array
     */
    private static $CSRFVars = null;
	
    public static function init($mainFolderm, $packageHash)
    {
        self::$mainFolder = $mainFolderm;
        self::$packagHash = $packageHash;
        self::$CSRFVars   = null;
    }

    /**
     * Set new CSRF
     *
     * @param string $key CSRF key
     * @param string $val CSRF val
     *
     * @return Void
     */
    public static function setKeyVal($key, $val)
    {
        $CSRFVars       = self::getCSRFVars();
        $CSRFVars[$key] = $val;
        self::saveCSRFVars($CSRFVars);
        self::$CSRFVars = null;
    }

    /**
     * Get CSRF value by passing CSRF key
     *
     * @param string $key CSRF key
     *
     * @return string|boolean If CSRF value set for give n Key, It returns CRF value otherise returns false
     */
    public static function getVal($key)
    {
        $CSRFVars = self::getCSRFVars();
        if (isset($CSRFVars[$key])) {
            return $CSRFVars[$key];
        } else {
            return false;
        }
    }

    /**
     * Generate DUPX_CSRF value for form
     *
     * @param   string  $form    // Form name as session key
     *
     * @return  string      // token
     */
    public static function generate($form = null)
    {
        $keyName = self::getKeyName($form);
        $existingToken = self::getVal($keyName);
        if (false !== $existingToken) {
            $token = $existingToken;
        } else {
            $token = DUPX_CSRF::token() . DUPX_CSRF::fingerprint();
        }

        self::setKeyVal($keyName, $token);
        return $token;
    }

    /**
     * Check DUPX_CSRF value of form
     *
     * @param   string  $token  - Token
     * @param   string  $form   - Form name as session key
     * @return  boolean
     */
    public static function check($token, $form = null)
    {
        if (empty($form)) {
            return false;
        }

        $keyName  = self::getKeyName($form);
        $CSRFVars = self::getCSRFVars();
        if (isset($CSRFVars[$keyName]) && $CSRFVars[$keyName] == $token) {
        // token OK
            return true;
        }
        return false;
    }

    /** Generate token
     *
     * @return  string
     */
    protected static function token()
    {
        mt_srand((int)((double) microtime() * 10000));
        $charid = strtoupper(md5(uniqid(rand(), true)));
        return substr($charid, 0, 8) . substr($charid, 8, 4) . substr($charid, 12, 4) . substr($charid, 16, 4) . substr($charid, 20, 12);
    }

    /** Returns "digital fingerprint" of user
     *
     * @return  string  - MD5 hashed data
     */
    protected static function fingerprint()
    {
        return strtoupper(md5(implode('|', array($_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']))));
    }

    /**
     * Generate CSRF Key name
     *
     * @param string $form the form name for which CSRF key need to generate
     * @return string CSRF key
     */
    private static function getKeyName($form)
    {
        return DUPX_CSRF::$prefix . '_' . $form;
    }

    /**
     * Get Package hash
     *
     * @return string Package hash
     */
    private static function getPackageHash()
    {
        if (is_null(self::$packagHash)) {
            throw new Exception('Not init CSFR CLASS');
        }
        return self::$packagHash;
    }

    /**
     * Get file path where CSRF tokens are stored in JSON encoded format
     *
     * @return string file path where CSRF token stored
     */
    public static function getFilePath()
    {
        if (is_null(self::$mainFolder)) {
            throw new Exception('Not init CSFR CLASS');
        }
        $dupInstallerfolderPath = self::$mainFolder;
        $packageHash            = self::getPackageHash();
        $fileName               = 'dup-installer-csrf__' . $packageHash . '.txt';
        $filePath               = $dupInstallerfolderPath . '/' . $fileName;
        return $filePath;
    }

    /**
     * Get all CSRF vars in array format
     *
     * @return array Key as CSRF name and value as CSRF value
     */
    private static function getCSRFVars()
    {
        if (is_null(self::$CSRFVars)) {
            $filePath = self::getFilePath();
            if (file_exists($filePath)) {
                $contents = file_get_contents($filePath);
                if (empty($contents)) {
                    self::$CSRFVars = array();
                } else {
                    $CSRFobjs = json_decode($contents);
                    foreach ($CSRFobjs as $key => $value) {
                        self::$CSRFVars[$key] = $value;
                    }
                }
            } else {
                self::$CSRFVars = array();
            }
        }
        return self::$CSRFVars;
    }

    /**
     * Stores all CSRF vars
     *
     * @param array $CSRFVars holds all CSRF key val
     * @return void
     */
    private static function saveCSRFVars($CSRFVars)
    {
        $contents = DupLiteSnapJsonU::wp_json_encode($CSRFVars);
        $filePath = self::getFilePath();
        file_put_contents($filePath, $contents);
    }
}
installer/dup-installer/classes/class.server.php000064400000012566151336065400016121 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * DUPX_cPanel  
 * Wrapper Class for cPanel API  */
class DUPX_Server
{
	/**
	 * Returns true if safe mode is enabled
	 */
	public static $php_safe_mode_on = false;

	/**
	 * The servers current PHP version
	 */
	public static $php_version = 0;

	/**
	 * The minimum PHP version the installer will support
	 */
	public static $php_version_min = "5.3.8";

	/**
	 * Is the current servers version of PHP safe to use with the installer
	 */
	public static $php_version_safe = false;

	/**
	 * A list of the core WordPress directories
	 */
	public static $wpCoreDirsList = "wp-admin,wp-includes,wp-content";

	public static function _init()
	{
		self::$php_safe_mode_on	 = in_array(strtolower(@ini_get('safe_mode')), array('on', 'yes', 'true', 1, "1"));
		self::$php_version		 = phpversion();
		self::$php_version_safe	 = (version_compare(phpversion(), self::$php_version_min) >= 0);
	}

	/**
	 *  Display human readable byte sizes
	 *  @param string $size		The size in bytes
	 */
	public static function is_dir_writable($path)
	{
		if (!@is_writeable($path)) return false;

		if (is_dir($path)) {
			if ($dh = @opendir($path)) {
				closedir($dh);
			} else {
				return false;
			}
		}

		return true;
	}

	/**
	 *  Can this server process in shell_exec mode
	 *  @return bool
	 */
	public static function is_shell_exec_available()
	{
		if (array_intersect(array('shell_exec', 'escapeshellarg', 'escapeshellcmd', 'extension_loaded'), array_map('trim', explode(',', @ini_get('disable_functions'))))) {
            return false;
        }

		//Suhosin: http://www.hardened-php.net/suhosin/
		//Will cause PHP to silently fail.
		if (extension_loaded('suhosin')) {
            return false;
        }

        if (! function_exists('shell_exec')) {
			return false;
	    }

		// Can we issue a simple echo command?
		if (!@shell_exec('echo duplicator')) {
            return false;
        }

		return true;
	}

	/**
	 *  Returns the path this this server where the zip command can be called
	 *  @return string	The path to where the zip command can be processed
	 */
	public static function get_unzip_filepath()
	{
		$filepath = null;
		if (self::is_shell_exec_available()) {
			if (shell_exec('hash unzip 2>&1') == NULL) {
				$filepath = 'unzip';
			} else {
				$possible_paths = array('/usr/bin/unzip', '/opt/local/bin/unzip');
				foreach ($possible_paths as $path) {
					if (file_exists($path)) {
						$filepath = $path;
						break;
					}
				}
			}
		}
		return $filepath;
	}
    
    /**
     * 
     * @return string[]
     */
    public static function getWpAddonsSiteLists()
    {
        $addonsSites  = array();
        $pathsToCheck = $GLOBALS['DUPX_ROOT'];
        
        if (is_scalar($pathsToCheck)) {
            $pathsToCheck = array($pathsToCheck);
        }

        foreach ($pathsToCheck as $mainPath) {
            DupLiteSnapLibIOU::regexGlobCallback($mainPath, function ($path) use (&$addonsSites) {
                if (DupLiteSnapLibUtilWp::isWpHomeFolder($path)) {
                    $addonsSites[] = $path;
                }
            }, array(
                'regexFile' => false,
                'recursive' => true
            ));
        }

        return $addonsSites;
    }

	/**
	* Does the site look to be a WordPress site
	*
	* @return bool		Returns true if the site looks like a WP site
	*/
	public static function isWordPress()
	{
		$search_list  = explode(',', self::$wpCoreDirsList);
		$root_files   = scandir($GLOBALS['DUPX_ROOT']);
		$search_count = count($search_list);
		$file_count   = 0;
		foreach ($root_files as $file) {
			if (in_array($file, $search_list)) {
				$file_count++;
			} 
		}
		return ($search_count == $file_count);
	}

    public static function parentWordfencePath()
    {
        $scanPath = $GLOBALS['DUPX_ROOT'];
        $rootPath = DupLiteSnapLibIOU::getMaxAllowedRootOfPath($scanPath);

        if ($rootPath === false) {
            //$scanPath is not contained in open_basedir paths skip
            return false;
        }

        DUPX_Handler::setMode(DUPX_Handler::MODE_OFF);
        $continueScan = true;
        while ($continueScan) {
            if (self::wordFenceFirewallEnabled($scanPath)) {
                return $scanPath;
                break;
            }
            $continueScan = $scanPath !== $rootPath && $scanPath != dirname($scanPath);
            $scanPath     = dirname($scanPath);
        }
        DUPX_Handler::setMode();

        return false;
    }

    protected static function wordFenceFirewallEnabled($path)
    {
        $configFiles = array(
            'php.ini',
            '.user.ini',
            '.htaccess'
        );

        foreach ($configFiles as $configFile) {
            $file = $path.'/'.$configFile;

            if (!@is_readable($file)) {
                continue;
            }

            if (($content = @file_get_contents($file)) === false) {
                continue;
            }

            if (strpos($content, 'wordfence-waf.php') !== false) {
                return true;
            }
        }

        return false;
    }
	
	/**
	* Is the web server IIS
	*
	* @return bool		Returns true if web server is IIS
	*/
    public static function isIISRunning()
	{
		$sSoftware = strtolower( $_SERVER["SERVER_SOFTWARE"] );
		if ( strpos($sSoftware, "microsoft-iis") !== false ) {
			return true;
		} else {
			return false;
		}
	}



}
//INIT Class Properties
DUPX_Server::_init();
installer/dup-installer/classes/class.logging.php000064400000031247151336065400016236 0ustar00<?php
/**
 * Class used to log information
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\Log
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * DUPX_Log
 * Class used to log information  */
class DUPX_Log
{

    /**
     * Maximum length of the log on the log. 
     * Prevents uncontrolled increase in log size. This dimension should never be reached
     */
    const MAX_LENGTH_FWRITE = 50000;
    const LV_DEFAULT        = 1;
    const LV_DETAILED       = 2;
    const LV_DEBUG          = 3;
    const LV_HARD_DEBUG     = 4;

    /**
     * if true throw exception on error else die on error
     * @var bool
     */
    private static $thowExceptionOnError = false;

    /**
     * log level
     * @var int 
     */
    private static $logLevel = self::LV_DEFAULT;

    /**
     * num of \t before log string.
     * @var int
     */
    private static $indentation = 0;

    /**
     *
     * @var float
     */
    private static $microtimeStart = 0;

    /**
     *
     * @var callable 
     */
    private static $postprocessCallback = null;

    /**
     * set log level from param manager
     */
    public static function setLogLevel()
    {
        self::$logLevel = isset($_POST['logging']) ? $_POST['logging'] : DUPX_Log::LV_DEFAULT;
    }

    /** METHOD: LOG
     *  Used to write debug info to the text log file
     *  @param string $msg		Any text data
     *  @param int $logging	Log level
     *  @param bool if true flush file log
     *
     */
    public static function info($msg, $logging = self::LV_DEFAULT, $flush = false)
    {
        if ($logging <= self::$logLevel) {
            if (isset($GLOBALS['LOG_FILE_HANDLE']) && is_resource($GLOBALS['LOG_FILE_HANDLE'])) {
                $preLog = '';
                if (self::$indentation) {
                    $preLog .= str_repeat("\t", self::$indentation);
                }
                if (self::$logLevel >= self::LV_DETAILED) {
                    $preLog .= sprintf('[DELTA:%10.5f] ', microtime(true) - self::$microtimeStart);
                }
                if (is_callable(self::$postprocessCallback)) {
                    $msg = call_user_func(self::$postprocessCallback, $msg);
                }
                @fwrite($GLOBALS["LOG_FILE_HANDLE"], $preLog.$msg."\n", self::MAX_LENGTH_FWRITE);
            }

            if ($flush) {
                self::flush();
            }
        }
    }

    /**
     * 
     * @param callable $callback
     */
    public static function setPostProcessCallback($callback)
    {
        if (is_callable($callback)) {
            self::$postprocessCallback = $callback;
        } else {
            self::$postprocessCallback = null;
        }
    }

    /**
     * set $microtimeStart  at current time
     */
    public static function resetTime($logging = self::LV_DEFAULT)
    {
        self::$microtimeStart = microtime(true);
        if ($logging > self::$logLevel) {
            return;
        }
        $callers = debug_backtrace();
        $file    = $callers[0]['file'];
        $line    = $callers[0]['line'];
        DUPX_Log::info('LOG-TIME['.$file.':'.$line.'] RESET TIME', $logging);
    }

    /**
     * log time delta from last resetTime call
     * 
     * @return void
     */
    public static function logTime($msg = '', $logging = self::LV_DEFAULT)
    {
        if ($logging > self::$logLevel) {
            return;
        }
        $callers = debug_backtrace();
        $file    = $callers[0]['file'];
        $line    = $callers[0]['line'];
        DUPX_Log::info(sprintf('LOG-TIME[%s:%s][DELTA:%10.5f] ', $file, $line, microtime(true) - self::$microtimeStart).(empty($msg) ? '' : ' MESSAGE:'.$msg), $logging);
    }

    public static function incIndent()
    {
        self::$indentation++;
    }

    public static function decIndent()
    {
        if (self::$indentation > 0) {
            self::$indentation--;
        }
    }

    public static function resetIndent()
    {
        self::$indentation = 0;
    }

    public static function isLevel($logging)
    {
        return $logging <= self::$logLevel;
    }

    public static function infoObject($msg, &$object, $logging = self::LV_DEFAULT)
    {
        $msg = $msg."\n".print_r($object, true);
        self::info($msg, $logging);
    }

    public static function flush()
    {
        if (is_resource($GLOBALS['LOG_FILE_HANDLE'])) {
            @fflush($GLOBALS['LOG_FILE_HANDLE']);
        }
    }

    public static function close()
    {
        if (is_resource($GLOBALS['LOG_FILE_HANDLE'])) {
            @fclose($GLOBALS["LOG_FILE_HANDLE"]);
            $GLOBALS["LOG_FILE_HANDLE"] = null;
        }
    }

    public static function getFileHandle()
    {
        return is_resource($GLOBALS["LOG_FILE_HANDLE"]) ? $GLOBALS["LOG_FILE_HANDLE"] : false;
    }

    public static function error($errorMessage)
    {
        $breaks  = array("<br />", "<br>", "<br/>");
        $spaces  = array("&nbsp;");
        $log_msg = str_ireplace($breaks, "\r\n", $errorMessage);
        $log_msg = str_ireplace($spaces, " ", $log_msg);
        $log_msg = strip_tags($log_msg);

        self::info("\nINSTALLER ERROR:\n{$log_msg}\n");

        if (self::$thowExceptionOnError) {
            throw new Exception($errorMessage);
        } else {
            self::close();
            die("<div class='dupx-ui-error'><hr size='1' /><b style='color:#B80000;'>INSTALL ERROR!</b><br/>{$errorMessage}</div>");
        }
    }

    /**
     * 
     * @param Exception $e
     * @param string $title
     */
    public static function logException($e, $logging = self::LV_DEFAULT, $title = 'EXCEPTION ERROR: ')
    {
        if ($logging <= self::$logLevel) {
            DUPX_Log::info("\n".$title.' '.$e->getMessage());
            DUPX_Log::info("\tFILE:".$e->getFile().'['.$e->getLIne().']');
            DUPX_Log::info("\tTRACE:\n".$e->getTraceAsString()."\n");
        }
    }

    /**
     *
     * @param boolean $set
     */
    public static function setThrowExceptionOnError($set)
    {
        self::$thowExceptionOnError = (bool) $set;
    }

    /**
     *
     * @param mixed $var
     * @param bool $checkCallable // if true check if var is callable and display it
     * @return string
     */
    public static function varToString($var, $checkCallable = false)
    {
        if ($checkCallable && is_callable($var)) {
            return '(callable) '.print_r($var, true);
        }
        switch (gettype($var)) {
            case "boolean":
                return $var ? 'true' : 'false';
            case "integer":
            case "double":
                return (string) $var;
            case "string":
                return '"'.$var.'"';
            case "array":
            case "object":
                return print_r($var, true);
            case "resource":
            case "resource (closed)":
            case "NULL":
            case "unknown type":
            default:
                return gettype($var);
        }
    }
}

class DUPX_Handler
{

    const MODE_OFF         = 0; // don't write in log
    const MODE_LOG         = 1; // write errors in log file
    const MODE_VAR         = 2; // put php errors in $varModeLog static var
    const SHUTDOWN_TIMEOUT = 'tm';

    public static function initErrorHandler()
    {
        DUPX_Boot::disableBootShutdownFunction();

        @set_error_handler(array(__CLASS__, 'error'));
        @register_shutdown_function(array(__CLASS__, 'shutdown'));
    }
    /**
     *
     * @var array
     */
    private static $shutdownReturns = array(
        'tm' => 'timeout'
    );

    /**
     *
     * @var int
     */
    private static $handlerMode = self::MODE_LOG;

    /**
     *
     * @var bool // print code reference and errno at end of php error line  [CODE:10|FILE:test.php|LINE:100]
     */
    private static $codeReference = true;

    /**
     *
     * @var bool // print prefix in php error line [PHP ERR][WARN] MSG: .....
     */
    private static $errPrefix = true;

    /**
     *
     * @var string // php errors in MODE_VAR
     */
    private static $varModeLog = '';

    /**
     * Error handler
     *
     * @param  integer $errno   Error level
     * @param  string  $errstr  Error message
     * @param  string  $errfile Error file
     * @param  integer $errline Error line
     * @return void
     */
    public static function error($errno, $errstr, $errfile, $errline)
    {
        switch (self::$handlerMode) {
            case self::MODE_OFF:
                if ($errno == E_ERROR) {
                    $log_message = self::getMessage($errno, $errstr, $errfile, $errline);
                    DUPX_Log::error($log_message);
                }
                break;
            case self::MODE_VAR:
                self::$varModeLog .= self::getMessage($errno, $errstr, $errfile, $errline)."\n";
                break;
            case self::MODE_LOG:
            default:
                switch ($errno) {
                    case E_ERROR :
                        $log_message = self::getMessage($errno, $errstr, $errfile, $errline);
                        DUPX_Log::error($log_message);
                        break;
                    case E_NOTICE :
                    case E_WARNING :
                    default :
                        $log_message = self::getMessage($errno, $errstr, $errfile, $errline);
                        DUPX_Log::info($log_message);
                        break;
                }
        }
    }

    private static function getMessage($errno, $errstr, $errfile, $errline)
    {
        $result = '';

        if (self::$errPrefix) {
            $result = '[PHP ERR]';
            switch ($errno) {
                case E_ERROR :
                    $result .= '[FATAL]';
                    break;
                case E_WARNING :
                    $result .= '[WARN]';
                    break;
                case E_NOTICE :
                    $result .= '[NOTICE]';
                    break;
                default :
                    $result .= '[ISSUE]';
                    break;
            }
            $result .= ' MSG:';
        }

        $result .= $errstr;

        if (self::$codeReference) {
            $result .= ' [CODE:'.$errno.'|FILE:'.$errfile.'|LINE:'.$errline.']';
            if (DUPX_Log::isLevel(DUPX_Log::LV_DEBUG)) {
                ob_start();
                debug_print_backtrace();
                $result .= "\n".ob_get_clean();
            }
        }

        return $result;
    }

    /**
     * if setMode is called without params set as default
     *
     * @param int $mode
     * @param bool $errPrefix // print prefix in php error line [PHP ERR][WARN] MSG: .....
     * @param bool $codeReference // print code reference and errno at end of php error line  [CODE:10|FILE:test.php|LINE:100]
     */
    public static function setMode($mode = self::MODE_LOG, $errPrefix = true, $codeReference = true)
    {
        switch ($mode) {
            case self::MODE_OFF:
            case self::MODE_VAR:
                self::$handlerMode = $mode;
                break;
            case self::MODE_LOG:
            default:
                self::$handlerMode = self::MODE_LOG;
        }

        self::$varModeLog    = '';
        self::$errPrefix     = $errPrefix;
        self::$codeReference = $codeReference;
    }

    /**
     *
     * @return string // return var log string in MODE_VAR
     */
    public static function getVarLog()
    {
        return self::$varModeLog;
    }

    /**
     *
     * @return string // return var log string in MODE_VAR and clean var
     */
    public static function getVarLogClean()
    {
        $result           = self::$varModeLog;
        self::$varModeLog = '';
        return $result;
    }

    /**
     *
     * @param string $status // timeout
     * @param string $string
     */
    public static function setShutdownReturn($status, $str)
    {
        self::$shutdownReturns[$status] = $str;
    }

    /**
     * Shutdown handler
     *
     * @return void
     */
    public static function shutdown()
    {
        if (($error = error_get_last())) {
            if (preg_match('/^Maximum execution time (?:.+) exceeded$/i', $error['message'])) {
                echo self::$shutdownReturns[self::SHUTDOWN_TIMEOUT];
            }
            DUPX_Handler::error($error['type'], $error['message'], $error['file'], $error['line']);
        }
    }
}installer/dup-installer/classes/utilities/class.u.html.php000064400000045211151336065400020026 0ustar00<?php
/**
 * Various html elements
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\U
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 *
 */
class DUPX_U_Html
{
    protected static $uniqueId = 0;

    /**
     * inizialize css for html elements
     */
    public static function css()
    {
        self::lightBoxCss();
        self::moreContentCss();
        self::inputPasswordToggleCss();
    }

    /**
     * inizialize js for html elements
     */
    public static function js()
    {
        self::lightBoxJs();
        self::moreContentJs();
        self::inputPasswordToggleJs();
    }

    private static function getUniqueId()
    {
        self::$uniqueId ++;
        return 'dup-html-id-'.self::$uniqueId.'-'.str_replace('.', '-', microtime(true));
    }

    public static function getLigthBox($linkLabelHtml, $titleContent, $htmlContent, $echo = true, $htmlAfterContent = '')
    {
        ob_start();
        $id = self::getUniqueId();
        ?>
        <a class="dup-ligthbox-link" data-dup-ligthbox="<?php echo $id; ?>" ><?php echo $linkLabelHtml; ?></a>
        <div id="<?php echo $id; ?>" class="dub-ligthbox-content close">
            <div class="wrapper" >
                <h2 class="title" ><?php echo htmlspecialchars($titleContent); ?></h2>
                <div class="content" ><?php echo $htmlContent; ?></div><?php echo $htmlAfterContent; ?>
                <button class="close-button" title="Close" ><i class="fa fa-2x fa-times"></i></button>
            </div>
        </div>
        <?php
        if ($echo) {
            ob_end_flush();
        } else {
            return ob_get_clean();
        }
    }

    public static function getLightBoxIframe($linkLabelHtml, $titleContent, $url, $autoUpdate = false, $enableTargetDownload = false, $echo = true)
    {
        $classes      = array('dup-lightbox-iframe');
        $afterContent = '<div class="tool-box">';
        if ($autoUpdate) {
            //$classes[]    = 'auto-update';
            $afterContent .= '<button class="button toggle-auto-update disabled" title="Enable auto reload" ><i class="fa fa-2x fa-redo-alt"></i></button>';
        }
        if ($enableTargetDownload) {
            $path = parse_url($url, PHP_URL_PATH);
            if (!empty($path)) {
                $urlPath  = parse_url($url, PHP_URL_PATH);
                $fileName = basename($urlPath);
            } else {
                $fileName = parse_url($url, PHP_URL_HOST);
            }
            $afterContent .= '<a target="_blank" class="button download-button" title="Download" download="'.DUPX_U::esc_attr($fileName).'" href="'.DUPX_U::esc_attr($url).'"><i class="fa fa-2x fa-download"></i></a>';
        }
        $afterContent .= '</div>';

        $lightBoxContent = '<iframe class="'.implode(' ', $classes).'" data-iframe-url="'.DUPX_U::esc_attr($url).'"></iframe> ';
        return DUPX_U_Html::getLigthBox($linkLabelHtml, $titleContent, $lightBoxContent, $echo, $afterContent);
    }

    protected static function lightBoxCss()
    {
        ?>
        <style>
            .dup-ligthbox-link {
                text-decoration: underline;
                cursor: pointer;
            }
            .dub-ligthbox-content {
                position: fixed;
                top: 0;
                left: 0;
                width: 100vw;
                height: 100vh;
                background-color: #FFFFFF;
                background-color: rgba(255,255,255,0.95);
                z-index: 999999;
                overflow: hidden;
            }
            .dub-ligthbox-content.close {
                width: 0;
                height: 0;
            }
            .dub-ligthbox-content.open {
                width: 100vw;
                height: 100vh;
            }

            .dub-ligthbox-content > .wrapper {
                width: 100vw;
                height: 100vh;
            }

            .dub-ligthbox-content > .wrapper > .title {
                height: 40px;
                line-height: 40px;
                margin: 0;
                padding: 0 15px;
            }

            .dub-ligthbox-content > .wrapper > .content {
                margin: 0 15px 15px;
                border: 1px solid darkgray;
                padding: 15px;
                height: calc(100% - 15px - 40px);
                box-sizing: border-box;
            }

            .dub-ligthbox-content > .wrapper > .tool-box {
                position: absolute;
                top: 0px;
                left: 200px;
            }

            .dub-ligthbox-content .tool-box .button {
                display: inline-block;
                background: transparent;
                border: 0 none;
                padding: 5px;
                margin: 0 10px;
                height: 40px;
                line-height: 40px;
                box-sizing: border-box;
                color: #000;
                cursor: pointer;
            }

            .dub-ligthbox-content .tool-box .button.disabled {
                color: #BABABA;
            }

            .dub-ligthbox-content > .wrapper > .close-button {
                position: absolute;
                top: 0px;
                right: 23px;
                background: transparent;
                border: 0 none;
                padding: 5px;
                margin: 0;
                height: 40px;
                line-height: 40px;
                box-sizing: border-box;
                color: #000;
                cursor: pointer;
            }

            .dub-ligthbox-content .row-cols-2 {
                height: 100%;
            }

            .dub-ligthbox-content .row-cols-2 .col {
                width: 50%;
                box-sizing: border-box;
                float: left;
                border-right: 1px solid black;
                height: 100%;
                overflow: auto;
            }

            .dub-ligthbox-content .row-cols-2 .col-2 {
                padding-left: 15px;
            }

            .dub-ligthbox-content .dup-lightbox-iframe {
                border: 0 none;
                margin: 0;
                padding: 0;
                width: 100%;
                height: 100%;
            }

        </style>
        <?php
    }

    protected static function lightBoxJs()
    {
        ?>
        <script>
            $(document).ready(function ()
            {
                var currentLightboxOpen = null;

                var toggleLightbox = function (target) {
                    if (target.hasClass('close')) {
                        target.animate({
                            height: "100vh",
                            width: "100vw"
                        }, 500, 'linear', function () {
                            $(this).removeClass('close').addClass('open').trigger('dup-lightbox-open');
                            currentLightboxOpen = target;
                        });
                    } else {
                        target.animate({
                            height: "0",
                            width: "0"
                        }, 500, 'linear', function () {
                            $(this).removeClass('open').addClass('close').trigger('dup-lightbox-close');
                            currentLightboxOpen = null;
                        });
                    }
                };

                function dupIframeLoaded(iframe, content) {
                    if (iframe.hasClass('auto-update')) {
                        setTimeout(function () {
                            dupIframeReload(iframe, content);
                        }, 3000);
                    }
                }
                ;

                function dupIframeReload(iframe, content) {
                    if (content.hasClass('open')) {
                        iframe[0].contentDocument.location.reload(true);
                        iframe.ready(function () {
                            dupIframeLoaded(iframe, content);
                        });
                    }
                }
                ;

                $('.dup-lightbox-iframe').on("load", function () {
                    this.contentWindow.scrollBy(0, 100000);
                });

                $('.dub-ligthbox-content').each(function () {
                    var content = $(this).detach().appendTo('body');
                    var iframe = content.find('.dup-lightbox-iframe');
                    if (iframe.length) {
                        content.
                                bind('dup-lightbox-open', function () {
                                    iframe.attr('src', iframe.data('iframe-url')).ready(function () {
                                        dupIframeLoaded(iframe, content);
                                    });
                                }).
                                bind('dup-lightbox-close', function () {
                                    iframe.attr('src', '');
                                });
                    }
                });

                $('[data-dup-ligthbox]').click(function (event) {
                    event.preventDefault();
                    event.stopPropagation();
                    var target = $('#' + $(this).data('dup-ligthbox'));
                    toggleLightbox(target);
                    return false;
                });

                $('.dub-ligthbox-content .toggle-auto-update').click(function (event) {
                    event.stopPropagation();
                    var elem = $(this);
                    var content = elem.closest('.dub-ligthbox-content');
                    var iframe = content.find('.dup-lightbox-iframe');
                    if (iframe.hasClass('auto-update')) {
                        iframe.removeClass('auto-update');
                        elem.addClass('disabled').attr('title', 'Enable auto reload');
                    } else {
                        iframe.addClass('auto-update');
                        elem.removeClass('disabled').attr('title', 'Disable auto reload');
                        dupIframeReload(iframe, content);
                    }
                });

                $('.dub-ligthbox-content .close-button').click(function (event) {
                    event.stopPropagation();
                    toggleLightbox($(this).closest('.dub-ligthbox-content'));
                });

                $(window).keydown(function (event) {
                    if (event.key === 'Escape' && currentLightboxOpen !== null) {
                        currentLightboxOpen.find('.close-button').trigger('click');
                    }
                });
            });
        </script>
        <?php
    }

    /**
     *
     * @param string $htmlContent
     * @param string|string[] $classes additiona classes on main div
     * @param int $step pixel foreach more step
     * @param string $id id on main div
     * @param bool $echo
     *
     * @return string|void
     */
    public static function getMoreContent($htmlContent, $classes = array(), $step = 200, $id = '', $echo = true)
    {
        $inputCls    = filter_var($classes, FILTER_UNSAFE_RAW, FILTER_FORCE_ARRAY);
        $mainClasses = array_merge(array('more-content'), $inputCls);
        $atStep      = max(100, $step);
        $idAttr      = empty($id) ? '' : 'id="'.$id.'" ';
        ob_start();
        ?>
        <div <?php echo $idAttr; ?>class="<?php echo implode(' ', $mainClasses); ?>" data-more-step="<?php echo $atStep; ?>" style="max-height: <?php echo $atStep; ?>px">
            <div class="more-wrapper" ><?php echo $htmlContent; ?></div>
            <button class="more-button" type="button">[ show more ]</button>
            <button class="all-button" type="button" >[ show all ]</button>
        </div>
        <?php
        if ($echo) {
            ob_end_flush();
        } else {
            return ob_get_clean();
        }
    }

    protected static function moreContentCss()
    {
        ?>
        <style>
            .more-content {
                overflow: hidden;
                position: relative;
                max-height: 0;
            }

            .more-content.more::after {
                content: "";
                position: absolute;
                bottom: 0;
                right: 0;
                height: 60px;
                width: 100%;
                background-image: linear-gradient(transparent, rgba(255,255,255,0.95) 70%);
            }

            .more-content .more-button,
            .more-content .all-button {
                position: absolute;
                bottom: 0;
                z-index: 1000;
                display: none;
                background: rgba(255,255,255,0.5);
                border: 0 none;
                padding: 10px 10px 0;
                margin: 0;
                color: #365899;
                cursor: pointer;
            }

            .more-content .more-button:hover,
            .more-content .all-button:hover {
                text-decoration: underline;
            }

            .more-content .more-button {
                left: 0;
            }

            .more-content .all-button {
                right: 0;
            }

            .more-content.more .more-button,
            .more-content.more .all-button {
                display: block;
            }

        </style>
        <?php
    }

    protected static function moreContentJs()
    {
        ?>
        <script>
            $(document).ready(function ()
            {
                function moreCheck(moreCont, moreWrap) {
                    if (moreWrap.height() > moreCont.height()) {
                        moreCont.addClass('more');
                    } else {
                        moreCont.removeClass('more');
                    }
                }

                $('.more-content').each(function () {
                    var moreCont = $(this);
                    var step = moreCont.data('more-step');
                    var moreWrap = $(this).find('.more-wrapper');

                    moreCont.find('.more-button').click(function () {
                        moreCont.css('max-height', "+=" + step + "px");
                        moreCheck(moreCont, moreWrap);
                    });

                    moreCont.find('.all-button').click(function () {
                        moreCont.css('max-height', "none");
                        moreCheck(moreCont, moreWrap);
                    });

                    moreCheck(moreCont, moreWrap);
                });
            });
        </script>
        <?php
    }

    public static function inputPasswordToggle($name, $id = '', $classes = array(), $attrs = array())
    {
        if (!is_array($attrs)) {
            $attrs = array();
        }
        if (!is_array($classes)) {
            if (empty($classes)) {
                $classes = array();
            } else {
                $classes = array($classes);
            }
        }
        $idAttr    = empty($id) ? '_id_'.$name : $id;
        $classes[] = 'input-password-group';

        $attrs['type'] = 'password';
        $attrs['name'] = $name;
        $attrs['id']   = $idAttr;
        $attrsHtml     = array();

        foreach ($attrs as $atName => $atValue) {
            $attrsHtml[] = $atName.'="'.DUPX_U::esc_attr($atValue).'"';
        }
        ?>
        <span class="<?php echo implode(' ', $classes); ?>" >
            <input <?php echo implode(' ', $attrsHtml); ?> />
            <button type="button" title="Show the password"><i class="fas fa-eye fa-xs"></i></button>
        </span>
        <?php
    }

    protected static function inputPasswordToggleCss()
    {
        ?>
        <style>
            .input-password-group {
                display: inline-block;
                width:100%;
                border: 1px solid darkgray;
                border-radius: 4px;
                overflow: hidden;
                position: relative;
            }
            .input-password-group input:not([type=checkbox]):not([type=radio]):not([type=button])  {
                width: calc(100% - 30px) !important;
                padding: 4px;
                line-height: 20px;
                height: 30px;
                box-sizing: border-box;
                display: inline-block;
                border-radius: 0;
                border: 0 none;
                border-right: 1px solid darkgray;
            }
            .input-password-group button {
                display: inline-block;
                width: 30px;
                height: 30px;
                box-sizing: border-box;
                padding: 0;
                margin: 0;
                border: 0 none;
                overflow: hidden;
                float: right;
                cursor: pointer;
            }

            .input-password-group button i {
                line-height: 30px;
                margin: 0;
                padding: 0;
            }

            .input-password-group .parsley-errors-list {
                position: absolute;
                top: 50%;
                transform: translateY(-50%);
                left: 10px;
            }
            
        </style>
        <?php
    }

    protected static function inputPasswordToggleJs()
    {
        ?>
        <script>
            $(document).ready(function () {
                $('.input-password-group').each(function () {
                    var group = $(this);
                    var pwdInput = group.find('input');
                    var pwdLock = group.find('button');

                    pwdLock.click(function () {
                        if (pwdInput.attr('type') === 'password') {
                            pwdInput.attr({
                                'type': 'text',
                                'title': 'Hide the password'
                            });
                            pwdLock.find('i')
                                    .removeClass('fa-eye')
                                    .addClass('fa-eye-slash');
                        } else {
                            pwdInput.attr({
                                'type': 'password',
                                'title': 'Show the password'
                            });
                            pwdLock.find('i').removeClass('fa-eye-slash').addClass('fa-eye');
                        }
                    });
                });

            });
        </script>
        <?php
    }
}
installer/dup-installer/classes/utilities/class.u.php000064400000157565151336065400017103 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Various Static Utility methods for working with the installer
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\U
 *
 */
class DUPX_U
{
	public static $on_php_53_plus;

	public static function init()
	{
		self::$on_php_53_plus = version_compare(PHP_VERSION, '5.3.2', '>=');
	}

	/**
	 * Adds a slash to the end of a file or directory path
	 *
	 * @param string $path		A path
	 *
	 * @return string The original $path with a with '/' added to the end.
	 */
	public static function addSlash($path)
	{
		$last_char = substr($path, strlen($path) - 1, 1);
		if ($last_char != '/') {
			$path .= '/';
		}
		return $path;
	}

    /**
     * Add replacement strings with encoding to $GLOBALS['REPLACE_LIST']
     *
     * @param string $search
     * @param string $replace
     *
     */
    public static function queueReplacementWithEncodings($search, $replace)
    {
        array_push($GLOBALS['REPLACE_LIST'], array('search' => $search, 'replace' => $replace));

        $search_json  = str_replace('"', "", DupLiteSnapJsonU::wp_json_encode($search));
        $replace_json = str_replace('"', "", DupLiteSnapJsonU::wp_json_encode($replace));

        if ($search != $search_json) {
            array_push($GLOBALS['REPLACE_LIST'], array('search' => $search_json, 'replace' => $replace_json));
        }

        $search_urlencode  = urlencode($search);
        $replace_urlencode = urlencode($replace);

        if ($search != $search_urlencode) {
            array_push($GLOBALS['REPLACE_LIST'], array('search' => $search_urlencode, 'replace' => $replace_urlencode));
        }
    }

    /**
     * Add replace strings to substitute old url to new url
     * 1) no protocol old url to no protocol new url (es. //www.hold.url  => //www.new.url)
     * 2) wrong protocol new url to right protocol new url (es. http://www.new.url => https://www.new.url)
     *
     * @param string $old
     * @param string $new
     */
    public static function replacmentUrlOldToNew($old, $new)
    {
        //SEARCH WITH NO PROTOCOL: RAW "//"
        $url_old_raw = str_ireplace(array('http://', 'https://'), '//', $old);
        $url_new_raw = str_ireplace(array('http://', 'https://'), '//', $new);
        DUPX_U::queueReplacementWithEncodings($url_old_raw, $url_new_raw);

        //FORCE NEW PROTOCOL "//"
        $url_new_info   = parse_url($new);
        $url_new_domain = $url_new_info['scheme'].'://'.$url_new_info['host'];

        if ($url_new_info['scheme'] == 'http') {
            $url_new_wrong_protocol = 'https://'.$url_new_info['host'];
        } else {
            $url_new_wrong_protocol = 'http://'.$url_new_info['host'];
        }
        DUPX_U::queueReplacementWithEncodings($url_new_wrong_protocol, $url_new_domain);
    }

    /**
	 * Does one string contain other
	 *
	 * @param string $haystack		The full string to search
	 * @param string $needle		The substring to search on
	 *
	 * @return bool Returns true if the $needle was found in the $haystack
	 */
	public static function contains($haystack, $needle)
	{
		$pos = strpos($haystack, $needle);
		return ($pos !== false);
	}

	/**
	 * Recursively copy files from one directory to another
	 *
	 * @param string $src - Source of files being moved
	 * @param string $dest - Destination of files being moved
	 * @param string $recursive recursively remove all items
	 *
	 * @return bool Returns true if all content was copied
	 */
	public static function copyDirectory($src, $dest, $recursive = true)
	{
		//RSR TODO:Verify this logic
		$success = true;

		// If source is not a directory stop processing
		if (!is_dir($src)) {
			return false;
		}

		// If the destination directory does not exist create it
        if (!DupLiteSnapLibIOU::dirWriteCheckOrMkdir($dest, 'u+rwx')) {
            // If the destination directory could not be created stop processing
            return false;
        }
		
		// Open the source directory to read in files
		$iterator = new DirectoryIterator($src);

		foreach ($iterator as $file) {
			if ($file->isFile()) {
				$success = copy($file->getRealPath(), "$dest/".$file->getFilename());
			} else if (!$file->isDot() && $file->isDir() && $recursive) {
				$success = self::copyDirectory($file->getRealPath(), "$dest/$file", $recursive);
			}

			if (!$success) {
				break;
			}
		}

		return $success;
	}

     /**
     *  Check to see if the internet is accessible
     *
     *  Note: fsocketopen on windows doesn't seem to honor $timeout setting.
     *
     *  @param string $url		A url e.g without prefix "ajax.googleapis.com"
     *  @param string $port		A valid port number
     *
     *  @return bool	Returns true PHP can request the URL
     */
    public static function isURLActive($url, $port, $timeout = 5)
    {
		 $exists = false;
		 if (function_exists('get_headers')) {
			$url =  is_integer($port) ? $url . ':' . $port 	: $url;
			DUPX_Handler::setMode(DUPX_Handler::MODE_OFF);
			if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('default_socket_timeout')) {
				@ini_set("default_socket_timeout", $timeout);
            }
            $headers = @get_headers($url);
			DUPX_Handler::setMode();
			if (is_array($headers) && strpos($headers[0], '404') === false) {
				 $exists = true;
			}
		} else {
			if (function_exists('fsockopen')) {
                if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('default_socket_timeout')) {
                    @ini_set("default_socket_timeout", $timeout); 
                }
				$port = isset($port) && is_integer($port) ? $port : 80;
				$host = parse_url($url, PHP_URL_HOST);
				$connected = @fsockopen($host, $port, $errno, $errstr, $timeout); //website and port
				if ($connected) {
					@fclose($connected);
					$exists = true;
				}
			}
		}
		return $exists;
    }

    /**
     * move all folder content up to parent
     *
     * @param string $subFolderName full path
     * @param boolean $deleteSubFolder if true delete subFolder after moved all
     * @return boolean
     * 
     */
    public static function moveUpfromSubFolder($subFolderName, $deleteSubFolder = false)
    {
        if (!is_dir($subFolderName)) {
            return false;
        }

        $parentFolder = dirname($subFolderName);
        if (!is_writable($parentFolder)) {
            return false;
        }

        $success = true;
        if (($subList = glob(rtrim($subFolderName, '/').'/*', GLOB_NOSORT)) === false) {
            DUPX_Log::info("Problem glob folder ".$subFolderName);
            return false;
        } else {
            foreach ($subList as $cName) {
                $destination = $parentFolder.'/'.basename($cName);
                if (file_exists($destination)) {
                    $success = self::deletePath($destination);
                }

                if ($success) {
                    $success = rename($cName, $destination);
                } else {
                    break;
                }
            }

            if ($success && $deleteSubFolder) {
                $success = self::deleteDirectory($subFolderName, true);
            }
        }

        if (!$success) {
            DUPX_Log::info("Problem om moveUpfromSubFolder subFolder:".$subFolderName);
        }

        return $success;
    }

    /**
     * @param string $archive_filepath  full path of zip archive
     * 
     * @return boolean|string  path of dup-installer folder of false if not found
     */
    public static function findDupInstallerFolder($archive_filepath)
    {
        $zipArchive = new ZipArchive();
        $result     = false;

        if ($zipArchive->open($archive_filepath) === true) {
            for ($i = 0; $i < $zipArchive->numFiles; $i++) {
                $stat     = $zipArchive->statIndex($i);
                $safePath = rtrim(self::setSafePath($stat['name']), '/');
                if (substr_count($safePath, '/') > 2) {
                    continue;
                }

                $exploded = explode('/',$safePath);
                if (($dup_index = array_search('dup-installer' , $exploded)) !== false) {
                    $result = implode('/' , array_slice($exploded , 0 , $dup_index));
                    break;
                }
            }
            if ($zipArchive->close() !== true) {
                DUPX_Log::info("Can't close ziparchive:".$archive_filepath);
                return false;
            }
        } else {
            DUPX_Log::info("Can't open zip archive:".$archive_filepath);
            return false;
        }

        return $result;
    }

    /**
	 *  A safe method used to copy larger files
	 *
	 * @param string $source		The path to the file being copied
	 * @param string $destination	The path to the file being made
	 *
	 * @return null
	 */
	public static function copyFile($source, $destination)
	{
		$sp	 = fopen($source, 'r');
		$op	 = fopen($destination, 'w');

		while (!feof($sp)) {
			$buffer = fread($sp, 512);  // use a buffer of 512 bytes
			fwrite($op, $buffer);
		}
		// close handles
		fclose($op);
		fclose($sp);
	}

	/**
     * Safely remove a directory and recursively if needed
     *
     * @param string $directory The full path to the directory to remove
     * @param string $recursive recursively remove all items
     *
     * @return bool Returns true if all content was removed
     */
    public static function deleteDirectory($directory, $recursive)
    {
        $success = true;

        $filenames = array_diff(scandir($directory), array('.', '..'));

        foreach ($filenames as $filename) {
            $fullPath = $directory.'/'.$filename;

            if (is_dir($fullPath)) {
                if ($recursive) {
                    $success = self::deleteDirectory($fullPath, true);
                }
            } else {
                $success = @unlink($fullPath);
                if ($success === false) {
                    DUPX_Log::info( __FUNCTION__.": Problem deleting file:".$fullPath);
                }
            }

            if ($success === false) {
                DUPX_Log::info("Problem deleting dir:".$directory);
                break;
            }
        }

        return $success && rmdir($directory);
    }

    /**
     * Safely remove a file or directory and recursively if needed
     *
     * @param string $directory The full path to the directory to remove
     *
     * @return bool Returns true if all content was removed
     */
    public static function deletePath($path)
    {
        $success = true;

        if (is_dir($path)) {
            $success = self::deleteDirectory($path, true);
        } else {
            $success = @unlink($path);

            if ($success === false) {
                DUPX_Log::info( __FUNCTION__.": Problem deleting file:".$path);
            }
        }

        return $success;
    }

    /**
	 * Dumps a variable for debugging
	 *
	 * @param string $var The variable to view
	 * @param bool	 $pretty Pretty print the var
	 *
	 * @return object A visual representation of an object
	 */
	public static function dump($var, $pretty = false)
	{
		if ($pretty) {
			echo '<pre>';
			print_r($var);
			echo '</pre>';
		} else {
			print_r($var);
		}
	}

    public static function echoBool($val)
    {
        if($val) {
            echo 'true';
        } else {
            echo 'false';
        }
    }

	/**
	 * Return a string with the elapsed time
	 *
	 * @see getMicrotime()
	 *
	 * @param mixed number $end     The final time in the sequence to measure
	 * @param mixed number $start   The start time in the sequence to measure
	 *
	 * @return  string   The time elapsed from $start to $end
	 */
	public static function elapsedTime($end, $start)
	{
		return sprintf("%.4f sec.", abs($end - $start));
	}

	/**
	 *  Returns 256 spaces
	 *
	 *  PHP_SAPI for fcgi requires a data flush of at least 256
	 *  bytes every 40 seconds or else it forces a script halt
	 *
	 * @return string A series of 256 spaces ' '
	 */
	public static function fcgiFlush()
	{
		echo(str_repeat(' ', 256));
		@flush();
	}

	/**
	 *  Returns the active plugins for the WordPress website in the package
	 *
	 *  @param  obj    $dbh	 A database connection handle
	 *
	 *  @return array  $list A list of active plugins
	 */
	public static function getActivePlugins($dbh)
	{
		// Standard WP installation
		$select = "option_value";
		$table  = "options";
		$where  = "option_name = 'active_plugins'";

		$query = @mysqli_query($dbh, "SELECT {$select} "
        . " FROM `".mysqli_real_escape_string($dbh, $GLOBALS['DUPX_AC']->wp_tableprefix) . mysqli_real_escape_string($dbh, $table)
        . "` WHERE {$where} ");

		if ($query) {
			$row		 = @mysqli_fetch_array($query);
			$plugins_ser_str = stripslashes($row[0]);
			$all_plugins = unserialize($plugins_ser_str);

			// Return data properly
			if (is_array($all_plugins)) {
				return $all_plugins;
			}
		}
		return array();
	}

	/**
	 * Get current microtime as a float.  Method is used for simple profiling
	 *
	 * @see elapsedTime
	 *
	 * @return  string   A float in the form "msec sec", where sec is the number of seconds since the Unix epoch
	 */
	public static function getMicrotime()
	{
		return microtime(true);
	}

	/**
	 *  Gets the size of a variable in memory
	 *
	 *  @param $var		A valid PHP variable
	 *
	 *  @returns int	The amount of memory the variable has consumed
	 */
	public static function getVarSize($var)
	{
		$start_memory	 = memory_get_usage();
		$var			 = unserialize(serialize($var));
		return memory_get_usage() - $start_memory - PHP_INT_SIZE * 8;
	}

	/**
	 * Is the string JSON
	 *
	 * @param string $string Any string blob
	 *
	 * @return bool Returns true if the string is JSON encoded
	 */
	public static function isJSON($string)
	{

		return is_string($string) && is_array(json_decode($string, true)) ? true : false;
	}

	/**
	 * Does a string have non ASCII characters
	 *
	 * @param string $string Any string blob
	 *
	 * @return bool Returns true if any non ASCII character is found in the blob
	 */
	public static function isNonASCII($string)
	{
		return preg_match('/[^\x20-\x7f]/', $string);
	}

	/**
	 * Is an object traversable
	 *
	 * @param object $obj The object to evaluate
	 *
	 * @return bool Returns true if the object can be looped over safely
	 */
	public static function isTraversable($obj)
	{
		if (is_null($obj))
			return false;

		return (is_array($obj) || $obj instanceof Traversable);
	}

    /**
     * Is the server running Windows operating system
     *
     * @return bool Returns true if operating system is Windows
     *
     */
    public static function isWindows()
    {
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
        {
            return true;
        }
        return false;
    }

	/**
	 *  The characters that are special in the replacement value of preg_replace are not the
	 *  same characters that are special in the pattern.  Allows for '$' to be safely passed.
	 *
	 *  @param string $str		The string to replace on
	 */
	public static function pregReplacementQuote($str)
	{
		return preg_replace('/(\$|\\\\)(?=\d)/', '\\\\\1', $str);
	}

	/**
	 * Display human readable byte sizes
	 *
	 * @param string $size	The size in bytes
	 *
	 * @return string Human readable bytes such as 50MB, 1GB
	 */
	public static function readableByteSize($size)
	{
		try {
			$units = array('B', 'KB', 'MB', 'GB', 'TB');
			for ($i = 0; $size >= 1024 && $i < 4; $i++)
				$size /= 1024;
			return round($size, 2).$units[$i];
		} catch (Exception $e) {
			return "n/a";
		}
	}

	/**
	 * Converts shorthand memory notation value to bytes
	 * From http://php.net/manual/en/function.ini-get.php
	 *
	 * @param $val Memory size shorthand notation string
	 *
	 * @return int	Returns the numeric byte from 1MB to 1024
	 */
	public static function returnBytes($val)
	{
		$val	 = trim($val);
		$last	 = strtolower($val[strlen($val) - 1]);
		$val	 = intval($val);
		switch ($last) {
			// The 'G' modifier is available since PHP 5.1.0
			case 'g':
				$val *= 1024;
			case 'm':
				$val *= 1024;
			case 'k':
				$val *= 1024;
				break;
			default :
				$val = null;
		}
		return $val;
	}

	/**
     *  Filter the string to escape the quote
     *
     *  @param string $val		The value to escape quote
     *
     *  @return string Returns the input value escaped
     */
    public static function safeQuote($val)
    {
		$val = addslashes($val);
        return $val;
    }

	/**
	 *  Makes path safe for any OS for PHP
	 *
	 *  Paths should ALWAYS READ be "/"
	 * 		uni:  /home/path/file.txt
	 * 		win:  D:/home/path/file.txt
	 *
	 *  @param string $path		The path to make safe
	 *
	 *  @return string The original $path with a with all slashes facing '/'.
	 */
	public static function setSafePath($path)
	{
		return str_replace("\\", "/", $path);
	}

    /**
     *  Looks for a list of strings in a string and returns each list item that is found
     *
     *  @param array  $list		An array of strings to search for
     *  @param string $haystack	The string blob to search through
     *
     *  @return array An array of strings from the $list array found in the $haystack
     */
    public static function getListValues($list, $haystack)
    {
        $found = array();
        foreach ($list as $var) {
            if (strstr($haystack, $var) !== false) {
                array_push($found, $var);
            }
        }
        return $found;
    }

	/**
	 *  Makes path unsafe for any OS for PHP used primarily to show default
	 *  Windows OS path standard
	 *
	 *  @param string $path		The path to make unsafe
	 *
	 *  @return string The original $path with a with all slashes facing '\'.
	 */
	public static function unsetSafePath($path)
	{
		return str_replace("/", "\\", $path);
	}

	/**
     *  Check PHP version
     *
     *  @param string $version		PHP version we looking for
     *
     *  @return boolean Returns true if version is same or above.
     */
    public static function isVersion($version)
    {
        return (version_compare(PHP_VERSION, $version) >= 0);
	}

	/**
     * Checks if ssl is enabled
     * @return bool
     */
    public static function is_ssl()
    {
        if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
            $_SERVER ['HTTPS'] = 'on';
        }
        
        if ( isset($_SERVER['HTTPS']) ) {
            if ( 'on' == strtolower($_SERVER['HTTPS']) )
                return true;
            if ( '1' == $_SERVER['HTTPS'] )
                return true;
        } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
            return true;
        }
        
        return false;
	}

    /**
     * @param $url string The URL whichs domain you want to get
     * @return string The domain part of the given URL
     *                  www.myurl.co.uk     => myurl.co.uk
     *                  www.google.com      => google.com
     *                  my.test.myurl.co.uk => myurl.co.uk
     *                  www.myurl.localweb  => myurl.localweb
     *
     */
    public static function getDomain($url)
    {
        $pieces = parse_url($url);
        $domain = isset($pieces['host']) ? $pieces['host'] : '';
        if (strpos($domain, ".") !== false) {
            if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
                return $regs['domain'];
            } else {
                $exDomain = explode('.', $domain);
                return implode('.', array_slice($exDomain, -2, 2));
            }
        } else {
            return $domain;
        }
    }

    // START ESCAPING AND SANITIZATION
	/**
	 * Escaping for HTML blocks.
	 *
	 *
	 * @param string $text
	 * @return string
	 */
	public static function esc_html( $text ) {
		$safe_text = DupLiteSnapJsonU::wp_check_invalid_utf8( $text );
		$safe_text = self::_wp_specialchars( $safe_text, ENT_QUOTES );
		/**
		 * Filters a string cleaned and escaped for output in HTML.
		 *
		 * Text passed to esc_html() is stripped of invalid or special characters
		 * before output.
		 *
		 * @param string $safe_text The text after it has been escaped.
		 * @param string $text      The text prior to being escaped.
		*/
		return $safe_text;
	}

	/**
	 * Escape single quotes, htmlspecialchar " < > &, and fix line endings.
	 *
	 * Escapes text strings for echoing in JS. It is intended to be used for inline JS
	 * (in a tag attribute, for example onclick="..."). Note that the strings have to
	 * be in single quotes. The {@see 'js_escape'} filter is also applied here.
	 *
	 *
	 * @param string $text The text to be escaped.
	 * @return string Escaped text.
	 */
	public static function esc_js( $text ) {
		$safe_text = DupLiteSnapJsonU::wp_check_invalid_utf8( $text );
		$safe_text = self::_wp_specialchars( $safe_text, ENT_COMPAT );
		$safe_text = preg_replace( '/&#(x)?0*(?(1)27|39);?/i', "'", stripslashes( $safe_text ) );
		$safe_text = str_replace( "\r", '', $safe_text );
		$safe_text = str_replace( "\n", '\\n', addslashes( $safe_text ) );
		/**
		 * Filters a string cleaned and escaped for output in JavaScript.
		 *
		 * Text passed to esc_js() is stripped of invalid or special characters,
		 * and properly slashed for output.
		 *
		 * @param string $safe_text The text after it has been escaped.
		 * @param string $text      The text prior to being escaped.
		*/
		return $safe_text;
	}

	/**
	 * Escaping for HTML attributes.
	 *
	 * @param string $text
	 * @return string
	 */
	public static function esc_attr( $text ) {
		$safe_text = DupLiteSnapJsonU::wp_check_invalid_utf8( $text );
		$safe_text = self::_wp_specialchars( $safe_text, ENT_QUOTES );
		/**
		 * Filters a string cleaned and escaped for output in an HTML attribute.
		 *
		 * Text passed to esc_attr() is stripped of invalid or special characters
		 * before output.
		 *
		 * @param string $safe_text The text after it has been escaped.
		 * @param string $text      The text prior to being escaped.
		*/
		return $safe_text;
	}

	/**
	 * Escaping for textarea values.
	 *
	 * @param string $text
	 * @return string
	 */
	public static function esc_textarea( $text )
	{
		$safe_text = htmlspecialchars( $text, ENT_QUOTES, 'UTF-8' );
		/**
		 * Filters a string cleaned and escaped for output in a textarea element.
		 *
		 * @param string $safe_text The text after it has been escaped.
		 * @param string $text      The text prior to being escaped.
		*/
		return $safe_text;
	}

	/**
	 * Escape an HTML tag name.
	 *
	 * @param string $tag_name
	 * @return string
	 */
	function tag_escape( $tag_name ) {
		$safe_tag = strtolower( preg_replace('/[^a-zA-Z0-9_:]/', '', $tag_name) );
		/**
		 * Filters a string cleaned and escaped for output as an HTML tag.
		 *
		 * @param string $safe_tag The tag name after it has been escaped.
		 * @param string $tag_name The text before it was escaped.
		*/
		return $safe_tag;
	}

	/**
	 * Converts a number of special characters into their HTML entities.
	 *
	 * Specifically deals with: &, <, >, ", and '.
	 *
	 * $quote_style can be set to ENT_COMPAT to encode " to
	 * &quot;, or ENT_QUOTES to do both. Default is ENT_NOQUOTES where no quotes are encoded.
	 *
	 * @access private
	 *
	 * @staticvar string $_charset
	 *
	 * @param string     $string         The text which is to be encoded.
	 * @param int|string $quote_style    Optional. Converts double quotes if set to ENT_COMPAT,
	 *                                   both single and double if set to ENT_QUOTES or none if set to ENT_NOQUOTES.
	 *                                   Also compatible with old values; converting single quotes if set to 'single',
	 *                                   double if set to 'double' or both if otherwise set.
	 *                                   Default is ENT_NOQUOTES.
	 * @param string     $charset        Optional. The character encoding of the string. Default is false.
	 * @param bool       $double_encode  Optional. Whether to encode existing html entities. Default is false.
	 * @return string The encoded text with HTML entities.
	 */
	public static function _wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) {
		$string = (string) $string;

		if ( 0 === strlen( $string ) )
			return '';

		// Don't bother if there are no specialchars - saves some processing
		if ( ! preg_match( '/[&<>"\']/', $string ) )
			return $string;

		// Account for the previous behaviour of the function when the $quote_style is not an accepted value
		if ( empty( $quote_style ) )
			$quote_style = ENT_NOQUOTES;
		elseif ( ! in_array( $quote_style, array( 0, 2, 3, 'single', 'double' ), true ) )
			$quote_style = ENT_QUOTES;

		// Store the site charset as a static to avoid multiple calls to wp_load_alloptions()
		if ( ! $charset ) {
			static $_charset = null;
			if ( ! isset( $_charset ) ) {
				$_charset = '';
			}
			$charset = $_charset;
		}

		if ( in_array( $charset, array( 'utf8', 'utf-8', 'UTF8' ) ) )
			$charset = 'UTF-8';

		$_quote_style = $quote_style;

		if ( $quote_style === 'double' ) {
			$quote_style = ENT_COMPAT;
			$_quote_style = ENT_COMPAT;
		} elseif ( $quote_style === 'single' ) {
			$quote_style = ENT_NOQUOTES;
		}

		if ( ! $double_encode ) {
			// Guarantee every &entity; is valid, convert &garbage; into &amp;garbage;
			// This is required for PHP < 5.4.0 because ENT_HTML401 flag is unavailable.
			$string = self::wp_kses_normalize_entities( $string );
		}

		$string = @htmlspecialchars( $string, $quote_style, $charset, $double_encode );

		// Back-compat.
		if ( 'single' === $_quote_style )
			$string = str_replace( "'", '&#039;', $string );

		return $string;
	}

	/**
	 * Converts a number of HTML entities into their special characters.
	 *
	 * Specifically deals with: &, <, >, ", and '.
	 *
	 * $quote_style can be set to ENT_COMPAT to decode " entities,
	 * or ENT_QUOTES to do both " and '. Default is ENT_NOQUOTES where no quotes are decoded.
	 *
	 * @param string     $string The text which is to be decoded.
	 * @param string|int $quote_style Optional. Converts double quotes if set to ENT_COMPAT,
	 *                                both single and double if set to ENT_QUOTES or
	 *                                none if set to ENT_NOQUOTES.
	 *                                Also compatible with old _wp_specialchars() values;
	 *                                converting single quotes if set to 'single',
	 *                                double if set to 'double' or both if otherwise set.
	 *                                Default is ENT_NOQUOTES.
	 * @return string The decoded text without HTML entities.
	 */
	public static function wp_specialchars_decode( $string, $quote_style = ENT_NOQUOTES ) {
		$string = (string) $string;

		if ( 0 === strlen( $string ) ) {
			return '';
		}

		// Don't bother if there are no entities - saves a lot of processing
		if ( strpos( $string, '&' ) === false ) {
			return $string;
		}

		// Match the previous behaviour of _wp_specialchars() when the $quote_style is not an accepted value
		if ( empty( $quote_style ) ) {
			$quote_style = ENT_NOQUOTES;
		} elseif ( !in_array( $quote_style, array( 0, 2, 3, 'single', 'double' ), true ) ) {
			$quote_style = ENT_QUOTES;
		}

		// More complete than get_html_translation_table( HTML_SPECIALCHARS )
		$single = array( '&#039;'  => '\'', '&#x27;' => '\'' );
		$single_preg = array( '/&#0*39;/'  => '&#039;', '/&#x0*27;/i' => '&#x27;' );
		$double = array( '&quot;' => '"', '&#034;'  => '"', '&#x22;' => '"' );
		$double_preg = array( '/&#0*34;/'  => '&#034;', '/&#x0*22;/i' => '&#x22;' );
		$others = array( '&lt;'   => '<', '&#060;'  => '<', '&gt;'   => '>', '&#062;'  => '>', '&amp;'  => '&', '&#038;'  => '&', '&#x26;' => '&' );
		$others_preg = array( '/&#0*60;/'  => '&#060;', '/&#0*62;/'  => '&#062;', '/&#0*38;/'  => '&#038;', '/&#x0*26;/i' => '&#x26;' );

		if ( $quote_style === ENT_QUOTES ) {
			$translation = array_merge( $single, $double, $others );
			$translation_preg = array_merge( $single_preg, $double_preg, $others_preg );
		} elseif ( $quote_style === ENT_COMPAT || $quote_style === 'double' ) {
			$translation = array_merge( $double, $others );
			$translation_preg = array_merge( $double_preg, $others_preg );
		} elseif ( $quote_style === 'single' ) {
			$translation = array_merge( $single, $others );
			$translation_preg = array_merge( $single_preg, $others_preg );
		} elseif ( $quote_style === ENT_NOQUOTES ) {
			$translation = $others;
			$translation_preg = $others_preg;
		}

		// Remove zero padding on numeric entities
		$string = preg_replace( array_keys( $translation_preg ), array_values( $translation_preg ), $string );

		// Replace characters according to translation table
		return strtr( $string, $translation );
	}

	/**
	 * Perform a deep string replace operation to ensure the values in $search are no longer present
	 *
	 * Repeats the replacement operation until it no longer replaces anything so as to remove "nested" values
	 * e.g. $subject = '%0%0%0DDD', $search ='%0D', $result ='' rather than the '%0%0DD' that
	 * str_replace would return
	 * @access private
	 *
	 * @param string|array $search  The value being searched for, otherwise known as the needle.
	 *                              An array may be used to designate multiple needles.
	 * @param string       $subject The string being searched and replaced on, otherwise known as the haystack.
	 * @return string The string with the replaced svalues.
	 */
	private static function _deep_replace( $search, $subject ) {
		$subject = (string) $subject;

		$count = 1;
		while ( $count ) {
			$subject = str_replace( $search, '', $subject, $count );
		}

		return $subject;
	}

	/**
     * Converts and fixes HTML entities.
     *
     * This function normalizes HTML entities. It will convert `AT&T` to the correct
     * `AT&amp;T`, `&#00058;` to `&#58;`, `&#XYZZY;` to `&amp;#XYZZY;` and so on.
     *
     * @param string $string Content to normalize entities
     * @return string Content with normalized entities
     */
    public static function wp_kses_normalize_entities($string)
    {
        // Disarm all entities by converting & to &amp;
        $string = str_replace('&', '&amp;', $string);

        // Change back the allowed entities in our entity whitelist
        $string = preg_replace_callback('/&amp;([A-Za-z]{2,8}[0-9]{0,2});/', array(__CLASS__, 'wp_kses_named_entities'), $string);
        $string = preg_replace_callback('/&amp;#(0*[0-9]{1,7});/', array(__CLASS__, 'wp_kses_normalize_entities2'), $string);
        $string = preg_replace_callback('/&amp;#[Xx](0*[0-9A-Fa-f]{1,6});/', array(__CLASS__, 'wp_kses_normalize_entities3'), $string);

        return $string;
    }

    /**
	 * Callback for wp_kses_normalize_entities() regular expression.
	 *
	 * This function only accepts valid named entity references, which are finite,
	 * case-sensitive, and highly scrutinized by HTML and XML validators.
	 *
	 * @global array $allowedentitynames
	 *
	 * @param array $matches preg_replace_callback() matches array
	 * @return string Correctly encoded entity
	 */
	public static function wp_kses_named_entities($matches) {
		if ( empty($matches[1]) )
			return '';

			$allowedentitynames = array(
				'nbsp',    'iexcl',  'cent',    'pound',  'curren', 'yen',
				'brvbar',  'sect',   'uml',     'copy',   'ordf',   'laquo',
				'not',     'shy',    'reg',     'macr',   'deg',    'plusmn',
				'acute',   'micro',  'para',    'middot', 'cedil',  'ordm',
				'raquo',   'iquest', 'Agrave',  'Aacute', 'Acirc',  'Atilde',
				'Auml',    'Aring',  'AElig',   'Ccedil', 'Egrave', 'Eacute',
				'Ecirc',   'Euml',   'Igrave',  'Iacute', 'Icirc',  'Iuml',
				'ETH',     'Ntilde', 'Ograve',  'Oacute', 'Ocirc',  'Otilde',
				'Ouml',    'times',  'Oslash',  'Ugrave', 'Uacute', 'Ucirc',
				'Uuml',    'Yacute', 'THORN',   'szlig',  'agrave', 'aacute',
				'acirc',   'atilde', 'auml',    'aring',  'aelig',  'ccedil',
				'egrave',  'eacute', 'ecirc',   'euml',   'igrave', 'iacute',
				'icirc',   'iuml',   'eth',     'ntilde', 'ograve', 'oacute',
				'ocirc',   'otilde', 'ouml',    'divide', 'oslash', 'ugrave',
				'uacute',  'ucirc',  'uuml',    'yacute', 'thorn',  'yuml',
				'quot',    'amp',    'lt',      'gt',     'apos',   'OElig',
				'oelig',   'Scaron', 'scaron',  'Yuml',   'circ',   'tilde',
				'ensp',    'emsp',   'thinsp',  'zwnj',   'zwj',    'lrm',
				'rlm',     'ndash',  'mdash',   'lsquo',  'rsquo',  'sbquo',
				'ldquo',   'rdquo',  'bdquo',   'dagger', 'Dagger', 'permil',
				'lsaquo',  'rsaquo', 'euro',    'fnof',   'Alpha',  'Beta',
				'Gamma',   'Delta',  'Epsilon', 'Zeta',   'Eta',    'Theta',
				'Iota',    'Kappa',  'Lambda',  'Mu',     'Nu',     'Xi',
				'Omicron', 'Pi',     'Rho',     'Sigma',  'Tau',    'Upsilon',
				'Phi',     'Chi',    'Psi',     'Omega',  'alpha',  'beta',
				'gamma',   'delta',  'epsilon', 'zeta',   'eta',    'theta',
				'iota',    'kappa',  'lambda',  'mu',     'nu',     'xi',
				'omicron', 'pi',     'rho',     'sigmaf', 'sigma',  'tau',
				'upsilon', 'phi',    'chi',     'psi',    'omega',  'thetasym',
				'upsih',   'piv',    'bull',    'hellip', 'prime',  'Prime',
				'oline',   'frasl',  'weierp',  'image',  'real',   'trade',
				'alefsym', 'larr',   'uarr',    'rarr',   'darr',   'harr',
				'crarr',   'lArr',   'uArr',    'rArr',   'dArr',   'hArr',
				'forall',  'part',   'exist',   'empty',  'nabla',  'isin',
				'notin',   'ni',     'prod',    'sum',    'minus',  'lowast',
				'radic',   'prop',   'infin',   'ang',    'and',    'or',
				'cap',     'cup',    'int',     'sim',    'cong',   'asymp',
				'ne',      'equiv',  'le',      'ge',     'sub',    'sup',
				'nsub',    'sube',   'supe',    'oplus',  'otimes', 'perp',
				'sdot',    'lceil',  'rceil',   'lfloor', 'rfloor', 'lang',
				'rang',    'loz',    'spades',  'clubs',  'hearts', 'diams',
				'sup1',    'sup2',   'sup3',    'frac14', 'frac12', 'frac34',
				'there4',
			);

		$i = $matches[1];
		return ( ! in_array( $i, $allowedentitynames ) ) ? "&amp;$i;" : "&$i;";
	}


    /**
    * Helper function to determine if a Unicode value is valid.
    *
    * @param int $i Unicode value
    * @return bool True if the value was a valid Unicode number
    */
    public static function wp_valid_unicode($i) {
        return ( $i == 0x9 || $i == 0xa || $i == 0xd ||
                ($i >= 0x20 && $i <= 0xd7ff) ||
                ($i >= 0xe000 && $i <= 0xfffd) ||
                ($i >= 0x10000 && $i <= 0x10ffff) );
    }

	/**
	 * Callback for wp_kses_normalize_entities() regular expression.
	 *
	 * This function helps wp_kses_normalize_entities() to only accept 16-bit
	 * values and nothing more for `&#number;` entities.
	 *
	 * @access private
	 *
	 * @param array $matches preg_replace_callback() matches array
	 * @return string Correctly encoded entity
	 */
	public static function wp_kses_normalize_entities2($matches) {
		if ( empty($matches[1]) )
			return '';

		$i = $matches[1];
		if (self::wp_valid_unicode($i)) {
			$i = str_pad(ltrim($i,'0'), 3, '0', STR_PAD_LEFT);
			$i = "&#$i;";
		} else {
			$i = "&amp;#$i;";
		}

		return $i;
	}

	/**
	 * Callback for wp_kses_normalize_entities() for regular expression.
	 *
	 * This function helps wp_kses_normalize_entities() to only accept valid Unicode
	 * numeric entities in hex form.
	 *
	 * @access private
	 *
	 * @param array $matches preg_replace_callback() matches array
	 * @return string Correctly encoded entity
	 */
	public static function wp_kses_normalize_entities3($matches) {
		if ( empty($matches[1]) )
			return '';

		$hexchars = $matches[1];
		return ( ! self::wp_valid_unicode( hexdec( $hexchars ) ) ) ? "&amp;#x$hexchars;" : '&#x'.ltrim($hexchars,'0').';';
	}

	/**
	 * Retrieve a list of protocols to allow in HTML attributes.
	 *
	 * @since 3.3.0
	 * @since 4.3.0 Added 'webcal' to the protocols array.
	 * @since 4.7.0 Added 'urn' to the protocols array.
	 *
	 * @see wp_kses()
	 * @see esc_url()
	 *
	 * @staticvar array $protocols
	 *
	 * @return array Array of allowed protocols. Defaults to an array containing 'http', 'https',
	 *               'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet',
	 *               'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal', and 'urn'.
	 */
	public static function wp_allowed_protocols() {
		static $protocols = array();

		if ( empty( $protocols ) ) {
			$protocols = array( 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal', 'urn' );
		}

		return $protocols;
	}

	/**
	 * Checks and cleans a URL.
	 *
	 * A number of characters are removed from the URL. If the URL is for displaying
	 * (the default behaviour) ampersands are also replaced. The {@see 'clean_url'} filter
	 * is applied to the returned cleaned URL.
	 *
	 * @since 2.8.0
	 *
	 * @param string $url       The URL to be cleaned.
	 * @param array  $protocols Optional. An array of acceptable protocols.
	 *		                    Defaults to return value of wp_allowed_protocols()
	* @param string $_context  Private. Use esc_url_raw() for database usage.
	* @return string The cleaned $url after the {@see 'clean_url'} filter is applied.
	*/
	public static function esc_url( $url, $protocols = null, $_context = 'display' ) {
		$original_url = $url;

		if ( '' == $url )
			return $url;

		$url = str_replace( ' ', '%20', $url );
		$url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\[\]\\x80-\\xff]|i', '', $url);

		if ( '' === $url ) {
			return $url;
		}

		if ( 0 !== stripos( $url, 'mailto:' ) ) {
			$strip = array('%0d', '%0a', '%0D', '%0A');
			$url = self::_deep_replace($strip, $url);
		}

		$url = str_replace(';//', '://', $url);
		/* If the URL doesn't appear to contain a scheme, we
		* presume it needs http:// prepended (unless a relative
		* link starting with /, # or ? or a php file).
		*/
		if ( strpos($url, ':') === false && ! in_array( $url[0], array( '/', '#', '?' ) ) &&
			! preg_match('/^[a-z0-9-]+?\.php/i', $url) )
			$url = 'http://' . $url;

		// Replace ampersands and single quotes only when displaying.
		if ( 'display' == $_context ) {
			$url = self::wp_kses_normalize_entities( $url );
			$url = str_replace( '&amp;', '&#038;', $url );
			$url = str_replace( "'", '&#039;', $url );
		}

		if ( ( false !== strpos( $url, '[' ) ) || ( false !== strpos( $url, ']' ) ) ) {

			$parsed = wp_parse_url( $url );
			$front  = '';

			if ( isset( $parsed['scheme'] ) ) {
				$front .= $parsed['scheme'] . '://';
			} elseif ( '/' === $url[0] ) {
				$front .= '//';
			}

			if ( isset( $parsed['user'] ) ) {
				$front .= $parsed['user'];
			}

			if ( isset( $parsed['pass'] ) ) {
				$front .= ':' . $parsed['pass'];
			}

			if ( isset( $parsed['user'] ) || isset( $parsed['pass'] ) ) {
				$front .= '@';
			}

			if ( isset( $parsed['host'] ) ) {
				$front .= $parsed['host'];
			}

			if ( isset( $parsed['port'] ) ) {
				$front .= ':' . $parsed['port'];
			}

			$end_dirty = str_replace( $front, '', $url );
			$end_clean = str_replace( array( '[', ']' ), array( '%5B', '%5D' ), $end_dirty );
			$url       = str_replace( $end_dirty, $end_clean, $url );

		}

		if ( '/' === $url[0] ) {
			$good_protocol_url = $url;
		} else {
			if ( ! is_array( $protocols ) )
				$protocols = self::wp_allowed_protocols();
			$good_protocol_url = self::wp_kses_bad_protocol( $url, $protocols );
			if ( strtolower( $good_protocol_url ) != strtolower( $url ) )
				return '';
		}

		/**
		 * Filters a string cleaned and escaped for output as a URL.
		 *
		 * @since 2.3.0
		 *
		 * @param string $good_protocol_url The cleaned URL to be returned.
		 * @param string $original_url      The URL prior to cleaning.
		 * @param string $_context          If 'display', replace ampersands and single quotes only.
		 */
		return $good_protocol_url;
	}


	/**
	 * Removes any invalid control characters in $string.
	 *
	 * Also removes any instance of the '\0' string.
	 *
	 * @param string $string
	 * @param array $options Set 'slash_zero' => 'keep' when '\0' is allowed. Default is 'remove'.
	 * @return string
	 */
	public static function wp_kses_no_null( $string, $options = null ) {
		if ( ! isset( $options['slash_zero'] ) ) {
			$options = array( 'slash_zero' => 'remove' );
		}

		$string = preg_replace( '/[\x00-\x08\x0B\x0C\x0E-\x1F]/', '', $string );
		if ( 'remove' == $options['slash_zero'] ) {
			$string = preg_replace( '/\\\\+0+/', '', $string );
		}

		return $string;
	}


	/**
	 * Sanitize string from bad protocols.
	 *
	 * This function removes all non-allowed protocols from the beginning of
	 * $string. It ignores whitespace and the case of the letters, and it does
	 * understand HTML entities. It does its work in a while loop, so it won't be
	 * fooled by a string like "javascript:javascript:alert(57)".
	 *
	 * @param string $string            Content to filter bad protocols from
	 * @param array  $allowed_protocols Allowed protocols to keep
	 * @return string Filtered content
	 */
	public static function wp_kses_bad_protocol($string, $allowed_protocols) {
		$string = self::wp_kses_no_null($string);
		$iterations = 0;

		do {
			$original_string = $string;
			$string = self::wp_kses_bad_protocol_once($string, $allowed_protocols);
		} while ( $original_string != $string && ++$iterations < 6 );

		if ( $original_string != $string )
			return '';

		return $string;
	}

	/**
	 * Sanitizes content from bad protocols and other characters.
	 *
	 * This function searches for URL protocols at the beginning of $string, while
	 * handling whitespace and HTML entities.
	 *
	 * @param string $string            Content to check for bad protocols
	 * @param string $allowed_protocols Allowed protocols
	 * @return string Sanitized content
	 */
	public static function wp_kses_bad_protocol_once($string, $allowed_protocols, $count = 1 ) {
		$string2 = preg_split( '/:|&#0*58;|&#x0*3a;/i', $string, 2 );
		if ( isset($string2[1]) && ! preg_match('%/\?%', $string2[0]) ) {
			$string = trim( $string2[1] );
			$protocol = self::wp_kses_bad_protocol_once2( $string2[0], $allowed_protocols );
			if ( 'feed:' == $protocol ) {
				if ( $count > 2 )
					return '';
				$string = wp_kses_bad_protocol_once( $string, $allowed_protocols, ++$count );
				if ( empty( $string ) )
					return $string;
			}
			$string = $protocol . $string;
		}

		return $string;
	}

	/**
     * Convert all entities to their character counterparts.
     *
     * This function decodes numeric HTML entities (`&#65;` and `&#x41;`).
     * It doesn't do anything with other entities like &auml;, but we don't
     * need them in the URL protocol whitelisting system anyway.
     *
     * @param string $string Content to change entities
     * @return string Content after decoded entities
     */
    public static function wp_kses_decode_entities($string)
    {
        $string = preg_replace_callback('/&#([0-9]+);/', array(__CLASS__, '_wp_kses_decode_entities_chr'), $string);
        $string = preg_replace_callback('/&#[Xx]([0-9A-Fa-f]+);/', array(__CLASS__, '_wp_kses_decode_entities_chr_hexdec'), $string);

        return $string;
    }

    /**
	 * Regex callback for wp_kses_decode_entities()
	 *
	 * @param array $match preg match
	 * @return string
	 */
	public static function _wp_kses_decode_entities_chr( $match ) {
		return chr( $match[1] );
	}

	/**
	 * Regex callback for wp_kses_decode_entities()
	 *
	 * @param array $match preg match
	 * @return string
	 */
	public static function _wp_kses_decode_entities_chr_hexdec( $match ) {
		return chr( hexdec( $match[1] ) );
	}

	/**
	 * Callback for wp_kses_bad_protocol_once() regular expression.
	 *
	 * This function processes URL protocols, checks to see if they're in the
	 * white-list or not, and returns different data depending on the answer.
	 *
	 * @access private
	 *
	 * @param string $string            URI scheme to check against the whitelist
	 * @param string $allowed_protocols Allowed protocols
	 * @return string Sanitized content
	 */
	public static function wp_kses_bad_protocol_once2( $string, $allowed_protocols ) {
		$string2 = self::wp_kses_decode_entities($string);
		$string2 = preg_replace('/\s/', '', $string2);
		$string2 = self::wp_kses_no_null($string2);
		$string2 = strtolower($string2);

		$allowed = false;
		foreach ( (array) $allowed_protocols as $one_protocol ) {
			if ( strtolower($one_protocol) == $string2 ) {
				$allowed = true;
				break;
			}
		}

		if ($allowed)
			return "$string2:";
		else
			return '';
	}

	/**
	 * Performs esc_url() for database usage.
	 *
	 * @param string $url       The URL to be cleaned.
	 * @param array  $protocols An array of acceptable protocols.
	 * @return string The cleaned URL.
	 */
	public static function esc_url_raw( $url, $protocols = null ) {
		return self::esc_url( $url, $protocols, 'db' );
	}

	// SANITIZE Functions

	/**
	 * Normalize EOL characters and strip duplicate whitespace.
	 *
	 * @param string $str The string to normalize.
	 * @return string The normalized string.
	 */
	public static function normalize_whitespace( $str ) {
		$str  = trim( $str );
		$str  = str_replace( "\r", "\n", $str );
		$str  = preg_replace( array( '/\n+/', '/[ \t]+/' ), array( "\n", ' ' ), $str );
		return $str;
	}

	/**
	 * Properly strip all HTML tags including script and style
	 *
	 * This differs from strip_tags() because it removes the contents of
	 * the `<script>` and `<style>` tags. E.g. `strip_tags( '<script>something</script>' )`
	 * will return 'something'. wp_strip_all_tags will return ''
	 *
	 * @param string $string        String containing HTML tags
	 * @param bool   $remove_breaks Optional. Whether to remove left over line breaks and white space chars
	 * @return string The processed string.
	 */
	public static function wp_strip_all_tags($string, $remove_breaks = false) {
		$string = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $string );
		$string = strip_tags($string);

		if ( $remove_breaks )
			$string = preg_replace('/[\r\n\t ]+/', ' ', $string);

		return trim( $string );
	}

	/**
	 * Sanitizes a string from user input or from the database.
	 *
	 * - Checks for invalid UTF-8,
	 * - Converts single `<` characters to entities
	 * - Strips all tags
	 * - Removes line breaks, tabs, and extra whitespace
	 * - Strips octets
	 *
	 * @see sanitize_textarea_field()
	 * @see wp_check_invalid_utf8()
	 * @see wp_strip_all_tags()
	 *
	 * @param string $str String to sanitize.
	 * @return string Sanitized string.
	 */
	public static function sanitize_text_field( $str ) {
		$filtered = self::_sanitize_text_fields( $str, false );

		/**
		 * Filters a sanitized text field string.
		 *
		 * @param string $filtered The sanitized string.
		 * @param string $str      The string prior to being sanitized.
		 */
		return $filtered;
	}

	/**
	 * Sanitizes a multiline string from user input or from the database.
	 *
	 * The function is like sanitize_text_field(), but preserves
	 * new lines (\n) and other whitespace, which are legitimate
	 * input in textarea elements.
	 *
	 * @see sanitize_text_field()
	 *
	 * @since 4.7.0
	 *
	 * @param string $str String to sanitize.
	 * @return string Sanitized string.
	 */
	public static function sanitize_textarea_field( $str ) {
		$filtered = self::_sanitize_text_fields( $str, true );

		/**
		 * Filters a sanitized textarea field string.
		 *
		 * @since 4.7.0
		 *
		 * @param string $filtered The sanitized string.
		 * @param string $str      The string prior to being sanitized.
		 */
		return $filtered;
	}

	/**
	 * Internal helper function to sanitize a string from user input or from the db
	 *
	 * @since 4.7.0
	 * @access private
	 *
	 * @param string $str String to sanitize.
	 * @param bool $keep_newlines optional Whether to keep newlines. Default: false.
	 * @return string Sanitized string.
	 */
	public static function _sanitize_text_fields( $str, $keep_newlines = false ) {
		$filtered = DupLiteSnapJsonU::wp_check_invalid_utf8( $str );

		if ( strpos($filtered, '<') !== false ) {
			$filtered = self::wp_pre_kses_less_than( $filtered );
			// This will strip extra whitespace for us.
			$filtered = self::wp_strip_all_tags( $filtered, false );

			// Use html entities in a special case to make sure no later
			// newline stripping stage could lead to a functional tag
			$filtered = str_replace("<\n", "&lt;\n", $filtered);
		}

		if ( ! $keep_newlines ) {
			$filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered );
		}
		$filtered = trim( $filtered );

		$found = false;
		while ( preg_match('/%[a-f0-9]{2}/i', $filtered, $match) ) {
			$filtered = str_replace($match[0], '', $filtered);
			$found = true;
		}

		if ( $found ) {
			// Strip out the whitespace that may now exist after removing the octets.
			$filtered = trim( preg_replace('/ +/', ' ', $filtered) );
		}

		return $filtered;
	}

	/**
	 * Convert lone less than signs.
	 *
	 * KSES already converts lone greater than signs.
	 *
	 * @param string $text Text to be converted.
	 * @return string Converted text.
	 */
	public static function wp_pre_kses_less_than( $text ) {
		return preg_replace_callback('%<[^>]*?((?=<)|>|$)%', array('self', 'wp_pre_kses_less_than_callback'), $text);
	}

	/**
	 * Callback function used by preg_replace.
	 *
	 * @param array $matches Populated by matches to preg_replace.
	 * @return string The text returned after esc_html if needed.
	 */
	public static function wp_pre_kses_less_than_callback( $matches ) {
		if ( false === strpos($matches[0], '>') )
			return self::esc_html($matches[0]);
		return $matches[0];
	}


	/**
	 * Remove slashes from a string or array of strings.
	 *
	 * This should be used to remove slashes from data passed to core API that
	 * expects data to be unslashed.
	 *
	 * @since 3.6.0
	 *
	 * @param string|array $value String or array of strings to unslash.
	 * @return string|array Unslashed $value
	 */
	public static function wp_unslash($value) {
		return self::stripslashes_deep( $value );
	}

	/**
	 * Navigates through an array, object, or scalar, and removes slashes from the values.
	 *
	 * @param mixed $value The value to be stripped.
	 * @return mixed Stripped value.
	 */
	public static function stripslashes_deep($value) {
		return self::map_deep($value, array('self', 'stripslashes_from_strings_only'));
	}

	/**
	 * Maps a function to all non-iterable elements of an array or an object.
	 *
	 * This is similar to `array_walk_recursive()` but acts upon objects too.
	 *
	 * @since 4.4.0
	 *
	 * @param mixed    $value    The array, object, or scalar.
	 * @param callable $callback The function to map onto $value.
	 * @return mixed The value with the callback applied to all non-arrays and non-objects inside it.
	 */
	public static function map_deep($value, $callback) {
		if (is_array($value)) {
			foreach ($value as $index => $item) {
				$value[$index] = self::map_deep($item, $callback);
			}
		} elseif (is_object($value)) {
			$object_vars = get_object_vars($value);
			foreach ($object_vars as $property_name => $property_value) {
				$value->$property_name = self::map_deep($property_value, $callback);
			}
		} else {
			$value = call_user_func($callback, $value);
		}

		return $value;
	}

	/**
	 * Callback function for `stripslashes_deep()` which strips slashes from strings.
	 *
	 * @since 4.4.0
	 *
	 * @param mixed $value The array or string to be stripped.
	 * @return mixed $value The stripped value.
	 */
	public static function stripslashes_from_strings_only($value) {
		return is_string($value) ? stripslashes($value) : $value;
	}


	/**
	 * Normalize a filesystem path.
	 *
	 * On windows systems, replaces backslashes with forward slashes
	 * and forces upper-case drive letters.
	 * Allows for two leading slashes for Windows network shares, but
	 * ensures that all other duplicate slashes are reduced to a single.
	 *
	 * @param string $path Path to normalize.
	 * @return string Normalized path.
	 */
	public static function wp_normalize_path( $path ) {
		$wrapper = '';
		if ( self::wp_is_stream( $path ) ) {
			list( $wrapper, $path ) = explode( '://', $path, 2 );
			$wrapper .= '://';
		}

		// Standardise all paths to use /
		$path = str_replace( '\\', '/', $path );

		// Replace multiple slashes down to a singular, allowing for network shares having two slashes.
		$path = preg_replace( '|(?<=.)/+|', '/', $path );

		// Windows paths should uppercase the drive letter
		if ( ':' === substr( $path, 1, 1 ) ) {
			$path = ucfirst( $path );
		}

		return $wrapper . $path;
	}
    
    /**
     * Test if a given path is a stream URL
     * 
     * from WordPress function wp_is_stream
     *
     * @param string $path The resource path or URL.
     * @return bool True if the path is a stream URL.
     */
    public static function wp_is_stream($path)
    {
        $scheme_separator = strpos($path, '://');

        if (false === $scheme_separator) {
            // $path isn't a stream
            return false;
        }

        $stream = substr($path, 0, $scheme_separator);

        return in_array($stream, stream_get_wrappers(), true);
    }
     
    /**
     * Toggle maintenance mode for the site.
     *
     * Creates/deletes the maintenance file to enable/disable maintenance mode.
     *
     * @param bool $enable True to enable maintenance mode, false to disable.
     */
    public static function maintenanceMode($enable = false)
    {
        $pathNew = DupLiteSnapLibIOU::safePathUntrailingslashit($GLOBALS['DUPX_ROOT']);
        if (!is_writable($pathNew)) {
            DUPX_Log::info('CAN\'T SET/REMOVE MAINTENANCE MODE, ROOT FOLDER NOT WRITABLE');
            return;
        }

        $file = $pathNew.'/.maintenance';
        if ($enable) {
            DUPX_Log::info('MAINTENANCE MODE ENABLE');
            // Create maintenance file to signal that we are upgrading
            $maintenanceString = '<?php $upgrading = '.time().'; ?>';
            if (file_exists($file)) {
                @unlink($file);
            }
            file_put_contents($file, $maintenanceString);
        } else if (!$enable && file_exists($file)) {
            DUPX_Log::info('MAINTENANCE MODE DISABLE');
            unlink($file);
        }
    }

    /**
     * Check if string is base64 encoded
     *
     * @param type $str
     * @return boolean|str return false if isn't base64 string or decoded string
     */
    public static function is_base64($str)
    {
        // Check if there are valid base64 characters
        if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $str)) {
            return false;
        }

        // Decode the string in strict mode and check the results
        $decoded = base64_decode($str, true);
        if (false === $decoded) {
            return false;
        }

        // Encode the string again
        if (base64_encode($decoded) != $str) {
            return false;
        }

        return $decoded;
    }

    /**
     *
     * @param array $matches
     * @return string
     */
    public static function encodeUtf8CharFromRegexMatch($matches)
    {
        if (empty($matches) || !is_array($matches)) {
            return '';
        } else {
            return json_decode('"'.$matches[0].'"');
        }
    }

    /**
     * this function escape generic string to prevent security issue.
     * Used to replace string in wp transformer
     * 
     * for example
     * abc'" become "abc'\""
     *
     * @param string $str input string
     * @param bool $addQuote if true add " before and after string
     * @return string
     */
    public static function getEscapedGenericString($str, $addQuote = true)
    {
        $result = DupLiteSnapJsonU::wp_json_encode(trim($str));
        $result = str_replace(array('\/', '$'), array('/', '\\$'), $result);
        $result = preg_replace_callback(
            '/\\\\u[a-fA-F0-9]{4}/m', array(__CLASS__, 'encodeUtf8CharFromRegexMatch'), $result
        );

        if (!$addQuote) {
            $result = substr($result, 1 , strlen($result) -2);
        }
        return $result;
    }

    /**
     *
     * @param array $input // es $_POST $_GET $_REQUEST
     * @param string $key // key of array to check
     * @param array $options // array('default' => null, default value to return if key don't exist
     *                                'trim' => false // if true trim sanitize value
     *                          )
     * @return type
     */
    public static function isset_sanitize($input, $key, $options = array())
    {
        $opt = array_merge(array('default' => null, 'trim' => false), $options);
        if (isset($input[$key])) {
            $result = DUPX_U::sanitize_text_field($input[$key]);
            if ($opt['trim']) {
                $result = trim($result);
            }
            return $result;
        } else {
            return $opt['default'];
        }
    }

    public static function boolToStr($input)
    {
        return $input ? 'true' : 'false';
    }

    public static function boolToEnable($input)
    {
        return $input ? 'enable' : 'disable';
    }
}installer/dup-installer/classes/utilities/class.u.notices.manager.php000064400000144313151336065400022142 0ustar00<?php
/**
 * Notice manager
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\U
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Notice manager
 * singleton class
 */
final class DUPX_NOTICE_MANAGER
{
    const ADD_NORMAL                   = 0; // add notice in list
    const ADD_UNIQUE                   = 1; // add if unique id don't exists
    const ADD_UNIQUE_UPDATE            = 2; // add or update notice unique id
    const ADD_UNIQUE_APPEND            = 3; // append long msg
    const ADD_UNIQUE_APPEND_IF_EXISTS  = 4; // append long msg if already exists item
    const ADD_UNIQUE_PREPEND           = 5; // append long msg
    const ADD_UNIQUE_PREPEND_IF_EXISTS = 6; // prepend long msg if already exists item
    const DEFAULT_UNIQUE_ID_PREFIX = '__auto_unique_id__';

    private static $uniqueCountId = 0;

    /**
     *
     * @var DUPX_NOTICE_ITEM[]
     */
    private $nextStepNotices = array();

    /**
     *
     * @var DUPX_NOTICE_ITEM[]
     */
    private $finalReporNotices = array();

    /**
     *
     * @var DUPX_NOTICE_MANAGER
     */
    private static $instance = null;

    /**
     *
     * @var string
     */
    private $persistanceFile = null;

    /**
     *
     * @return DUPX_S_R_MANAGER
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    private function __construct()
    {
        $this->persistanceFile = $GLOBALS["NOTICES_FILE_PATH"];
        $this->loadNotices();
    }

    /**
     * save notices from json file
     */
    public function saveNotices()
    {
        $notices = array(
            'globalData' => array(
                'uniqueCountId' => self::$uniqueCountId
            ),
            'nextStep' => array(),
            'finalReport' => array()
        );

        foreach ($this->nextStepNotices as $uniqueId => $notice) {
            $notices['nextStep'][$uniqueId] = $notice->toArray();
        }

        foreach ($this->finalReporNotices as $uniqueId => $notice) {
            $notices['finalReport'][$uniqueId] = $notice->toArray();
        }

        file_put_contents($this->persistanceFile, DupLiteSnapJsonU::wp_json_encode_pprint($notices));
    }

    /**
     * load notice from json file
     */
    private function loadNotices()
    {
        if (file_exists($this->persistanceFile)) {
            $json    = file_get_contents($this->persistanceFile);
            $notices = json_decode($json, true);

            $this->nextStepNotices   = array();
            $this->finalReporNotices = array();

            if (!empty($notices['nextStep'])) {
                foreach ($notices['nextStep'] as $uniqueId => $notice) {
                    $this->nextStepNotices[$uniqueId] = DUPX_NOTICE_ITEM::getItemFromArray($notice);
                }
            }

            if (!empty($notices['finalReport'])) {
                foreach ($notices['finalReport'] as $uniqueId => $notice) {
                    $this->finalReporNotices[$uniqueId] = DUPX_NOTICE_ITEM::getItemFromArray($notice);
                }
            }

            self::$uniqueCountId = $notices['globalData']['uniqueCountId'];
        } else {
            $this->resetNotices();
        }
    }

    /**
     * remove all notices and save reset file
     */
    public function resetNotices()
    {
        $this->nextStepNotices   = array();
        $this->finalReporNotices = array();
        self::$uniqueCountId     = 0;
        $this->saveNotices();
    }

    /**
     * return next step notice by id
     *
     * @param string $id
     * @return DUPX_NOTICE_ITEM
     */
    public function getNextStepNoticeById($id)
    {
        if (isset($this->nextStepNotices[$id])) {
            return $this->nextStepNotices[$id];
        } else {
            return null;
        }
    }

    /**
     * return last report notice by id
     *
     * @param string $id
     * @return DUPX_NOTICE_ITEM
     */
    public function getFinalReporNoticeById($id)
    {
        if (isset($this->finalReporNotices[$id])) {
            return $this->finalReporNotices[$id];
        } else {
            return null;
        }
    }

    /**
     *
     * @param array|DUPX_NOTICE_ITEM $item // if string add new notice obj with item message and level param
     *                                            // if array must be [
     *                                                                   'shortMsg' => text,
     *                                                                   'level' => level,
     *                                                                   'longMsg' => html text,
     *                                                                   'sections' => sections list,
     *                                                                   'faqLink' => [
     *                                                                                     'url' => external link
     *                                                                                     'label' => link text if empty get external url link
     *                                                                               ]
     *                                                                 ]
     * @param int $mode         // ADD_NORMAL | ADD_UNIQUE | ADD_UNIQUE_UPDATE | ADD_UNIQUE_APPEND
     * @param string $uniqueId  // used for ADD_UNIQUE or ADD_UNIQUE_UPDATE or ADD_UNIQUE_APPEND
     *
     * @return string   // notice insert id
     *
     * @throws Exception
     */
    public function addBothNextAndFinalReportNotice($item, $mode = self::ADD_NORMAL, $uniqueId = null)
    {
        $this->addNextStepNotice($item, $mode, $uniqueId);
        $this->addFinalReportNotice($item, $mode, $uniqueId);
    }

    /**
     *
     * @param array|DUPX_NOTICE_ITEM $item // if string add new notice obj with item message and level param
     *                                            // if array must be [
     *                                                                   'shortMsg' => text,
     *                                                                   'level' => level,
     *                                                                   'longMsg' => html text,
     *                                                                   'sections' => sections list,
     *                                                                   'faqLink' => [
     *                                                                                     'url' => external link
     *                                                                                     'label' => link text if empty get external url link
     *                                                                               ]
     *                                                                 ]
     * @param int $mode         // ADD_NORMAL | ADD_UNIQUE | ADD_UNIQUE_UPDATE | ADD_UNIQUE_APPEND
     * @param string $uniqueId  // used for ADD_UNIQUE or ADD_UNIQUE_UPDATE or ADD_UNIQUE_APPEND
     *
     * @return string   // notice insert id
     *
     * @throws Exception
     */
    public function addNextStepNotice($item, $mode = self::ADD_NORMAL, $uniqueId = null)
    {
        if (!is_array($item) && !($item instanceof DUPX_NOTICE_ITEM)) {
            throw new Exception('Invalid item param');
        }
        return self::addReportNoticeToList($this->nextStepNotices, $item, $mode, $uniqueId);
    }

    /**
     * addNextStepNotice wrapper to add simple message with error level
     *
     * @param string $message
     * @param int $level        // warning level
     * @param int $mode         // ADD_NORMAL | ADD_UNIQUE | ADD_UNIQUE_UPDATE | ADD_UNIQUE_APPEND
     * @param string $uniqueId  // used for ADD_UNIQUE or ADD_UNIQUE_UPDATE or ADD_UNIQUE_APPEND
     *
     * @return string   // notice insert id
     *
     * @throws Exception
     */
    public function addNextStepNoticeMessage($message, $level = DUPX_NOTICE_ITEM::INFO, $mode = self::ADD_NORMAL, $uniqueId = null)
    {
        return $this->addNextStepNotice(array(
                'shortMsg' => $message,
                'level' => $level,
                ), $mode, $uniqueId);
    }

    /**
     *
     * @param array|DUPX_NOTICE_ITEM $item // if string add new notice obj with item message and level param
     *                                            // if array must be [
     *                                                                   'shortMsg' => text,
     *                                                                   'level' => level,
     *                                                                   'longMsg' => html text,
     *                                                                   'sections' => sections list,
     *                                                                   'faqLink' => [
     *                                                                                     'url' => external link
     *                                                                                     'label' => link text if empty get external url link
     *                                                                               ]
     *                                                                 ]
     * @param int $mode         // ADD_NORMAL | ADD_UNIQUE | ADD_UNIQUE_UPDATE | ADD_UNIQUE_APPEND
     * @param string $uniqueId  // used for ADD_UNIQUE or ADD_UNIQUE_UPDATE or ADD_UNIQUE_APPEND
     *
     * @return string   // notice insert id
     *
     * @throws Exception
     */
    public function addFinalReportNotice($item, $mode = self::ADD_NORMAL, $uniqueId = null)
    {
        if (!is_array($item) && !($item instanceof DUPX_NOTICE_ITEM)) {
            throw new Exception('Invalid item param');
        }
        return self::addReportNoticeToList($this->finalReporNotices, $item, $mode, $uniqueId);
    }

    /**
     * addFinalReportNotice wrapper to add simple message with error level
     *
     * @param string $message
     * @param string|string[] $sections   // message sections on final report
     * @param int $level        // warning level
     * @param int $mode         // ADD_NORMAL | ADD_UNIQUE | ADD_UNIQUE_UPDATE | ADD_UNIQUE_APPEND
     * @param string $uniqueId  // used for ADD_UNIQUE or ADD_UNIQUE_UPDATE or ADD_UNIQUE_APPEND
     *
     * @return string   // notice insert id
     *
     * @throws Exception
     */
    public function addFinalReportNoticeMessage($message, $sections, $level = DUPX_NOTICE_ITEM::INFO, $mode = self::ADD_NORMAL, $uniqueId = null)
    {
        return $this->addFinalReportNotice(array(
                'shortMsg' => $message,
                'level' => $level,
                'sections' => $sections,
                ), $mode, $uniqueId);
    }

    /**
     *
     * @param array $list
     * @param array|DUPX_NOTICE_ITEM $item // if string add new notice obj with item message and level param
     *                                            // if array must be [
     *                                                                   'shortMsg' => text,
     *                                                                   'level' => level,
     *                                                                   'longMsg' => html text,
     *                                                                   'sections' => sections list,
     *                                                                   'faqLink' => [
     *                                                                                     'url' => external link
     *                                                                                     'label' => link text if empty get external url link
     *                                                                               ]
     *                                                                 ]
     * @param int $mode         // ADD_NORMAL | ADD_UNIQUE | ADD_UNIQUE_UPDATE | ADD_UNIQUE_APPEND
     * @param string $uniqueId  // used for ADD_UNIQUE or ADD_UNIQUE_UPDATE or ADD_UNIQUE_APPEND
     *
     * @return string   // notice insert id
     *
     * @throws Exception
     */
    private static function addReportNoticeToList(&$list, $item, $mode = self::ADD_NORMAL, $uniqueId = null)
    {
        switch ($mode) {
            case self::ADD_UNIQUE:
                if (empty($uniqueId)) {
                    throw new Exception('uniqueId can\'t be empty');
                }
                if (isset($list[$uniqueId])) {
                    return $uniqueId;
                }
            // no break -> continue on unique update
            case self::ADD_UNIQUE_UPDATE:
                if (empty($uniqueId)) {
                    throw new Exception('uniqueId can\'t be empty');
                }
                $insertId = $uniqueId;
                break;
            case self::ADD_UNIQUE_APPEND_IF_EXISTS:
                if (empty($uniqueId)) {
                    throw new Exception('uniqueId can\'t be empty');
                }
                if (!isset($list[$uniqueId])) {
                    return false;
                }
            // no break
            case self::ADD_UNIQUE_APPEND:
                if (empty($uniqueId)) {
                    throw new Exception('uniqueId can\'t be empty');
                }
                $insertId = $uniqueId;
                // if item id exist append long msg
                if (isset($list[$uniqueId])) {
                    $tempObj                  = self::getObjFromParams($item);
                    $list[$uniqueId]->longMsg .= $tempObj->longMsg;
                    $item                     = $list[$uniqueId];
                }
                break;
            case self::ADD_UNIQUE_PREPEND_IF_EXISTS:
                if (empty($uniqueId)) {
                    throw new Exception('uniqueId can\'t be empty');
                }
                if (!isset($list[$uniqueId])) {
                    return false;
                }
            // no break
            case self::ADD_UNIQUE_PREPEND:
                if (empty($uniqueId)) {
                    throw new Exception('uniqueId can\'t be empty');
                }
                $insertId = $uniqueId;
                // if item id exist append long msg
                if (isset($list[$uniqueId])) {
                    $tempObj                  = self::getObjFromParams($item);
                    $list[$uniqueId]->longMsg = $tempObj->longMsg.$list[$uniqueId]->longMsg;
                    $item                     = $list[$uniqueId];
                }
                break;
            case self::ADD_NORMAL:
            default:
                if (empty($uniqueId)) {
                    $insertId = self::getNewAutoUniqueId();
                } else {
                    $insertId = $uniqueId;
                }
        }

        $list[$insertId] = self::getObjFromParams($item);
        return $insertId;
    }

    /**
     *
     * @param string|array|DUPX_NOTICE_ITEM $item // if string add new notice obj with item message and level param
     *                                            // if array must be [
     *                                                                   'shortMsg' => text,
     *                                                                   'level' => level,
     *                                                                   'longMsg' => html text,
     *                                                                   'sections' => sections list,
     *                                                                   'faqLink' => [
     *                                                                                     'url' => external link
     *                                                                                     'label' => link text if empty get external url link
     *                                                                               ]
     *                                                                 ]
     * @param int $level message level considered only in the case where $item is a string.
     * @return \DUPX_NOTICE_ITEM
     *
     * @throws Exception
     */
    private static function getObjFromParams($item, $level = DUPX_NOTICE_ITEM::INFO)
    {
        if ($item instanceof DUPX_NOTICE_ITEM) {
            $newObj = $item;
        } else if (is_array($item)) {
            $newObj = DUPX_NOTICE_ITEM::getItemFromArray($item);
        } else if (is_string($item)) {
            $newObj = new DUPX_NOTICE_ITEM($item, $level);
        } else {
            throw new Exception('Notice input not valid');
        }

        return $newObj;
    }

    /**
     *
     * @param null|string $section if null is count global
     * @param int $level error level
     * @param string $operator > < >= <= = !=
     *
     * @return int
     */
    public function countFinalReportNotices($section = null, $level = DUPX_NOTICE_ITEM::INFO, $operator = '>=')
    {
        $result = 0;
        foreach ($this->finalReporNotices as $notice) {
            if (is_null($section) || in_array($section, $notice->sections)) {
                switch ($operator) {
                    case '>=':
                        $result        += (int) ($notice->level >= $level);
                        break;
                    case '>':
                        $result        += (int) ($notice->level > $level);
                        break;
                    case '=':
                        $result        += (int) ($notice->level = $level);
                        break;
                    case '<=':
                        $result        += (int) ($notice->level <= $level);
                        break;
                    case '<':
                        $result        += (int) ($notice->level < $level);
                        break;
                    case '!=':
                        $result        += (int) ($notice->level != $level);
                        break;
                }
            }
        }
        return $result;
    }

    /**
     * sort final report notice from priority and notice level
     */
    public function sortFinalReport()
    {
        uasort($this->finalReporNotices, 'DUPX_NOTICE_ITEM::sortNoticeForPriorityAndLevel');
    }

    /**
     * display final final report notice section
     *
     * @param string $section
     */
    public function displayFinalReport($section)
    {
        foreach ($this->finalReporNotices as $id => $notice) {
            if (in_array($section, $notice->sections)) {
                self::finalReportNotice($id, $notice);
            }
        }
    }

    /**
     *
     * @param string $section
     * @param string $title
     */
    public function displayFinalRepostSectionHtml($section, $title)
    {
        if ($this->haveSection($section)) {
            ?>
            <div id="report-section-<?php echo $section; ?>" class="section" >
                <div class="section-title" ><?php echo $title; ?></div>
                <div class="section-content">
                    <?php
                    $this->displayFinalReport($section);
                    ?>
                </div>
            </div>
            <?php
        }
    }

    /**
     *
     * @param string $section
     * @return boolean
     */
    public function haveSection($section)
    {
        foreach ($this->finalReporNotices as $notice) {
            if (in_array($section, $notice->sections)) {
                return true;
            }
        }
        return false;
    }

    /**
     *
     * @param null|string $section  if null is a global result
     *
     * @return int // returns the worst level found
     *
     */
    public function getSectionErrLevel($section = null)
    {
        $result = DUPX_NOTICE_ITEM::INFO;

        foreach ($this->finalReporNotices as $notice) {
            if (is_null($section) || in_array($section, $notice->sections)) {
                $result = max($result, $notice->level);
            }
        }
        return $result;
    }

    /**
     *
     * @param string $section
     * @param bool $echo
     * @return void|string
     */
    public function getSectionErrLevelHtml($section = null, $echo = true)
    {
        return self::getErrorLevelHtml($this->getSectionErrLevel($section), $echo);
    }

    /**
     * Displa next step notice message
     *
     * @param bool $deleteListAfterDisaply
     * @return void
     */
    public function displayStepMessages($deleteListAfterDisaply = true)
    {
        if (empty($this->nextStepNotices)) {
            return;
        }
        ?>
        <div id="step-messages">
            <?php
            foreach ($this->nextStepNotices as $notice) {
                self::stepMsg($notice);
            }
            ?>
        </div>
        <?php
        if ($deleteListAfterDisaply) {
            $this->nextStepNotices = array();
            $this->saveNotices();
        }
    }

    /**
     *
     * @param DUPX_NOTICE_ITEM $notice
     */
    private static function stepMsg($notice)
    {
        $classes     = array(
            'notice',
            'next-step',
            self::getClassFromLevel($notice->level)
        );
        $haveContent = !empty($notice->faqLink) || !empty($notice->longMsg);
        ?>
        <div class="<?php echo implode(' ', $classes); ?>">
            <div class="title">
                <?php echo self::getNextStepLevelPrefixMessage($notice->level).': <b>'.htmlentities($notice->shortMsg).'</b>'; ?>
            </div>
            <?php if ($haveContent) { ?>
                <div class="title-separator" ></div>
                <?php
                ob_start();
                if (!empty($notice->faqLink)) {
                    ?>
                    See FAQ: <a href="<?php echo $notice->faqLink['url']; ?>" >
                        <b><?php echo htmlentities(empty($notice->faqLink['label']) ? $notice->faqLink['url'] : $notice->faqLink['label']); ?></b>
                    </a>
                    <?php
                }
                if (!empty($notice->faqLink) && !empty($notice->longMsg)) {
                    echo '<br><br>';
                }
                if (!empty($notice->longMsg)) {
                    switch ($notice->longMsgMode) {
                        case DUPX_NOTICE_ITEM::MSG_MODE_PRE:
                            echo '<pre>'.htmlentities($notice->longMsg).'</pre>';
                            break;
                        case DUPX_NOTICE_ITEM::MSG_MODE_HTML:
                            echo $notice->longMsg;
                            break;
                        case DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT:
                        default:
                            echo htmlentities($notice->longMsg);
                    }
                }
                $longContent = ob_get_clean();
                DUPX_U_Html::getMoreContent($longContent, 'info', 200);
            }
            ?>
        </div>
        <?php
    }

    /**
     *
     * @param string $id
     * @param DUPX_NOTICE_ITEM $notice
     */
    private static function finalReportNotice($id, $notice)
    {
        $classes        = array(
            'notice-report',
            'notice',
            self::getClassFromLevel($notice->level)
        );
        $haveContent    = !empty($notice->faqLink) || !empty($notice->longMsg);
        $contentId      = 'notice-content-'.$id;
        $iconClasses    = $haveContent ? 'fa fa-caret-right' : 'fa fa-toggle-empty';
        $toggleLinkData = $haveContent ? 'data-type="toggle" data-target="#'.$contentId.'"' : '';
        ?>
        <div class="<?php echo implode(' ', $classes); ?>">
            <div class="title" <?php echo $toggleLinkData; ?>>
                <i class="<?php echo $iconClasses; ?>"></i>  <?php echo htmlentities($notice->shortMsg); ?>
            </div>
            <?php
            if ($haveContent) {
                $infoClasses = array('info');
                if (!$notice->open) {
                    $infoClasses[] = 'no-display';
                }
                ?>
                <div id="<?php echo $contentId; ?>" class="<?php echo implode(' ', $infoClasses); ?>" >
                    <?php
                    if (!empty($notice->faqLink)) {
                        ?>
                        <b>See FAQ</b>: <a href="<?php echo $notice->faqLink['url']; ?>" >
                            <?php echo htmlentities(empty($notice->faqLink['label']) ? $notice->faqLink['url'] : $notice->faqLink['label']); ?>
                        </a>
                        <?php
                    }
                    if (!empty($notice->faqLink) && !empty($notice->longMsg)) {
                        echo '<br><br>';
                    }
                    if (!empty($notice->longMsg)) {
                        switch ($notice->longMsgMode) {
                            case DUPX_NOTICE_ITEM::MSG_MODE_PRE:
                                echo '<pre>'.htmlentities($notice->longMsg).'</pre>';
                                break;
                            case DUPX_NOTICE_ITEM::MSG_MODE_HTML:
                                echo $notice->longMsg;
                                break;
                            case DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT:
                            default:
                                echo htmlentities($notice->longMsg);
                        }
                    }
                    ?>
                </div>
                <?php
            }
            ?>
        </div>
        <?php
    }

    /**
     *
     * @param DUPX_NOTICE_ITEM $notice
     */
    private static function noticeToText($notice)
    {
        $result = '-----------------------'."\n".
            '['.self::getNextStepLevelPrefixMessage($notice->level, false).'] '.$notice->shortMsg;

        if (!empty($notice->sections)) {
            $result .= "\n\t".'SECTIONS: '.implode(',', $notice->sections);
        }
        if (!empty($notice->longMsg)) {
            $result .= "\n\t".'LONG MSG: '.$notice->longMsg;
        }
        return $result."\n";
    }

    public function nextStepLog()
    {
        if (!empty($this->nextStepNotices)) {
            DUPX_Log::info(
                '===================================='."\n".
                'NEXT STEP NOTICES'."\n".
                '====================================');
            foreach ($this->nextStepNotices as $notice) {
                DUPX_Log::info(self::noticeToText($notice));
            }
            DUPX_Log::info(
                '====================================');
        }
    }

    public function finalReportLog($sections = array())
    {
        if (!empty($this->finalReporNotices)) {
            DUPX_Log::info(
                '===================================='."\n".
                'FINAL REPORT NOTICES LIST'."\n".
                '====================================');
            foreach ($this->finalReporNotices as $notice) {
                if (count(array_intersect($notice->sections, $sections)) > 0) {
                    DUPX_Log::info(self::noticeToText($notice));
                }
            }
            DUPX_Log::info(
                '====================================');
        }
    }

    /**
     * get html class from level
     *
     * @param int $level
     * @return string
     */
    private static function getClassFromLevel($level)
    {
        switch ($level) {
            case DUPX_NOTICE_ITEM::INFO:
                return 'l-info';
            case DUPX_NOTICE_ITEM::NOTICE:
                return 'l-notice';
            case DUPX_NOTICE_ITEM::SOFT_WARNING:
                return 'l-swarning';
            case DUPX_NOTICE_ITEM::HARD_WARNING:
                return 'l-hwarning';
            case DUPX_NOTICE_ITEM::CRITICAL:
                return 'l-critical';
            case DUPX_NOTICE_ITEM::FATAL:
                return 'l-fatal';
        }
    }

    /**
     * get level label from level
     *
     * @param int $level
     * @param bool $echo
     * @return type
     */
    public static function getErrorLevelHtml($level, $echo = true)
    {
        switch ($level) {
            case DUPX_NOTICE_ITEM::INFO:
                $label = 'good';
                break;
            case DUPX_NOTICE_ITEM::NOTICE:
                $label = 'good';
                break;
            case DUPX_NOTICE_ITEM::SOFT_WARNING:
                $label = 'warning';
                break;
            case DUPX_NOTICE_ITEM::HARD_WARNING:
                $label = 'warning';
                break;
            case DUPX_NOTICE_ITEM::CRITICAL:
                $label = 'critical error';
                break;
            case DUPX_NOTICE_ITEM::FATAL:
                $label = 'fatal error';
                break;
            default:
                return;
        }
        $classes = self::getClassFromLevel($level);
        ob_start();
        ?>
        <span class="notice-level-status <?php echo $classes; ?>"><?php echo $label; ?></span>
        <?php
        if ($echo) {
            ob_end_flush();
        } else {
            return ob_get_clean();
        }
    }

    /**
     * get next step message prefix
     *
     * @param int $level
     * @param bool $echo
     * @return string
     */
    public static function getNextStepLevelPrefixMessage($level, $echo = true)
    {
        switch ($level) {
            case DUPX_NOTICE_ITEM::INFO:
                $label = 'INFO';
                break;
            case DUPX_NOTICE_ITEM::NOTICE:
                $label = 'NOTICE';
                break;
            case DUPX_NOTICE_ITEM::SOFT_WARNING:
                $label = 'WARNING';
                break;
            case DUPX_NOTICE_ITEM::HARD_WARNING:
                $label = 'WARNING';
                break;
            case DUPX_NOTICE_ITEM::CRITICAL:
                $label = 'CRITICAL ERROR';
                break;
            case DUPX_NOTICE_ITEM::FATAL:
                $label = 'FATAL ERROR';
                break;
            default:
                return;
        }

        if ($echo) {
            echo $label;
        } else {
            return $label;
        }
    }

    /**
     * get unique id
     *
     * @return string
     */
    private static function getNewAutoUniqueId()
    {
        self::$uniqueCountId ++;
        return self::DEFAULT_UNIQUE_ID_PREFIX.self::$uniqueCountId;
    }

    /**
     * function for internal test
     *
     * display all messages levels
     */
    public static function testNextStepMessaesLevels()
    {
        $manager = self::getInstance();
        $manager->addNextStepNoticeMessage('Level info ('.DUPX_NOTICE_ITEM::INFO.')', DUPX_NOTICE_ITEM::INFO);
        $manager->addNextStepNoticeMessage('Level notice ('.DUPX_NOTICE_ITEM::NOTICE.')', DUPX_NOTICE_ITEM::NOTICE);
        $manager->addNextStepNoticeMessage('Level soft warning ('.DUPX_NOTICE_ITEM::SOFT_WARNING.')', DUPX_NOTICE_ITEM::SOFT_WARNING);
        $manager->addNextStepNoticeMessage('Level hard warning ('.DUPX_NOTICE_ITEM::HARD_WARNING.')', DUPX_NOTICE_ITEM::HARD_WARNING);
        $manager->addNextStepNoticeMessage('Level critical error ('.DUPX_NOTICE_ITEM::CRITICAL.')', DUPX_NOTICE_ITEM::CRITICAL);
        $manager->addNextStepNoticeMessage('Level fatal error ('.DUPX_NOTICE_ITEM::FATAL.')', DUPX_NOTICE_ITEM::FATAL);
        $manager->saveNotices();
    }

    /**
     * test function
     */
    public static function testNextStepFullMessageData()
    {
        $manager = self::getInstance();
        $longMsg = <<<LONGMSG
            <b>Formattend long text</b><br>
            <ul>
            <li>Proin dapibus mi eu erat pulvinar, id congue nisl egestas.</li>
            <li>Nunc venenatis eros et sapien ornare consequat.</li>
            <li>Mauris tincidunt est sit amet turpis placerat, a tristique dui porttitor.</li>
            <li>Etiam volutpat lectus quis risus molestie faucibus.</li>
            <li>Integer gravida eros sit amet sem viverra, a volutpat neque rutrum.</li>
            <li>Aenean varius ipsum vitae lorem tempus rhoncus.</li>
            </ul>
LONGMSG;
        $manager->addNextStepNotice(array(
            'shortMsg' => 'Full elements next step message MODE HTML',
            'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
            'longMsg' => $longMsg,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
            'faqLink' => array(
                'url' => 'http://www.google.it',
                'label' => 'google link'
            )
        ));

        $longMsg = <<<LONGMSG
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc a auctor erat, et lobortis libero.
                Suspendisse aliquet neque in massa posuere mollis. Donec venenatis finibus sapien in bibendum. Donec et ex massa.

   Aliquam venenatis dapibus tellus nec ullamcorper. Mauris ante velit, tincidunt sit amet egestas et, mattis non lorem. In semper ex ut velit suscipit,
       at luctus nunc dapibus. Etiam blandit maximus dapibus. Nullam eu porttitor augue. Suspendisse pulvinar, massa eget condimentum aliquet, dolor massa tempus dui, vel rhoncus tellus ligula non odio.
           Ut ac faucibus tellus, in lobortis odio.
LONGMSG;
        $manager->addNextStepNotice(array(
            'shortMsg' => 'Full elements next step message MODE PRE',
            'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
            'longMsg' => $longMsg,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
            'faqLink' => array(
                'url' => 'http://www.google.it',
                'label' => 'google link'
            )
        ));

        $longMsg = <<<LONGMSG
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc a auctor erat, et lobortis libero.
                Suspendisse aliquet neque in massa posuere mollis. Donec venenatis finibus sapien in bibendum. Donec et ex massa.

   Aliquam venenatis dapibus tellus nec ullamcorper. Mauris ante velit, tincidunt sit amet egestas et, mattis non lorem. In semper ex ut velit suscipit,
       at luctus nunc dapibus. Etiam blandit maximus dapibus. Nullam eu porttitor augue. Suspendisse pulvinar, massa eget condimentum aliquet, dolor massa tempus dui, vel rhoncus tellus ligula non odio.
           Ut ac faucibus tellus, in lobortis odio.
LONGMSG;
        $manager->addNextStepNotice(array(
            'shortMsg' => 'Full elements next step message MODE DEFAULT',
            'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
            'longMsg' => $longMsg,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT,
            'faqLink' => array(
                'url' => 'http://www.google.it',
                'label' => 'google link'
            )
        ));


        $longMsg = <<<LONGMSG
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam cursus porttitor consectetur. Nunc faucibus elementum nisl nec ornare. Phasellus sit amet urna in diam ultricies ornare nec sit amet nibh. Nulla a aliquet leo. Quisque aliquet posuere lectus sit amet commodo. Nullam tempus enim eget urna rutrum egestas. Aliquam eget lorem nisl. Nulla tincidunt massa erat. Phasellus lectus tellus, mollis sit amet aliquam in, dapibus quis metus. Nunc venenatis nulla vitae convallis accumsan.

Mauris eu ullamcorper metus. Aenean ultricies et turpis eget mollis. Aliquam auctor, elit scelerisque placerat pellentesque, quam augue fermentum lectus, vel pretium nisi justo sit amet ante. Donec blandit porttitor tempus. Duis vulputate nulla ut orci rutrum, et consectetur urna mollis. Sed at iaculis velit. Pellentesque id quam turpis. Curabitur eu ligula velit. Cras gravida, ipsum sed iaculis eleifend, mauris nunc posuere quam, vel blandit nisi justo congue ligula. Phasellus aliquam eu odio ac porttitor. Fusce dictum mollis turpis sit amet fringilla.

Nulla eu ligula mauris. Fusce lobortis ligula elit, a interdum nibh pulvinar eu. Pellentesque rhoncus nec turpis id blandit. Morbi fringilla, justo non varius consequat, arcu ante efficitur ante, sit amet cursus lorem elit vel odio. Phasellus neque ligula, vehicula vel ipsum sed, volutpat dignissim eros. Curabitur at lacus id felis elementum auctor. Nullam ac tempus nisi. Phasellus nibh purus, aliquam nec purus ut, sodales lobortis nulla. Cras viverra dictum magna, ac malesuada nibh dictum ac. Mauris euismod, magna sit amet pretium posuere, ligula nibh ultrices tellus, sit amet pretium odio urna egestas justo. Suspendisse purus erat, eleifend sed magna in, efficitur interdum nibh.

Vivamus nibh nunc, fermentum non tortor volutpat, consectetur vulputate velit. Phasellus lobortis, purus et faucibus mollis, metus eros viverra ante, sit amet euismod nibh est eu orci. Duis sodales cursus lacinia. Praesent laoreet ut ipsum ut interdum. Praesent venenatis massa vitae ligula consequat aliquet. Fusce in purus in odio molestie laoreet at ac augue. Fusce consectetur elit a magna mollis aliquet.

Nulla eros nisi, dapibus eget diam vitae, tincidunt blandit odio. Fusce interdum tellus nec varius condimentum. Fusce non magna a purus sodales imperdiet sit amet vitae ligula. Quisque viverra leo sit amet mi egestas, et posuere nunc tincidunt. Suspendisse feugiat malesuada urna sed tincidunt. Morbi a urna sed magna volutpat pellentesque sit amet ac mauris. Nulla sed ultrices dui. Etiam massa arcu, tempor ut erat at, cursus malesuada ipsum. Duis sit amet felis dolor.

Morbi gravida nisl nunc, vulputate iaculis risus vehicula non. Proin cursus, velit et laoreet consectetur, lacus libero sagittis lacus, quis accumsan odio lectus non erat. Aenean dolor lectus, euismod sit amet justo eget, dictum gravida nisl. Phasellus sed nunc non odio ullamcorper rhoncus non ut ipsum. Duis ante ligula, pellentesque sit amet imperdiet eget, congue vel dui. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Suspendisse luctus leo eget justo mollis, convallis convallis ex suscipit. Integer et justo eget odio lobortis sollicitudin. Pellentesque accumsan rhoncus augue, luctus suscipit ex accumsan nec. Maecenas lacinia consectetur risus at bibendum. Etiam venenatis purus lorem, sit amet elementum turpis tristique eu. Proin vulputate faucibus feugiat. Nunc vehicula congue odio consequat vulputate. Quisque bibendum augue id iaculis faucibus. Donec blandit cursus sem, eget accumsan orci commodo sed.

Suspendisse iaculis est quam, sed scelerisque purus tincidunt non. Cras hendrerit ante turpis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse purus ipsum, rutrum id sem in, venenatis laoreet metus. Aliquam ac bibendum mauris. Cras egestas rhoncus est, sed lacinia nibh vestibulum id. Proin diam quam, sagittis congue molestie ac, rhoncus et mauris. Phasellus massa neque, ornare vel erat a, rutrum pharetra arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi et nulla eget massa auctor fermentum. Quisque maximus tellus sed cursus cursus. Ut vehicula erat at purus aliquet, quis imperdiet dui sagittis. Nullam eget quam leo.

Nulla magna ipsum, congue nec dui ut, lacinia malesuada felis. Cras mattis metus non maximus venenatis. Aliquam euismod est vitae erat sollicitudin, at pellentesque augue sollicitudin. Curabitur euismod maximus cursus. In tortor dui, convallis sed sapien ac, varius congue metus. Nunc ullamcorper ac orci sit amet finibus. Vivamus molestie nibh vitae quam rhoncus, eu ultrices est molestie. Maecenas consectetur eu quam sit amet placerat.

Curabitur ut fermentum mauris. Donec et congue nibh. Sed cursus elit sit amet convallis varius. Donec malesuada porta odio condimentum varius. Pellentesque ornare tempor ante, ut volutpat nulla lobortis sed. Nunc congue aliquet erat ac elementum. Quisque a ex sit amet turpis placerat sagittis eget ac ligula. Etiam in augue malesuada, aliquam est non, lacinia justo. Vivamus tincidunt dolor orci, id dignissim lorem maximus at. Vivamus ligula mauris, venenatis vel nibh id, lacinia ultrices ipsum. Mauris cursus, urna ac rutrum aliquet, risus ipsum tincidunt purus, sit amet blandit nunc sem sit amet nibh.

Nam eleifend risus lacus, eu pharetra risus egestas eu. Maecenas hendrerit nisl in semper placerat. Vestibulum massa tellus, laoreet non euismod quis, sollicitudin id sapien. Morbi vel cursus metus. Aenean tincidunt nisi est, ut elementum est auctor id. Duis auctor elit leo, ac scelerisque risus suscipit et. Pellentesque lectus nisi, ultricies in elit sed, pulvinar iaculis massa. Morbi viverra eros mi, pretium facilisis neque egestas id. Curabitur non massa accumsan, porttitor sem vitae, ultricies lacus. Curabitur blandit nisl velit. Mauris sollicitudin ultricies purus sit amet placerat. Fusce ac neque sed leo venenatis laoreet ut non ex. Integer elementum rhoncus orci, eu maximus neque tempus eu. Curabitur euismod dignissim tellus, vitae lacinia metus. Mauris imperdiet metus vitae vulputate accumsan. Duis eget luctus nibh, sit amet finibus libero.

LONGMSG;
        $manager->addNextStepNotice(array(
            'shortMsg' => 'Full elements LONG LONG',
            'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
            'longMsg' => $longMsg,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT,
            'faqLink' => array(
                'url' => 'http://www.google.it',
                'label' => 'google link'
            )
        ));




        $manager->saveNotices();
    }

    /**
     * test function
     */
    public static function testFinalReporMessaesLevels()
    {
        $section = 'general';

        $manager = self::getInstance();
        $manager->addFinalReportNoticeMessage('Level info ('.DUPX_NOTICE_ITEM::INFO.')', $section, DUPX_NOTICE_ITEM::INFO, DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'test_fr_0');
        $manager->addFinalReportNoticeMessage('Level notice ('.DUPX_NOTICE_ITEM::NOTICE.')', $section, DUPX_NOTICE_ITEM::NOTICE, DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'test_fr_1');
        $manager->addFinalReportNoticeMessage('Level soft warning ('.DUPX_NOTICE_ITEM::SOFT_WARNING.')', $section, DUPX_NOTICE_ITEM::SOFT_WARNING, DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'test_fr_2');
        $manager->addFinalReportNoticeMessage('Level hard warning ('.DUPX_NOTICE_ITEM::HARD_WARNING.')', $section, DUPX_NOTICE_ITEM::HARD_WARNING, DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'test_fr_3');
        $manager->addFinalReportNoticeMessage('Level critical error ('.DUPX_NOTICE_ITEM::CRITICAL.')', $section, DUPX_NOTICE_ITEM::CRITICAL, DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'test_fr_4');
        $manager->addFinalReportNoticeMessage('Level fatal error ('.DUPX_NOTICE_ITEM::FATAL.')', $section, DUPX_NOTICE_ITEM::FATAL, DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'test_fr_5');
        $manager->saveNotices();
    }

    /**
     * test function
     */
    public static function testFinalReportFullMessages()
    {
        $section = 'general';
        $manager = self::getInstance();

        $longMsg = <<<LONGMSG
            <b>Formattend long text</b><br>
            <ul>
            <li>Proin dapibus mi eu erat pulvinar, id congue nisl egestas.</li>
            <li>Nunc venenatis eros et sapien ornare consequat.</li>
            <li>Mauris tincidunt est sit amet turpis placerat, a tristique dui porttitor.</li>
            <li>Etiam volutpat lectus quis risus molestie faucibus.</li>
            <li>Integer gravida eros sit amet sem viverra, a volutpat neque rutrum.</li>
            <li>Aenean varius ipsum vitae lorem tempus rhoncus.</li>
            </ul>
LONGMSG;

        $manager->addFinalReportNotice(array(
            'shortMsg' => 'Full elements final report message',
            'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
            'longMsg' => $longMsg,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
            'sections' => $section,
            'faqLink' => array(
                'url' => 'http://www.google.it',
                'label' => 'google link'
            )
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'test_fr_full_1');

        $manager->addFinalReportNotice(array(
            'shortMsg' => 'Full elements final report message info high priority',
            'level' => DUPX_NOTICE_ITEM::INFO,
            'longMsg' => $longMsg,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
            'sections' => $section,
            'faqLink' => array(
                'url' => 'http://www.google.it',
                'label' => 'google link'
            ),
            'priority' => 5
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'test_fr_full_2');
        $manager->saveNotices();
    }

    //PHP 8 Requires method to be public
    public function __wakeup()
    {
    }

    private function __clone()
    {

    }
}

class DUPX_NOTICE_ITEM
{
    const INFO             = 0;
    const NOTICE           = 1;
    const SOFT_WARNING     = 2;
    const HARD_WARNING     = 3;
    const CRITICAL         = 4;
    const FATAL            = 5;
    const MSG_MODE_DEFAULT = 'def';
    const MSG_MODE_HTML    = 'html';
    const MSG_MODE_PRE     = 'pre';

    /**
     *
     * @var string text
     */
    public $shortMsg = '';

    /**
     *
     * @var string html text
     */
    public $longMsg = '';

    /**
     *
     * @var bool if true long msg can be html
     */
    public $longMsgMode = self::MSG_MODE_DEFAULT;

    /**
     *
     * @var null|array // null = no faq link
     *                    array( 'label' => link text , 'url' => faq url)
     */
    public $faqLink = array(
        'label' => '',
        'url' => ''
    );

    /**
     *
     * @var string[] notice sections for final report only
     */
    public $sections = array();

    /**
     *
     * @var int
     */
    public $level = self::NOTICE;

    /**
     *
     * @var int
     */
    public $priority = 10;

    /**
     *
     * @var bool if true notice start open. For final report only
     */
    public $open = false;

    /**
     *
     * @param string $shortMsg text
     * @param int $level
     * @param string $longMsg html text
     * @param string|string[] $sections
     * @param null|array $faqLink [
     *                              'url' => external link
     *                              'label' => link text if empty get external url link
     *                          ]
     * @param int priority
     * @param bool open
     * @param string longMsgMode MSG_MODE_DEFAULT | MSG_MODE_HTML | MSG_MODE_PRE
     */
    public function __construct($shortMsg, $level = self::INFO, $longMsg = '', $sections = array(), $faqLink = null, $priority = 10, $open = false, $longMsgMode = self::MSG_MODE_DEFAULT)
    {
        $this->shortMsg    = (string) $shortMsg;
        $this->level       = (int) $level;
        $this->longMsg     = (string) $longMsg;
        $this->sections    = is_array($sections) ? $sections : array($sections);
        $this->faqLink     = $faqLink;
        $this->priority    = $priority;
        $this->open        = $open;
        $this->longMsgMode = $longMsgMode;
    }

    /**
     *
     * @return array        [
     *                          'shortMsg' => text,
     *                          'level' => level,
     *                          'longMsg' => html text,
     *                          'sections' => string|string[],
     *                          'faqLink' => [
     *                              'url' => external link
     *                              'label' => link text if empty get external url link
     *                          ]
     *                          'priority' => int low first
     *                          'open' => if true the tab is opene on final report
     *                          'longMsgMode'=> MSG_MODE_DEFAULT | MSG_MODE_HTML | MSG_MODE_PRE
     *                      ]
     */
    public function toArray()
    {
        return array(
            'shortMsg' => $this->shortMsg,
            'level' => $this->level,
            'longMsg' => $this->longMsg,
            'sections' => $this->sections,
            'faqLink' => $this->faqLink,
            'priority' => $this->priority,
            'open' => $this->open,
            'longMsgMode' => $this->longMsgMode
        );
    }

    /**
     *
     * @return array        [
     *                          'shortMsg' => text,
     *                          'level' => level,
     *                          'longMsg' => html text,
     *                          'sections' => string|string[],
     *                          'faqLink' => [
     *                              'url' => external link
     *                              'label' => link text if empty get external url link
     *                          ],
     *                          priority
     *                          open
     *                          longMsgMode
     *                      ]
     * @return DUPX_NOTICE_ITEM
     */
    public static function getItemFromArray($array)
    {
        if (isset($array['sections']) && !is_array($array['sections'])) {
            if (empty($array['sections'])) {
                $array['sections'] = array();
            } else {
                $array['sections'] = array($array['sections']);
            }
        }
        $params = array_merge(self::getDefaultArrayParams(), $array);
        $result = new self($params['shortMsg'], $params['level'], $params['longMsg'], $params['sections'], $params['faqLink'], $params['priority'], $params['open'], $params['longMsgMode']);
        return $result;
    }

    /**
     *
     * @return array        [
     *                          'shortMsg' => text,
     *                          'level' => level,
     *                          'longMsg' => html text,
     *                          'sections' => string|string[],
     *                          'faqLink' => [
     *                              'url' => external link
     *                              'label' => link text if empty get external url link
     *                          ],
     *                          priority
     *                          open
     *                          longMsgMode
     *                      ]
     */
    public static function getDefaultArrayParams()
    {
        return array(
            'shortMsg' => '',
            'level' => self::INFO,
            'longMsg' => '',
            'sections' => array(),
            'faqLink' => null,
            'priority' => 10,
            'open' => false,
            'longMsgMode' => self::MSG_MODE_DEFAULT
        );
    }

    /**
     * before lower priority
     * before highest level
     *
     * @param DUPX_NOTICE_ITEM $a
     * @param DUPX_NOTICE_ITEM $b
     */
    public static function sortNoticeForPriorityAndLevel($a, $b)
    {
        if ($a->priority == $b->priority) {
            if ($a->level == $b->level) {
                return 0;
            } else if ($a->level < $b->level) {
                return 1;
            } else {
                return -1;
            }
        } else if ($a->priority < $b->priority) {
            return -1;
        } else {
            return 1;
        }
    }
}installer/dup-installer/classes/utilities/index.php000064400000000017151336065400016615 0ustar00<?php
//silentinstaller/dup-installer/classes/utilities/class.u.search.reaplce.manager.php000064400000042666151336065400023365 0ustar00<?php
/**
 * Search and reaplace manager
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\U
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Search and replace manager
 * singleton class
 */
final class DUPX_S_R_MANAGER
{
    const GLOBAL_SCOPE_KEY = '___!GLOBAL!___!SCOPE!___';

    /**
     *
     * @var DUPX_S_R_MANAGER
     */
    private static $instance = null;

    /**
     * full list items not sorted
     * @var DUPX_S_R_ITEM[]
     */
    private $items = array();

    /**
     * items sorted by priority and scope
     * [
     *      10 => [
     *             '___!GLOBAL!___!SCOPE!___' => [
     *                  DUPX_S_R_ITEM
     *                  DUPX_S_R_ITEM
     *                  DUPX_S_R_ITEM
     *              ],
     *              'scope_one' => [
     *                  DUPX_S_R_ITEM
     *                  DUPX_S_R_ITEM
     *              ]
     *          ],
     *      20 => [
     *          .
     *          .
     *          .
     *      ]
     * ]
     *
     * @var array
     */
    private $prorityScopeItems = array();

    /**
     *
     * @return DUPX_S_R_MANAGER
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    private function __construct()
    {

    }

    /**
     *
     * @return array
     */
    public function getArrayData()
    {
        $data = array();

        foreach ($this->items as $item) {
            $data[] = $item->toArray();
        }

        return $data;
    }

    /**
     *
     * @param array $json
     */
    public function setFromArrayData($data)
    {

        foreach ($data as $itemArray) {
            $new_item = DUPX_S_R_ITEM::getItemFromArray($itemArray);
            $this->setNewItem($new_item);
        }
    }

    /**
     *
     * @param string $search
     * @param string $replace
     * @param string $type                  // item type DUPX_S_R_ITEM::[TYPE_STRING|TYPE_URL|TYPE_URL_NORMALIZE_DOMAIN|TYPE_PATH]
     * @param int $prority                  // lower first
     * @param bool|string|string[] $scope   // true = global scope | false = never | string signle scope | string[] scope list
     *
     * @return boolean|DUPX_S_R_ITEM        // false if fail or new DUPX_S_R_ITEM
     */
    public function addItem($search, $replace, $type = DUPX_S_R_ITEM::TYPE_STRING, $prority = 10, $scope = true)
    {
        if (strlen((string) $search) == 0) {
            return false;
        }

        if (is_bool($scope)) {
            $scope = $scope ? self::GLOBAL_SCOPE_KEY : '';
        }
        DUPX_Log::info(
            'ADD SEARCH AND REPLACE ITEM'."\n".
            'Search:"'.$search.'" Replace:"'.$replace.'" Type:"'.$type.'" Prority:"'.$prority.'" Scope:"'.$scope, 2);
        $new_item = new DUPX_S_R_ITEM($search, $replace, $type, $prority, $scope);

        return $this->setNewItem($new_item);
    }

    /**
     *
     * @param DUPX_S_R_ITEM $new_item
     *
     * @return boolean|DUPX_S_R_ITEM        // false if fail or new DUPX_S_R_ITEM
     */
    private function setNewItem($new_item)
    {
        $this->items[$new_item->getId()] = $new_item;

        // create priority array
        if (!isset($this->prorityScopeItems[$new_item->prority])) {
            $this->prorityScopeItems[$new_item->prority] = array();

            // sort by priority
            ksort($this->prorityScopeItems);
        }

        // create scope list
        foreach ($new_item->scope as $scope) {
            if (!isset($this->prorityScopeItems[$new_item->prority][$scope])) {
                $this->prorityScopeItems[$new_item->prority][$scope] = array();
            }
            $this->prorityScopeItems[$new_item->prority][$scope][] = $new_item;
        }

        return $new_item;
    }

    /**
     * get all search and reaple items by scpoe
     *
     * @param null|string $scope if scope is empty get only global scope
     * @return DUPX_S_R_ITEM[]
     */
    private function getSearchReplaceItems($scope = null, $globalScope = true)
    {
        $items_list = array();
        foreach ($this->prorityScopeItems as $priority => $priority_list) {
            // get scope list
            if (!empty($scope) && isset($priority_list[$scope])) {
                foreach ($priority_list[$scope] as $item) {
                    $items_list[] = $item;
                }
            }

            // get global scope
            if ($globalScope && isset($priority_list[self::GLOBAL_SCOPE_KEY])) {
                foreach ($priority_list[self::GLOBAL_SCOPE_KEY] as $item) {
                    $items_list[] = $item;
                }
            }
        }

        return $items_list;
    }

    /**
     * get replace list by scope
     * result
     * [
     *      ['search' => ...,'replace' => ...]
     *      ['search' => ...,'replace' => ...]
     * ]
     *
     * @param null|string $scope if scope is empty get only global scope
     * @param bool $unique_search If true it eliminates the double searches leaving the one with lower priority.
     *
     * @return array
     */
    public function getSearchReplaceList($scope = null, $unique_search = true, $globalScope = true)
    {
        DUPX_Log::info('-- SEARCH LIST -- SCOPE: '.DUPX_Log::varToString($scope), DUPX_Log::LV_DEBUG);

        $items_list = $this->getSearchReplaceItems($scope, $globalScope);
        DUPX_Log::info('-- SEARCH LIST ITEMS --'."\n".print_r($items_list, true), DUPX_Log::LV_HARD_DEBUG);

        if ($unique_search) {
            $items_list = self::uniqueSearchListItem($items_list);
            DUPX_Log::info('-- UNIQUE LIST ITEMS --'."\n".print_r($items_list, true), DUPX_Log::LV_HARD_DEBUG);
        }
        $result = array();

        foreach ($items_list as $item) {
            $result = array_merge($result, $item->getPairsSearchReplace());
        }

        foreach ($result as $index => $c_sr) {
            DUPX_Log::info(
                'SEARCH'.str_pad($index + 1, 3, ' ', STR_PAD_LEFT).":".
                str_pad(DUPX_Log::varToString($c_sr['search'])." ", 50, '=', STR_PAD_RIGHT).
                "=> ".
                DUPX_Log::varToString($c_sr['replace']));
        }

        return $result;
    }

    /**
     * remove duplicated search strings. 
     * Leave the object at lower priority
     *
     * @param DUPX_S_R_ITEM[] $list
     * @return boolean|DUPX_S_R_ITEM[]
     */
    private static function uniqueSearchListItem($list)
    {
        $search_strings = array();
        $result         = array();

        if (!is_array($list)) {
            return false;
        }

        foreach ($list as $item) {
            if (!in_array($item->search, $search_strings)) {
                $result[]         = $item;
                $search_strings[] = $item->search;
            }
        }

        return $result;
    }

    //PHP 8 Requires method to be public
    public function __wakeup()
    {
    }

    private function __clone()
    {

    }

}

/**
 * search and replace item use in manager to creat the search and replace list.
 */
class DUPX_S_R_ITEM
{
    private static $uniqueIdCount = 0;

    const TYPE_STRING               = 'str';
    const TYPE_URL                  = 'url';
    const TYPE_URL_NORMALIZE_DOMAIN = 'urlnd';
    const TYPE_PATH                 = 'path';

    /**
     *
     * @var int
     */
    private $id = 0;

    /**
     *
     * @var int prority lower first
     */
    public $prority = 10;

    /**
     *
     * @var string[] scope list
     */
    public $scope = array();

    /**
     *
     * @var string type of string
     */
    public $type = self::TYPE_STRING;

    /**
     *
     * @var string search string
     */
    public $search = '';

    /**
     *
     * @var string replace string
     */
    public $replace = '';

    /**
     *
     * @param string $search
     * @param string $replace
     * @param string $type
     * @param int $prority
     * @param string|string[] $scope if empty never used
     */
    public function __construct($search, $replace, $type = DUPX_S_R_ITEM::TYPE_STRING, $prority = 10, $scope = array())
    {
        if (!is_array($scope)) {
            $this->scope = empty($scope) ? array() : array((string) $scope);
        } else {
            $this->scope = $scope;
        }
        $this->prority = (int) $prority;
        switch ($type) {
            case DUPX_S_R_ITEM::TYPE_URL:
            case DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN:
                $this->search  = rtrim($search, '/');
                $this->replace = rtrim($replace, '/');
                break;
            case DUPX_S_R_ITEM::TYPE_PATH:
            case DUPX_S_R_ITEM::TYPE_STRING:
            default:
                $this->search  = (string) $search;
                $this->replace = (string) $replace;
                break;
        }
        $this->type = $type;
        $this->id   = self::$uniqueIdCount;
        self::$uniqueIdCount ++;
    }

    public function toArray()
    {
        return array(
            'id' => $this->id,
            'prority' => $this->prority,
            'scope' => $this->scope,
            'type' => $this->type,
            'search' => $this->search,
            'replace' => $this->replace
        );
    }

    public static function getItemFromArray($array)
    {
        $result = new self($array['search'], $array['replace'], $array['type'], $array['prority'], $array['scope']);
        return $result;
    }

    /**
     * return search an replace string
     *
     * result
     * [
     *      ['search' => ...,'replace' => ...]
     *      ['search' => ...,'replace' => ...]
     * ]
     *
     * @return array
     */
    public function getPairsSearchReplace()
    {
        switch ($this->type) {
            case self::TYPE_URL:
                return self::searchReplaceUrl($this->search, $this->replace);
            case self::TYPE_URL_NORMALIZE_DOMAIN:
                return self::searchReplaceUrl($this->search, $this->replace, true, true);
            case self::TYPE_PATH:
                return self::searchReplacePath($this->search, $this->replace);
            case self::TYPE_STRING:
            default:
                return self::searchReplaceWithEncodings($this->search, $this->replace);
        }
    }

    /**
     * Get search and replace strings with encodings
     * prevents unnecessary substitution like when search and reaplace are the same.
     *
     * result
     * [
     *      ['search' => ...,'replace' => ...]
     *      ['search' => ...,'replace' => ...]
     * ]
     *
     * @param string $search
     * @param string $replace
     * @param bool $json add json encode string
     * @param bool $urlencode add urlencode string
     *
     * @return array pairs search and replace
     */
    public static function searchReplaceWithEncodings($search, $replace, $json = true, $urlencode = true)
    {
        $result = array();
        if ($search != $replace) {
            $result[] = array('search' => $search, 'replace' => $replace);
        } else {
            return array();
        }

        // JSON ENCODE
        if ($json) {
            $search_json  = str_replace('"', "", json_encode($search));
            $replace_json = str_replace('"', "", json_encode($replace));

            if ($search != $search_json && $search_json != $replace_json) {
                $result[] = array('search' => $search_json, 'replace' => $replace_json);
            }
        }

        // URL ENCODE
        if ($urlencode) {
            $search_urlencode  = urlencode($search);
            $replace_urlencode = urlencode($replace);

            if ($search != $search_urlencode && $search_urlencode != $replace_urlencode) {
                $result[] = array('search' => $search_urlencode, 'replace' => $replace_urlencode);
            }
        }

        return $result;
    }

    /**
     * Add replace strings to substitute old url to new url
     * 1) no protocol old url to no protocol new url (es. //www.hold.url  => //www.new.url)
     * 2) wrong protocol new url to right protocol new url (es. http://www.new.url => https://www.new.url)
     * 
     * result
     * [
     *      ['search' => ...,'replace' => ...]
     *      ['search' => ...,'replace' => ...]
     * ]
     *
     * @param string $search_url
     * @param string $replace_url
     * @param bool $force_new_protocol if true force http or https protocol (work only if replace url have http or https scheme)
     *
     * @return array
     */
    public static function searchReplaceUrl($search_url, $replace_url, $force_new_protocol = true, $normalizeWww = false)
    {
        if (($parse_search_url = parse_url($search_url)) !== false && isset($parse_search_url['scheme'])) {
            $search_url_raw = substr($search_url, strlen($parse_search_url['scheme']) + 1);
        } else {
            $search_url_raw = $search_url;
        }

        if (($parse_replace_url = parse_url($replace_url)) !== false && isset($parse_replace_url['scheme'])) {
            $replace_url_raw = substr($replace_url, strlen($parse_replace_url['scheme']) + 1);
        } else {
            $replace_url_raw = $replace_url;
        }
        //SEARCH WITH NO PROTOCOL: RAW "//"
        $result = self::searchReplaceWithEncodings($search_url_raw, $replace_url_raw);

        // NORMALIZE source www
        if ($normalizeWww && self::domainCanNormalized($search_url_raw)) {
            if (self::isWww($search_url_raw)) {
                $fromDomain = '//'.substr($search_url_raw , strlen('//www.'));
            } else {
                $fromDomain = '//www.'.substr($search_url_raw , strlen('//'));
            }

            // prevent double subsition for subdiv problems.
            if (strpos($replace_url_raw, $fromDomain) !== 0) {
                $result = array_merge($result, self::searchReplaceWithEncodings($fromDomain, $replace_url_raw));
            }
        }

        // NORMALIZE source protocol
        if ($force_new_protocol && $parse_replace_url !== false && isset($parse_replace_url['scheme'])) {
            //FORCE NEW PROTOCOL [HTTP / HTTPS]
            switch ($parse_replace_url['scheme']) {
                case 'http':
                    $replace_url_wrong_protocol = 'https:'.$replace_url_raw;
                    break;
                case 'https':
                    $replace_url_wrong_protocol = 'http:'.$replace_url_raw;
                    break;
                default:
                    $replace_url_wrong_protocol = '';
                    break;
            }

            if (!empty($replace_url_wrong_protocol)) {
                $result = array_merge($result, self::searchReplaceWithEncodings($replace_url_wrong_protocol, $replace_url));
            }
        }

        return $result;
    }

    /**
     * result
     * [
     *      ['search' => ...,'replace' => ...]
     *      ['search' => ...,'replace' => ...]
     * ]
     *
     * @param string $search_path
     * @param string $replace_path
     * 
     * @return array
     */
    public static function searchReplacePath($search_path, $replace_path)
    {
        $result = self::searchReplaceWithEncodings($search_path, $replace_path);

        $search_path_unsetSafe  = rtrim(DUPX_U::unsetSafePath($search_path), '\\');
        $replace_path_unsetSafe = rtrim($replace_path, '/');
        $result                 = array_merge($result, self::searchReplaceWithEncodings($search_path_unsetSafe, $replace_path_unsetSafe));

        return $result;
    }

    /**
     * get unique item id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param $url string The URL whichs domain you want to get
     * @return string The domain part of the given URL
     *                  www.myurl.co.uk     => myurl.co.uk
     *                  www.google.com      => google.com
     *                  my.test.myurl.co.uk => myurl.co.uk
     *                  www.myurl.localweb  => myurl.localweb
     *
     */
    public static function getDomain($url)
    {
        $pieces = parse_url($url);
        $domain = isset($pieces['host']) ? $pieces['host'] : '';
        $regs   = null;
        if (strpos($domain, ".") !== false) {
            if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
                return $regs['domain'];
            } else {
                $exDomain = explode('.', $domain);
                return implode('.', array_slice($exDomain, -2, 2));
            }
        } else {
            return $domain;
        }
    }

    public static function domainCanNormalized($url)
    {
        $pieces = parse_url($url);

        if (!isset($pieces['host'])) {
            return false;
        }

        if (strpos($pieces['host'], ".") === false) {
            return false;
        }

        $dLevels = explode('.', $pieces['host']);
        if ($dLevels[0] == 'www') {
            return true;
        }

        switch (count($dLevels)) {
            case 1:
                return false;
            case 2:
                return true;
            case 3:
                if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $pieces['host'], $regs)) {
                    return $regs['domain'] == $pieces['host'];
                }
                return false;
            default:
                return false;
        }
    }

    public static function isWww($url)
    {
        $pieces = parse_url($url);
        if (!isset($pieces['host'])) {
            return false;
        } else {
            return strpos($pieces['host'], 'www.') === 0;
        }
    }
}installer/dup-installer/classes/utilities/class.u.exceptions.php000064400000003735151336065400021250 0ustar00<?php
/**
 * Custom exceptions
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\U
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Dup installer custom exception
 */
class DupxException extends Exception
{
    /**
     *
     * @var string // formatted html string
     */
    protected $longMsg = '';
    protected $faqLink = false;

    /**
     *
     * @param type $shortMsg
     * @param type $longMsg
     * @param type $faqLinkUrl
     * @param type $faqLinkLabel
     * @param type $code
     * @param Exception $previous
     */
    public function __construct($shortMsg, $longMsg = '', $faqLinkUrl = '', $faqLinkLabel = '', $code = 0, Exception $previous = null)
    {
        parent::__construct($shortMsg, $code, $previous);
        $this->longMsg = (string) $longMsg;
        if (!empty($faqLinkUrl)) {
            $this->faqLink = array(
                'url' => $faqLinkUrl,
                'label' => $faqLinkLabel
            );
        }
    }

    public function getLongMsg()
    {
        return $this->longMsg;
    }

    public function haveFaqLink()
    {
        return $this->faqLink !== false;
    }

    public function getFaqLinkUrl()
    {
        if ($this->haveFaqLink()) {
            return $this->faqLink['url'];
        } else {
            return '';
        }
    }

    public function getFaqLinkLabel()
    {
        if ($this->haveFaqLink()) {
            return $this->faqLink['label'];
        } else {
            return '';
        }
    }

    // custom string representation of object
    public function __toString()
    {
        $result = __CLASS__.": [{$this->code}]: {$this->message}";
        if ($this->haveFaqLink()) {
            $result .= "\n\tSee FAQ ".$this->faqLink['label'].': '.$this->faqLink['url'];
        }
        if (!empty($this->longMsg)) {
            $result .= "\n\t".strip_tags($this->longMsg);
        }
        $result .= "\n";
        return $result;
    }
}installer/dup-installer/classes/class.package.php000064400000004555151336065400016205 0ustar00<?php
/**
 * Class used to update and edit web server configuration files
 * for .htaccess, web.config and user.ini
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Package related functions
 *
 */
final class DUPX_Package
{

    /**
     *
     * @staticvar string $path
     * @return string
     */
    public static function getWpconfigArkPath()
    {
        static $path = null;
        if (is_null($path)) {
            $path = $GLOBALS['DUPX_AC']->installSiteOverwriteOn ? $GLOBALS['DUPX_ROOT'].'/dup-wp-config-arc__'.$GLOBALS['DUPX_AC']->package_hash.'.txt' : $GLOBALS['DUPX_ROOT'].'/wp-config.php';
        }
        return $path;
    }

    /**
     * 
     * @staticvar bool|string $packageHash
     * @return bool|string false if fail
     */
    public static function getPackageHash()
    {
        return $GLOBALS['DUPX_AC']->package_hash;
    }

    /**
     * 
     * @staticvar string $fileHash
     * @return string
     */
    public static function getArchiveFileHash()
    {
        static $fileHash = null;

        if (is_null($fileHash)) {
            $fileHash = preg_replace('/^.+_([a-z0-9]+)_[0-9]{14}_archive\.(?:daf|zip)$/', '$1', $GLOBALS['FW_PACKAGE_PATH']);
        }

        return $fileHash;
    }

    /**
     *
     * @staticvar string $path
     * @return string
     */
    public static function getHtaccessArkPath()
    {
        static $path = null;
        if (is_null($path)) {
            $path = $GLOBALS['DUPX_ROOT'].'/.htaccess__'.$GLOBALS['DUPX_AC']->package_hash;
        }
        return $path;
    }

    /**
     *
     * @staticvar string $path
     * @return string
     */
    public static function getOrigWpConfigPath()
    {
        static $path = null;
        if (is_null($path)) {
            $path = $GLOBALS['DUPX_INIT'].'/dup-orig-wp-config__'.$GLOBALS['DUPX_AC']->package_hash.'.txt';
        }
        return $path;
    }

    /**
     *
     * @staticvar string $path
     * @return string
     */
    public static function getOrigHtaccessPath()
    {
        static $path = null;
        if (is_null($path)) {
            $path = $GLOBALS['DUPX_INIT'].'/dup-orig-wp-config__'.$GLOBALS['DUPX_AC']->package_hash.'.txt';
        }
        return $GLOBALS['DUPX_INIT'].'/dup-orig-htaccess__'.$GLOBALS['DUPX_AC']->package_hash.'.txt';
    }
}installer/dup-installer/classes/config/class.conf.srv.php000064400000036352151336065400017615 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Class for server type enum setup
 * .htaccess, web.config and .user.ini
 *
 */
abstract class DUPX_ServerConfigTypes
{

    const Apache    = 0;
    const IIS       = 1;
    const WordFence = 2;

}

/**
 * Class used to update and edit web server configuration files
 * for .htaccess, web.config and .user.ini
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 */
class DUPX_ServerConfig
{

    protected static $fileHash;
    protected static $timeStamp;
    protected static $confFileApache;
    protected static $confFileApacheOrig;
    protected static $confFileIIS;
    protected static $confFileIISOrig;
    protected static $confFileWordFence;
    protected static $configMode;
    protected static $newSiteURL;
    protected static $rootPath;

    /**
     *  Setup this classes properties
     */
    public static function init()
    {
        self::$fileHash           = date("ymdHis").'-'.uniqid();
        self::$timeStamp          = date("Y-m-d H:i:s");
        self::$rootPath           = "{$GLOBALS['DUPX_ROOT']}";
        self::$confFileApache     = "{$GLOBALS['DUPX_ROOT']}/.htaccess";
        self::$confFileApacheOrig = "{$GLOBALS['DUPX_ROOT']}/.htaccess__".$GLOBALS['DUPX_AC']->package_hash;
        self::$confFileIIS        = "{$GLOBALS['DUPX_ROOT']}/web.config";
        self::$confFileIISOrig    = "{$GLOBALS['DUPX_ROOT']}/web.config.orig";
        self::$confFileWordFence  = "{$GLOBALS['DUPX_ROOT']}/.user.ini";
        self::$configMode         = isset($_POST['config_mode']) ? DUPX_U::sanitize_text_field($_POST['config_mode']) : null;
        self::$newSiteURL         = isset($_POST['url_new']) ? DUPX_U::sanitize_text_field($_POST['url_new']) : null;
    }

    /**
     * After the archive is extracted run setup checks
     *
     * @return null
     */
    public static function afterExtractionSetup()
    {
        if (self::$configMode != 'IGNORE') {
            //WORDFENCE: Only the WordFence file needs to be removed
            //completly from setup to avoid any issues
            self::removeFile(self::$confFileWordFence, DUPX_ServerConfigTypes::WordFence);
        } else {
            DUPX_Log::info("** CONFIG FILE SET TO IGNORE ALL CHANGES **");
        }
    }

    /**
     * Before the archive is extracted run a series of back and remove checks
     * This is for existing config files that may exist before the ones in the
     * archive are extracted.
     *
     * @return void
     */
    public static function beforeExtractionSetup()
    {
        if (self::$configMode != 'IGNORE') {
            //---------------------
            //APACHE
            if (self::createBackup(self::$confFileApache, DUPX_ServerConfigTypes::Apache)) {
                self::removeFile(self::$confFileApache, DUPX_ServerConfigTypes::Apache);
            }

            //---------------------
            //MICROSOFT IIS
            if (self::createBackup(self::$confFileIIS, DUPX_ServerConfigTypes::IIS)) {
                self::removeFile(self::$confFileIIS, DUPX_ServerConfigTypes::IIS);
            }

            //---------------------
            //WORDFENCE
            if (self::createBackup(self::$confFileWordFence, DUPX_ServerConfigTypes::WordFence)) {
                self::removeFile(self::$confFileWordFence, DUPX_ServerConfigTypes::WordFence);
            }
        }
    }

    /**
     * Copies the code in .htaccess__[HASH] and web.config.orig
     * to .htaccess and web.config
     *
     * @return void
     */
    public static function renameOrigConfigs()
    {
        //APACHE
        if (rename(self::$confFileApacheOrig, self::$confFileApache)) {
            DUPX_Log::info("\n- PASS: The orginal .htaccess__[HASH] was renamed");
        } else {
            DUPX_Log::info("\n- WARN: The orginal .htaccess__[HASH] was NOT renamed");
        }

        //IIS
        if (rename(self::$confFileIISOrig, self::$confFileIIS)) {
            DUPX_Log::info("\n- PASS: The orginal .htaccess__[HASH] was renamed");
        } else {
            DUPX_Log::info("\n- WARN: The orginal .htaccess__[HASH] was NOT renamed");
        }
    }

    /**
     * Creates the new config file
     *
     * @return void
     */
    public static function createNewConfigs()
    {
        $config_made = false;

        //APACHE
        if (file_exists(self::$confFileApacheOrig)) {
            self::createNewApacheConfig();
            self::removeFile(self::$confFileApacheOrig, DUPX_ServerConfigTypes::Apache);
            $config_made = true;
        }

        if (file_exists(self::$confFileIISOrig)) {
            self::createNewIISConfig();
            self::removeFile(self::$confFileIISOrig, DUPX_ServerConfigTypes::IIS);
            $config_made = true;
        }

        //No config was made so try to guess which one
        //95% of the time it will be Apache
        if (!$config_made) {
            if (DUPX_Server::isIISRunning()) {
                self::createNewIISConfig();
            } else {
                self::createNewApacheConfig();
            }
        }
    }

    /**
     * Sets up the web config file based on the inputs from the installer forms.
     *
     * @return void
     */
    private static function createNewApacheConfig()
    {
        $timestamp  = self::$timeStamp;
        $newdata    = parse_url(self::$newSiteURL);
        $newpath    = DUPX_U::addSlash(isset($newdata['path']) ? $newdata['path'] : "");
        $update_msg = "#This Apache config file was created by Duplicator Installer on {$timestamp}.\n";
        $update_msg .= "#The original can be found in archived file with the name .htaccess__[HASH]\n";

        $tmp_htaccess = <<<HTACCESS
{$update_msg}
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase {$newpath}
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . {$newpath}index.php [L]
</IfModule>
# END WordPress
HTACCESS;

        if (@file_put_contents(self::$confFileApache, $tmp_htaccess) === FALSE) {
            DUPX_Log::info("- WARN: Unable to create the .htaccess file! Please check the permission on the root directory and make sure the .htaccess exists.");
        } else {
            DUPX_Log::info("- PASS: Successfully created a new .htaccess file.");
            @chmod(self::$confFileApache, 0644);
        }
    }

    /**
     * Sets up the web config file based on the inputs from the installer forms.
     *
     * @return void
     */
    private static function createNewIISConfig()
    {
        $timestamp    = self::$timeStamp;
        $xml_contents = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
        $xml_contents .= "<!-- This new IIS config file was created by Duplicator Installer on {$timestamp}.\n"
            ."The original can be found in archived file with the name web.config.orig -->\n";
        $xml_contents .= "<configuration></configuration>\n";
        @file_put_contents(self::$confFileIIS, $xml_contents);
    }

    /**
     * Creates a copy of any existing file and hashes it with a .bak extension
     *
     * @param string $file_path					The full path of the config file
     * @param DUPX_ServerConfigTypes $type		A valid DUPX_ServerConfigTypes
     *
     * @return bool		Returns true if the file was backed-up.
     */
    private static function createBackup($file_path, $type)
    {
        $status    = false;
        $file_name = DupLiteSnapLibIOU::getFileName($file_path);
        $hash      = self::$fileHash;
        $source    = self::getTypeName($type);
        if (is_file($file_path)) {
            if (!self::backupExists($type)) {
                $status = copy($file_path, "{$file_path}-{$hash}-duplicator.bak");
                $status ? DUPX_Log::info("- PASS: {$source} '{$file_name}' backed-up to {$file_name}-{$hash}-duplicator.bak") : DUPX_Log::info("- WARN: {$source} '{$file_name}' unable to create backup copy, a possible permission error?");
            }
        } else {
            DUPX_Log::info("- PASS: {$source} '{$file_name}' not found - no backup needed.");
        }

        return $status;
    }

    /**
     * Removes the specified file
     *
     * @param string $file_path					The full path of the config file
     * @param DUPX_ServerConfigTypes $type		A valid DUPX_ServerConfigTypes
     *
     * @return bool		Returns true if the file was removed
     */
    private static function removeFile($file_path, $type)
    {
        $status = false;
        if (is_file($file_path)) {
            $source    = self::getTypeName($type);
            $file_name = DupLiteSnapLibIOU::getFileName($file_path);
            $status    = @unlink($file_path);
            if ($status === FALSE) {
                @chmod($file_path, 0777);
                $status = @unlink($file_path);
            }
            $status ? DUPX_Log::info("- PASS: Existing {$source} '{$file_name}' was removed") : DUPX_Log::info("- WARN: Existing {$source} '{$file_path}' not removed, a possible permission error?");
        }
        return $status;
    }

    /**
     * Check if a backup file already exists
     *
     * @param DUPX_ServerConfigTypes $type		A valid DUPX_ServerConfigTypes
     *
     * @return bool		Returns true if the file was removed
     */
    private static function backupExists($type)
    {
        $pattern = 'unknown-duplicator-type-set';

        switch ($type) {
            case DUPX_ServerConfigTypes::Apache:
                $pattern = '/.htaccess-.*-duplicator.bak/';
                break;
            case DUPX_ServerConfigTypes::IIS:
                $pattern = '/web.config-.*-duplicator.bak/';
                break;
            case DUPX_ServerConfigTypes::WordFence:
                $pattern = '/.user.ini-.*-duplicator.bak/';
                break;
        }

        if (is_dir(self::$rootPath)) {
            $dir = new DirectoryIterator(self::$rootPath);
            foreach ($dir as $file) {
                if ($file->isDot()) {
                    continue;
                }
                if ($file->isFile()) {
                    $name = $file->getFilename();
                    if (strpos($name, '-duplicator.bak')) {
                        if (preg_match($pattern, $name)) {
                            return true;
                        }
                    }
                }
            }
        }

        return false;
    }

    /**
     * Gets the friendly type name
     *
     * @param DUPX_ServerConfigTypes $type		A valid DUPX_ServerConfigTypes
     *
     * @return string		The friendly enum name
     */
    private static function getTypeName($type)
    {
        switch ($type) {
            case DUPX_ServerConfigTypes::Apache:
                return 'Apache';
                break;
            case DUPX_ServerConfigTypes::IIS:
                return 'Microsoft IIS';
                break;
            case DUPX_ServerConfigTypes::WordFence:
                return 'WordFence';
                break;

            default:
                throw new Exception('The param $type must be of type DUPX_ServerConfigTypes');
                break;
        }
    }

    /**
     * Get AddHadler line from existing WP .htaccess file
     *
     * @param $path string root path
     * @return string
     */
    private static function getOldHtaccessAddhandlerLine($path)
    {
        $backupHtaccessPath = $path.'/.htaccess-'.$GLOBALS['DUPX_AC']->package_hash.'.orig';
        if (file_exists($backupHtaccessPath)) {
            $htaccessContent = file_get_contents($backupHtaccessPath);
            if (!empty($htaccessContent)) {
                // match and trim non commented line  "AddHandler application/x-httpd-XXXX .php" case insenstive
                $re      = '/^[\s\t]*[^#]?[\s\t]*(AddHandler[\s\t]+.+\.php[ \t]?.*?)[\s\t]*$/mi';
                $matches = array();
                if (preg_match($re, $htaccessContent, $matches)) {
                    return "\n".$matches[1];
                }
            }
        }
        return '';
    }

    /**
     * Copies the code in .htaccess__[HASH] to .htaccess
     *
     * @param $path					The root path to the location of the server config files
     * @param $new_htaccess_name	New name of htaccess (either .htaccess or a backup name)
     *
     * @return bool					Returns true if the .htaccess file was retained successfully
     */
    public static function renameHtaccess($path, $new_htaccess_name)
    {
        $status = false;

        if (!@rename($path.'/.htaccess__'.$GLOBALS['DUPX_AC']->package_hash, $path.'/'.$new_htaccess_name)) {
            $status = true;
        }

        return $status;
    }

    /**
     * Sets up the web config file based on the inputs from the installer forms.
     *
     * @param int $mu_mode		Is this site a specific multi-site mode
     * @param object $dbh		The database connection handle for this request
     * @param string $path		The path to the config file
     *
     * @return null
     */
    public static function setup($mu_mode, $mu_generation, $dbh, $path)
    {
        DUPX_Log::info("\nWEB SERVER CONFIGURATION FILE UPDATED:");

        $timestamp    = date("Y-m-d H:i:s");
        $post_url_new = DUPX_U::sanitize_text_field($_POST['url_new']);
        $newdata      = parse_url($post_url_new);
        $newpath      = DUPX_U::addSlash(isset($newdata['path']) ? $newdata['path'] : "");
        $update_msg   = "# This file was updated by Duplicator Pro on {$timestamp}.\n";
        $update_msg   .= (file_exists("{$path}/.htaccess")) ? "# See .htaccess__[HASH] for the .htaccess original file." : "";
        $update_msg   .= self::getOldHtaccessAddhandlerLine($path);


        // no multisite
        $empty_htaccess = false;
        $query_result   = @mysqli_query($dbh, "SELECT option_value FROM `".mysqli_real_escape_string($dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` WHERE option_name = 'permalink_structure' ");

        if ($query_result) {
            $row = @mysqli_fetch_array($query_result);
            if ($row != null) {
                $permalink_structure = trim($row[0]);
                $empty_htaccess      = empty($permalink_structure);
            }
        }


        if ($empty_htaccess) {
            $tmp_htaccess = '';
        } else {
            $tmp_htaccess = <<<HTACCESS
{$update_msg}
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase {$newpath}
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . {$newpath}index.php [L]
</IfModule>
# END WordPress
HTACCESS;
            DUPX_Log::info("- Preparing .htaccess file with basic setup.");
        }

        if (@file_put_contents("{$path}/.htaccess", $tmp_htaccess) === FALSE) {
            DUPX_Log::info("WARNING: Unable to update the .htaccess file! Please check the permission on the root directory and make sure the .htaccess exists.");
        } else {
            DUPX_Log::info("- Successfully updated the .htaccess file setting.");
        }
        @chmod("{$path}/.htaccess", 0644);
    }
}installer/dup-installer/classes/config/class.security.php000064400000014317151336065400017723 0ustar00<?php

/**
 * Security class
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\Constants
 *
 */

defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * singleton class
 *
 *
 * In this class all installer security checks are performed. If the security checks are not passed, an exception is thrown and the installer is stopped.
 * This happens before anything else so the class must work without the initialization of all global duplicator variables.
 */
class DUPX_Security
{
    const SECURITY_NONE     = 'none';
    const SECURITY_PASSWORD = 'pwd';
    const SECURITY_ARCHIVE  = 'archive';

    /**
     *
     * @var self
     */
    private static $instance = null;

    /**
     * archive path read from  csrf file
     * @var string
     */
    private $archivePath = null;

    /**
     * installer name read from csrf file
     * @var string
     */
    private $bootloader = null;

    /**
     * installer url path read from csrf file
     * @var string
     */
    private $bootUrl = null;

    /**
     * boot log file full path read from csrf file
     * @var string
     */
    private $bootFilePath = null;

    /**
     * boot log file full path read from csrf file
     * @var string
     */
    private $bootLogFile = null;

    /**
     * package hash read from csrf file
     * @var string
     */
    private $packageHash = null;

    /**
     * public package hash read from csrf file
     * @var string
     */
    private $secondaryPackageHash = null;

    /**
     *
     * @return self
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    private function __construct()
    {
        DUPX_CSRF::init($GLOBALS['DUPX_INIT'], DUPX_Boot::getPackageHash());

        if (!file_exists(DUPX_CSRF::getFilePath())) {
            throw new Exception("CSRF FILE NOT FOUND\n"
                    . "Please, check webroot file permsission and dup-installer folder permission");
        }

        $this->bootloader           = DUPX_CSRF::getVal('bootloader');
        $this->bootUrl              = DUPX_CSRF::getVal('booturl');
        $this->bootLogFile          = DupLiteSnapLibIOU::safePath(DUPX_CSRF::getVal('bootLogFile'));
        $this->bootFilePath         = DupLiteSnapLibIOU::safePath(DUPX_CSRF::getVal('installerOrigPath'));
        $this->archivePath          = DupLiteSnapLibIOU::safePath(DUPX_CSRF::getVal('archive'));
        $this->packageHash          = DUPX_CSRF::getVal('package_hash');
        $this->secondaryPackageHash = DUPX_CSRF::getVal('secondaryHash');
    }

    /**
     * archive path read from installer.php passed by DUPX_CSFR
     *
     * @return string
     */
    public function getArchivePath()
    {
        return $this->archivePath;
    }

    /**
     * installer full path read from installer.php passed by DUPX_CSFR
     *
     * @return string
     */
    public function getBootFilePath()
    {
        return $this->bootFilePath;
    }

    /**
     * boot log file full path read from installer.php passed by DUPX_CSFR
     *
     * @return string
     */
    public function getBootLogFile()
    {
        return $this->bootLogFile;
    }

    /**
     * bootloader path read from installer.php passed by DUPX_CSFR
     *
     * @return string
     */
    public function getBootloader()
    {
        return $this->bootloader;
    }

    /**
     * bootloader path read from installer.php passed by DUPX_CSFR
     *
     * @return string
     */
    public function getBootUrl()
    {
        return $this->bootUrl;
    }

    /**
     * package hash read from installer.php passed by DUPX_CSFR
     *
     * @return string
     */
    public function getPackageHash()
    {
        return $this->packageHash;
    }

    /**
     * package public hash read from installer.php passed by DUPX_CSFR
     *
     * @return string
     */
    public function getSecondaryPackageHash()
    {
        return $this->secondaryPackageHash;
    }

    /**
     * Get security tipe (NONE, PASSWORD, ARCHIVE)
     *
     * @return string enum type
     */
    public function getSecurityType()
    {
        if ($GLOBALS['DUPX_AC']->secure_on == true) {
            return self::SECURITY_PASSWORD;
        }

        if (
            DUPX_InstallerState::getInstance()->mode == DUPX_InstallerMode::OverwriteInstall &&
            basename($this->bootFilePath) == 'installer.php' &&
            !in_array($_SERVER['REMOTE_ADDR'], self::getSecurityAddrWhitelist())
        ) {
            return self::SECURITY_ARCHIVE;
        }

        return self::SECURITY_NONE;
    }

    /**
     * Get IPs white list for remote requests
     *
     * @return string[]
     */
    private static function getSecurityAddrWhitelist()
    {
        // uncomment this to test security archive on localhost
        // return array();
        // -------
        return array(
            '127.0.0.1',
            '::1'
        );
    }

    /**
     * return true if security check is passed
     *
     * @return bool
     */
    public function securityCheck()
    {
        $archiveConfig = DUPX_ArchiveConfig::getInstance();
        $result = false;
        switch ($this->getSecurityType()) {
            case self::SECURITY_NONE:
                $result = true;
                break;
            case self::SECURITY_PASSWORD:
                $securePass = isset($_POST['secure-pass']) ? DupLiteSnapLibUtil::sanitize_non_stamp_chars_and_newline($_POST['secure-pass']) : '';
                $pass_hasher = new DUPX_PasswordHash(8, false);
                $base64Pass  = base64_encode($securePass);
                $result      = $pass_hasher->CheckPassword($base64Pass, $archiveConfig->secure_pass);
                break;
            case self::SECURITY_ARCHIVE:
                $secureArchive = isset($_POST['secure-archive']) ? DupLiteSnapLibUtil::sanitize_non_stamp_chars_newline_and_trim($_POST['secure-archive']) : '';
                $result = (strcmp(basename($this->archivePath), $secureArchive) == 0);
                break;
            default:
                throw new Exception('Security type not valid ' . $this->getSecurityType());
                break;
        }
        return $result;
    }
}
installer/dup-installer/classes/config/index.php000064400000000017151336065400016047 0ustar00<?php
//silentinstaller/dup-installer/classes/config/class.constants.php000064400000035030151336065400020063 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Class used to group all global constants
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\Constants
 *
 */
class DUPX_Constants
{
    const DEFAULT_MAX_STRLEN_SERIALIZED_CHECK_IN_M = 4; // 0 no limit

    /**
     *
     * @var int
     */
    public static $maxStrlenSerializeCheck = self::DEFAULT_MAX_STRLEN_SERIALIZED_CHECK;

	/**
	 * Init method used to auto initialize the global params
	 *
	 * @return null
	 */
	public static function init()
	{
		$dup_installer_dir_absolute_path = dirname(dirname(dirname(__FILE__)));
		$config_files = glob($dup_installer_dir_absolute_path.'/dup-archive__*.txt');
		$config_file_absolute_path = array_pop($config_files);
		$config_file_name = basename($config_file_absolute_path, '.txt');
		$archive_prefix_length = strlen('dup-archive__');
		$GLOBALS['PACKAGE_HASH'] = substr($config_file_name, $archive_prefix_length); 
        
        $bootloader                 = DUPX_CSRF::getVal('bootloader');
        $GLOBALS['BOOTLOADER_NAME'] = $bootloader ? $bootloader : 'installer.php';
        $package                    = DUPX_CSRF::getVal('archive');
        $GLOBALS['FW_PACKAGE_PATH'] = $package ? $package : null; // '%fwrite_package_name%';

        $GLOBALS['FW_ENCODED_PACKAGE_PATH'] = urlencode($GLOBALS['FW_PACKAGE_PATH']);
        $GLOBALS['FW_PACKAGE_NAME'] = basename($GLOBALS['FW_PACKAGE_PATH']);

		$GLOBALS['FAQ_URL'] = 'https://snapcreek.com/duplicator/docs/faqs-tech';

		//DATABASE SETUP: all time in seconds
		//max_allowed_packet: max value 1073741824 (1268MB) see my.ini
		$GLOBALS['DB_MAX_TIME'] = 5000;
        $GLOBALS['DATABASE_PAGE_SIZE'] = 3500;
		$GLOBALS['DB_MAX_PACKETS'] = 268435456;
		$GLOBALS['DBCHARSET_DEFAULT'] = 'utf8';
		$GLOBALS['DBCOLLATE_DEFAULT'] = 'utf8_general_ci';
		$GLOBALS['DB_RENAME_PREFIX'] = 'x-bak-' . @date("dHis") . '__';

        if (!defined('MAX_SITES_TO_DEFAULT_ENABLE_CORSS_SEARCH')) {
            define('MAX_SITES_TO_DEFAULT_ENABLE_CORSS_SEARCH',  10);
        }

		//UPDATE TABLE SETTINGS
		$GLOBALS['REPLACE_LIST'] = array();
		$GLOBALS['DEBUG_JS'] = false;

		//PHP INI SETUP: all time in seconds
		if (!$GLOBALS['DUPX_ENFORCE_PHP_INI']) {
			if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('mysql.connect_timeout'))@ini_set('mysql.connect_timeout', '5000');
			if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('memory_limit'))  @ini_set('memory_limit', DUPLICATOR_PHP_MAX_MEMORY);
			if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('max_execution_time'))  @ini_set("max_execution_time", '5000');
			if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('max_input_time'))  @ini_set("max_input_time", '5000');
			if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('default_socket_timeout'))  @ini_set('default_socket_timeout', '5000');
			@set_time_limit(0);
		}

		//CONSTANTS
		define("DUPLICATOR_INIT", 1);

		//SHARED POST PARAMS
		$_GET['debug'] = isset($_GET['debug']) ? true : false;
		$_GET['basic'] = isset($_GET['basic']) ? true : false;
		// For setting of help view
		if (isset($_GET['view'])) {
			$_POST['view'] = $_GET['view'];
		} elseif (!isset($_POST['view'])) {
			$_POST['view'] = "step1";
		}

		//GLOBALS
		$GLOBALS["VIEW"]				= isset($_GET["view"]) ? $_GET["view"] : $_POST["view"];
		$GLOBALS['INIT']                = ($GLOBALS['VIEW'] === 'secure');
 		$GLOBALS["LOG_FILE_NAME"]		= 'dup-installer-log__'.DUPX_CSRF::getVal('secondaryHash').'.txt';
		$GLOBALS['SEPERATOR1']			= str_repeat("********", 10);
		$GLOBALS['LOGGING']				= isset($_POST['logging']) ? $_POST['logging'] : 1;
		$GLOBALS['CURRENT_ROOT_PATH']	= str_replace('\\', '/', realpath(dirname(__FILE__) . "/../../../"));
		$GLOBALS['LOG_FILE_PATH']		= $GLOBALS['DUPX_INIT'] . '/' . $GLOBALS["LOG_FILE_NAME"];
        $GLOBALS["NOTICES_FILE_NAME"]	= "dup-installer-notices__{$GLOBALS['PACKAGE_HASH']}.json";
        $GLOBALS["NOTICES_FILE_PATH"]	= $GLOBALS['DUPX_INIT'] . '/' . $GLOBALS["NOTICES_FILE_NAME"];
		$GLOBALS['CHOWN_ROOT_PATH']		= DupLiteSnapLibIOU::chmod("{$GLOBALS['CURRENT_ROOT_PATH']}", 'u+rwx');
		$GLOBALS['CHOWN_LOG_PATH']		= DupLiteSnapLibIOU::chmod("{$GLOBALS['LOG_FILE_PATH']}", 'u+rw');
        $GLOBALS['CHOWN_NOTICES_PATH']	= DupLiteSnapLibIOU::chmod("{$GLOBALS['NOTICES_FILE_PATH']}", 'u+rw');
        if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
            $_SERVER ['HTTPS'] = 'on';
        }
        $GLOBALS['URL_SSL']				= (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') ? true : false;
		$GLOBALS['URL_PATH']			= ($GLOBALS['URL_SSL']) ? "https://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}" : "http://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}";
		$GLOBALS['PHP_MEMORY_LIMIT']	= ini_get('memory_limit') === false ? 'n/a' : ini_get('memory_limit');
		$GLOBALS['PHP_SUHOSIN_ON']		= extension_loaded('suhosin') ? 'enabled' : 'disabled';

        /**
         * Inizialize notices manager and load file
         */
        $noticesManager = DUPX_NOTICE_MANAGER::getInstance();

        //Restart log if user starts from step 1
        if ($GLOBALS["VIEW"] == "step1") {
            $GLOBALS['LOG_FILE_HANDLE'] = @fopen($GLOBALS['LOG_FILE_PATH'], "w+");
            $noticesManager->resetNotices();
        } else {
            $GLOBALS['LOG_FILE_HANDLE'] = @fopen($GLOBALS['LOG_FILE_PATH'], "a+");
        }

		// for ngrok url and Local by Flywheel Live URL
		if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {
			$host = $_SERVER['HTTP_X_ORIGINAL_HOST'];
		} else {
			$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];//WAS SERVER_NAME and caused problems on some boxes
		}
        $GLOBALS['HOST_NAME'] = $host;

        if (!defined('MAX_STRLEN_SERIALIZED_CHECK')) { define('MAX_STRLEN_SERIALIZED_CHECK', 2000000); }
	}

	public static function initErrDefines()
    {
		define('ERR_ZIPNOTFOUND', 'The packaged zip file was not found or has become unreadable. Be sure the zip package is in the same directory as the installer file.  If you are trying to reinstall a package you can copy the package from the storage directory back up to your root which is the same location as your installer file.');

		define('ERR_SHELLEXEC_ZIPOPEN', 'Failed to extract the archive using shell_exec unzip');

		define('ERR_ZIPOPEN', 'Failed to open the zip archive file. Please be sure the archive is completely downloaded before running the installer. Try to extract the archive manually to make sure the file is not corrupted.');

		define('ERR_ZIPEXTRACTION', 'Errors extracting the zip file.  Portions or part of the zip archive did not extract correctly.    Try to extract the archive manually with a client side program like unzip/win-zip/winrar to make sure the file is not corrupted.  If the file extracts correctly then there is an invalid file or directory that PHP is unable to extract.  This can happen if your moving from one operating system to another where certain naming conventions work on one environment and not another. <br/><br/> Workarounds: <br/> 1. Create a new package and be sure to exclude any directories that have name checks or files in them.   This warning will be displayed on the scan results under "Name Checks". <br/> 2. Manually extract the zip file with a client side program.  Then under options in step 1 of the installer select the "Manual Archive Extraction" option and perform the install.');

		define('ERR_ZIPMANUAL', 'When choosing "Manual Archive Extraction", the contents of the package must already be extracted for the process to continue.  Please manually extract the package into the current directory before continuing in manual extraction mode.  Also validate that the wp-config.php files are present.');

		define('ERR_MAKELOG', 'PHP is having issues writing to the log file <b>'.$GLOBALS['DUPX_INIT'].'\dup-installer-log__[HASH].txt .</b> In order for the Duplicator to proceed validate your owner/group and permission settings for PHP on this path. Try temporarily setting you permissions to 777 to see if the issue gets resolved.  If you are on a shared hosting environment please contact your hosting company and tell them you are getting errors writing files to the path above when using PHP.');

		define('ERR_ZIPARCHIVE', 'In order to extract the archive.zip file, the PHP ZipArchive module must be installed.  Please read the FAQ for more details.  You can still install this package but you will need to select the "Manual Archive Extraction" options found under Options.  Please read the online user guide for details in performing a manual archive extraction.');

		define('ERR_MYSQLI_SUPPORT', 'In order to complete an install the mysqli extension for PHP is required. If you are on a hosted server please contact your host and request that mysqli be enabled.  For more information visit: http://php.net/manual/en/mysqli.installation.php');

		define('ERR_DBCONNECT', 'DATABASE CONNECTION FAILED!<br/>');

		define('ERR_DBCONNECT_CREATE', 'DATABASE CREATION FAILURE!<br/> Unable to create database "%s". Check to make sure the user has "Create" privileges.  Some hosts will restrict the creation of a database only through the cpanel.  Try creating the database manually to proceed with installation.  If the database already exists select the action "Connect and Remove All Data" which will remove all existing tables.');

        define('ERR_DROP_TABLE_TRYCLEAN', 'TABLE CLEAN FAILURE'
            .'Unable to remove TABLE "%s" from database "%s".<br/>'
            .'Please remove all tables from this database and try the installation again. '
            .'If no tables show in the database, then Drop the database and re-create it.<br/>'
            .'ERROR MESSAGE: %s');
        define('ERR_DROP_PROCEDURE_TRYCLEAN', 'PROCEDURE CLEAN FAILURE. '
            .'Please remove all procedures from this database and try the installation again. '
            .'If no procedures show in the database, then Drop the database and re-create it.<br/>'
            .'ERROR MESSAGE: %s <br/><br/>');
        define('ERR_DROP_FUNCTION_TRYCLEAN', 'FUNCTION CLEAN FAILURE. '
            .'Please remove all functions from this database and try the installation again. '
            .'If no functions show in the database, then Drop the database and re-create it.<br/>'
            .'ERROR MESSAGE: %s <br/><br/>');
        define('ERR_DROP_VIEW_TRYCLEAN', 'VIEW CLEAN FAILURE. '
            .'Please remove all views from this database and try the installation again. '
            .'If no views show in the database, then Drop the database and re-create it.<br/>'
            .'ERROR MESSAGE: %s <br/><br/>');

		define('ERR_DBTRYRENAME', 'DATABASE CREATION FAILURE!<br/> Unable to rename a table from database "%s".<br/> Be sure the database user has RENAME privileges for this specific database on all tables.');

		define('ERR_DBCREATE', 'The database "%s" does not exist.<br/>  Change the action to create in order to "Create New Database" to create the database.  Some hosting providers do not allow database creation except through their control panels. In this case, you will need to login to your hosting providers\' control panel and create the database manually.  Please contact your hosting provider for further details on how to create the database.');

		define('ERR_DBEMPTY', 'The database "%s" already exists and has "%s" tables.  When using the "Create New Database" action the database should not exist.  Select the action "Connect and Remove All Data" or "Connect and Backup Any Existing Data" to remove or backup the existing tables or choose a database name that does not already exist. Some hosting providers do not allow table removal or renaming from scripts.  In this case, you will need to login to your hosting providers\' control panel and remove or rename the tables manually.  Please contact your hosting provider for further details.  Always backup all your data before proceeding!');

		define('ERR_DBMANUAL', 'The database "%s" has "%s" tables. This does not look to be a valid WordPress database.  The base WordPress install has 12 tables.  Please validate that this database is indeed pre-populated with a valid WordPress database.  The "Manual SQL execution" mode requires that you have a valid WordPress database already installed.');

		define('ERR_TESTDB_VERSION_INFO', 'The current version detected was released prior to MySQL 5.5.3 which had a release date of April 8th, 2010.  WordPress 4.2 included support for utf8mb4 which is only supported in MySQL server 5.5.3+.  It is highly recommended to upgrade your version of MySQL server on this server to be more compatible with recent releases of WordPress and avoid issues with install errors.');

		define('ERR_TESTDB_VERSION_COMPAT', 'In order to avoid database incompatibility issues make sure the database versions between the build and installer servers are as close as possible. If the package was created on a newer database version than where it is being installed then you might run into issues.<br/><br/> It is best to make sure the server where the installer is running has the same or higher version number than where it was built.  If the major and minor version are the same or close for example [5.7 to 5.6], then the migration should work without issues.  A version pair of [5.7 to 5.1] is more likely to cause issues unless you have a very simple setup.  If the versions are too far apart work with your hosting provider to upgrade the MySQL engine on this server.<br/><br/>   <b>MariaDB:</b> If see a version of 10.N.N then the database distribution is a MariaDB flavor of MySQL.   While the distributions are very close there are some subtle differences.   Some operating systems will report the version such as "5.5.5-10.1.21-MariaDB" showing the correlation of both.  Please visit the online <a href="https://mariadb.com/kb/en/mariadb/mariadb-vs-mysql-compatibility/" target="_blank">MariaDB versus MySQL - Compatibility</a> page for more details.<br/><br/> Please note these messages are simply notices.  It is highly recommended that you continue with the install process and closely monitor the dup-installer-log.txt file along with the install report found on step 3 of the installer.  Be sure to look for any notices/warnings/errors in these locations to validate the install process did not detect any errors. If any issues are found please visit the FAQ pages and see the question <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-260-q" target="_blank">What if I get database errors or general warnings on the install report?</a>.');
	}
}installer/dup-installer/classes/config/class.archive.config.php000064400000004712151336065400020737 0ustar00<?php
/**
 * Class used to control values about the package meta data
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\ArchiveConfig
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUPX_ArchiveConfig
{
	//READ-ONLY: COMPARE VALUES
	public $created;
	public $version_dup;
	public $version_wp;
	public $version_db;
	public $version_php;
	public $version_os;
	public $dbInfo;

	//GENERAL
	public $secure_on;
	public $secure_pass;
	public $skipscan;
	public $package_name;
	public $package_hash;
	public $package_notes;
	public $wp_tableprefix;
	public $blogname;
    public $wplogin_url;
	public $relative_content_dir;
	public $blogNameSafe;
	public $exportOnlyDB;

	//BASIC DB
	public $dbhost;
	public $dbname;
	public $dbuser;
	public $dbpass;
	public $dbcharset;
	public $dbcollation;

	//ADV OPTS	
	public $wproot;
	public $url_old;
	public $opts_delete;

	public $debug_mode = false;

	private static $instance = null;

	/**
	 * Loads a usable object from the archive.txt file found in the dup-installer root
	 *
	 * @param string $path		The root path to the location of the server config files
	 *
	 * @return obj	Returns an instance of DUPX_ArchiveConfig
	 */
	public static function getInstance()
	{
		if (self::$instance == null) {
			$config_filepath = realpath(dirname(__FILE__).'/../../dup-archive__'.$GLOBALS['PACKAGE_HASH'].'.txt');
			if (file_exists($config_filepath )) {
				self::$instance = new DUPX_ArchiveConfig();

				$file_contents = file_get_contents($config_filepath);
				$ac_data = json_decode($file_contents);

				foreach ($ac_data as $key => $value) {
					self::$instance->{$key} = $value;
				}

				if (isset($_GET['debug']) && ($_GET['debug'] == 1)) {
					self::$instance->debug_mode = true;
				}
                
 			} else {
				echo "$config_filepath doesn't exist<br/>";
			}
		}

		//Instance Updates:
		self::$instance->blogNameSafe	= preg_replace("/[^A-Za-z0-9?!]/", '', self::$instance->blogname);
		self::$instance->dbhost			= empty(self::$instance->dbhost)       ? 'localhost' : self::$instance->dbhost;

		return self::$instance;
	}

    public function isZipArchive()
    {
        //$extension = strtolower(pathinfo($this->package_name)['extension']);
		$extension = strtolower(pathinfo($this->package_name, PATHINFO_EXTENSION));
        
        return ($extension == 'zip');
    }
}installer/dup-installer/classes/config/class.boot.php000064400000025462151336065400017022 0ustar00<?php
/**
 * Boot class
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\Constants
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * This class manages all the initialization of the installer by performing security tests, log initialization and global variables.
 * 
 */
class DUPX_Boot
{

    const ARCHIVE_PREFIX      = 'dup-archive__';
    const ARCHIVE_EXTENSION   = '.txt';
    const MINIMUM_PHP_VERSION = '5.3.8';

    /**
     * this variable becomes false after the installer is initialized by skipping the shutdown function defined in the boot class
     * 
     * @var bool  
     */
    private static $shutdownFunctionEnabled = true;

    /**
     * inizialize all
     */
    public static function init()
    {
        self::phpVersionCheck();

        $GLOBALS['DUPX_ENFORCE_PHP_INI'] = false;

        // INIT ERROR LOG FILE (called before evrithing)
        if (function_exists('register_shutdown_function')) {
            register_shutdown_function(array(__CLASS__, 'bootShutdown'));
        }
        if (self::initPhpErrorLog(false) === false) {
            // Enable this only for debugging. Generate a log too alarmist.            
            error_log('DUPLICATOR CAN\'T CHANGE THE PATH OF PHP ERROR LOG FILE', E_USER_NOTICE);
        }

        // includes main files
        self::includes();
        // set log post-proccessor
        DUPX_Log::setPostProcessCallback(array('DUPX_CTRL', 'renderPostProcessings'));
        // set time for logging time
        DUPX_Log::resetTime();
        // set all PHP.INI settings
        self::phpIni();
        self::initParamsBase();
        DUPX_Security::getInstance();

        /*
         * INIZIALIZE
         */
        // init global values
        DUPX_Constants::init();

        //init managed host manager
        DUPX_Custom_Host_Manager::getInstance()->init();

        // init ERR defines
        DUPX_Constants::initErrDefines();
        // init error handler after constant
        DUPX_Handler::initErrorHandler();

        self::initArchive();

        $pathInfo = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
        DUPX_Log::info("\n\n"
            ."==============================================\n"
            ."= BOOT INIT OK [".$pathInfo."]\n"
            ."==============================================\n", DUPX_Log::LV_DETAILED);
    }

    /**
     * init ini_set and default constants
     *
     * @throws Exception
     */
    public static function phpIni()
    {
        /** Absolute path to the Installer directory. - necessary for php protection */
        if (!defined('KB_IN_BYTES')) {
            define('KB_IN_BYTES', 1024);
        }
        if (!defined('MB_IN_BYTES')) {
            define('MB_IN_BYTES', 1024 * KB_IN_BYTES);
        }
        if (!defined('GB_IN_BYTES')) {
            define('GB_IN_BYTES', 1024 * MB_IN_BYTES);
        }
        if (!defined('DUPLICATOR_PHP_MAX_MEMORY')) {
            define('DUPLICATOR_PHP_MAX_MEMORY', 4096 * MB_IN_BYTES);
        }

        date_default_timezone_set('UTC'); // Some machines don’t have this set so just do it here.
        @ignore_user_abort(true);

        @set_time_limit(3600);

        $defaultCharset = ini_get("default_charset");
        if (empty($defaultCharset) && DupLiteSnapLibUtil::wp_is_ini_value_changeable('default_charset')) {
            @ini_set("default_charset", 'utf-8');
        }
        if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('memory_limit')) {
            @ini_set('memory_limit', DUPLICATOR_PHP_MAX_MEMORY);
        }
        if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('max_input_time')) {
            @ini_set('max_input_time', '-1');
        }
        if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('pcre.backtrack_limit')) {
            @ini_set('pcre.backtrack_limit', PHP_INT_MAX);
        }

        //PHP INI SETUP: all time in seconds
        if (!isset($GLOBALS['DUPX_ENFORCE_PHP_INI']) || !$GLOBALS['DUPX_ENFORCE_PHP_INI']) {
            if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('mysql.connect_timeout')) {
                @ini_set('mysql.connect_timeout', '5000');
            }
            if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('max_execution_time')) {
                @ini_set("max_execution_time", '5000');
            }
            if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('max_input_time')) {
                @ini_set("max_input_time", '5000');
            }
            if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('default_socket_timeout')) {
                @ini_set('default_socket_timeout', '5000');
            }
            @set_time_limit(0);
        }
    }

    /**
     * include default utils files and constants
     *
     * @throws Exception
     */
    public static function includes()
    {
        require_once($GLOBALS['DUPX_INIT'].'/lib/snaplib/snaplib.all.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.exceptions.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.notices.manager.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/utilities/class.u.html.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.constants.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/class.package.php');
        require_once($GLOBALS['DUPX_INIT'].'/ctrls/ctrl.base.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.archive.config.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/config/class.security.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/class.logging.php');
        require_once($GLOBALS['DUPX_INIT'].'/classes/host/class.custom.host.manager.php');
    }

    /**
     * init archive config
     * 
     * @throws Exception
     */
    public static function initArchive()
    {
        $GLOBALS['DUPX_AC'] = DUPX_ArchiveConfig::getInstance();
        if (empty($GLOBALS['DUPX_AC'])) {
            throw new Exception("Can't initialize config globals");
        }
    }

    /**
     * This function moves the error_log.php into the dup-installer directory.
     * It is called before including any other file so it uses only native PHP functions.
     * 
     * !!! Don't use any Duplicator function within this function. !!!
     * 
     * @param bool $reset
     * @return boolean
     */
    public static function initPhpErrorLog($reset = false)
    {
        if (!function_exists('ini_set')) {
            return false;
        }

        $logFile = $GLOBALS['DUPX_INIT'].'/php_error__'.self::getPackageHash().'.log';

        if (file_exists($logFile) && !is_writable($logFile)) {
            if (!is_writable($logFile)) {
                return false;
            } else if ($reset && function_exists('unlink')) {
                @unlink($logFile);
            }
        }

        if (function_exists('error_reporting')) {
            error_reporting(E_ALL | E_STRICT);  // E_STRICT for PHP 5.3
        }

        @ini_set("log_errors", 1);
        if (@ini_set("error_log", $logFile) === false) {
            return false;
        }

        if (!file_exists($logFile)) {
            error_log("PHP ERROR LOG INIT");
        }

        return true;
    }

    /**
     * It is called before including any other file so it uses only native PHP functions.
     * 
     * !!! Don't use any Duplicator function within this function. !!!
     * 
     * @staticvar bool|string $packageHash
     * @return bool|string      // package hash or false if fail
     */
    public static function getPackageHash()
    {
        static $packageHash = null;
        if (is_null($packageHash)) {
            $searchStr    = $GLOBALS['DUPX_INIT'].'/'.self::ARCHIVE_PREFIX.'*'.self::ARCHIVE_EXTENSION;
            $config_files = glob($searchStr);
            if (empty($config_files)) {
                $packageHash = false;
            } else {
                $config_file_absolute_path = array_pop($config_files);
                $config_file_name          = basename($config_file_absolute_path, self::ARCHIVE_EXTENSION);
                $packageHash               = substr($config_file_name, strlen(self::ARCHIVE_PREFIX));
            }
        }
        return $packageHash;
    }

    /**
     *  This function init all params before read from request
     * 
     */
    protected static function initParamsBase()
    {
        DUPX_Log::setLogLevel();
        $GLOBALS['DUPX_DEBUG'] = isset($_POST['logging']) ? $_POST['logging'] : DUPX_Log::LV_DEFAULT;
    }

    /**
     * this function disables the shutdown function defined in the boot class
     */
    public static function disableBootShutdownFunction()
    {
        self::$shutdownFunctionEnabled = false;
    }

    /**
     * This function sets the shutdown function before the installer is initialized.
     * Prevents blank pages.
     * 
     * After the plugin is initialized it will be set as a shudwon ​​function DUPX_Handler::shutdown
     * 
     * !!! Don't use any Duplicator function within this function. !!!
     * 
     */
    public static function bootShutdown()
    {
        if (!self::$shutdownFunctionEnabled) {
            return;
        }

        if (($error = error_get_last())) {
            ?>
            <h1>BOOT SHUTDOWN FATAL ERROR</H1>
            <pre><?php
                echo 'Error: '.htmlspecialchars($error['message'])."\n\n\n".
                'Type: '.htmlspecialchars($error['type'])."\n".
                'File: '.htmlspecialchars($error['file'])."\n".
                'Line: '.htmlspecialchars($error['line'])."\n";
                ?>
            </pre>
            <?php
        }
    }

    /**
     * this function is called before anything else. do not use duplicator functions because nothing is included at this level.
     * 
     * @return boolean
     */
    public static function phpVersionCheck()
    {
        if (version_compare(PHP_VERSION, self::MINIMUM_PHP_VERSION, '>=')) {
            return true;
        }
        $match = null;
        if (preg_match("#^\d+(\.\d+)*#", PHP_VERSION, $match)) {
            $phpVersion = $match[0];
        } else {
            $phpVersion = PHP_VERSION;
        }
        $minPHPVersion = self::MINIMUM_PHP_VERSION;
        
        echo '<div style="line-height:25px">';

        echo "NOTICE: This web server is running <b>PHP: {$phpVersion}</b>.&nbsp; A minimum of PHP {$minPHPVersion} is required to run the installer and PHP 7.0+ is recommended.<br/>";
        echo "Please contact your host or server administrator and let them know you would like to upgrade your PHP version.<br/>";
        
        echo '<i>For more information on this topic see the FAQ titled '
        . '<a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-licensing-017-q" target="_blank">What version of PHP Does Duplicator Support?</a></i>';

        echo '</div>';
        
        die();
    }
}installer/dup-installer/classes/class.password.php000064400000014626151336065400016454 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

#
# Portable PHP password hashing framework.
#
# Version 0.5 / genuine.
#
# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
# the public domain.  Revised in subsequent years, still public domain.
#
# There's absolutely no warranty.
#
# The homepage URL for this framework is:
#
#	http://www.openwall.com/phpass/
#
# Please be sure to update the Version line if you edit this file in any way.
# It is suggested that you leave the main version number intact, but indicate
# your project name (after the slash) and add your own revision information.
#
# Please do not change the "private" password hashing method implemented in
# here, thereby making your hashes incompatible.  However, if you must, please
# change the hash type identifier (the "$P$") to something different.
#
# Obviously, since this code is in the public domain, the above are not
# requirements (there can be none), but merely suggestions.
#
class DUPX_PasswordHash
{

	var $itoa64;
	var $iteration_count_log2;
	var $portable_hashes;
	var $random_state;

	function __construct($iteration_count_log2, $portable_hashes)
	{
		$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

		if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
			$iteration_count_log2 = 8;
		$this->iteration_count_log2 = $iteration_count_log2;

		$this->portable_hashes = $portable_hashes;

		$this->random_state = microtime();
		if (function_exists('getmypid'))
			$this->random_state .= getmypid();
	}

	function PasswordHash($iteration_count_log2, $portable_hashes)
	{
		self::__construct($iteration_count_log2, $portable_hashes);
	}

	function get_random_bytes($count)
	{
		$output = '';
		if (@is_readable('/dev/urandom') &&
		    ($fh = @fopen('/dev/urandom', 'rb'))) {
			$output = fread($fh, $count);
			fclose($fh);
		}

		if (strlen($output) < $count) {
			$output = '';
			for ($i = 0; $i < $count; $i += 16) {
				$this->random_state =
				    md5(microtime() . $this->random_state);
				$output .= md5($this->random_state, TRUE);
			}
			$output = substr($output, 0, $count);
		}

		return $output;
	}

	function encode64($input, $count)
	{
		$output = '';
		$i = 0;
		do {
			$value = ord($input[$i++]);
			$output .= $this->itoa64[$value & 0x3f];
			if ($i < $count)
				$value |= ord($input[$i]) << 8;
			$output .= $this->itoa64[($value >> 6) & 0x3f];
			if ($i++ >= $count)
				break;
			if ($i < $count)
				$value |= ord($input[$i]) << 16;
			$output .= $this->itoa64[($value >> 12) & 0x3f];
			if ($i++ >= $count)
				break;
			$output .= $this->itoa64[($value >> 18) & 0x3f];
		} while ($i < $count);

		return $output;
	}

	function gensalt_private($input)
	{
		$output = '$P$';
		$output .= $this->itoa64[min($this->iteration_count_log2 +
			((PHP_VERSION >= '5') ? 5 : 3), 30)];
		$output .= $this->encode64($input, 6);

		return $output;
	}

	function crypt_private($password, $setting)
	{
		$output = '*0';
		if (substr($setting, 0, 2) === $output)
			$output = '*1';

		$id = substr($setting, 0, 3);
		# We use "$P$", phpBB3 uses "$H$" for the same thing
		if ($id !== '$P$' && $id !== '$H$')
			return $output;

		$count_log2 = strpos($this->itoa64, $setting[3]);
		if ($count_log2 < 7 || $count_log2 > 30)
			return $output;

		$count = 1 << $count_log2;

		$salt = substr($setting, 4, 8);
		if (strlen($salt) !== 8)
			return $output;

		# We were kind of forced to use MD5 here since it's the only
		# cryptographic primitive that was available in all versions
		# of PHP in use.  To implement our own low-level crypto in PHP
		# would have resulted in much worse performance and
		# consequently in lower iteration counts and hashes that are
		# quicker to crack (by non-PHP code).
		$hash = md5($salt . $password, TRUE);
		do {
			$hash = md5($hash . $password, TRUE);
		} while (--$count);

		$output = substr($setting, 0, 12);
		$output .= $this->encode64($hash, 16);

		return $output;
	}

	function gensalt_blowfish($input)
	{
		# This one needs to use a different order of characters and a
		# different encoding scheme from the one in encode64() above.
		# We care because the last character in our encoded string will
		# only represent 2 bits.  While two known implementations of
		# bcrypt will happily accept and correct a salt string which
		# has the 4 unused bits set to non-zero, we do not want to take
		# chances and we also do not want to waste an additional byte
		# of entropy.
		$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

		$output = '$2a$';
		$output .= chr(ord('0') + $this->iteration_count_log2 / 10);
		$output .= chr(ord('0') + $this->iteration_count_log2 % 10);
		$output .= '$';

		$i = 0;
		do {
			$c1 = ord($input[$i++]);
			$output .= $itoa64[$c1 >> 2];
			$c1 = ($c1 & 0x03) << 4;
			if ($i >= 16) {
				$output .= $itoa64[$c1];
				break;
			}

			$c2 = ord($input[$i++]);
			$c1 |= $c2 >> 4;
			$output .= $itoa64[$c1];
			$c1 = ($c2 & 0x0f) << 2;

			$c2 = ord($input[$i++]);
			$c1 |= $c2 >> 6;
			$output .= $itoa64[$c1];
			$output .= $itoa64[$c2 & 0x3f];
		} while (1);

		return $output;
	}

	function HashPassword($password)
	{
		$random = '';

		if (CRYPT_BLOWFISH === 1 && !$this->portable_hashes) {
			$random = $this->get_random_bytes(16);
			$hash =
			    crypt($password, $this->gensalt_blowfish($random));
			if (strlen($hash) === 60)
				return $hash;
		}

		if (strlen($random) < 6)
			$random = $this->get_random_bytes(6);
		$hash =
		    $this->crypt_private($password,
		    $this->gensalt_private($random));
		if (strlen($hash) === 34)
			return $hash;

		# Returning '*' on error is safe here, but would _not_ be safe
		# in a crypt(3)-like function used _both_ for generating new
		# hashes and for validating passwords against existing hashes.
		return '*';
	}

	function CheckPassword($password, $stored_hash)
	{
		$hash = $this->crypt_private($password, $stored_hash);
		if ($hash[0] === '*')
			$hash = crypt($password, $stored_hash);

		# This is not constant-time.  In order to keep the code simple,
		# for timing safety we currently rely on the salts being
		# unpredictable, which they are at least in the non-fallback
		# cases (that is, when we use /dev/urandom and bcrypt).
		return $hash === $stored_hash;
	}
}
installer/dup-installer/classes/host/interface.host.php000064400000001437151336065400017373 0ustar00<?php
/**
 * interface for specific hostings class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * instaler custom host interface for cusotm hosting classes
 * 
 */
interface DUPX_Host_interface
{

    /**
     * return the current host itentifier
     *
     * @return string
     */
    public static function getIdentifier();

    /**
     * @return bool true if is current host
     */
    public function isHosting();

    /**
     * the init function.
     * is called only if isHosting is true
     *
     * @return void
     */
    public function init();

    /**
     * return the label of current hosting
     * 
     * @return string
     */
    public function getLabel();
}installer/dup-installer/classes/host/class.wpengine.host.php000064400000002117151336065400020347 0ustar00<?php
/**
 * wpengine custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * class for wpengine managed hosting
 * 
 * @todo not yet implemneted
 * 
 */
class DUPX_WPEngine_Host implements DUPX_Host_interface
{

    /**
     * return the current host itentifier
     *
     * @return string
     */
    public static function getIdentifier()
    {
        return DUPX_Custom_Host_Manager::HOST_WPENGINE;
    }

    /**
     * @return bool true if is current host
     */
    public function isHosting()
    {
        // check only mu plugin file exists
        
        $file = $GLOBALS['DUPX_ROOT'].'/wp-content/mu-plugins/wpengine-security-auditor.php';
        return file_exists($file);
    }

    /**
     * the init function.
     * is called only if isHosting is true
     *
     * @return void
     */
    public function init()
    {
        
    }

    /**
     * 
     * @return string
     */
    public function getLabel()
    {
        return 'WP Engine';
    }
}installer/dup-installer/classes/host/class.wordpresscom.host.php000064400000002124151336065400021260 0ustar00<?php
/**
 * godaddy custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * class for wordpress.com managed hosting
 * 
 * @todo not yet implemneted
 * 
 */
class DUPX_WordpressCom_Host implements DUPX_Host_interface
{

    /**
     * return the current host itentifier
     *
     * @return string
     */
    public static function getIdentifier()
    {
        return DUPX_Custom_Host_Manager::HOST_WORDPRESSCOM;
    }

    /**
     * @return bool true if is current host
     */
    public function isHosting()
    {
        // check only mu plugin file exists

        $testFile = $GLOBALS['DUPX_ROOT'].'/wp-content/mu-plugins/wpcomsh-loader.php';
        return file_exists($testFile);
    }

    /**
     * the init function.
     * is called only if isHosting is true
     *
     * @return void
     */
    public function init()
    {
        
    }

    /**
     * 
     * @return string
     */
    public function getLabel()
    {
        return 'Wordpress.com';
    }
}installer/dup-installer/classes/host/class.godaddy.host.php000064400000002100151336065400020136 0ustar00<?php
/**
 * godaddy custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * class for GoDaddy managed hosting
 * 
 * @todo not yet implemneted
 * 
 */
class DUPX_GoDaddy_Host implements DUPX_Host_interface
{

    /**
     * return the current host itentifier
     *
     * @return string
     */
    public static function getIdentifier()
    {
        return DUPX_Custom_Host_Manager::HOST_GODADDY;
    }

    /**
     * @return bool true if is current host
     */
    public function isHosting()
    {
        // check only mu plugin file exists
        
        $file = $GLOBALS['DUPX_ROOT'].'/wp-content/mu-plugins/gd-system-plugin.php';
        return file_exists($file);
    }

    /**
     * the init function.
     * is called only if isHosting is true
     *
     * @return void
     */
    public function init()
    {
        
    }

    /**
     * 
     * @return string
     */
    public function getLabel()
    {
        return 'GoDaddy';
    }
}installer/dup-installer/classes/host/class.custom.host.manager.php000064400000013145151336065400021461 0ustar00<?php
/**
 * custom hosting manager
 * singleton class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

require_once ($GLOBALS['DUPX_INIT'].'/classes/host/interface.host.php');
require_once ($GLOBALS['DUPX_INIT'].'/classes/host/class.godaddy.host.php');
require_once ($GLOBALS['DUPX_INIT'].'/classes/host/class.wpengine.host.php');
require_once ($GLOBALS['DUPX_INIT'].'/classes/host/class.wordpresscom.host.php');
require_once ($GLOBALS['DUPX_INIT'].'/classes/host/class.liquidweb.host.php');
require_once ($GLOBALS['DUPX_INIT'].'/classes/host/class.pantheon.host.php');
require_once ($GLOBALS['DUPX_INIT'].'/classes/host/class.flywheel.host.php');

class DUPX_Custom_Host_Manager
{

    const HOST_GODADDY      = 'godaddy';
    const HOST_WPENGINE     = 'wpengine';
    const HOST_WORDPRESSCOM = 'wordpresscom';
    const HOST_LIQUIDWEB    = 'liquidweb';
    const HOST_PANTHEON     = 'pantheon';
    const HOST_FLYWHEEL     = 'flywheel';

    /**
     *
     * @var self
     */
    protected static $instance = null;

    /**
     * this var prevent multiple params inizialization. 
     * it's useful on development to prevent an infinite loop in class constructor
     * 
     * @var bool
     */
    private $initialized = false;

    /**
     * custom hostings list 
     * 
     * @var DUPX_Host_interface[]
     */
    private $customHostings = array();

    /**
     * active custom hosting in current server
     * 
     * @var string[]
     */
    private $activeHostings = array();

    /**
     *
     * @return self
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    /**
     * init custom histings
     */
    private function __construct()
    {
        $this->customHostings[DUPX_WPEngine_Host::getIdentifier()]     = new DUPX_WPEngine_Host();
        $this->customHostings[DUPX_GoDaddy_Host::getIdentifier()]      = new DUPX_GoDaddy_Host();
        $this->customHostings[DUPX_WordpressCom_Host::getIdentifier()] = new DUPX_WordpressCom_Host();
        $this->customHostings[DUPX_Liquidweb_Host::getIdentifier()]    = new DUPX_Liquidweb_Host();
        $this->customHostings[DUPX_Pantheon_Host::getIdentifier()]     = new DUPX_Pantheon_Host();
        $this->customHostings[DUPX_FlyWheel_Host::getIdentifier()]     = new DUPX_FlyWheel_Host();
    }

    /**
     * execute the active custom hostings inizialization only one time.
     * 
     * @return boolean
     * @throws Exception
     */
    public function init()
    {
        if ($this->initialized) {
            return true;
        }
        foreach ($this->customHostings as $cHost) {
            if (!($cHost instanceof DUPX_Host_interface)) {
                throw new Exception('Host must implemnete DUPX_Host_interface');
            }
            if ($cHost->isHosting()) {
                $this->activeHostings[] = $cHost->getIdentifier();
                $cHost->init();
            }
        }
        $this->initialized = true;
        return true;
    }

    /**
     * return the lisst of current custom active hostings
     * 
     * @return DUPX_Host_interface[]
     */
    public function getActiveHostings()
    {
        $result = array();
        foreach ($this->customHostings as $cHost) {
            if ($cHost->isHosting()) {
                $result[] = $cHost->getIdentifier();
            }
        }
        return $result;
    }

    /**
     * return true if current identifier hostoing is active
     * 
     * @param string $identifier
     * @return bool
     */
    public function isHosting($identifier)
    {
        return isset($this->customHostings[$identifier]) && $this->customHostings[$identifier]->isHosting();
    }

    /**
     * 
     * @return boolean|string return false if isn't managed manage hosting of manager hosting 
     */
    public function isManaged()
    {
        if ($this->isHosting(self::HOST_WPENGINE)) {
            return self::HOST_WPENGINE;
        } else if ($this->isHosting(self::HOST_LIQUIDWEB)) {
            return self::HOST_LIQUIDWEB;
        } else if ($this->isHosting(self::HOST_GODADDY)) {
            return self::HOST_GODADDY;
        } else if ($this->isHosting(self::HOST_WORDPRESSCOM)) {
            return self::HOST_WORDPRESSCOM;
        } else if ($this->isHosting(self::HOST_PANTHEON)) {
            return self::HOST_PANTHEON;
        } else if ($this->isHosting(self::HOST_FLYWHEEL)) {
            return self::HOST_FLYWHEEL;
        } else if ($this->wpConfigIsNotWriteable() || $this->notAccessibleCoreDirPresent()) {
            return true;
        } else {
            return false;
        }
    }


    public function wpConfigIsNotWriteable()
    {
        $path = $GLOBALS['DUPX_ROOT'].'/wp-config.php';

        return file_exists($path) && !is_writeable($path);
    }

    public function notAccessibleCoreDirPresent()
    {
        $coreDirs = array(
            $GLOBALS['DUPX_ROOT'].'/wp-admin',
            $GLOBALS['DUPX_ROOT'].'/wp-includes',
            $GLOBALS['DUPX_ROOT'].'/wp-content'
        );

        foreach ($coreDirs as $coreDir) {
            if (file_exists($coreDir) && !is_writeable($coreDir)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 
     * @param type $identifier
     * @return boolean|DUPX_Host_interface
     */
    public function getHosting($identifier)
    {
        if ($this->isHosting($identifier)) {
            return $this->customHostings[$identifier];
        } else {
            return false;
        }
    }
}installer/dup-installer/classes/host/class.flywheel.host.php000064400000002024151336065400020347 0ustar00<?php
/**
 * godaddy custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * class for GoDaddy managed hosting
 *
 * @todo not yet implemneted
 *
 */
class DUPX_FlyWheel_Host implements DUPX_Host_interface
{

    /**
     * return the current host identifier
     *
     * @return string
     */
    public static function getIdentifier()
    {
        return DUPX_Custom_Host_Manager::HOST_FLYWHEEL;
    }

    /**
     * @return bool true if is current host
     */
    public function isHosting()
    {
        // check only mu plugin file exists

        $file = $GLOBALS['DUPX_ROOT'].'/.fw-config.php';
        return file_exists($file);
    }

    /**
     * the init function.
     * is called only if isHosting is true
     *
     * @return void
     */
    public function init()
    {

    }

    /**
     *
     * @return string
     */
    public function getLabel()
    {
        return 'FlyWheel';
    }
}installer/dup-installer/classes/host/class.pantheon.host.php000064400000002342151336065400020347 0ustar00<?php
/**
 * godaddy custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * class for GoDaddy managed hosting
 * 
 * @todo not yet implemneted
 * 
 */
class DUPX_Pantheon_Host implements DUPX_Host_interface
{

    /**
     * return the current host itentifier
     *
     * @return string
     */
    public static function getIdentifier()
    {
        return DUPX_Custom_Host_Manager::HOST_PANTHEON;
    }

    /**
     * @return bool true if is current host
     * @throws Exception
     */
    public function isHosting()
    {
        // check only mu plugin file exists
        
        $testFile = $GLOBALS['DUPX_ROOT'].'/wp-content/mu-plugins/pantheon.php';
        return file_exists($testFile);
    }

    /**
     * the init function.
     * is called only if isHosting is true
     *
     * @return void
     */
    public function init()
    {
        
    }

    /**
     * 
     * @return string
     */
    public function getLabel()
    {
        return 'Pantheon';
    }

    /**
     * this function is called if current hosting is this
     */
    public function setCustomParams()
    {
        
    }
}installer/dup-installer/classes/host/class.liquidweb.host.php000064400000002044151336065400020517 0ustar00<?php
/**
 * liquidweb custom hosting class
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUPX_Liquidweb_Host implements DUPX_Host_interface
{

    /**
     * return the current host itentifier
     *
     * @return string
     */
    public static function getIdentifier()
    {
        return DUPX_Custom_Host_Manager::HOST_LIQUIDWEB;
    }

    /**
     * @return bool true if is current host
     */
    public function isHosting()
    {
        // check only mu plugin file exists
        
        $testFile = $GLOBALS['DUPX_ROOT'].'/wp-content/mu-plugins/liquid-web.php';
        return file_exists($testFile);
    }

    /**
     * the init function.
     * is called only if isHosting is true
     *
     * @return void
     */
    public function init()
    {
        
    }

    /**
     * return the label of current hosting
     * 
     * @return string
     */
    public function getLabel()
    {
        return 'Liquid Web';
    }
}installer/dup-installer/classes/class.engine.php000064400000110251151336065400016046 0ustar00<?php
/**
 * Walks every table in db that then walks every row and column replacing searches with replaces
 * large tables are split into 50k row blocks to save on memory.
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\UpdateEngine
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUPX_UpdateEngine
{

    const SERIALIZE_OPEN_STR_REGEX   = '/^(s:\d+:")/';
    const SERIALIZE_OPEN_SUBSTR_LEN  = 25;
    const SERIALIZE_CLOSE_STR_REGEX  = '/^";}*(?:"|a:|s:|S:|b:|d:|i:|o:|O:|C:|r:|R:|N;|$)/';
    const SERIALIZE_CLOSE_SUBSTR_LEN = 50;
    const SERIALIZE_CLOSE_STR        = '";';
    const SERIALIZE_CLOSE_STR_LEN    = 2;

    private static $report = null;

    /**
     *  Used to report on all log errors into the installer-txt.log
     *
     * @return string Writes the results of the update engine tables to the log
     */
    public static function logErrors()
    {
        $s3Funcs = DUPX_S3_Funcs::getInstance();

        if (!empty($s3Funcs->report['errsql'])) {
            DUPX_Log::info("--------------------------------------");
            DUPX_Log::info("DATA-REPLACE ERRORS (MySQL)");
            foreach ($s3Funcs->report['errsql'] as $error) {
                DUPX_Log::info($error);
            }
            DUPX_Log::info("");
        }
        if (!empty($s3Funcs->report['errser'])) {
            DUPX_Log::info("--------------------------------------");
            DUPX_Log::info("DATA-REPLACE ERRORS (Serialization):");
            foreach ($s3Funcs->report['errser'] as $error) {
                DUPX_Log::info($error);
            }
            DUPX_Log::info("");
        }
        if (!empty($s3Funcs->report['errkey'])) {
            DUPX_Log::info("--------------------------------------");
            DUPX_Log::info("DATA-REPLACE ERRORS (Key):");
            DUPX_Log::info('Use SQL: SELECT @row := @row + 1 as row, t.* FROM some_table t, (SELECT @row := 0) r');
            foreach ($s3Funcs->report['errkey'] as $error) {
                DUPX_Log::info($error);
            }
        }
    }

    /**
     *  Used to report on all log stats into the installer-txt.log
     *
     * @return string Writes the results of the update engine tables to the log
     */
    public static function logStats()
    {
        $s3Funcs = DUPX_S3_Funcs::getInstance();
        DUPX_Log::resetIndent();

        if (!empty($s3Funcs->report) && is_array($s3Funcs->report)) {
            $stats = "--------------------------------------\n";
            $stats .= sprintf("SCANNED:\tTables:%d \t|\t Rows:%d \t|\t Cells:%d \n", $s3Funcs->report['scan_tables'], $s3Funcs->report['scan_rows'], $s3Funcs->report['scan_cells']);
            $stats .= sprintf("UPDATED:\tTables:%d \t|\t Rows:%d \t|\t Cells:%d \n", $s3Funcs->report['updt_tables'], $s3Funcs->report['updt_rows'], $s3Funcs->report['updt_cells']);
            $stats .= sprintf("ERRORS:\t\t%d \nRUNTIME:\t%f sec", $s3Funcs->report['err_all'], $s3Funcs->report['time']);
            DUPX_Log::info($stats);
        }
    }

    /**
     * Returns only the text type columns of a table ignoring all numeric types
     *
     * @param obj $conn A valid database link handle
     * @param string $table A valid table name
     *
     * @return array All the column names of a table
     */
    private static function getTextColumns($table)
    {
        $dbh = DUPX_S3_Funcs::getInstance()->getDbConnection();

        $type_where = '';
        $type_where .= "type LIKE '%char%' OR ";
        $type_where .= "type LIKE '%text' OR ";
        $type_where .= "type LIKE '%blob' ";
        $sql        = "SHOW COLUMNS FROM `".mysqli_real_escape_string($dbh, $table)."` WHERE {$type_where}";

        $result = DUPX_DB::mysqli_query($dbh, $sql, __FILE__, __LINE__);
        if (!$result) {
            return null;
        }

        $fields = array();
        if (mysqli_num_rows($result) > 0) {
            while ($row = mysqli_fetch_assoc($result)) {
                $fields[] = $row['Field'];
            }
        }

        //Return Primary which is needed for index lookup.  LIKE '%PRIMARY%' is less accurate with lookup
        //$result = mysqli_query($dbh, "SHOW INDEX FROM `{$table}` WHERE KEY_NAME LIKE '%PRIMARY%'");
        $result = mysqli_query($dbh, "SHOW INDEX FROM `".mysqli_real_escape_string($dbh, $table)."`");
        if (mysqli_num_rows($result) > 0) {
            while ($row = mysqli_fetch_assoc($result)) {
                $fields[] = $row['Column_name'];
            }
        }

        return (count($fields) > 0) ? array_unique($fields) : null;
    }

    public static function set_sql_column_safe(&$str)
    {
        $str = "`$str`";
    }

    public static function loadInit()
    {
        DUPX_Log::info('ENGINE LOAD INIT', DUPX_Log::LV_DEBUG);
        $s3Funcs                          = DUPX_S3_Funcs::getInstance();
        $s3Funcs->report['profile_start'] = DUPX_U::getMicrotime();

        $dbh = $s3Funcs->getDbConnection();
        @mysqli_autocommit($dbh, false);
    }

    /**
     * Begins the processing for replace logic
     *
     * @param array $tables The tables we want to look at
     *
     * @return array Collection of information gathered during the run.
     */
    public static function load($tables = array())
    {
        self::loadInit();

        if (is_array($tables)) {
            foreach ($tables as $table) {
                self::evaluateTalbe($table);
            }
        }

        self::commitAndSave();
        return self::loadEnd();
    }

    public static function commitAndSave()
    {
        DUPX_Log::info('ENGINE COMMIT AND SAVE', DUPX_Log::LV_DEBUG);

        $dbh = DUPX_S3_Funcs::getInstance()->getDbConnection();

        @mysqli_commit($dbh);
        @mysqli_autocommit($dbh, true);

        DUPX_NOTICE_MANAGER::getInstance()->saveNotices();
    }

    public static function loadEnd()
    {
        $s3Funcs = DUPX_S3_Funcs::getInstance();
        DUPX_Log::info('ENGINE LOAD END', DUPX_Log::LV_DEBUG);

        $s3Funcs->report['profile_end'] = DUPX_U::getMicrotime();
        $s3Funcs->report['time']        = DUPX_U::elapsedTime($s3Funcs->report['profile_end'], $s3Funcs->report['profile_start']);
        $s3Funcs->report['errsql_sum']  = empty($s3Funcs->report['errsql']) ? 0 : count($s3Funcs->report['errsql']);
        $s3Funcs->report['errser_sum']  = empty($s3Funcs->report['errser']) ? 0 : count($s3Funcs->report['errser']);
        $s3Funcs->report['errkey_sum']  = empty($s3Funcs->report['errkey']) ? 0 : count($s3Funcs->report['errkey']);
        $s3Funcs->report['err_all']     = $s3Funcs->report['errsql_sum'] + $s3Funcs->report['errser_sum'] + $s3Funcs->report['errkey_sum'];

        return $s3Funcs->report;
    }

    public static function getTableRowParamsDefault($table = '')
    {
        return array(
            'table'         => $table,
            'updated'       => false,
            'row_count'     => 0,
            'columns'       => array(),
            'colList'       => '*',
            'colMsg'        => 'every column',
            'columnsSRList' => array(),
            'pages'         => 0,
            'page_size'     => 0,
            'page'          => 0,
            'current_row'   => 0
        );
    }

    private static function getTableRowsParams($table)
    {
        $s3Funcs = DUPX_S3_Funcs::getInstance();
        $dbh     = $s3Funcs->getDbConnection();

        $rowsParams = self::getTableRowParamsDefault($table);

        // Count the number of rows we have in the table if large we'll split into blocks
        $rowsParams['row_count'] = mysqli_query($dbh, "SELECT COUNT(*) FROM `".mysqli_real_escape_string($dbh, $rowsParams['table'])."`");
        if (!$rowsParams['row_count']) {
            return null;
        }
        $rows_result             = mysqli_fetch_array($rowsParams['row_count']);
        @mysqli_free_result($rowsParams['row_count']);
        $rowsParams['row_count'] = $rows_result[0];
        if ($rowsParams['row_count'] == 0) {
            $rowsParams['colMsg'] = 'no columns  ';
            self::logEvaluateTable($rowsParams);
            return null;
        }

        // Get a list of columns in this table
        $sql    = 'DESCRIBE '.mysqli_real_escape_string($dbh, $rowsParams['table']);
        $fields = mysqli_query($dbh, $sql);
        if (!$fields) {
            return null;
        }
        while ($column = mysqli_fetch_array($fields)) {
            $rowsParams['columns'][$column['Field']] = $column['Key'] == 'PRI' ? true : false;
        }

        $rowsParams['page_size'] = $GLOBALS['DATABASE_PAGE_SIZE'];
        $rowsParams['pages']     = ceil($rowsParams['row_count'] / $rowsParams['page_size']);

        // Grab the columns of the table.  Only grab text based columns because
        // they are the only data types that should allow any type of search/replace logic
        if (!$s3Funcs->getPost('fullsearch')) {
            $rowsParams['colList'] = self::getTextColumns($rowsParams['table']);
            if ($rowsParams['colList'] != null && is_array($rowsParams['colList'])) {
                array_walk($rowsParams['colList'], array(__CLASS__, 'set_sql_column_safe'));
                $rowsParams['colList'] = implode(',', $rowsParams['colList']);
            }
            $rowsParams['colMsg'] = (empty($rowsParams['colList'])) ? 'every column' : 'text columns';
        }

        if (empty($rowsParams['colList'])) {
            $rowsParams['colMsg'] = 'no columns  ';
        }

        self::logEvaluateTable($rowsParams);

        if (empty($rowsParams['colList'])) {
            return null;
        } else {
            // PREPARE SEARCH AN REPLACE LISF FOR TABLES
            $rowsParams['columnsSRList'] = self::getColumnsSearchReplaceList($rowsParams['table'], $rowsParams['columns']);
            return $rowsParams;
        }
    }

    public static function logEvaluateTable($rowsParams)
    {
        DUPX_Log::resetIndent();
        $log = "\n".'EVALUATE TABLE: '.str_pad(DUPX_Log::varToString($rowsParams['table']), 50, '_', STR_PAD_RIGHT);
        $log .= '[ROWS:'.str_pad($rowsParams['row_count'], 6, " ", STR_PAD_LEFT).']';
        $log .= '[PG:'.str_pad($rowsParams['pages'], 4, " ", STR_PAD_LEFT).']';
        $log .= '[SCAN:'.$rowsParams['colMsg'].']';
        if (DUPX_Log::isLevel(DUPX_Log::LV_DETAILED)) {
            $log .= '[COLS: '.$rowsParams['colList'].']';
        }
        DUPX_Log::info($log);
        DUPX_Log::incIndent();
    }

    public static function evaluateTalbe($table)
    {
        $s3Funcs = DUPX_S3_Funcs::getInstance();

        // init table params if isn't initialized
        if (!self::initTableParams($table)) {
            return false;
        }

        //Paged Records
        $pages = $s3Funcs->cTableParams['pages'];
        for ($page = 0; $page < $pages; $page++) {
            self::evaluateTableRows($table, $page);
        }

        if ($s3Funcs->cTableParams['updated']) {
            $s3Funcs->report['updt_tables']++;
        }
    }

    public static function evaluateTableRows($table, $page)
    {
        $s3Funcs = DUPX_S3_Funcs::getInstance();

        // init table params if isn't initialized
        if (!self::initTableParams($table)) {
            return false;
        }

        $s3Funcs->cTableParams['page'] = $page;
        if ($s3Funcs->cTableParams['page'] >= $s3Funcs->cTableParams['pages']) {
            DUPX_Log::info('ENGINE EXIT PAGE:'.DUPX_Log::varToString($table).' PAGES:'.$s3Funcs->cTableParams['pages'], DUPX_Log::LV_DEBUG);
            return false;
        }

        self::evaluatePagedRows($s3Funcs->cTableParams);
    }

    public static function initTableParams($table)
    {
        $s3Funcs = DUPX_S3_Funcs::getInstance();
        if (is_null($s3Funcs->cTableParams) || $s3Funcs->cTableParams['table'] !== $table) {
            DUPX_Log::info('ENGINE INIT TABLE PARAMS '.DUPX_Log::varToString($table), DUPX_Log::LV_DETAILED);
            $s3Funcs->report['scan_tables']++;

            if (($s3Funcs->cTableParams = self::getTableRowsParams($table)) === null) {
                DUPX_Log::info('ENGINE TABLE PARAMS EMPTY', DUPX_Log::LV_DEBUG);
                return false;
            }
        }

        return true;
    }

    /**
     * evaluate rows with pagination
     *
     * @param array $rowsParams
     *
     * @return boolean // if true table is modified and updated
     */
    private static function evaluatePagedRows(&$rowsParams)
    {
        $nManager = DUPX_NOTICE_MANAGER::getInstance();
        $s3Funcs  = DUPX_S3_Funcs::getInstance();
        $dbh      = $s3Funcs->getDbConnection();
        $start    = $rowsParams['page'] * $rowsParams['page_size'];
        $end      = $start + $rowsParams['page_size'] - 1;

        $sql  = sprintf("SELECT {$rowsParams['colList']} FROM `%s` LIMIT %d, %d", $rowsParams['table'], $start, $rowsParams['page_size']);
        $data = DUPX_DB::mysqli_query($dbh, $sql, __FILE__, __LINE__);

        $scan_count = min($rowsParams['row_count'], $end);
        if (DUPX_Log::isLevel(DUPX_Log::LV_DETAILED)) {
            DUPX_Log::info('ENGINE EV TABLE '.str_pad(DUPX_Log::varToString($rowsParams['table']), 50, '_', STR_PAD_RIGHT).
                '[PAGE:'.str_pad($rowsParams['page'], 4, " ", STR_PAD_LEFT).']'.
                '[START:'.str_pad($start, 6, " ", STR_PAD_LEFT).']'.
                '[OF:'.str_pad($scan_count, 6, " ", STR_PAD_LEFT).']', DUPX_Log::LV_DETAILED);
        }

        if (!$data) {
            $errMsg                      = mysqli_error($dbh);
            $s3Funcs->report['errsql'][] = $errMsg;
            $nManager->addFinalReportNotice(array(
                'shortMsg' => 'DATA-REPLACE ERRORS: MySQL',
                'level'    => DUPX_NOTICE_ITEM::SOFT_WARNING,
                'longMsg'  => $errMsg,
                'sections' => 'search_replace'
            ));
        }

        //Loops every row
        while ($row = mysqli_fetch_assoc($data)) {
            self::evaluateRow($rowsParams, $row);
        }

        //DUPX_U::fcgiFlush();
        @mysqli_free_result($data);

        return $rowsParams['updated'];
    }

    /**
     * evaluate single row columns
     *
     * @param array $rowsParams
     * @param array $row
     *
     * @return boolean true if row is modified and updated
     */
    private static function evaluateRow(&$rowsParams, $row)
    {
        $nManager             = DUPX_NOTICE_MANAGER::getInstance();
        $s3Funcs              = DUPX_S3_Funcs::getInstance();
        $dbh                  = $s3Funcs->getDbConnection();
        $maxSerializeLenCheck = $s3Funcs->getPost('maxSerializeStrlen');

        $s3Funcs->report['scan_rows']++;
        $rowsParams['current_row']++;

        $upd_col    = array();
        $upd_sql    = array();
        $where_sql  = array();
        $upd        = false;
        $serial_err = false;
        $is_unkeyed = !in_array(true, $rowsParams['columns']);

        $rowErrors = array();


        //Loops every cell
        foreach ($rowsParams['columns'] as $column => $primary_key) {
            $s3Funcs->report['scan_cells']++;
            if (!isset($row[$column])) {
                continue;
            }

            $safe_column     = '`'.mysqli_real_escape_string($dbh, $column).'`';
            $edited_data     = $originalData    = $row[$column];
            $base64converted = false;
            $txt_found       = false;

            //Unkeyed table code
            //Added this here to add all columns to $where_sql
            //The if statement with $txt_found would skip additional columns -TG
            if ($is_unkeyed && !empty($originalData)) {
                $where_sql[] = $safe_column.' = "'.mysqli_real_escape_string($dbh, $originalData).'"';
            }

            //Only replacing string values
            if (!empty($row[$column]) && !is_numeric($row[$column]) && $primary_key != 1) {
                // get search and reaplace list for column
                $tColList        = &$rowsParams['columnsSRList'][$column]['list'];
                $tColSearchList  = &$rowsParams['columnsSRList'][$column]['sList'];
                $tColreplaceList = &$rowsParams['columnsSRList'][$column]['rList'];
                $tColExactMatch  = $rowsParams['columnsSRList'][$column]['exactMatch'];

                // skip empty search col
                if (empty($tColSearchList)) {
                    continue;
                }

                // Search strings in data
                foreach ($tColList as $item) {
                    if (strpos($edited_data, $item['search']) !== false) {
                        $txt_found = true;
                        break;
                    }
                }

                if (!$txt_found) {
                    //if not found decetc Base 64
                    if (($decoded = DUPX_U::is_base64($row[$column])) !== false) {
                        $edited_data     = $decoded;
                        $base64converted = true;

                        // Search strings in data decoded
                        foreach ($tColList as $item) {
                            if (strpos($edited_data, $item['search']) !== false) {
                                $txt_found = true;
                                break;
                            }
                        }
                    }

                    //Skip table cell if match not found
                    if (!$txt_found) {
                        continue;
                    }
                }

                // 0 no limit
                if ($maxSerializeLenCheck > 0 && self::is_serialized_string($edited_data) && strlen($edited_data) > $maxSerializeLenCheck) {
                    $serial_err         = true;
                    $trimLen            = DUPX_Log::isLevel(DUPX_Log::LV_HARD_DEBUG) ? 10000 : 200;
                    $rowErrors[$column] = 'ENGINE: serialize data too big to convert; data len:'.strlen($edited_data).' Max size:'.$maxSerializeLenCheck;
                    $rowErrors[$column] .= "\n\tDATA: ".mb_strimwidth($edited_data, 0, $trimLen, ' [...]');
                } else {
                    //Replace logic - level 1: simple check on any string or serlized strings
                    if ($tColExactMatch) {
                        // if is exact match search and replace the itentical string
                        if (($rIndex = array_search($edited_data, $tColSearchList)) !== false) {
                            DUPX_Log::info("ColExactMatch ".$column.' search:'.$edited_data.' replace:'.$tColreplaceList[$rIndex].' index:'.$rIndex, DUPX_Log::LV_DEBUG);
                            $edited_data = $tColreplaceList[$rIndex];
                        }
                    } else {
                        // search if column contain search list
                        $edited_data = self::searchAndReplaceItems($tColSearchList, $tColreplaceList, $edited_data);

                        //Replace logic - level 2: repair serialized strings that have become broken
                        // check value without unserialize it
                        if (self::is_serialized_string($edited_data)) {
                            $serial_check = self::fixSerialString($edited_data);
                            if ($serial_check['fixed']) {
                                $edited_data = $serial_check['data'];
                            } else {
                                $trimLen            = DUPX_Log::isLevel(DUPX_Log::LV_HARD_DEBUG) ? 10000 : 200;
                                $message            = 'ENGINE: serialize data serial check error'.
                                    "\n\tDATA: ".mb_strimwidth($edited_data, 0, $trimLen, ' [...]');
                                DUPX_Log::info($message);
                                $serial_err         = true;
                                $rowErrors[$column] = $message;
                            }
                        }
                    }
                }
            }

            //Base 64 encode
            if ($base64converted) {
                $edited_data = base64_encode($edited_data);
            }

            //Change was made
            if ($serial_err == false && $edited_data != $originalData) {
                $s3Funcs->report['updt_cells']++;
                $upd_col[] = $safe_column;
                $upd_sql[] = $safe_column.' = "'.mysqli_real_escape_string($dbh, $edited_data).'"';
                $upd       = true;
            }

            if ($primary_key) {
                $where_sql[] = $safe_column.' = "'.mysqli_real_escape_string($dbh, $originalData).'"';
            }
        }

        foreach ($rowErrors as $errCol => $msgCol) {
            $longMsg                     = $msgCol."\n\tTABLE:".$rowsParams['table'].' COLUMN: '.$errCol.' WHERE: '.implode(' AND ', array_filter($where_sql));
            $s3Funcs->report['errser'][] = $longMsg;

            $nManager->addFinalReportNotice(array(
                'shortMsg'    => 'DATA-REPLACE ERROR: Serialization',
                'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                'longMsg'     => $longMsg,
                'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                'sections'    => 'search_replace'
            ));
        }

        //PERFORM ROW UPDATE
        if ($upd && !empty($where_sql)) {
            $sql    = "UPDATE `{$rowsParams['table']}` SET ".implode(', ', $upd_sql).' WHERE '.implode(' AND ', array_filter($where_sql));
            $result = DUPX_DB::mysqli_query($dbh, $sql, __FILE__, __LINE__);

            if ($result) {
                $s3Funcs->report['updt_rows']++;
                $rowsParams['updated'] = true;
            } else {
                $errMsg                      = mysqli_error($dbh)."\n\tTABLE:".$rowsParams['table'].' COLUMN: '.$errCol.' WHERE: '.implode(' AND ', array_filter($where_sql));
                $s3Funcs->report['errsql'][] = ($GLOBALS['LOGGING'] == 1) ? 'DB ERROR: '.$errMsg : 'DB ERROR: '.$errMsg."\nSQL: [{$sql}]\n";
                $nManager->addFinalReportNotice(array(
                    'shortMsg'    => 'DATA-REPLACE ERRORS: MySQL',
                    'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                    'longMsg'     => $errMsg,
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                    'sections'    => 'search_replace'
                ));
            }
        } elseif ($upd) {
            $errMsg                      = sprintf("Row [%s] on Table [%s] requires a manual update.", $rowsParams['current_row'], $rowsParams['table']);
            $s3Funcs->report['errkey'][] = $errMsg;

            $nManager->addFinalReportNotice(array(
                'shortMsg' => 'DATA-REPLACE ERROR: Key',
                'level'    => DUPX_NOTICE_ITEM::SOFT_WARNING,
                'longMsg'  => $errMsg,
                'sections' => 'search_replace'
            ));
        }

        return $rowsParams['updated'];
    }

    private static function getColumnsSearchReplaceList($table, $columns)
    {
        // PREPARE SEARCH AN REPLACE LISF FOR TABLES
        $srManager   = DUPX_S_R_MANAGER::getInstance();
        $searchList  = array();
        $replaceList = array();
        $list        = $srManager->getSearchReplaceList($table);
        foreach ($list as $item) {
            $searchList[]  = $item['search'];
            $replaceList[] = $item['replace'];
        }

        $columnsSRList = array();
        foreach ($columns as $column => $primary_key) {
            if (($cScope = self::getSearchReplaceCustomScope($table, $column)) === false) {
                // if don't have custom scope get normal search and reaplce table list
                $columnsSRList[$column] = array(
                    'list'       => &$list,
                    'sList'      => &$searchList,
                    'rList'      => &$replaceList,
                    'exactMatch' => false
                );
            } else {
                // if column have custom scope overvrite default table search/replace list
                $columnsSRList[$column] = array(
                    'list'       => $srManager->getSearchReplaceList($cScope, true, false),
                    'sList'      => array(),
                    'rList'      => array(),
                    'exactMatch' => self::isExactMatch($table, $column)
                );
                foreach ($columnsSRList[$column]['list'] as $item) {
                    $columnsSRList[$column]['sList'][] = $item['search'];
                    $columnsSRList[$column]['rList'][] = $item['replace'];
                }
            }
        }

        return $columnsSRList;
    }

    /**
     * searches and replaces strings without deserializing
     * recursion for arrays
     *
     * @param array $search
     * @param array $replace
     * @param mixed $data
     *
     * @return mixed
     */
    public static function searchAndReplaceItems($search, $replace, $data)
    {

        if (empty($data) || is_numeric($data) || is_bool($data) || is_callable($data)) {

            /* do nothing */
        } else if (is_string($data)) {

            //  Multiple replace string. If the string is serialized will fixed with fixSerialString
            $data = str_replace($search, $replace, $data);
        } else if (is_array($data)) {

            $_tmp = array();
            foreach ($data as $key => $value) {

                // prevent recursion overhead
                if (empty($value) || is_numeric($value) || is_bool($value) || is_callable($value) || is_object($data)) {

                    $_tmp[$key] = $value;
                } else {

                    $_tmp[$key] = self::searchAndReplaceItems($search, $replace, $value, false);
                }
            }

            $data = $_tmp;
            unset($_tmp);
        } elseif (is_object($data)) {
            // it can never be an object type
            DUPX_Log::info("OBJECT DATA IMPOSSIBLE\n");
        }

        return $data;
    }

    /**
     * FROM WORDPRESS
     * Check value to find if it was serialized.
     *
     * If $data is not an string, then returned value will always be false.
     * Serialized data is always a string.
     *
     * @since 2.0.5
     *
     * @param string $data   Value to check to see if was serialized.
     * @param bool   $strict Optional. Whether to be strict about the end of the string. Default true.
     * @return bool False if not serialized and true if it was.
     */
    public static function is_serialized_string($data, $strict = true)
    {
        // if it isn't a string, it isn't serialized.
        if (!is_string($data)) {
            return false;
        }
        $data = trim($data);
        if ('N;' == $data) {
            return true;
        }
        if (strlen($data) < 4) {
            return false;
        }
        if (':' !== $data[1]) {
            return false;
        }
        if ($strict) {
            $lastc = substr($data, -1);
            if (';' !== $lastc && '}' !== $lastc) {
                return false;
            }
        } else {
            $semicolon = strpos($data, ';');
            $brace     = strpos($data, '}');
            // Either ; or } must exist.
            if (false === $semicolon && false === $brace) {
                return false;
            }
            // But neither must be in the first X characters.
            if (false !== $semicolon && $semicolon < 3) {
                return false;
            }
            if (false !== $brace && $brace < 4) {
                return false;
            }
        }
        $token = $data[0];
        switch ($token) {
            case 's' :
                if ($strict) {
                    if ('"' !== substr($data, -2, 1)) {
                        return false;
                    }
                } elseif (false === strpos($data, '"')) {
                    return false;
                }
            // or else fall through
            case 'a' :
            case 'O' :
                return (bool) preg_match("/^{$token}:[0-9]+:/s", $data);
            case 'b' :
            case 'i' :
            case 'd' :
                $end = $strict ? '$' : '';
                return (bool) preg_match("/^{$token}:[0-9.E-]+;$end/", $data);
        }
        return false;
    }

    /**
     * Test if a string in properly serialized
     *
     * @param string $data Any string type
     *
     * @return bool Is the string a serialized string
     */
    public static function unserializeTest($data)
    {
        if (!is_string($data)) {
            return false;
        } else if ($data === 'b:0;') {
            return true;
        } else {
            try {
                DUPX_Handler::setMode(DUPX_Handler::MODE_OFF);
                $unserialize_ret = @unserialize($data);
                DUPX_Handler::setMode();
                return ($unserialize_ret !== false);
            }
            catch (Exception $e) {
                DUPX_Log::info("Unserialize exception: ".$e->getMessage());
                //DEBUG ONLY:
                DUPX_Log::info("Serialized data\n".$data, DUPX_Log::LV_DEBUG);
                return false;
            }
        }
    }
    /**
     * custom columns list
     * if the table / column pair exists in this array then the search scope will be overwritten with that contained in the array
     *
     * @var array
     */
    private static $customScopes = array(
        'signups' => array(
            'domain' => array(
                'scope' => 'domain_host',
                'exact' => true
            ),
            'path'   => array(
                'scope' => 'domain_path',
                'exact' => true
            )
        ),
        'site'    => array(
            'domain' => array(
                'scope' => 'domain_host',
                'exact' => true
            ),
            'path'   => array(
                'scope' => 'domain_path',
                'exact' => true
            )
        )
    );

    /**
     *
     * @param string $table
     * @param string $column
     * @return boolean|string  false if custom scope not found or return custom scoper for table/column
     */
    private static function getSearchReplaceCustomScope($table, $column)
    {
        if (strpos($table, $GLOBALS['DUPX_AC']->wp_tableprefix) !== 0) {
            return false;
        }

        $table_key = substr($table, strlen($GLOBALS['DUPX_AC']->wp_tableprefix));

        if (!array_key_exists($table_key, self::$customScopes)) {
            return false;
        }

        if (!array_key_exists($column, self::$customScopes[$table_key])) {
            return false;
        }

        return self::$customScopes[$table_key][$column]['scope'];
    }

    /**
     *
     * @param string $table
     * @param string $column
     * @return boolean if true search a exact match in column if false search as LIKE
     */
    private static function isExactMatch($table, $column)
    {
        if (strpos($table, $GLOBALS['DUPX_AC']->wp_tableprefix) !== 0) {
            return false;
        }

        $table_key = substr($table, strlen($GLOBALS['DUPX_AC']->wp_tableprefix));

        if (!array_key_exists($table_key, self::$customScopes)) {
            return false;
        }

        if (!array_key_exists($column, self::$customScopes[$table_key])) {
            return false;
        }

        return self::$customScopes[$table_key][$column]['exact'];
    }

    /**
     *  Fixes the string length of a string object that has been serialized but the length is broken
     *
     * @param string $data The string object to recalculate the size on.
     *
     * @return string  A serialized string that fixes and string length types
     */
    public static function fixSerialString($data)
    {
        $result = array(
            'data'  => null,
            'fixed' => false,
            'tried' => false
        );

        // check if serialized string must be fixed
        if (self::unserializeTest($data)) {
            $result['data']  = $data;
            $result['fixed'] = true;
        } else {
            $result['tried']  = true;
            $serialized_fixed = self::recursiveFixSerialString($data);
            if (self::unserializeTest($serialized_fixed)) {
                $result['data']  = $serialized_fixed;
                $result['fixed'] = true;
            } else {
                $result['fixed'] = false;
            }
        }

        return $result;
    }

    /**
     *  Fixes the string length of a string object that has been serialized but the length is broken
     *  Work on nested serialized string recursively.
     *
     *  @param string $data	The string ojbect to recalculate the size on.
     *
     *  @return string  A serialized string that fixes and string length types
     */
    public static function recursiveFixSerialString($data)
    {

        if (!self::is_serialized_string($data)) {
            return $data;
        }

        $result  = '';
        $matches = null;

        $openLevel     = 0;
        $openContent   = '';
        $openContentL2 = '';

        // parse every char
        for ($i = 0; $i < strlen($data); $i++) {

            $cChar = $data[$i];

            $addChar = true;

            if ($cChar == 's') {
                // test if is a open string
                if (preg_match(self::SERIALIZE_OPEN_STR_REGEX, substr($data, $i, self::SERIALIZE_OPEN_SUBSTR_LEN), $matches)) {

                    if ($openLevel > 1) {
                        $openContentL2 .= $matches[0];
                    }

                    $addChar = false;

                    $openLevel++;

                    $i += strlen($matches[0]) - 1;
                }
            } else if ($openLevel > 0 && $cChar == '"') {

                // test if is a close string
                if (preg_match(self::SERIALIZE_CLOSE_STR_REGEX, substr($data, $i, self::SERIALIZE_CLOSE_SUBSTR_LEN))) {
                    $addChar = false;

                    switch ($openLevel) {
                        case 1:
                            // level 1
                            // flush string content
                            $result .= 's:'.strlen($openContent).':"'.$openContent.'";';

                            $openContent = '';

                            break;
                        case 2;
                            // level 2
                            // fix serial string level2
                            $sublevelstr = self::recursiveFixSerialString($openContentL2);

                            // flush content on level 1
                            $openContent .= 's:'.strlen($sublevelstr).':"'.$sublevelstr.'";';

                            $openContentL2 = '';

                            break;
                        default:
                            // level > 2
                            // keep writing at level 2; it will be corrected with recursion
                            $openContentL2 .= self::SERIALIZE_CLOSE_STR;
                            break;
                    }

                    $openLevel--;
                    $i += self::SERIALIZE_CLOSE_STR_LEN - 1;
                }
            }

            if ($addChar) {
                switch ($openLevel) {
                    case 0:
                        // level 0
                        // add char on result
                        $result .= $cChar;

                        break;
                    case 1:
                        // level 1
                        // add char on content level1
                        $openContent .= $cChar;

                        break;
                    default:
                        // level > 1
                        // add char on content level2
                        $openContentL2 .= $cChar;

                        break;
                }
            }
        }

        return $result;
    }
}installer/dup-installer/classes/class.view.php000064400000005254151336065400015561 0ustar00<?php
/**
 * This is the class that manages the functions related to the views
 * 
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * View functions
 */
class DUPX_View_Funcs
{

    public static function installerLogLink()
    {
        $log_url = $GLOBALS['DUPX_INIT_URL'].'/'.$GLOBALS["LOG_FILE_NAME"].'?now='.DUPX_U::esc_attr($GLOBALS['NOW_TIME']);
        DUPX_U_Html::getLightBoxIframe('dup-installer-log.txt', 'installer-log.txt', $log_url, true, true);
    }

    public static function getHelpLink($section = '')
    {
        switch ($section) {
            case "secure" :
                $helpOpenSection = 'section-security';
                break;
            case "step1" :
                $helpOpenSection = 'section-step-1';
                break;
            case "step2" :
                $helpOpenSection = 'section-step-2';
                break;
            case "step3" :
                $helpOpenSection = 'section-step-3';
                break;
            case "step4" :
                $helpOpenSection = 'section-step-4';
                break;
            case "help" :
            default :
                $helpOpenSection = '';
        }

        return "?view=help".
            "&basic".
            '&open_section='.$helpOpenSection;
    }

    public static function helpLink($section, $linkLabel = 'Help')
    {
        $help_url = self::getHelpLink($section);
        DUPX_U_Html::getLightBoxIframe($linkLabel, 'HELP', $help_url);
    }

    public static function helpLockLink()
    {
        if ($GLOBALS['DUPX_AC']->secure_on) {
            self::helpLink('secure', '<i class="fa fa-lock fa-xs"></i>');
        } else {
            self::helpLink('secure', '<i class="fa fa-unlock-alt fa-xs"></i>');
        }
    }

    public static function helpIconLink($section)
    {
        self::helpLink($section, '<i class="fas fa-question-circle fa-sm"></i>');
    }

    /**
     * Get badge class attr val from status
     *
     * @param string $status
     * @return string html class attribute
     */
    public static function getBadgeClassFromCheckStatus($status)
    {
        switch ($status) {
            case 'Pass':
                return 'status-badge-pass';
            case 'Fail':
                return 'status-badge-fail';
            case 'Warn':
                return 'status-badge-warn';
            default:
                DUPX_Log::error(sprintf("The arcCheck var has the illegal value %s in switch case", DUPX_Log::varToString($status)));
        }
    }
}installer/dup-installer/classes/class.s3.func.php000064400000177304151336065400016074 0ustar00<?php
/**
 * Class used to update and edit web server configuration files
 * for .htaccess, web.config and user.ini
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\Crypt
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Step 3 functions
 * Singleton
 */
final class DUPX_S3_Funcs
{
    const MODE_NORMAL = 1;
    // const MODE_CHUNK  = 2; reserved for PRO version
    const MODE_SKIP   = 3; // not implemented yet

    /**
     *
     * @var DUPX_S3_Funcs
     */
    protected static $instance = null;

    /**
     *
     * @var array
     */
    public $post = null;

    /**
     *
     * @var array
     */
    public $cTableParams = null;

    /**
     *
     * @var array
     */
    public $report = array();

    /**
     *
     * @var int
     */
    private $timeStart = null;

    /**
     *
     * @var database connection
     */
    private $dbh = null;

    /**
     *
     * @var bool
     */
    private $fullReport = false;

    private function __construct()
    {
        $this->timeStart = DUPX_U::getMicrotime();
    }

    /**
     *
     * @return self
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    /**
     * inizialize 3sFunc data
     */
    public function initData()
    {
        DUPX_Log::info('INIT S3 DATA', 2);
        // else init data from $_POST
        $this->setPostData();
        $this->setReplaceList();
        $this->initReport();
        $this->copyOriginalConfigFiles();
    }

    private function initReport()
    {
        $this->report = self::getInitReport();
    }

    public static function getInitReport()
    {
        return array(
            'pass' => 0,
            'chunk' => 0,
            'chunkPos' => array(),
            'progress_perc' => 0,
            'scan_tables' => 0,
            'scan_rows' => 0,
            'scan_cells' => 0,
            'updt_tables' => 0,
            'updt_rows' => 0,
            'updt_cells' => 0,
            'errsql' => array(),
            'errser' => array(),
            'errkey' => array(),
            'errsql_sum' => 0,
            'errser_sum' => 0,
            'errkey_sum' => 0,
            'profile_start' => '',
            'profile_end' => '',
            'time' => '',
            'err_all' => 0,
            'warn_all' => 0,
            'warnlist' => array()
        );
    }

    public function getJsonReport()
    {
        $this->report['warn_all'] = empty($this->report['warnlist']) ? 0 : count($this->report['warnlist']);

        if ($this->fullReport) {
            return array(
                'step1' => json_decode(urldecode($this->post['json'])),
                'step3' => $this->report
            );
        } else {
            return array(
                'step3' => $this->report
            );
        }
    }

    private static function logSectionHeader($title, $func, $line)
    {
        $log = "\n".'===================================='."\n".
            $title;
        if ($GLOBALS["LOGGING"] > 1) {
            $log .= ' [FUNC: '.$func.' L:'.$line.']';
        }
        $log .= "\n".
            '====================================';
        DUPX_Log::info($log);
    }

    private function setPostData()
    {
        // POST PARAMS
        // SEARCH AND SEPLACE SETTINGS
        $this->post = array();

        $this->post['blogname']   = isset($_POST['blogname']) ? htmlspecialchars($_POST['blogname'], ENT_QUOTES) : 'No Blog Title Set';
        $this->post['postguid']   = filter_input(INPUT_POST, 'postguid', FILTER_VALIDATE_BOOLEAN, array('options' => array('default' => false)));
        $this->post['fullsearch'] = filter_input(INPUT_POST, 'fullsearch', FILTER_VALIDATE_BOOLEAN, array('options' => array('default' => false)));

        $this->post['path_old'] = DUPX_U::isset_sanitize($_POST, 'path_old', array('default' => null, 'trim' => true));
        $this->post['path_new'] = DUPX_U::isset_sanitize($_POST, 'path_new', array('default' => null, 'trim' => true));

        $this->post['siteurl'] = DUPX_U::isset_sanitize($_POST, 'siteurl', array('default' => null, 'trim' => true));
        if (!is_null($this->post['siteurl'])) {
            $this->post['siteurl'] = rtrim($this->post['siteurl'], '/');
        }

        $this->post['url_old'] = DUPX_U::isset_sanitize($_POST, 'url_old', array('default' => null, 'trim' => true));
        if (!is_null($this->post['url_old'])) {
            $this->post['siteurl'] = rtrim($this->post['url_old'], '/');
        }

        $this->post['url_new'] = DUPX_U::isset_sanitize($_POST, 'url_new', array('default' => null, 'trim' => true));
        if (!is_null($this->post['url_new'])) {
            $this->post['siteurl'] = rtrim($this->post['url_new'], '/');
        }

        $this->post['tables']             = isset($_POST['tables']) && is_array($_POST['tables']) ? array_map('DUPX_U::sanitize_text_field', $_POST['tables']) : array();
        $this->post['maxSerializeStrlen'] = filter_input(INPUT_POST, DUPX_CTRL::NAME_MAX_SERIALIZE_STRLEN_IN_M, FILTER_VALIDATE_INT,
                array("options" => array('default' => DUPX_Constants::DEFAULT_MAX_STRLEN_SERIALIZED_CHECK_IN_M, 'min_range' => 0))) * 1000000;
        $this->post['replaceMail']        = filter_input(INPUT_POST, 'search_replace_email_domain', FILTER_VALIDATE_BOOLEAN, array('options' => array('default' => false)));

        // DATABASE CONNECTION
        $this->post['dbhost']    = trim(filter_input(INPUT_POST, 'dbhost', FILTER_DEFAULT, array('options' => array('default' => ''))));
        $this->post['dbuser']    = trim(filter_input(INPUT_POST, 'dbuser', FILTER_DEFAULT, array('options' => array('default' => ''))));
        $this->post['dbname']    = trim(filter_input(INPUT_POST, 'dbname', FILTER_DEFAULT, array('options' => array('default' => ''))));
        $this->post['dbpass']    = trim(filter_input(INPUT_POST, 'dbpass', FILTER_DEFAULT, array('options' => array('default' => ''))));
        $this->post['dbcharset'] = DUPX_U::isset_sanitize($_POST, 'dbcharset', array('default' => ''));
        $this->post['dbcollate'] = DUPX_U::isset_sanitize($_POST, 'dbcollate', array('default' => ''));

        // NEW ADMIN USER
        $this->post['wp_username']   = DUPX_U::isset_sanitize($_POST, 'wp_username', array('default' => '', 'trim' => true));
        $this->post['wp_password']   = DUPX_U::isset_sanitize($_POST, 'wp_password', array('default' => '', 'trim' => true));
        $this->post['wp_mail']       = DUPX_U::isset_sanitize($_POST, 'wp_mail', array('default' => '', 'trim' => true));
        $this->post['wp_nickname']   = DUPX_U::isset_sanitize($_POST, 'wp_nickname', array('default' => '', 'trim' => true));
        $this->post['wp_first_name'] = DUPX_U::isset_sanitize($_POST, 'wp_first_name', array('default' => '', 'trim' => true));
        $this->post['wp_last_name']  = DUPX_U::isset_sanitize($_POST, 'wp_last_name', array('default' => '', 'trim' => true));

        // WP CONFIG SETTINGS
        $this->post['ssl_admin']  = filter_input(INPUT_POST, 'ssl_admin', FILTER_VALIDATE_BOOLEAN, array('options' => array('default' => false)));
        $this->post['cache_wp']   = filter_input(INPUT_POST, 'cache_wp', FILTER_VALIDATE_BOOLEAN, array('options' => array('default' => false)));
        $this->post['cache_path'] = filter_input(INPUT_POST, 'cache_path', FILTER_VALIDATE_BOOLEAN, array('options' => array('default' => false)));

        // OTHER
        $this->post['exe_safe_mode'] = filter_input(INPUT_POST, 'exe_safe_mode', FILTER_VALIDATE_BOOLEAN, array('options' => array('default' => false)));
        $this->post['config_mode']   = DUPX_U::isset_sanitize($_POST, 'config_mode', array('default' => 'NEW'));
        $this->post['plugins']       = filter_input(INPUT_POST, 'plugins', FILTER_UNSAFE_RAW,
            array(
            'options' => array(
                'default' => array()
            ),
            'flags' => FILTER_REQUIRE_ARRAY,
        ));

        $this->post['json'] = filter_input(INPUT_POST, 'json', FILTER_DEFAULT, array('options' => array('default' => '{}')));
    }

    /**
     * get value post if  the post isn't initialized initialize it
     * 
     * @param string $key
     * @return mixed
     */
    public function getPost($key = null)
    {
        if (is_null($this->post)) {
            $this->initData();
        }

        if (is_null($key)) {
            return $this->post;
        } else if (isset($this->post[$key])) {
            return $this->post[$key];
        } else {
            return null;
        }
    }

    /**
     * add table in tables list to scan in search and replace engine if isn't already in array
     * 
     * @param string $table
     */
    public function addTable($table)
    {
        if (empty($table)) {
            return;
        }

        // make sure post data is initialized
        $this->getPost();
        if (!in_array($table, $this->post['tables'])) {
            $this->post['tables'][] = $table;
        }
    }

    /**
     * open db connection if is closed
     */
    private function dbConnection()
    {
        if (is_null($this->dbh)) {
            // make sure post data is initialized
            $this->getPost();

            //MYSQL CONNECTION
            $this->dbh   = DUPX_DB::connect($this->post['dbhost'], $this->post['dbuser'], $this->post['dbpass'], $this->post['dbname']);
            $dbConnError = (mysqli_connect_error()) ? 'Error: '.mysqli_connect_error() : 'Unable to Connect';

            if (!$this->dbh) {
                $msg = "Unable to connect with the following parameters: <br/> <b>HOST:</b> {$post_db_host}<br/> <b>DATABASE:</b> {$post_db_name}<br/>";
                $msg .= "<b>Connection Error:</b> {$dbConnError}";
                DUPX_Log::error($msg);
            }

            $db_max_time = mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_TIME']);
            @mysqli_query($this->dbh, "SET wait_timeout = ".mysqli_real_escape_string($this->dbh, $db_max_time));

            $post_db_charset = $this->post['dbcharset'];
            $post_db_collate = $this->post['dbcollate'];
            DUPX_DB::setCharset($this->dbh, $post_db_charset, $post_db_collate);
        }
    }

    public function getDbConnection()
    {
        // make sure dbConnection is initialized
        $this->dbConnection();
        return $this->dbh;
    }

    /**
     * close db connection if is open
     */
    public function closeDbConnection()
    {
        if (!is_null($this->dbh)) {
            mysqli_close($this->dbh);
            $this->dbh = null;
        }
    }

    public function initLog()
    {
        // make sure dbConnection is initialized
        $this->dbConnection();

        $charsetServer = @mysqli_character_set_name($this->dbh);
        $charsetClient = @mysqli_character_set_name($this->dbh);

        //LOGGING
        $date = @date('h:i:s');
        $log  = "\n\n".
            "********************************************************************************\n".
            "DUPLICATOR PRO INSTALL-LOG\n".
            "STEP-3 START @ ".$date."\n".
            "NOTICE: Do NOT post to public sites or forums\n".
            "********************************************************************************\n".
            "CHARSET SERVER:\t".DUPX_Log::varToString($charsetServer)."\n".
            "CHARSET CLIENT:\t".DUPX_Log::varToString($charsetClient)."\n".
            "********************************************************************************\n".
            "OPTIONS:\n";

        $skipOpts = array('tables', 'plugins', 'dbpass', 'json', 'search', 'replace', 'mu_search', 'mu_replace', 'wp_password', 'dbhost', 'dbuser', 'dbname', 'wp_username');
        foreach ($this->post as $key => $val) {
            if (in_array($key, $skipOpts)) {
                continue;
            }
            $log .= str_pad($key, 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($val)."\n";
        }
        $log .= "********************************************************************************\n";

        DUPX_Log::info($log);

        $POST_LOG = $this->post;
        unset($POST_LOG['tables']);
        unset($POST_LOG['plugins']);
        unset($POST_LOG['dbpass']);
        ksort($POST_LOG);

        //Detailed logging
        $log = "--------------------------------------\n";
        $log .= "POST DATA\n";
        $log .= "--------------------------------------\n";
        $log .= print_r($POST_LOG, true);
        DUPX_Log::info($log, DUPX_Log::LV_DEBUG);

        $log = "--------------------------------------\n";
        $log .= "TABLES TO SCAN\n";
        $log .= "--------------------------------------\n";
        $log .= (isset($this->post['tables']) && count($this->post['tables']) > 0) ? DUPX_Log::varToString($this->post['tables']) : 'No tables selected to update';
        $log .= "--------------------------------------\n";
        $log .= "KEEP PLUGINS ACTIVE\n";
        $log .= "--------------------------------------\n";
        $log .= (isset($this->post['plugins']) && count($this->post['plugins']) > 0) ? DUPX_Log::varToString($this->post['plugins']) : 'No plugins selected for activation';
        DUPX_Log::info($log, 2);
        DUPX_Log::flush();
    }

    /**
     *
     * @staticvar type $configTransformer
     * 
     * @return DupLiteWPConfigTransformer
     */
    public function getWpConfigTransformer()
    {
        static $configTransformer = null;

        if (is_null($configTransformer)) {
            //@todo: integrate all logic into DUPX_WPConfig::updateVars
            if (!is_writable(DUPX_Package::getWpconfigArkPath())) {
                if (DupLiteSnapLibIOU::chmod(DUPX_Package::getWpconfigArkPath(), 0644)) {
                    DUPX_Log::info("File Permission Update: dup-wp-config-arc__[HASH].txt set to 0644");
                } else {
                    $err_log = "\nWARNING: Unable to update file permissions and write to dup-wp-config-arc__[HASH].txt.  ";
                    $err_log .= "Check that the wp-config.php is in the archive.zip and check with your host or administrator to enable PHP to write to the wp-config.php file.  ";
                    $err_log .= "If performing a 'Manual Extraction' please be sure to select the 'Manual Archive Extraction' option on step 1 under options.";
                    DUPX_Log::error($err_log);
                }
            }
            $configTransformer = new DupLiteWPConfigTransformer(DUPX_Package::getWpconfigArkPath());
        }

        return $configTransformer;
    }

    /**
     *
     * @return string
     */
    public function copyOriginalConfigFiles()
    {
        $wpOrigPath = DUPX_Package::getOrigWpConfigPath();
        $wpArkPath  = DUPX_Package::getWpconfigArkPath();

        if (file_exists($wpOrigPath)) {
            if (!@unlink($wpOrigPath)) {
                DUPX_Log::info('Can\'t delete copy of WP Config orig file');
            }
        }

        if (!file_exists($wpArkPath)) {
            DUPX_Log::info('WP Config ark file don\' exists');
        } else {
            if (!@copy($wpArkPath, $wpOrigPath)) {
                $errors = error_get_last();
                DUPX_Log::info("COPY ERROR: ".$errors['type']."\n".$errors['message']);
            } else {
                echo DUPX_Log::info("Original WP Config file copied", 2);
            }
        }

        $htOrigPath = DUPX_Package::getOrigHtaccessPath();
        $htArkPath  = DUPX_Package::getHtaccessArkPath();

        if (file_exists($htOrigPath)) {
            if (!@unlink($htOrigPath)) {
                DUPX_Log::info('Can\'t delete copy of htaccess orig file');
            }
        }

        if (!file_exists($htArkPath)) {
            DUPX_Log::info('htaccess ark file don\' exists');
        } else {
            if (!@copy($htArkPath, $htOrigPath)) {
                $errors = error_get_last();
                DUPX_Log::info("COPY ERROR: ".$errors['type']."\n".$errors['message']);
            } else {
                echo DUPX_Log::info("htaccess file copied", 2);
            }
        }
    }

    /**
     * set replace list
     *
     * Auto inizialize function
     */
    public function setReplaceList()
    {
        self::logSectionHeader('SET SEARCH AND REPLACE LIST', __FUNCTION__, __LINE__);
        $this->setGlobalSearchAndReplaceList();
    }

    /**
     *
     * @return int MODE_NORAML
     */
    public function getEngineMode()
    {
        return self::MODE_NORMAL;
    }

    private function setGlobalSearchAndReplaceList()
    {
        $s_r_manager = DUPX_S_R_MANAGER::getInstance();

        // make sure dbConnection is initialized
        $this->dbConnection();

        // DIRS PATHS
        $post_path_old = $this->post['path_old'];
        $post_path_new = $this->post['path_new'];
        $s_r_manager->addItem($post_path_old, $post_path_new, DUPX_S_R_ITEM::TYPE_PATH, 10);

        // URLS
        // url from _POST
        $old_urls_list = array($this->post['url_old']);
        $post_url_new  = $this->post['url_new'];
        $at_new_domain = '@'.DUPX_U::getDomain($post_url_new);

        try {
            $confTransformer = $this->getWpConfigTransformer();

            // urls from wp-config
            if (!is_null($confTransformer)) {
                if ($confTransformer->exists('constant', 'WP_HOME')) {
                    $old_urls_list[] = $confTransformer->get_value('constant', 'WP_HOME');
                }

                if ($confTransformer->exists('constant', 'WP_SITEURL')) {
                    $old_urls_list[] = $confTransformer->get_value('constant', 'WP_SITEURL');
                }
            }

            // urls from db
            $dbUrls = mysqli_query($this->dbh, 'SELECT * FROM `'.mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix).'options` where option_name IN (\'siteurl\',\'home\')');
            if ($dbUrls instanceof mysqli_result) {
                while ($row = $dbUrls->fetch_object()) {
                    $old_urls_list[] = $row->option_value;
                }
            } else {
                DUPX_Log::info('DB ERROR: '.mysqli_error($this->dbh));
            }
        } catch (Exception $e) {
            DUPX_Log::info('CONTINUE EXCEPTION: '.$e->getMessage());
            DUPX_Log::info('TRACE:');
            DUPX_Log::info($e->getTraceAsString());
        }

        foreach (array_unique($old_urls_list) as $old_url) {
            $s_r_manager->addItem($old_url, $post_url_new, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, 10);

            // Replace email address (xyz@oldomain.com to xyz@newdomain.com).
            if ($this->post['replaceMail']) {
                $at_old_domain = '@'.DUPX_U::getDomain($old_url);
                $s_r_manager->addItem($at_old_domain, $at_new_domain, DUPX_S_R_ITEM::TYPE_STRING, 20);
            }
        }
    }

    public function runSearchAndReplace()
    {
        self::logSectionHeader('RUN SEARCH AND REPLACE', __FUNCTION__, __LINE__);

        // make sure post data is initialized
        $this->getPost();

        DUPX_UpdateEngine::load($this->post['tables']);
        DUPX_UpdateEngine::logStats();
        DUPX_UpdateEngine::logErrors();
    }

    public function removeLicenseKey()
    {
        self::logSectionHeader('REMOVE LICENSE KEY', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();

        if (isset($GLOBALS['DUPX_AC']->brand) && isset($GLOBALS['DUPX_AC']->brand->enabled) && $GLOBALS['DUPX_AC']->brand->enabled) {
            $license_check = mysqli_query($this->dbh,
                "SELECT COUNT(1) AS count FROM `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` WHERE `option_name` LIKE 'duplicator_pro_license_key' ");
            $license_row   = mysqli_fetch_row($license_check);
            $license_count = is_null($license_row) ? 0 : $license_row[0];
            if ($license_count > 0) {
                mysqli_query($this->dbh,
                    "UPDATE `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` SET `option_value` = '' WHERE `option_name` LIKE 'duplicator_pro_license_key'");
            }
        }
    }

    public function createNewAdminUser()
    {
        self::logSectionHeader('CREATE NEW ADMIN USER', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();

        $nManager = DUPX_NOTICE_MANAGER::getInstance();

        if (strlen($this->post['wp_username']) >= 4 && strlen($this->post['wp_password']) >= 6) {
            $wp_username   = mysqli_real_escape_string($this->dbh, $this->post['wp_username']);
            $newuser_check = mysqli_query($this->dbh,
                "SELECT COUNT(*) AS count FROM `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."users` WHERE user_login = '{$wp_username}' ");
            $newuser_row   = mysqli_fetch_row($newuser_check);
            $newuser_count = is_null($newuser_row) ? 0 : $newuser_row[0];

            if ($newuser_count == 0) {

                $newuser_datetime = @date("Y-m-d H:i:s");
                $newuser_datetime = mysqli_real_escape_string($this->dbh, $newuser_datetime);
                $newuser_security = mysqli_real_escape_string($this->dbh, 'a:1:{s:13:"administrator";b:1;}');

                $post_wp_username = $this->post['wp_username'];
                $post_wp_password = $this->post['wp_password'];

                $post_wp_mail     = $this->post['wp_mail'];
                $post_wp_nickname = $this->post['wp_nickname'];
                if (empty($post_wp_nickname)) {
                    $post_wp_nickname = $post_wp_username;
                }
                $post_wp_first_name = $this->post['wp_first_name'];
                $post_wp_last_name  = $this->post['wp_last_name'];

                $wp_username   = mysqli_real_escape_string($this->dbh, $post_wp_username);
                $wp_password   = mysqli_real_escape_string($this->dbh, $post_wp_password);
                $wp_mail       = mysqli_real_escape_string($this->dbh, $post_wp_mail);
                $wp_nickname   = mysqli_real_escape_string($this->dbh, $post_wp_nickname);
                $wp_first_name = mysqli_real_escape_string($this->dbh, $post_wp_first_name);
                $wp_last_name  = mysqli_real_escape_string($this->dbh, $post_wp_last_name);

                $newuser1 = @mysqli_query($this->dbh,
                        "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."users`
                        (`user_login`, `user_pass`, `user_nicename`, `user_email`, `user_registered`, `user_activation_key`, `user_status`, `display_name`)
                        VALUES ('{$wp_username}', MD5('{$wp_password}'), '{$wp_username}', '{$wp_mail}', '{$newuser_datetime}', '', '0', '{$wp_username}')");

                $newuser1_insert_id = intval(mysqli_insert_id($this->dbh));

                $newuser2 = @mysqli_query($this->dbh,
                        "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."usermeta`
                        (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', '".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."capabilities', '{$newuser_security}')");

                $newuser3 = @mysqli_query($this->dbh,
                        "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."usermeta`
                        (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', '".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."user_level', '10')");

                //Misc Meta-Data Settings:
                @mysqli_query($this->dbh,
                        "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'rich_editing', 'true')");
                @mysqli_query($this->dbh,
                        "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'admin_color',  'fresh')");
                @mysqli_query($this->dbh,
                        "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'nickname', '{$wp_nickname}')");
                @mysqli_query($this->dbh,
                        "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'first_name', '{$wp_first_name}')");
                @mysqli_query($this->dbh,
                        "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'last_name', '{$wp_last_name}')");

                DUPX_Log::info("\nNEW WP-ADMIN USER:");
                if ($newuser1 && $newuser2 && $newuser3) {
                    DUPX_Log::info("- New username '{$this->post['wp_username']}' was created successfully allong with MU usermeta.");
                } elseif ($newuser1) {
                    DUPX_Log::info("- New username '{$this->post['wp_username']}' was created successfully.");
                } else {
                    $newuser_warnmsg            = "- Failed to create the user '{$this->post['wp_username']}' \n ";
                    $this->report['warnlist'][] = $newuser_warnmsg;

                    $nManager->addFinalReportNotice(array(
                        'shortMsg' => 'New admin user create error',
                        'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
                        'longMsg' => $newuser_warnmsg,
                        'sections' => 'general'
                        ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'new-user-create-error');

                    DUPX_Log::info($newuser_warnmsg);
                }
            } else {
                $newuser_warnmsg            = "\nNEW WP-ADMIN USER:\n - Username '{$this->post['wp_username']}' already exists in the database.  Unable to create new account.\n";
                $this->report['warnlist'][] = $newuser_warnmsg;

                $nManager->addFinalReportNotice(array(
                    'shortMsg' => 'New admin user create error',
                    'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
                    'longMsg' => $newuser_warnmsg,
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                    'sections' => 'general'
                    ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'new-user-create-error');

                DUPX_Log::info($newuser_warnmsg);
            }
        }
    }

    public function configurationFileUpdate()
    {
        self::logSectionHeader('CONFIGURATION FILE UPDATES', __FUNCTION__, __LINE__);
        DUPX_Log::incIndent();
        // make sure post data is initialized
        $this->getPost();
        $strReplaced = 0;

        $nManager = DUPX_NOTICE_MANAGER::getInstance();
        try {
            if (file_exists(DUPX_Package::getWpconfigArkPath())) {
                $confTransformer = $this->getWpConfigTransformer();

                $mu_newDomain     = parse_url($this->getPost('url_new'));
                $mu_oldDomain     = parse_url($this->getPost('url_old'));
                $mu_newDomainHost = $mu_newDomain['host'];
                $mu_oldDomainHost = $mu_oldDomain['host'];
                $mu_newUrlPath    = parse_url($this->getPost('url_new'), PHP_URL_PATH);
                $mu_oldUrlPath    = parse_url($this->getPost('url_old'), PHP_URL_PATH);

                if (empty($mu_newUrlPath) || ($mu_newUrlPath == '/')) {
                    $mu_newUrlPath = '/';
                } else {
                    $mu_newUrlPath = rtrim($mu_newUrlPath, '/').'/';
                }

                if (empty($mu_oldUrlPath) || ($mu_oldUrlPath == '/')) {
                    $mu_oldUrlPath = '/';
                } else {
                    $mu_oldUrlPath = rtrim($mu_oldUrlPath, '/').'/';
                }

                if ($confTransformer->exists('constant', 'WP_HOME')) {
                    $confTransformer->update('constant', 'WP_HOME', $this->post['url_new'], array('normalize' => true, 'add' => false));
                    DUPX_Log::info('UPDATE WP_HOME '.DUPX_Log::varToString($this->post['url_new']));
                }
                if ($confTransformer->exists('constant', 'WP_SITEURL')) {
                    $confTransformer->update('constant', 'WP_SITEURL', $this->post['url_new'], array('normalize' => true, 'add' => false));
                    DUPX_Log::info('UPDATE WP_SITEURL '.DUPX_Log::varToString($this->post['url_new']));
                }
                if ($confTransformer->exists('constant', 'DOMAIN_CURRENT_SITE')) {
                    $confTransformer->update('constant', 'DOMAIN_CURRENT_SITE', $mu_newDomainHost, array('normalize' => true, 'add' => false));
                    DUPX_Log::info('UPDATE DOMAIN_CURRENT_SITE '.DUPX_Log::varToString($mu_newDomainHost));
                }
                if ($confTransformer->exists('constant', 'PATH_CURRENT_SITE')) {
                    $confTransformer->update('constant', 'PATH_CURRENT_SITE', $mu_newUrlPath, array('normalize' => true, 'add' => false));
                    DUPX_Log::info('UPDATE PATH_CURRENT_SITE '.DUPX_Log::varToString($mu_newUrlPath));
                }

                /**
                 * clean multisite settings for security reasons.
                 */
                if ($confTransformer->exists('constant', 'WP_ALLOW_MULTISITE')) {
                    $confTransformer->remove('constant', 'WP_ALLOW_MULTISITE');
                    DUPX_Log::info('REMOVED WP_ALLOW_MULTISITE');
                }
                if ($confTransformer->exists('constant', 'ALLOW_MULTISITE')) {
                    $confTransformer->update('constant', 'ALLOW_MULTISITE', 'false', array('add' => false, 'raw' => true, 'normalize' => true));
                    DUPX_Log::info('TRANSFORMER: ALLOW_MULTISITE constant value set to false in WP config file');
                }
                if ($confTransformer->exists('constant', 'MULTISITE')) {
                    $confTransformer->update('constant', 'MULTISITE', 'false', array('add' => false, 'raw' => true, 'normalize' => true));
                    DUPX_Log::info('TRANSFORMER: MULTISITE constant value set to false in WP config file');
                }
                if ($confTransformer->exists('constant', 'NOBLOGREDIRECT')) {
                    $confTransformer->update('constant', 'NOBLOGREDIRECT', 'false', array('add' => false, 'raw' => true, 'normalize' => true));
                    DUPX_Log::info('TRANSFORMER: NOBLOGREDIRECT constant value set to false in WP config file');
                }
                if ($confTransformer->exists('constant', 'SUBDOMAIN_INSTALL')) {
                    $confTransformer->remove('constant', 'SUBDOMAIN_INSTALL');
                    DUPX_Log::info('TRANSFORMER: SUBDOMAIN_INSTALL constant removed from WP config file');
                }
                if ($confTransformer->exists('constant', 'VHOST')) {
                    $confTransformer->remove('constant', 'VHOST');
                    DUPX_Log::info('TRANSFORMER: VHOST constant removed from WP config file');
                }
                if ($confTransformer->exists('constant', 'SUNRISE')) {
                    $confTransformer->remove('constant', 'SUNRISE');
                    DUPX_Log::info('TRANSFORMER: SUNRISE constant removed from WP config file');
                }


                $dbname = DUPX_U::getEscapedGenericString($this->post['dbname']);
                $dbuser = DUPX_U::getEscapedGenericString($this->post['dbuser']);
                $dbpass = DUPX_U::getEscapedGenericString($this->post['dbpass']);
                $dbhost = DUPX_U::getEscapedGenericString($this->post['dbhost']);

                $confTransformer->update('constant', 'DB_NAME', $dbname, array('raw' => true));
                DUPX_Log::info('UPDATE DB_NAME '. DUPX_Log::varToString('** OBSCURED **'));

                $confTransformer->update('constant', 'DB_USER', $dbuser, array('raw' => true));
                DUPX_Log::info('UPDATE DB_USER '. DUPX_Log::varToString('** OBSCURED **'));

                $confTransformer->update('constant', 'DB_PASSWORD', $dbpass, array('raw' => true));
                DUPX_Log::info('UPDATE DB_PASSWORD '.DUPX_Log::varToString('** OBSCURED **'));

                $confTransformer->update('constant', 'DB_HOST', $dbhost, array('raw' => true));
                DUPX_Log::info('UPDATE DB_HOST '.DUPX_Log::varToString($dbhost));

                //SSL CHECKS
                if ($this->post['ssl_admin']) {
                    $confTransformer->update('constant', 'FORCE_SSL_ADMIN', 'true', array('raw' => true, 'normalize' => true));
                    DUPX_Log::info('UPDATE FORCE_SSL_ADMIN '.DUPX_Log::varToString(true));
                } else {
                    if ($confTransformer->exists('constant', 'FORCE_SSL_ADMIN')) {
                        $confTransformer->update('constant', 'FORCE_SSL_ADMIN', 'false', array('raw' => true, 'add' => false, 'normalize' => true));
                        DUPX_Log::info('UPDATE FORCE_SSL_ADMIN '.DUPX_Log::varToString(false));
                    }
                }

                // COOKIE_DOMAIN
                if ($confTransformer->exists('constant', 'COOKIE_DOMAIN')) {
                    $const_val     = $confTransformer->get_value('constant', 'COOKIE_DOMAIN');
                    $const_new_val = str_replace($mu_oldDomainHost, $mu_newDomainHost, $const_val, $strReplaced);
                    if ($strReplaced > 0) {
                        $confTransformer->update('constant', 'COOKIE_DOMAIN', $const_new_val, array('normalize' => true));
                    }
                }

                if ($this->post['cache_wp']) {
                    $confTransformer->update('constant', 'WP_CACHE', 'true', array('raw' => true, 'normalize' => true));
                    DUPX_Log::info('UPDATE WP_CACHE '.DUPX_Log::varToString(true));
                } else {
                    if ($confTransformer->exists('constant', 'WP_CACHE')) {
                        $confTransformer->update('constant', 'WP_CACHE', 'false', array('raw' => true, 'add' => false, 'normalize' => true));
                        DUPX_Log::info('UPDATE WP_CACHE '.DUPX_Log::varToString(false));
                    }
                }

                // Cache: [ ] Keep Home Path
                if ($this->post['cache_path']) {
                    if ($confTransformer->exists('constant', 'WPCACHEHOME')) {
                        $wpcachehome_const_val     = $confTransformer->get_value('constant', 'WPCACHEHOME');
                        $wpcachehome_const_val     = DUPX_U::wp_normalize_path($wpcachehome_const_val);
                        $wpcachehome_new_const_val = str_replace($this->post['path_old'], $this->post['path_new'], $wpcachehome_const_val, $strReplaced);
                        if ($strReplaced > 0) {
                            $confTransformer->update('constant', 'WPCACHEHOME', $wpcachehome_new_const_val, array('normalize' => true));
                            DUPX_Log::info('UPDATE WPCACHEHOME '.DUPX_Log::varToString($wpcachehome_new_const_val));
                        }
                    }
                } else {
                    $confTransformer->remove('constant', 'WPCACHEHOME');
                    DUPX_Log::info('REMOVE WPCACHEHOME');
                }

                if ($GLOBALS['DUPX_AC']->is_outer_root_wp_content_dir) {
                    if (empty($GLOBALS['DUPX_AC']->wp_content_dir_base_name)) {
                        $ret = $confTransformer->remove('constant', 'WP_CONTENT_DIR');
                        DUPX_Log::info('REMOVE WP_CONTENT_DIR');
                        // sometimes WP_CONTENT_DIR const removal failed, so we need to update them
                        if (false === $ret) {
                            $wpContentDir = "dirname(__FILE__).'/wp-content'";
                            $confTransformer->update('constant', 'WP_CONTENT_DIR', $wpContentDir, array('raw' => true, 'normalize' => true));
                            DUPX_Log::info('UPDATE WP_CONTENT_DIR '.DUPX_Log::varToString($wpContentDir));
                        }
                    } else {
                        $wpContentDir = "dirname(__FILE__).'/".$GLOBALS['DUPX_AC']->wp_content_dir_base_name."'";
                        $confTransformer->update('constant', 'WP_CONTENT_DIR', $wpContentDir, array('raw' => true, 'normalize' => true));
                        DUPX_Log::info('UPDATE WP_CONTENT_DIR '.DUPX_Log::varToString($wpContentDir));
                    }
                } elseif ($confTransformer->exists('constant', 'WP_CONTENT_DIR')) {
                    $wp_content_dir_const_val = $confTransformer->get_value('constant', 'WP_CONTENT_DIR');
                    $wp_content_dir_const_val = DUPX_U::wp_normalize_path($wp_content_dir_const_val);
                    $new_path                 = str_replace($this->post['path_old'], $this->post['path_new'], $wp_content_dir_const_val, $strReplaced);
                    if ($strReplaced > 0) {
                        $confTransformer->update('constant', 'WP_CONTENT_DIR', $new_path, array('normalize' => true));
                        DUPX_Log::info('UPDATE WP_CONTENT_DIR '.DUPX_Log::varToString($new_path));
                    }
                }

                //WP_CONTENT_URL
                // '/' added to prevent word boundary with domains that have the same root path
                if ($GLOBALS['DUPX_AC']->is_outer_root_wp_content_dir) {
                    if (empty($GLOBALS['DUPX_AC']->wp_content_dir_base_name)) {
                        $ret = $confTransformer->remove('constant', 'WP_CONTENT_URL');
                        DUPX_Log::info('REMOVE WP_CONTENT_URL');
                        // sometimes WP_CONTENT_DIR const removal failed, so we need to update them
                        if (false === $ret) {
                            $new_url = $this->post['url_new'].'/wp-content';
                            $confTransformer->update('constant', 'WP_CONTENT_URL', $new_url, array('raw' => true, 'normalize' => true));
                            DUPX_Log::info('UPDATE WP_CONTENT_URL '.DUPX_Log::varToString($new_url));
                        }
                    } else {
                        $new_url = $this->post['url_new'].'/'.$GLOBALS['DUPX_AC']->wp_content_dir_base_name;
                        $confTransformer->update('constant', 'WP_CONTENT_URL', $new_url, array('normalize' => true));
                        DUPX_Log::info('UPDATE WP_CONTENT_URL '.DUPX_Log::varToString($new_url));
                    }
                } elseif ($confTransformer->exists('constant', 'WP_CONTENT_URL')) {
                    $wp_content_url_const_val = $confTransformer->get_value('constant', 'WP_CONTENT_URL');
                    $new_path                 = str_replace($this->post['url_old'].'/', $this->post['url_new'].'/', $wp_content_url_const_val, $strReplaced);
                    if ($strReplaced > 0) {
                        $confTransformer->update('constant', 'WP_CONTENT_URL', $new_path, array('normalize' => true));
                        DUPX_Log::info('UPDATE WP_CONTENT_URL '.DUPX_Log::varToString($new_path));
                    }
                }

                //WP_TEMP_DIR
                if ($confTransformer->exists('constant', 'WP_TEMP_DIR')) {
                    $wp_temp_dir_const_val = $confTransformer->get_value('constant', 'WP_TEMP_DIR');
                    $wp_temp_dir_const_val = DUPX_U::wp_normalize_path($wp_temp_dir_const_val);
                    $new_path              = str_replace($this->post['path_old'], $this->post['path_new'], $wp_temp_dir_const_val, $strReplaced);
                    if ($strReplaced > 0) {
                        $confTransformer->update('constant', 'WP_TEMP_DIR', $new_path, array('normalize' => true));
                        DUPX_Log::info('UPDATE WP_TEMP_DIR '.DUPX_Log::varToString($new_path));
                    }
                }

                // WP_PLUGIN_DIR
                if ($confTransformer->exists('constant', 'WP_PLUGIN_DIR')) {
                    $wp_plugin_dir_const_val = $confTransformer->get_value('constant', 'WP_PLUGIN_DIR');
                    $wp_plugin_dir_const_val = DUPX_U::wp_normalize_path($wp_plugin_dir_const_val);
                    $new_path                = str_replace($this->post['path_old'], $this->post['path_new'], $wp_plugin_dir_const_val, $strReplaced);
                    if ($strReplaced > 0) {
                        $confTransformer->update('constant', 'WP_PLUGIN_DIR', $new_path, array('normalize' => true));
                        DUPX_Log::info('UPDATE WP_PLUGIN_DIR '.DUPX_Log::varToString($new_path));
                    }
                }

                // WP_PLUGIN_URL
                if ($confTransformer->exists('constant', 'WP_PLUGIN_URL')) {
                    $wp_plugin_url_const_val = $confTransformer->get_value('constant', 'WP_PLUGIN_URL');
                    $new_path                = str_replace($this->post['url_old'].'/', $this->post['url_new'].'/', $wp_plugin_url_const_val, $strReplaced);
                    if ($strReplaced > 0) {
                        $confTransformer->update('constant', 'WP_PLUGIN_URL', $new_path, array('normalize' => true));
                        DUPX_Log::info('UPDATE WP_PLUGIN_URL '.DUPX_Log::varToString($new_path));
                    }
                }

                // WPMU_PLUGIN_DIR
                if ($confTransformer->exists('constant', 'WPMU_PLUGIN_DIR')) {
                    $wpmu_plugin_dir_const_val = $confTransformer->get_value('constant', 'WPMU_PLUGIN_DIR');
                    $wpmu_plugin_dir_const_val = DUPX_U::wp_normalize_path($wpmu_plugin_dir_const_val);
                    $new_path                  = str_replace($this->post['path_old'], $this->post['path_new'], $wpmu_plugin_dir_const_val, $strReplaced);
                    if ($strReplaced > 0) {
                        $confTransformer->update('constant', 'WPMU_PLUGIN_DIR', $new_path, array('normalize' => true));
                        DUPX_Log::info('UPDATE WPMU_PLUGIN_DIR '.DUPX_Log::varToString($new_path));
                    }
                }

                // WPMU_PLUGIN_URL
                if ($confTransformer->exists('constant', 'WPMU_PLUGIN_URL')) {
                    $wpmu_plugin_url_const_val = $confTransformer->get_value('constant', 'WPMU_PLUGIN_URL');
                    $new_path                  = str_replace($this->post['url_old'].'/', $this->post['url_new'].'/', $wpmu_plugin_url_const_val, $strReplaced);
                    if ($strReplaced > 0) {
                        $confTransformer->update('constant', 'WPMU_PLUGIN_URL', $new_path, array('normalize' => true));
                        DUPX_Log::info('UPDATE WPMU_PLUGIN_URL '.DUPX_Log::varToString($new_path));
                    }
                }
                DUPX_Log::info("\n*** UPDATED WP CONFIG FILE ***");
            } else {
                DUPX_Log::info("WP-CONFIG ARK FILE NOT FOUND");
                DUPX_Log::info("WP-CONFIG ARK FILE:\n - 'dup-wp-config-arc__[HASH].txt'");
                DUPX_Log::info("SKIP FILE UPDATES\n");

                $shortMsg = 'wp-config.php not found';
                $longMsg  = <<<LONGMSG
Error updating wp-config file.<br>
The installation is finished but check the wp-config.php file and manually update the incorrect values.
LONGMSG;
                /*    $nManager->addNextStepNotice(array(
                  'shortMsg' => $shortMsg,
                  'level' => DUPX_NOTICE_ITEM::CRITICAL,

                  ), DUPX_NOTICE_MANAGER::ADD_UNIQUE , 'wp-config-transformer-exception'); */
                $nManager->addFinalReportNotice(array(
                    'shortMsg' => $shortMsg,
                    'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
                    'longMsg' => $longMsg,
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                    'sections' => 'general'
                    ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'wp-config-transformer-exception');
            }
        } catch (Exception $e) {
            $shortMsg = 'wp-config.php transformer:'.$e->getMessage();
            $longMsg  = <<<LONGMSG
Error updating wp-config file.<br>
The installation is finished but check the wp-config.php file and manually update the incorrect values.
LONGMSG;
            /*    $nManager->addNextStepNotice(array(
              'shortMsg' => $shortMsg,
              'level' => DUPX_NOTICE_ITEM::CRITICAL,

              ), DUPX_NOTICE_MANAGER::ADD_UNIQUE , 'wp-config-transformer-exception'); */
            $nManager->addFinalReportNotice(array(
                'shortMsg' => $shortMsg,
                'level' => DUPX_NOTICE_ITEM::CRITICAL,
                'longMsg' => $longMsg,
                'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                'sections' => 'general'
                ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'wp-config-transformer-exception');

            DUPX_Log::info("WP-CONFIG TRANSFORMER EXCEPTION\n".$e->getTraceAsString());
        }
        DUPX_Log::resetIndent();
    }

    public function htaccessUpdate()
    {
        $this->getPost();
        self::logSectionHeader('HTACCESS UPDATE MODE: '.DUPX_LOG::varToString($this->post['config_mode']), __FUNCTION__, __LINE__);


        switch ($this->post['config_mode']) {
            case 'NEW':
                DUPX_ServerConfig::createNewConfigs();
                break;
            case 'RESTORE':
                DUPX_ServerConfig::renameOrigConfigs();
                DUPX_Log::info("\nWARNING: Retaining the original .htaccess or web.config files may cause");
                DUPX_Log::info("issues with the initial setup of your site.  If you run into issues with the install");
                DUPX_Log::info("process choose 'Create New' for the 'Config Files' options");
                break;
            case 'IGNORE':
                DUPX_Log::info("\nWARNING: Choosing the option to ignore the .htaccess, web.config and .user.ini files");
                DUPX_Log::info("can lead to install issues.  The 'Ignore All' option is designed for advanced users.");
                break;
        }
    }

    public function generalUpdateAndCleanup()
    {
        self::logSectionHeader('GENERAL UPDATES & CLEANUP', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();
        $this->deactivateIncompatiblePlugins();
        $blog_name   = mysqli_real_escape_string($this->dbh, $this->post['blogname']);
        
        /** FINAL UPDATES: Must happen after the global replace to prevent double pathing
          http://xyz.com/abc01 will become http://xyz.com/abc0101  with trailing data */
        mysqli_query($this->dbh,
            "UPDATE `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` SET option_value = '".mysqli_real_escape_string($this->dbh, $blog_name)."' WHERE option_name = 'blogname' ");
        mysqli_query($this->dbh,
            "UPDATE `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` SET option_value = '".mysqli_real_escape_string($this->dbh, $this->post['url_new'])."'  WHERE option_name = 'home' ");
        mysqli_query($this->dbh,
            "UPDATE `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` SET option_value = '".mysqli_real_escape_string($this->dbh, $this->post['siteurl'])."'  WHERE option_name = 'siteurl' ");
        mysqli_query($this->dbh,
            "REPLACE INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` (option_value, option_name) VALUES('".mysqli_real_escape_string($this->dbh,
                $this->post['exe_safe_mode'])."','duplicator_exe_safe_mode')");
        //Reset the postguid data
        if ($this->post['postguid']) {
            mysqli_query($this->dbh,
                "UPDATE `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."posts` SET guid = REPLACE(guid, '".mysqli_real_escape_string($this->dbh, $this->post['url_new'])."', '".mysqli_real_escape_string($this->dbh,
                    $this->post['url_old'])."')");
            $update_guid = @mysqli_affected_rows($this->dbh) or 0;
            DUPX_Log::info("Reverted '{$update_guid}' post guid columns back to '{$this->post['url_old']}'");
        }
        
        DUPX_U::maintenanceMode(false);
    }

    /**
     * Deactivate incompatible plugins
     *
     * @return void
     */
    private function deactivateIncompatiblePlugins() {
        self::logSectionHeader("DEACTIVATE PLUGINS CHECK", __FUNCTION__, __LINE__);
        // make sure post data is initialized
        $this->getPost();
        $nManager = DUPX_NOTICE_MANAGER::getInstance();
        $plugin_list = array();
        $auto_deactivate_plugins = $this->getAutoDeactivatePlugins();
        $deactivated_plugins = array();
        $reactivate_plugins_after_installation = array();
        foreach ($this->post['plugins'] as $plugin_slug) {
            if (isset($auto_deactivate_plugins[$plugin_slug])) {
                DUPX_Log::info("deactivate ".$plugin_slug);
                $deactivated_plugins[] = $plugin_slug;
                $nManager->addFinalReportNotice(array(
                    'shortMsg' => $auto_deactivate_plugins[$plugin_slug]['shortMsg'],
                    'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
                    'longMsg' => $auto_deactivate_plugins[$plugin_slug]['longMsg'],
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                    'sections' => 'general'
                ));
                if ($auto_deactivate_plugins[$plugin_slug]['reactivate']) {
                    $reactivate_plugins_after_installation[$plugin_slug] = $auto_deactivate_plugins[$plugin_slug]['title'];
                }
            } else {
                $plugin_list[] = $plugin_slug;
            }
        }

        if (!empty($deactivated_plugins)) {
            DUPX_Log::info('Plugin(s) listed here are deactivated: '. implode(', ', $deactivated_plugins));
        }

        if (!empty($reactivate_plugins_after_installation)) {
            DUPX_Log::info('Plugin(s) reactivated after installation: '. implode(', ', $deactivated_plugins));
            $reactivate_plugins_after_installation_str = serialize($reactivate_plugins_after_installation);
            mysqli_query($this->dbh, "INSERT INTO `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` (option_value, option_name) VALUES('".mysqli_real_escape_string($this->dbh,
                $reactivate_plugins_after_installation_str)."','duplicator_reactivate_plugins_after_installation')");
        }
        
        // Force Duplicator active so the security cleanup will be available
        if (!in_array('duplicator/duplicator.php', $plugin_list)) {
            $plugin_list[] = 'duplicator/duplicator.php';
        }
        $serial_plugin_list = @serialize($plugin_list);
        
        mysqli_query($this->dbh,
            "UPDATE `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` "
            . "SET option_value = '".mysqli_real_escape_string($this->dbh, $serial_plugin_list)."'  WHERE option_name = 'active_plugins' ");
    }

    /**
     * Get Automatic deactivation plugins lists
     * 
     * @return array key as plugin slug and val as plugin title
     */
    private function getAutoDeactivatePlugins() {
        $excludePlugins = array();
        
        if (!DUPX_U::is_ssl()) {
            DUPX_Log::info('Really Simple SSL [as Non-SSL installation] will be Deactivated, If It is activated', DUPX_Log::LV_HARD_DEBUG);
            $excludePlugins['really-simple-ssl/rlrsssl-really-simple-ssl.php'] = array(
                    'title' => "Really Simple SSL",
                    'shortMsg' => "Deactivated Plugin:  Really Simple SSL",
                    'longMsg' => "This plugin has been deactivated since this migration is going from SSL (HTTPS) to Non-SSL (HTTP).  This will allow you to login to your WordPress Admin.  "
								. " To reactivate the plugin please go to the admin plugin page.",
                    'reactivate' => false

                );
        }

        if ($GLOBALS['DUPX_AC']->url_old != $this->post['siteurl']) {
            DUPX_Log::info('Simple Google reCAPTCHA [as Package creation site URL and installation site URL are different] will be deactivated, If It is activated', DUPX_Log::LV_HARD_DEBUG);
            $excludePlugins['simple-google-recaptcha/simple-google-recaptcha.php'] = array(
                'title' => "Simple Google reCAPTCHA",
                'shortMsg' => "Deactivated Plugin:  Simple Google reCAPTCHA",
                'longMsg' => "It is deactivated because the Google Recaptcha required reCaptcha site key which is bound to the site's address. Your package site's address and installed site's address doesn't match. You can reactivate it from the installed site login panel after completion of the installation.<br>
                                <strong>Please do not forget to change the reCaptcha site key after activating it.</strong>",
                'reactivate' => false
            );
        }

        DUPX_Log::info('WPBakery Page Builder will be Deactivated, If It is activated', DUPX_Log::LV_HARD_DEBUG);
        $excludePlugins['js_composer/js_composer.php']  = array(
            'title' => 'WPBakery Page Builder',
            'shortMsg' => "Deactivated Plugin:  WPBakery Page Builder",
            'longMsg' => "This plugin is deactivated automatically, because it requires a reacivation to work properly.  "
						. "<b>Please reactivate from the WordPress admin panel after logging in.</b> This will re-enable your site's frontend.",
            'reactivate' => true
        );

        DUPX_Log::info('Auto Deactivated plugins list here: '.DUPX_Log::varToString(array_keys($excludePlugins)));
        return $excludePlugins;
    }

    public function noticeTest()
    {
        self::logSectionHeader('NOTICES TEST', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();

        $nManager = DUPX_NOTICE_MANAGER::getInstance();
        if (file_exists(DUPX_Package::getWpconfigArkPath())) {
            $wpconfig_ark_contents = file_get_contents(DUPX_Package::getWpconfigArkPath());
            $config_vars           = array('WPCACHEHOME', 'COOKIE_DOMAIN', 'WP_SITEURL', 'WP_HOME', 'WP_TEMP_DIR');
            $config_found          = DUPX_U::getListValues($config_vars, $wpconfig_ark_contents);

            //Files
            if (!empty($config_found)) {
                $msg                        = "WP-CONFIG NOTICE: The wp-config.php has following values set [".implode(", ", $config_found)."].  \n";
                $msg                        .= "Please validate these values are correct by opening the file and checking the values.\n";
                $msg                        .= "See the codex link for more details: https://codex.wordpress.org/Editing_wp-config.php";
                // old system
                $this->report['warnlist'][] = $msg;
                DUPX_Log::info($msg);

                $nManager->addFinalReportNotice(array(
                    'shortMsg' => 'wp-config notice',
                    'level' => DUPX_NOTICE_ITEM::NOTICE,
                    'longMsg' => $msg,
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                    'sections' => 'general'
                ));
            }

            //-- Finally, back up the old wp-config and rename the new one
            $wpconfig_path = "{$GLOBALS['DUPX_ROOT']}/wp-config.php";
            if (DUPX_Package::getWpconfigArkPath() !== $wpconfig_path) {
                if (copy(DUPX_Package::getWpconfigArkPath(), $wpconfig_path) === false) {
                    DUPX_LOG::info(
                        'COPY SOURCE: '.DUPX_LOG::varToString(DUPX_Package::getWpconfigArkPath())."\n".
                        "COPY DEST:".DUPX_LOG::varToString($wpconfig_path), DUPX_Log::LV_DEBUG);
                    DUPX_Log::error("ERROR: Unable to copy 'dup-wp-config-arc__[HASH].txt' to 'wp-config.php'.\n".
                        "Check server permissions for more details see FAQ: https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-055-q");
                }
            }
        } else {
            $msg                        = "WP-CONFIG NOTICE: <b>wp-config.php not found.</b><br><br>";
            $msg                        .= "No action on the wp-config was possible.<br>";
            $msg                        .= "Be sure to insert a properly modified wp-config for correct wordpress operation.";
            $this->report['warnlist'][] = $msg;

            $nManager->addFinalReportNotice(array(
                'shortMsg' => 'wp-config not found',
                'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
                'longMsg' => $msg,
                'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                'sections' => 'general'
                ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'wp-config-not-found');

            DUPX_Log::info($msg);
        }

        //Database
        $result = @mysqli_query($this->dbh,
                "SELECT option_value FROM `".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options` WHERE option_name IN ('upload_url_path','upload_path')");
        if ($result) {
            while ($row = mysqli_fetch_row($result)) {
                if (strlen($row[0])) {
                    $msg = "MEDIA SETTINGS NOTICE: The table '".mysqli_real_escape_string($this->dbh, $GLOBALS['DUPX_AC']->wp_tableprefix)."options' has at least one the following values ['upload_url_path','upload_path'] \n";
                    $msg .= "set please validate settings. These settings can be changed in the wp-admin by going to /wp-admin/options.php'";

                    $this->report['warnlist'][] = $msg;
                    DUPX_Log::info($msg);

                    $nManager->addFinalReportNotice(array(
                        'shortMsg' => 'Media settings notice',
                        'level' => DUPX_NOTICE_ITEM::SOFT_WARNING,
                        'longMsg' => $msg,
                        'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                        'sections' => 'general'
                        ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'media-settings-notice');

                    break;
                }
            }
        }

        if (empty($this->report['warnlist'])) {
            DUPX_Log::info("No General Notices Found\n");
        }
    }

    public function cleanupTmpFiles()
    {
        self::logSectionHeader('CLEANUP TMP FILES', __FUNCTION__, __LINE__);
        // make sure post data is initialized
        $this->getPost();

        //Cleanup any tmp files a developer may have forgotten about
        //Lets be proactive for the developer just in case
        $wpconfig_path_bak   = "{$GLOBALS['DUPX_ROOT']}/wp-config.bak";
        $wpconfig_path_old   = "{$GLOBALS['DUPX_ROOT']}/wp-config.old";
        $wpconfig_path_org   = "{$GLOBALS['DUPX_ROOT']}/wp-config.org";
        $wpconfig_path_orig  = "{$GLOBALS['DUPX_ROOT']}/wp-config.orig";
        $wpconfig_safe_check = array($wpconfig_path_bak, $wpconfig_path_old, $wpconfig_path_org, $wpconfig_path_orig);
        foreach ($wpconfig_safe_check as $file) {
            if (file_exists($file)) {
                $tmp_newfile = $file.uniqid('_');
                if (rename($file, $tmp_newfile) === false) {
                    DUPX_Log::info("WARNING: Unable to rename '{$file}' to '{$tmp_newfile}'");
                }
            }
        }
    }

    public function finalReportNotices()
    {
        self::logSectionHeader('FINAL REPORT NOTICES', __FUNCTION__, __LINE__);

        $this->wpConfigFinalReport();
        $this->htaccessFinalReport();
    }

    private function htaccessFinalReport()
    {
        $nManager = DUPX_NOTICE_MANAGER::getInstance();

        $orig = file_get_contents(DUPX_Package::getOrigHtaccessPath());
        $new  = file_get_contents($GLOBALS['DUPX_ROOT'].'/.htaccess');

        $lightBoxContent = '<div class="row-cols-2">'.
            '<div class="col col-1"><b>Original .htaccess</b><pre>'.htmlspecialchars($orig).'</pre></div>'.
            '<div class="col col-2"><b>New .htaccess</b><pre>'.htmlspecialchars($new).'</pre></div>'.
            '</div>';
        $longMsg         = DUPX_U_Html::getLigthBox('.htaccess changes', 'HTACCESS COMPARE', $lightBoxContent, false);

        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'htaccess changes',
            'level' => DUPX_NOTICE_ITEM::INFO,
            'longMsg' => $longMsg,
            'sections' => 'changes',
            'open' => true,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'htaccess-changes');
    }

    private function wpConfigFinalReport()
    {
        $nManager = DUPX_NOTICE_MANAGER::getInstance();

        if (($orig = file_get_contents(DUPX_Package::getOrigWpConfigPath())) === false) {
            $orig = 'Can read origin wp-config.php file';
        } else {
            $orig = $this->obscureWpConfig($orig);
        }

        if (($new = file_get_contents($GLOBALS['DUPX_ROOT'].'/wp-config.php')) === false) {
            $new = 'Can read wp-config.php file';
        } else {
            $new = $this->obscureWpConfig($new);
        }

        $lightBoxContent = '<div class="row-cols-2">'.
            '<div class="col col-1"><b>Original wp-config.php</b><pre>'.htmlspecialchars($orig).'</pre></div>'.
            '<div class="col col-2"><b>New wp-config.php</b><pre>'.htmlspecialchars($new).'</pre></div>'.
            '</div>';
        $longMsg         = DUPX_U_Html::getLigthBox('wp-config.php changes', 'WP-CONFIG.PHP COMPARE', $lightBoxContent, false);

        $nManager->addFinalReportNotice(array(
            'shortMsg' => 'wp-config.php changes',
            'level' => DUPX_NOTICE_ITEM::INFO,
            'longMsg' => $longMsg,
            'sections' => 'changes',
            'open' => true,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'wp-config-changes');
    }

    private function obscureWpConfig($src)
    {
        $transformer = new DupLiteWPConfigTransformerSrc($src);
        $obsKeys     = array(
            'DB_NAME',
            'DB_USER',
            'DB_HOST',
            'DB_PASSWORD',
            'AUTH_KEY',
            'SECURE_AUTH_KEY',
            'LOGGED_IN_KEY',
            'NONCE_KEY',
            'AUTH_SALT',
            'SECURE_AUTH_SALT',
            'LOGGED_IN_SALT',
            'NONCE_SALT');

        foreach ($obsKeys as $key) {
            if ($transformer->exists('constant', $key)) {
                $transformer->update('constant', $key, '**OBSCURED**');
            }
        }

        return $transformer->getSrc();
    }

    public function complete()
    {
        // make sure post data is initialized
        $this->getPost();
        $this->closeDbConnection();

        $ajax3_sum = DUPX_U::elapsedTime(DUPX_U::getMicrotime(), $this->timeStart);
        DUPX_Log::info("\nSTEP-3 COMPLETE @ ".@date('h:i:s')." - RUNTIME: {$ajax3_sum} \n\n");

        $this->fullReport              = true;
        $this->report['pass']          = 1;
        $this->report['chunk']         = 0;
        $this->report['chunkPos']      = null;
        $this->report['progress_perc'] = 100;
        // error_reporting($ajax3_error_level);
    }

    public function error($message)
    {
        // make sure post data is initialized
        $this->getPost();

        $this->closeDbConnection();

        $ajax3_sum = DUPX_U::elapsedTime(DUPX_U::getMicrotime(), $this->timeStart);
        DUPX_Log::info("\nSTEP-3 ERROR @ ".@date('h:i:s')." - RUNTIME: {$ajax3_sum} \n\n");

        $this->report['pass']          = -1;
        $this->report['chunk']         = 0;
        $this->report['chunkPos']      = null;
        $this->report['error_message'] = $message;
    }

    protected function __clone()
    {

    }

    public function __wakeup()
    {
        throw new Exception("Cannot unserialize singleton");
    }
}installer/dup-installer/classes/class.db.php000064400000040422151336065400015170 0ustar00<?php
/**
 * Lightweight abstraction layer for common simple database routines
 *
 * Standard: PSR-2
 *
 * @package SC\DUPX\DB
 * @link http://www.php-fig.org/psr/psr-2/
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

class DUPX_DB
{

    /**
     * Modified version of https://developer.wordpress.org/reference/classes/wpdb/db_connect/
     *
     * @param string $host The server host name
     * @param string $username The server DB user name
     * @param string $password The server DB password
     * @param string $dbname The server DB name
     * @return mysqli Database connection handle
     */
    public static function connect($host, $username, $password, $dbname = null)
    {
        $dbh = null;
        try {
            $port    = null;
            $socket  = null;
            $is_ipv6 = false;

            $host_data = self::parseDBHost($host);
            if ($host_data) {
                list($host, $port, $socket, $is_ipv6) = $host_data;
            }

            /*
             * If using the `mysqlnd` library, the IPv6 address needs to be
             * enclosed in square brackets, whereas it doesn't while using the
             * `libmysqlclient` library.
             * @see https://bugs.php.net/bug.php?id=67563
             */
            if ($is_ipv6 && extension_loaded('mysqlnd')) {
                $host = "[$host]";
            }

            $dbh = @mysqli_connect($host, $username, $password, $dbname, $port, $socket);

            if (!$dbh) {
                DUPX_Log::info('DATABASE CONNECTION ERROR: '.mysqli_connect_error().'[ERRNO:'.mysqli_connect_errno().']');
            } else {
                if (method_exists($dbh, 'options')) {
                    $dbh->options(MYSQLI_OPT_LOCAL_INFILE, false);
                }
            }
        }
        catch (Exception $e) {
            DUPX_Log::info('DATABASE CONNECTION EXCEPTION ERROR: '.$e->getMessage());
        }
        return $dbh;
    }

    /**
     * Modified version of https://developer.wordpress.org/reference/classes/wpdb/parse_db_host/
     *
     * @param string $host The DB_HOST setting to parse
     * @return array|bool Array containing the host, the port, the socket and whether it is an IPv6 address, in that order. If $host couldn't be parsed, returns false
     */
    public static function parseDBHost($host)
    {
        $port    = null;
        $socket  = null;
        $is_ipv6 = false;

        // First peel off the socket parameter from the right, if it exists.
        $socket_pos = strpos($host, ':/');
        if (false !== $socket_pos) {
            $socket = substr($host, $socket_pos + 1);
            $host   = substr($host, 0, $socket_pos);
        }

        // We need to check for an IPv6 address first.
        // An IPv6 address will always contain at least two colons.
        if (substr_count($host, ':') > 1) {
            $pattern = '#^(?:\[)?(?P<host>[0-9a-fA-F:]+)(?:\]:(?P<port>[\d]+))?#';
            $is_ipv6 = true;
        } else {
            // We seem to be dealing with an IPv4 address.
            $pattern = '#^(?P<host>[^:/]*)(?::(?P<port>[\d]+))?#';
        }

        $matches = array();
        $result  = preg_match($pattern, $host, $matches);

        if (1 !== $result) {
            // Couldn't parse the address, bail.
            return false;
        }

        $host = '';
        foreach (array('host', 'port') as $component) {
            if (!empty($matches[$component])) {
                $$component = $matches[$component];
            }
        }

        return array($host, $port, $socket, $is_ipv6);
    }

    /**
     *  Count the tables in a given database
     *
     * @param obj    $dbh       A valid database link handle
     * @param string $dbname    Database to count tables in
     *
     * @return int  The number of tables in the database
     */
    public static function countTables($dbh, $dbname)
    {
        $res = mysqli_query($dbh, "SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = '".mysqli_real_escape_string($dbh, $dbname)."' ");
        $row = mysqli_fetch_row($res);
        return is_null($row) ? 0 : $row[0];
    }

    /**
     * Returns the number of rows in a table
     *
     * @param obj    $dbh   A valid database link handle
     * @param string $name	A valid table name
     */
    public static function countTableRows($dbh, $name)
    {
        $total = mysqli_query($dbh, "SELECT COUNT(*) FROM `".mysqli_real_escape_string($dbh, $name)."`");
        if ($total) {
            $total = @mysqli_fetch_array($total);
            return $total[0];
        } else {
            return 0;
        }
    }

    /**
     * Drops the table given
     *
     * @param obj    $dbh   A valid database link handle
     * @param string $name	A valid table name to remove
     *
     * @return null
     */
    public static function dropTable($dbh, $name)
    {
        self::queryNoReturn($dbh, "DROP TABLE IF EXISTS $name");
    }

    /**
     * Validates if the $collations exist in the current database
     *
     * @param obj $dbh   A valid database link handle
     * @param array $collations An array of collation names to search on
     *
     * @return array	Returns the original $collations array with the original names and a found status
     * 				    $status[name], $status[found]
     */
    public static function getCollationStatus($dbh, $collations)
    {
        $localhost = array();
        $status    = array();

        $query  = "SHOW COLLATION";
        if ($result = $dbh->query($query)) {

            while ($row = $result->fetch_assoc()) {
                $localhost[] = $row["Collation"];
            }

            if (DUPX_U::isTraversable($collations)) {
            foreach ($collations as $key => $val) {
                $status[$key]['name']  = $val;
                $status[$key]['found'] = (in_array($val, $localhost)) ? 1 : 0;
            }
        }
        }
        $result->free();

        return $status;
    }

    /**
     * Returns the database names as an array
     *
     * @param obj $dbh			A valid database link handle
     * @param string $dbuser  	An optional dbuser name to search by
     *
     * @return array  A list of all database names
     */
    public static function getDatabases($dbh, $dbuser = '')
    {
        $sql   = strlen($dbuser) ? "SHOW DATABASES LIKE '%".mysqli_real_escape_string($dbh, $dbuser)."%'" : 'SHOW DATABASES';
        $query = @mysqli_query($dbh, $sql);
        if ($query) {
            while ($db = @mysqli_fetch_array($query)) {
                $all_dbs[] = $db[0];
            }
            if (isset($all_dbs) && is_array($all_dbs)) {
                return $all_dbs;
            }
        }
        return array();
    }

    /**
     * Returns the tables for a database as an array
     *
     * @param obj $dbh   A valid database link handle
     *
     * @return array  A list of all table names
     */
    public static function getTables($dbh)
    {
        $query = @mysqli_query($dbh, 'SHOW TABLES');
        if ($query) {
            while ($table = @mysqli_fetch_array($query)) {
                $all_tables[] = $table[0];
            }
            if (isset($all_tables) && is_array($all_tables)) {
                return $all_tables;
            }
        }
        return array();
    }

    /**
     * Get the requested MySQL system variable
     *
     * @param obj    $dbh   A valid database link handle
     * @param string $name  The database variable name to lookup
     *
     * @return string the server variable to query for
     */
    public static function getVariable($dbh, $name)
    {
        $result = @mysqli_query($dbh, "SHOW VARIABLES LIKE '".mysqli_real_escape_string($dbh, $name)."'");
        $row    = @mysqli_fetch_array($result);
        @mysqli_free_result($result);
        return isset($row[1]) ? $row[1] : null;
    }

    /**
     * Gets the MySQL database version number
     *
     * @param obj    $dbh   A valid database link handle
     * @param bool   $full  True:  Gets the full version
     *                      False: Gets only the numeric portion i.e. 5.5.6 or 10.1.2 (for MariaDB)
     *
     * @return false|string 0 on failure, version number on success
     */
    public static function getVersion($dbh, $full = false)
    {
        if ($full) {
            $version = self::getVariable($dbh, 'version');
        } else {
            $version = preg_replace('/[^0-9.].*/', '', self::getVariable($dbh, 'version'));
        }

        //Fall-back for servers that have restricted SQL for SHOW statement
        //Note: For MariaDB this will report something like 5.5.5 when it is really 10.2.1.
        //This mainly is due to mysqli_get_server_info method which gets the version comment
        //and uses a regex vs getting just the int version of the value.  So while the former
        //code above is much more accurate it may fail in rare situations
        if (empty($version)) {
            $version = mysqli_get_server_info($dbh);
            $version = preg_replace('/[^0-9.].*/', '', $version);
        }

        $version = is_null($version) ? null : $version;
        return empty($version) ? 0 : $version;
    }

    /**
     * Returns a more detailed string about the msyql server version
     * For example on some systems the result is 5.5.5-10.1.21-MariaDB
     * this format is helpful for providing the user a full overview
     *
     * @param conn $dbh Database connection handle
     *
     * @return string The full details of mysql
     */
    public static function getInfo($dbh)
    {
        return mysqli_get_server_info($dbh);
    }

    /**
     * Determine if a MySQL database supports a particular feature
     *
     * @param conn $dbh Database connection handle
     * @param string $feature the feature to check for
     * @return bool
     */
    public static function hasAbility($dbh, $feature)
    {
        $version = self::getVersion($dbh);

        switch (strtolower($feature)) {
            case 'collation' :
            case 'group_concat' :
            case 'subqueries' :
                return version_compare($version, '4.1', '>=');
            case 'set_charset' :
                return version_compare($version, '5.0.7', '>=');
        }
        return false;
    }

    /**
     * Runs a query and returns the results as an array with the column names
     *
     * @param obj    $dbh   A valid database link handle
     * @param string $sql   The sql to run
     *
     * @return array    The result of the query as an array with the column name as the key
     */
    public static function queryColumnToArray($dbh, $sql, $column_index = 0)
    {
        $result_array      = array();
        $full_result_array = self::queryToArray($dbh, $sql);

        for ($i = 0; $i < count($full_result_array); $i++) {
            $result_array[] = $full_result_array[$i][$column_index];
        }
        return $result_array;
    }

    /**
     * Runs a query with no result
     *
     * @param obj    $dbh   A valid database link handle
     * @param string $sql   The sql to run
     *
     * @return array    The result of the query as an array
     */
    public static function queryToArray($dbh, $sql)
    {
        $result = array();

        DUPX_Log::info("calling mysqli query on $sql", DUPX_Log::LV_HARD_DEBUG);
        $query_result = mysqli_query($dbh, $sql);

        if ($query_result !== false) {
            if (mysqli_num_rows($query_result) > 0) {
                while ($row = mysqli_fetch_row($query_result)) {
                    $result[] = $row;
                }
            }
        } else {
            $error = mysqli_error($dbh);

            throw new Exception("Error executing query {$sql}.<br/>{$error}");
        }

        return $result;
    }

    /**
     * Runs a query with no result
     *
     * @param obj    $dbh   A valid database link handle
     * @param string $sql   The sql to run
     *
     * @return null
     */
    public static function queryNoReturn($dbh, $sql)
    {
        $query_result = mysqli_query($dbh, $sql);

        if ($query_result === false) {
            $error = mysqli_error($dbh);

            throw new Exception("Error executing query {$sql}.<br/>{$error}");
        }
    }

    /**
     * Renames an existing table
     *
     * @param obj    $dbh                   A valid database link handle
     * @param string $existing_name         The current tables name
     * @param string $new_name              The new table name to replace the existing name
     * @param string $delete_if_conflict    Delete the table name if there is a conflict
     *
     * @return null
     */
    public static function renameTable($dbh, $existing_name, $new_name, $delete_if_conflict = false)
    {
        if ($delete_if_conflict) {
            if (self::tableExists($dbh, $new_name)) {
                self::dropTable($dbh, $new_name);
            }
        }

        self::queryNoReturn($dbh, "RENAME TABLE $existing_name TO $new_name");
    }

    /**
     * Sets the MySQL connection's character set.
     *
     * @param resource $dbh     The resource given by mysqli_connect
     * @param string   $charset The character set (optional)
     * @param string   $collate The collation (optional)
     */
    public static function setCharset($dbh, $charset = null, $collate = null)
    {
        $charset = (!isset($charset) ) ? $GLOBALS['DBCHARSET_DEFAULT'] : $charset;
        $collate = (!isset($collate) ) ? $GLOBALS['DBCOLLATE_DEFAULT'] : $collate;

        if (self::hasAbility($dbh, 'collation') && !empty($charset)) {
            if (function_exists('mysqli_set_charset') && self::hasAbility($dbh, 'set_charset')) {
                if (($result = mysqli_set_charset($dbh, mysqli_real_escape_string($dbh, $charset))) === false) {
                    $errMsg = mysqli_error($dbh);
                    DUPX_Log::info('DATABASE ERROR: mysqli_set_charset '.DUPX_Log::varToString($charset).' MSG: '.$errMsg);
                } else {
                    DUPX_Log::info('DATABASE: mysqli_set_charset '.DUPX_Log::varToString($charset), DUPX_Log::LV_DETAILED);
                }
                return $result;
            } else {
                $sql = " SET NAMES ".mysqli_real_escape_string($dbh, $charset);
                if (!empty($collate)) {
                    $sql .= " COLLATE ".mysqli_real_escape_string($dbh, $collate);
                }

                if (($result = mysqli_query($dbh, $sql)) === false) {
                    $errMsg = mysqli_error($dbh);
                    DUPX_Log::info('DATABASE SQL ERROR: '.DUPX_Log::varToString($sql).' MSG: '.$errMsg);
                } else {
                    DUPX_Log::info('DATABASE SQL: '.DUPX_Log::varToString($sql), DUPX_Log::LV_DETAILED);
                }

                return $result;
            }
        }
    }

    /**
     *  If cached_table_names is null re-query the database, otherwise use those for the list
     *
     * @param obj    $dbh           A valid database link handle
     * @param string $table_name    Name of table to check for
     *
     * @return bool  Does the table name exist in the database
     */
    public static function tableExists($dbh, $table_name, $cached_table_names = null)
    {
        if ($cached_table_names === null) {
            // RSR TODO: retrieve full list of tables
            $cached_table_names = self::queryColumnToArray($dbh, "SHOW TABLES");
        }
        return in_array($table_name, $cached_table_names);
    }

    /**
     * mysqli_query wrapper with logging
     *
     * @param mysqli $link
     * @param string $sql
     * @return type
     */
    public static function mysqli_query($link, $sql, $file = '', $line = '')
    {
        if (($result = mysqli_query($link, $sql)) === false) {
            DUPX_Log::info('DB QUERY [ERROR]['.$file.':'.$line.'] SQL: '.DUPX_Log::varToString($sql)."\n\t MSG: ".mysqli_error($link));
        } else {
            DUPX_Log::info('DB QUERY ['.$file.':'.$line.']: '.DUPX_Log::varToString($sql), DUPX_Log::LV_HARD_DEBUG);
        }

        return $result;
    }
}installer/dup-installer/classes/class.installer.state.php000064400000005573151336065400017727 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

abstract class DUPX_InstallerMode
{
	const Unknown = -1;
    const StandardInstall = 0;
    const OverwriteInstall = 1;
}

class DUPX_InstallerState
{
	const State_Filename = 'installer-state.txt';
    public $mode = DUPX_InstallerMode::Unknown;
	public $ovr_wp_content_dir = '';
	//public $isManualExtraction = false;

    private static $state_filepath = null;

	private static $instance = null;

    public static function init($clearState) {
        self::$state_filepath = dirname(__FILE__).'/../dup-installer-state_'.$GLOBALS['PACKAGE_HASH'].'.txt';

        if($clearState) {
            DupLiteSnapLibIOU::rm(self::$state_filepath);
        }
    }

	public static function getInstance($init_state = false)
	{
		if($init_state) {
			self::$instance = null;
			if(file_exists(self::$state_filepath)) {
				unlink(self::$state_filepath);
			}
		}

		// Still using an installer state file since will be stuff we want to retain between steps at some point but for now it just checks wp-config.php
		if (self::$instance == null) {

			self::$instance = new DUPX_InstallerState();

			if (file_exists(self::$state_filepath)) {

				$file_contents = file_get_contents(self::$state_filepath);
				$data = json_decode($file_contents);

				foreach ($data as $key => $value) {
					self::$instance->{$key} = $value;
				}
            } else {
				$wpConfigPath	= "{$GLOBALS['DUPX_ROOT']}/wp-config.php";
				$outerWPConfigPath	= dirname($GLOBALS['DUPX_ROOT'])."/wp-config.php";
				$outerWPSettingsPath	= dirname($GLOBALS['DUPX_ROOT'])."/wp-settings.php";

				if ((file_exists($wpConfigPath) || (@file_exists($outerWPConfigPath) && !@file_exists($outerWPSettingsPath))) && @file_exists("{$GLOBALS['DUPX_ROOT']}/wp-includes") && @file_exists("{$GLOBALS['DUPX_ROOT']}/wp-admin")) {
					require_once($GLOBALS['DUPX_INIT'].'/lib/config/class.wp.config.tranformer.php');
					$config_transformer = file_exists($wpConfigPath)
											? new DupLiteWPConfigTransformer($wpConfigPath)
											: new DupLiteWPConfigTransformer($outerWPConfigPath);
                    if ($config_transformer->exists('constant', 'WP_CONTENT_DIR')) {
						$wp_content_dir_val = $config_transformer->get_value('constant', 'WP_CONTENT_DIR');						
                    } else {
						$wp_content_dir_val = $GLOBALS['CURRENT_ROOT_PATH'] . '/wp-content';	
					}
					self::$instance->mode = DUPX_InstallerMode::OverwriteInstall;
					self::$instance->ovr_wp_content_dir = $wp_content_dir_val;

				} else {
					self::$instance->mode = DUPX_InstallerMode::StandardInstall;
				}

			}

			self::$instance->save();
		}

		return self::$instance;
	}

    public function save()
    {
		$data = DupLiteSnapJsonU::wp_json_encode($this);

        DupLiteSnapLibIOU::filePutContents(self::$state_filepath, $data);
    }
}installer/dup-installer/classes/class.http.php000064400000004711151336065400015563 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**	 * *****************************************************
 *  CLASS::DUPX_Http
 *  Http Class Utility */
class DUPX_HTTP
{
	/**
	 *  Do an http post request with html form elements
	 *  @param string $url		A URL to post to
	 *  @param string $data		A valid key/pair combo $data = array('key1' => 'value1', 'key2' => 'value2')
	 * 							generated hidden form elements
	 *  @return string		    An html form that will automatically post itself
	 */
	public static function post_with_html($url, $data)
	{
		$id = uniqid();
		$html = "<form id='".DUPX_U::esc_attr($id)."' method='post' action='".DUPX_U::esc_url($url)."'>\n";
		foreach ($data as $name => $value)
		{
			$html .= "<input type='hidden' name='".DUPX_U::esc_attr($name)."' value='".DUPX_U::esc_attr($value)."' autocomplete=\"off\" />\n";
		}
		$html .= "</form>\n";
		$html .= "<script>$(document).ready(function() { $('#{$id}').submit(); });</script>";
		echo $html;
	}

	/**
	 *  Gets the URL of the current request
	 *  @param bool $show_query		Include the query string in the URL
	 *  @return string	A URL
	 */
	public static function get_request_uri($show_query = true)
	{
		$isSecure = false;
        if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
            $_SERVER ['HTTPS'] = 'on';
        }
        if((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || ($_SERVER['SERVER_PORT'] == 443))
		{
			$isSecure = true;
		}
		elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
		{
			$isSecure = true;
		}
		$protocol = $isSecure ? 'https' : 'http';
		// for ngrok url and Local by Flywheel Live URL
		if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {
			$host = $_SERVER['HTTP_X_ORIGINAL_HOST'];
		} else {
			$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];//WAS SERVER_NAME and caused problems on some boxes
		}
		$url = "{$protocol}://{$host}{$_SERVER['REQUEST_URI']}";
		$url = ($show_query) ? $url : preg_replace('/\?.*/', '', $url);
		return $url;
	}

	public static function parse_host($url)
	{
		$url = parse_url(trim($url));
		if ($url == false)
		{
			return null;
		}
		return trim($url['host'] ? $url['host'] : array_shift(explode('/', $url['path'], 2)));
	}
}
installer/dup-installer/classes/class.crypt.php000064400000002643151336065400015747 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

/**
 * Class used to update and edit web server configuration files
 * for .htaccess, web.config and user.ini
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\Crypt
 *
 */
class DUPX_Crypt
{

	public static function encrypt($key, $string)
	{
		$result = '';
		for ($i = 0; $i < strlen($string); $i++) {
			$char	 = substr($string, $i, 1);
			$keychar = substr($key, ($i % strlen($key)) - 1, 1);
			$char	 = chr(ord($char) + ord($keychar));
			$result .= $char;
		}

		return urlencode(base64_encode($result));
	}

	public static function decrypt($key, $string)
	{
		$result	 = '';
		$string	 = urldecode($string);
		$string	 = base64_decode($string);

		for ($i = 0; $i < strlen($string); $i++) {
			$char	 = substr($string, $i, 1);
			$keychar = substr($key, ($i % strlen($key)) - 1, 1);
			$char	 = chr(ord($char) - ord($keychar));
			$result .= $char;
		}

		return $result;
	}

	public static function scramble($string)
	{
		return self::encrypt(self::sk1().self::sk2(), $string);
	}

	public static function unscramble($string)
	{
		return self::decrypt(self::sk1().self::sk2(), $string);
	}

	public static function sk1()
	{
		return 'fdas'.self::encrypt('abx', 'v1');
	}

	public static function sk2()
	{
		return 'fres'.self::encrypt('ad3x', 'v2');
	}
}installer/dup-installer/classes/index.php000064400000000017151336065400014602 0ustar00<?php
//silentinstaller/dup-installer/classes/Crypt/Rijndael.php000064400000131465151336065400016340 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Pure-PHP implementation of Rijndael.
 *
 * Uses mcrypt, if available/possible, and an internal implementation, otherwise.
 *
 * PHP versions 4 and 5
 *
 * If {@link self::setBlockLength() setBlockLength()} isn't called, it'll be assumed to be 128 bits.  If
 * {@link self::setKeyLength() setKeyLength()} isn't called, it'll be calculated from
 * {@link self::setKey() setKey()}.  ie. if the key is 128-bits, the key length will be 128-bits.  If it's
 * 136-bits it'll be null-padded to 192-bits and 192 bits will be the key length until
 * {@link self::setKey() setKey()} is called, again, at which point, it'll be recalculated.
 *
 * Not all Rijndael implementations may support 160-bits or 224-bits as the block length / key length.  mcrypt, for example,
 * does not.  AES, itself, only supports block lengths of 128 and key lengths of 128, 192, and 256.
 * {@link http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=10 Rijndael-ammended.pdf#page=10} defines the
 * algorithm for block lengths of 192 and 256 but not for block lengths / key lengths of 160 and 224.  Indeed, 160 and 224
 * are first defined as valid key / block lengths in
 * {@link http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=44 Rijndael-ammended.pdf#page=44}:
 * Extensions: Other block and Cipher Key lengths.
 * Note: Use of 160/224-bit Keys must be explicitly set by setKeyLength(160) respectively setKeyLength(224).
 *
 * {@internal The variable names are the same as those in
 * {@link http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf#page=10 fips-197.pdf#page=10}.}}
 *
 * Here's a short example of how to use this library:
 * <code>
 * <?php
 *    include 'Crypt/Rijndael.php';
 *
 *    $rijndael = new Crypt_Rijndael();
 *
 *    $rijndael->setKey('abcdefghijklmnop');
 *
 *    $size = 10 * 1024;
 *    $plaintext = '';
 *    for ($i = 0; $i < $size; $i++) {
 *        $plaintext.= 'a';
 *    }
 *
 *    echo $rijndael->decrypt($rijndael->encrypt($plaintext));
 * ?>
 * </code>
 *
 * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * @category  Crypt
 * @package   Crypt_Rijndael
 * @author    Jim Wigginton <terrafrost@php.net>
 * @copyright 2008 Jim Wigginton
 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
 * @link      http://phpseclib.sourceforge.net
 */

/**
 * Include Crypt_Base
 *
 * Base cipher class
 */
if (!class_exists('Crypt_Base')) {
    include_once 'Base.php';
}

/**#@+
 * @access public
 * @see self::encrypt()
 * @see self::decrypt()
 */
/**
 * Encrypt / decrypt using the Counter mode.
 *
 * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
 */
define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR);
/**
 * Encrypt / decrypt using the Electronic Code Book mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
 */
define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB);
/**
 * Encrypt / decrypt using the Code Book Chaining mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
 */
define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC);
/**
 * Encrypt / decrypt using the Cipher Feedback mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
 */
define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB);
/**
 * Encrypt / decrypt using the Cipher Feedback mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
 */
define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB);
/**#@-*/

/**
 * Pure-PHP implementation of Rijndael.
 *
 * @package Crypt_Rijndael
 * @author  Jim Wigginton <terrafrost@php.net>
 * @access  public
 */
class Crypt_Rijndael extends Crypt_Base
{
    /**
     * The namespace used by the cipher for its constants.
     *
     * @see Crypt_Base::const_namespace
     * @var string
     * @access private
     */
    var $const_namespace = 'RIJNDAEL';

    /**
     * The mcrypt specific name of the cipher
     *
     * Mcrypt is useable for 128/192/256-bit $block_size/$key_length. For 160/224 not.
     * Crypt_Rijndael determines automatically whether mcrypt is useable
     * or not for the current $block_size/$key_length.
     * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly.
     *
     * @see Crypt_Base::cipher_name_mcrypt
     * @see Crypt_Base::engine
     * @see self::isValidEngine()
     * @var string
     * @access private
     */
    var $cipher_name_mcrypt = 'rijndael-128';

    /**
     * The default salt used by setPassword()
     *
     * @see Crypt_Base::password_default_salt
     * @see Crypt_Base::setPassword()
     * @var string
     * @access private
     */
    var $password_default_salt = 'phpseclib';

    /**
     * The Key Schedule
     *
     * @see self::_setup()
     * @var array
     * @access private
     */
    var $w;

    /**
     * The Inverse Key Schedule
     *
     * @see self::_setup()
     * @var array
     * @access private
     */
    var $dw;

    /**
     * The Block Length divided by 32
     *
     * @see self::setBlockLength()
     * @var int
     * @access private
     * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4.  Exists in conjunction with $block_size
     *    because the encryption / decryption / key schedule creation requires this number and not $block_size.  We could
     *    derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
     *    of that, we'll just precompute it once.
     */
    var $Nb = 4;

    /**
     * The Key Length (in bytes)
     *
     * @see self::setKeyLength()
     * @var int
     * @access private
     * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16.  Exists in conjunction with $Nk
     *    because the encryption / decryption / key schedule creation requires this number and not $key_length.  We could
     *    derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
     *    of that, we'll just precompute it once.
     */
    var $key_length = 16;

    /**
     * The Key Length divided by 32
     *
     * @see self::setKeyLength()
     * @var int
     * @access private
     * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4
     */
    var $Nk = 4;

    /**
     * The Number of Rounds
     *
     * @var int
     * @access private
     * @internal The max value is 14, the min value is 10.
     */
    var $Nr;

    /**
     * Shift offsets
     *
     * @var array
     * @access private
     */
    var $c;

    /**
     * Holds the last used key- and block_size information
     *
     * @var array
     * @access private
     */
    var $kl;

    /**
     * Sets the key.
     *
     * Keys can be of any length.  Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and
     * whose length is a multiple of 32.  If the key is less than 256-bits and the key length isn't set, we round the length
     * up to the closest valid key length, padding $key with null bytes.  If the key is more than 256-bits, we trim the
     * excess bits.
     *
     * If the key is not explicitly set, it'll be assumed to be all null bytes.
     *
     * Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits.
     *
     * @see Crypt_Base:setKey()
     * @see self::setKeyLength()
     * @access public
     * @param string $key
     */
    function setKey($key)
    {
        if (!$this->explicit_key_length) {
            $length = strlen($key);
            switch (true) {
                case $length <= 16:
                    $this->key_size = 16;
                    break;
                case $length <= 20:
                    $this->key_size = 20;
                    break;
                case $length <= 24:
                    $this->key_size = 24;
                    break;
                case $length <= 28:
                    $this->key_size = 28;
                    break;
                default:
                    $this->key_size = 32;
            }
        }
        parent::setKey($key);
    }

    /**
     * Sets the key length
     *
     * Valid key lengths are 128, 160, 192, 224, and 256.  If the length is less than 128, it will be rounded up to
     * 128.  If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
     *
     * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined
     *       and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to
     *       192/256 bits as, for example, mcrypt will do.
     *
     *       That said, if you want be compatible with other Rijndael and AES implementations,
     *       you should not setKeyLength(160) or setKeyLength(224).
     *
     * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use
     *             the mcrypt php extension, even if available.
     *             This results then in slower encryption.
     *
     * @access public
     * @param int $length
     */
    function setKeyLength($length)
    {
        switch (true) {
            case $length <= 128:
                $this->key_length = 16;
                break;
            case $length <= 160:
                $this->key_length = 20;
                break;
            case $length <= 192:
                $this->key_length = 24;
                break;
            case $length <= 224:
                $this->key_length = 28;
                break;
            default:
                $this->key_length = 32;
        }

        parent::setKeyLength($length);
    }

    /**
     * Sets the block length
     *
     * Valid block lengths are 128, 160, 192, 224, and 256.  If the length is less than 128, it will be rounded up to
     * 128.  If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
     *
     * @access public
     * @param int $length
     */
    function setBlockLength($length)
    {
        $length >>= 5;
        if ($length > 8) {
            $length = 8;
        } elseif ($length < 4) {
            $length = 4;
        }
        $this->Nb = $length;
        $this->block_size = $length << 2;
        $this->changed = true;
        $this->_setEngine();
    }

    /**
     * Test for engine validity
     *
     * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
     *
     * @see Crypt_Base::Crypt_Base()
     * @param int $engine
     * @access public
     * @return bool
     */
    function isValidEngine($engine)
    {
        switch ($engine) {
            case CRYPT_ENGINE_OPENSSL:
                if ($this->block_size != 16) {
                    return false;
                }
                $this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb';
                $this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->_openssl_translate_mode();
                break;
            case CRYPT_ENGINE_MCRYPT:
                $this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3);
                if ($this->key_length % 8) { // is it a 160/224-bit key?
                    // mcrypt is not usable for them, only for 128/192/256-bit keys
                    return false;
                }
        }

        return parent::isValidEngine($engine);
    }

    /**
     * Encrypts a block
     *
     * @access private
     * @param string $in
     * @return string
     */
    function _encryptBlock($in)
    {
        static $tables;
        if (empty($tables)) {
            $tables = &$this->_getTables();
        }
        $t0   = $tables[0];
        $t1   = $tables[1];
        $t2   = $tables[2];
        $t3   = $tables[3];
        $sbox = $tables[4];

        $state = array();
        $words = unpack('N*', $in);

        $c = $this->c;
        $w = $this->w;
        $Nb = $this->Nb;
        $Nr = $this->Nr;

        // addRoundKey
        $wc = $Nb - 1;
        foreach ($words as $word) {
            $state[] = $word ^ $w[++$wc];
        }

        // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components -
        // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding
        // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf.
        // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization.
        // Unfortunately, the description given there is not quite correct.  Per aes.spec.v316.pdf#page=19 [1],
        // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well.

        // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf
        $temp = array();
        for ($round = 1; $round < $Nr; ++$round) {
            $i = 0; // $c[0] == 0
            $j = $c[1];
            $k = $c[2];
            $l = $c[3];

            while ($i < $Nb) {
                $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^
                            $t1[$state[$j] >> 16 & 0x000000FF] ^
                            $t2[$state[$k] >>  8 & 0x000000FF] ^
                            $t3[$state[$l]       & 0x000000FF] ^
                            $w[++$wc];
                ++$i;
                $j = ($j + 1) % $Nb;
                $k = ($k + 1) % $Nb;
                $l = ($l + 1) % $Nb;
            }
            $state = $temp;
        }

        // subWord
        for ($i = 0; $i < $Nb; ++$i) {
            $state[$i] =   $sbox[$state[$i]       & 0x000000FF]        |
                          ($sbox[$state[$i] >>  8 & 0x000000FF] <<  8) |
                          ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) |
                          ($sbox[$state[$i] >> 24 & 0x000000FF] << 24);
        }

        // shiftRows + addRoundKey
        $i = 0; // $c[0] == 0
        $j = $c[1];
        $k = $c[2];
        $l = $c[3];
        while ($i < $Nb) {
            $temp[$i] = ($state[$i] & 0xFF000000) ^
                        ($state[$j] & 0x00FF0000) ^
                        ($state[$k] & 0x0000FF00) ^
                        ($state[$l] & 0x000000FF) ^
                         $w[$i];
            ++$i;
            $j = ($j + 1) % $Nb;
            $k = ($k + 1) % $Nb;
            $l = ($l + 1) % $Nb;
        }

        switch ($Nb) {
            case 8:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]);
            case 7:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]);
            case 6:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]);
            case 5:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]);
            default:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]);
        }
    }

    /**
     * Decrypts a block
     *
     * @access private
     * @param string $in
     * @return string
     */
    function _decryptBlock($in)
    {
        static $invtables;
        if (empty($invtables)) {
            $invtables = &$this->_getInvTables();
        }
        $dt0   = $invtables[0];
        $dt1   = $invtables[1];
        $dt2   = $invtables[2];
        $dt3   = $invtables[3];
        $isbox = $invtables[4];

        $state = array();
        $words = unpack('N*', $in);

        $c  = $this->c;
        $dw = $this->dw;
        $Nb = $this->Nb;
        $Nr = $this->Nr;

        // addRoundKey
        $wc = $Nb - 1;
        foreach ($words as $word) {
            $state[] = $word ^ $dw[++$wc];
        }

        $temp = array();
        for ($round = $Nr - 1; $round > 0; --$round) {
            $i = 0; // $c[0] == 0
            $j = $Nb - $c[1];
            $k = $Nb - $c[2];
            $l = $Nb - $c[3];

            while ($i < $Nb) {
                $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^
                            $dt1[$state[$j] >> 16 & 0x000000FF] ^
                            $dt2[$state[$k] >>  8 & 0x000000FF] ^
                            $dt3[$state[$l]       & 0x000000FF] ^
                            $dw[++$wc];
                ++$i;
                $j = ($j + 1) % $Nb;
                $k = ($k + 1) % $Nb;
                $l = ($l + 1) % $Nb;
            }
            $state = $temp;
        }

        // invShiftRows + invSubWord + addRoundKey
        $i = 0; // $c[0] == 0
        $j = $Nb - $c[1];
        $k = $Nb - $c[2];
        $l = $Nb - $c[3];

        while ($i < $Nb) {
            $word = ($state[$i] & 0xFF000000) |
                    ($state[$j] & 0x00FF0000) |
                    ($state[$k] & 0x0000FF00) |
                    ($state[$l] & 0x000000FF);

            $temp[$i] = $dw[$i] ^ ($isbox[$word       & 0x000000FF]        |
                                  ($isbox[$word >>  8 & 0x000000FF] <<  8) |
                                  ($isbox[$word >> 16 & 0x000000FF] << 16) |
                                  ($isbox[$word >> 24 & 0x000000FF] << 24));
            ++$i;
            $j = ($j + 1) % $Nb;
            $k = ($k + 1) % $Nb;
            $l = ($l + 1) % $Nb;
        }

        switch ($Nb) {
            case 8:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]);
            case 7:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]);
            case 6:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]);
            case 5:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]);
            default:
                return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]);
        }
    }

    /**
     * Setup the key (expansion)
     *
     * @see Crypt_Base::_setupKey()
     * @access private
     */
    function _setupKey()
    {
        // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field.
        // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse
        static $rcon = array(0,
            0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
            0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000,
            0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000,
            0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000,
            0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000,
            0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000
        );

        if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_length === $this->kl['key_length'] && $this->block_size === $this->kl['block_size']) {
            // already expanded
            return;
        }
        $this->kl = array('key' => $this->key, 'key_length' => $this->key_length, 'block_size' => $this->block_size);

        $this->Nk = $this->key_length >> 2;
        // see Rijndael-ammended.pdf#page=44
        $this->Nr = max($this->Nk, $this->Nb) + 6;

        // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44,
        //     "Table 8: Shift offsets in Shiftrow for the alternative block lengths"
        // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14,
        //     "Table 2: Shift offsets for different block lengths"
        switch ($this->Nb) {
            case 4:
            case 5:
            case 6:
                $this->c = array(0, 1, 2, 3);
                break;
            case 7:
                $this->c = array(0, 1, 2, 4);
                break;
            case 8:
                $this->c = array(0, 1, 3, 4);
        }

        $w = array_values(unpack('N*words', $this->key));

        $length = $this->Nb * ($this->Nr + 1);
        for ($i = $this->Nk; $i < $length; $i++) {
            $temp = $w[$i - 1];
            if ($i % $this->Nk == 0) {
                // according to <http://php.net/language.types.integer>, "the size of an integer is platform-dependent".
                // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine,
                // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and'
                // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is.
                $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord
                $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk];
            } elseif ($this->Nk > 6 && $i % $this->Nk == 4) {
                $temp = $this->_subWord($temp);
            }
            $w[$i] = $w[$i - $this->Nk] ^ $temp;
        }

        // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns
        // and generate the inverse key schedule.  more specifically,
        // according to <http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=23> (section 5.3.3),
        // "The key expansion for the Inverse Cipher is defined as follows:
        //        1. Apply the Key Expansion.
        //        2. Apply InvMixColumn to all Round Keys except the first and the last one."
        // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher"
        list($dt0, $dt1, $dt2, $dt3) = $this->_getInvTables();
        $temp = $this->w = $this->dw = array();
        for ($i = $row = $col = 0; $i < $length; $i++, $col++) {
            if ($col == $this->Nb) {
                if ($row == 0) {
                    $this->dw[0] = $this->w[0];
                } else {
                    // subWord + invMixColumn + invSubWord = invMixColumn
                    $j = 0;
                    while ($j < $this->Nb) {
                        $dw = $this->_subWord($this->w[$row][$j]);
                        $temp[$j] = $dt0[$dw >> 24 & 0x000000FF] ^
                                    $dt1[$dw >> 16 & 0x000000FF] ^
                                    $dt2[$dw >>  8 & 0x000000FF] ^
                                    $dt3[$dw       & 0x000000FF];
                        $j++;
                    }
                    $this->dw[$row] = $temp;
                }

                $col = 0;
                $row++;
            }
            $this->w[$row][$col] = $w[$i];
        }

        $this->dw[$row] = $this->w[$row];

        // Converting to 1-dim key arrays (both ascending)
        $this->dw = array_reverse($this->dw);
        $w  = array_pop($this->w);
        $dw = array_pop($this->dw);
        foreach ($this->w as $r => $wr) {
            foreach ($wr as $c => $wc) {
                $w[]  = $wc;
                $dw[] = $this->dw[$r][$c];
            }
        }
        $this->w  = $w;
        $this->dw = $dw;
    }

    /**
     * Performs S-Box substitutions
     *
     * @access private
     * @param int $word
     */
    function _subWord($word)
    {
        static $sbox;
        if (empty($sbox)) {
            list(, , , , $sbox) = $this->_getTables();
        }

        return  $sbox[$word       & 0x000000FF]        |
               ($sbox[$word >>  8 & 0x000000FF] <<  8) |
               ($sbox[$word >> 16 & 0x000000FF] << 16) |
               ($sbox[$word >> 24 & 0x000000FF] << 24);
    }

    /**
     * Provides the mixColumns and sboxes tables
     *
     * @see Crypt_Rijndael:_encryptBlock()
     * @see Crypt_Rijndael:_setupInlineCrypt()
     * @see Crypt_Rijndael:_subWord()
     * @access private
     * @return array &$tables
     */
    function &_getTables()
    {
        static $tables;
        if (empty($tables)) {
            // according to <http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=19> (section 5.2.1),
            // precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so
            // those are the names we'll use.
            $t3 = array_map('intval', array(
                // with array_map('intval', ...) we ensure we have only int's and not
                // some slower floats converted by php automatically on high values
                0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491,
                0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC,
                0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB,
                0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B,
                0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83,
                0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A,
                0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F,
                0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA,
                0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B,
                0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713,
                0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6,
                0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85,
                0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411,
                0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B,
                0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1,
                0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF,
                0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E,
                0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6,
                0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B,
                0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD,
                0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8,
                0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2,
                0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049,
                0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810,
                0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197,
                0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F,
                0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C,
                0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927,
                0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733,
                0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5,
                0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0,
                0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C
            ));

            foreach ($t3 as $t3i) {
                $t0[] = (($t3i << 24) & 0xFF000000) | (($t3i >>  8) & 0x00FFFFFF);
                $t1[] = (($t3i << 16) & 0xFFFF0000) | (($t3i >> 16) & 0x0000FFFF);
                $t2[] = (($t3i <<  8) & 0xFFFFFF00) | (($t3i >> 24) & 0x000000FF);
            }

            $tables = array(
                // The Precomputed mixColumns tables t0 - t3
                $t0,
                $t1,
                $t2,
                $t3,
                // The SubByte S-Box
                array(
                    0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
                    0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
                    0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
                    0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
                    0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
                    0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
                    0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
                    0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
                    0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
                    0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
                    0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
                    0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
                    0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
                    0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
                    0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
                    0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
                )
            );
        }
        return $tables;
    }

    /**
     * Provides the inverse mixColumns and inverse sboxes tables
     *
     * @see Crypt_Rijndael:_decryptBlock()
     * @see Crypt_Rijndael:_setupInlineCrypt()
     * @see Crypt_Rijndael:_setupKey()
     * @access private
     * @return array &$tables
     */
    function &_getInvTables()
    {
        static $tables;
        if (empty($tables)) {
            $dt3 = array_map('intval', array(
                0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B,
                0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5,
                0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B,
                0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E,
                0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D,
                0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9,
                0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66,
                0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED,
                0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4,
                0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD,
                0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60,
                0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79,
                0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C,
                0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24,
                0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C,
                0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814,
                0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B,
                0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084,
                0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077,
                0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22,
                0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F,
                0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582,
                0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB,
                0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF,
                0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035,
                0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17,
                0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46,
                0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D,
                0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A,
                0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678,
                0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF,
                0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0
            ));

            foreach ($dt3 as $dt3i) {
                $dt0[] = (($dt3i << 24) & 0xFF000000) | (($dt3i >>  8) & 0x00FFFFFF);
                $dt1[] = (($dt3i << 16) & 0xFFFF0000) | (($dt3i >> 16) & 0x0000FFFF);
                $dt2[] = (($dt3i <<  8) & 0xFFFFFF00) | (($dt3i >> 24) & 0x000000FF);
            };

            $tables = array(
                // The Precomputed inverse mixColumns tables dt0 - dt3
                $dt0,
                $dt1,
                $dt2,
                $dt3,
                // The inverse SubByte S-Box
                array(
                    0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
                    0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
                    0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
                    0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
                    0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
                    0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
                    0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
                    0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
                    0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
                    0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
                    0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
                    0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
                    0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
                    0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
                    0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
                    0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
                )
            );
        }
        return $tables;
    }

    /**
     * Setup the performance-optimized function for de/encrypt()
     *
     * @see Crypt_Base::_setupInlineCrypt()
     * @access private
     */
    function _setupInlineCrypt()
    {
        // Note: _setupInlineCrypt() will be called only if $this->changed === true
        // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt().
        // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible.

        $lambda_functions =& Crypt_Rijndael::_getLambdaFunctions();

        // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
        // (Currently, for Crypt_Rijndael/AES, one generated $lambda_function cost on php5.5@32bit ~80kb unfreeable mem and ~130kb on php5.5@64bit)
        // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
        $gen_hi_opt_code = (bool)(count($lambda_functions) < 10);

        // Generation of a uniqe hash for our generated code
        $code_hash = "Crypt_Rijndael, {$this->mode}, {$this->Nr}, {$this->Nb}";
        if ($gen_hi_opt_code) {
            $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
        }

        if (!isset($lambda_functions[$code_hash])) {
            switch (true) {
                case $gen_hi_opt_code:
                    // The hi-optimized $lambda_functions will use the key-words hardcoded for better performance.
                    $w  = $this->w;
                    $dw = $this->dw;
                    $init_encrypt = '';
                    $init_decrypt = '';
                    break;
                default:
                    for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) {
                        $w[]  = '$w['  . $i . ']';
                        $dw[] = '$dw[' . $i . ']';
                    }
                    $init_encrypt = '$w  = $self->w;';
                    $init_decrypt = '$dw = $self->dw;';
            }

            $Nr = $this->Nr;
            $Nb = $this->Nb;
            $c  = $this->c;

            // Generating encrypt code:
            $init_encrypt.= '
                static $tables;
                if (empty($tables)) {
                    $tables = &$self->_getTables();
                }
                $t0   = $tables[0];
                $t1   = $tables[1];
                $t2   = $tables[2];
                $t3   = $tables[3];
                $sbox = $tables[4];
            ';

            $s  = 'e';
            $e  = 's';
            $wc = $Nb - 1;

            // Preround: addRoundKey
            $encrypt_block = '$in = unpack("N*", $in);'."\n";
            for ($i = 0; $i < $Nb; ++$i) {
                $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n";
            }

            // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey
            for ($round = 1; $round < $Nr; ++$round) {
                list($s, $e) = array($e, $s);
                for ($i = 0; $i < $Nb; ++$i) {
                    $encrypt_block.=
                        '$'.$e.$i.' =
                        $t0[($'.$s.$i                  .' >> 24) & 0xff] ^
                        $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^
                        $t2[($'.$s.(($i + $c[2]) % $Nb).' >>  8) & 0xff] ^
                        $t3[ $'.$s.(($i + $c[3]) % $Nb).'        & 0xff] ^
                        '.$w[++$wc].";\n";
                }
            }

            // Finalround: subWord + shiftRows + addRoundKey
            for ($i = 0; $i < $Nb; ++$i) {
                $encrypt_block.=
                    '$'.$e.$i.' =
                     $sbox[ $'.$e.$i.'        & 0xff]        |
                    ($sbox[($'.$e.$i.' >>  8) & 0xff] <<  8) |
                    ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) |
                    ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n";
            }
            $encrypt_block .= '$in = pack("N*"'."\n";
            for ($i = 0; $i < $Nb; ++$i) {
                $encrypt_block.= ',
                    ($'.$e.$i                  .' & '.((int)0xFF000000).') ^
                    ($'.$e.(($i + $c[1]) % $Nb).' &         0x00FF0000   ) ^
                    ($'.$e.(($i + $c[2]) % $Nb).' &         0x0000FF00   ) ^
                    ($'.$e.(($i + $c[3]) % $Nb).' &         0x000000FF   ) ^
                    '.$w[$i]."\n";
            }
            $encrypt_block .= ');';

            // Generating decrypt code:
            $init_decrypt.= '
                static $invtables;
                if (empty($invtables)) {
                    $invtables = &$self->_getInvTables();
                }
                $dt0   = $invtables[0];
                $dt1   = $invtables[1];
                $dt2   = $invtables[2];
                $dt3   = $invtables[3];
                $isbox = $invtables[4];
            ';

            $s  = 'e';
            $e  = 's';
            $wc = $Nb - 1;

            // Preround: addRoundKey
            $decrypt_block = '$in = unpack("N*", $in);'."\n";
            for ($i = 0; $i < $Nb; ++$i) {
                $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n";
            }

            // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey
            for ($round = 1; $round < $Nr; ++$round) {
                list($s, $e) = array($e, $s);
                for ($i = 0; $i < $Nb; ++$i) {
                    $decrypt_block.=
                        '$'.$e.$i.' =
                        $dt0[($'.$s.$i                        .' >> 24) & 0xff] ^
                        $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^
                        $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >>  8) & 0xff] ^
                        $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).'        & 0xff] ^
                        '.$dw[++$wc].";\n";
                }
            }

            // Finalround: subWord + shiftRows + addRoundKey
            for ($i = 0; $i < $Nb; ++$i) {
                $decrypt_block.=
                    '$'.$e.$i.' =
                     $isbox[ $'.$e.$i.'        & 0xff]        |
                    ($isbox[($'.$e.$i.' >>  8) & 0xff] <<  8) |
                    ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) |
                    ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n";
            }
            $decrypt_block .= '$in = pack("N*"'."\n";
            for ($i = 0; $i < $Nb; ++$i) {
                $decrypt_block.= ',
                    ($'.$e.$i.                        ' & '.((int)0xFF000000).') ^
                    ($'.$e.(($Nb + $i - $c[1]) % $Nb).' &         0x00FF0000   ) ^
                    ($'.$e.(($Nb + $i - $c[2]) % $Nb).' &         0x0000FF00   ) ^
                    ($'.$e.(($Nb + $i - $c[3]) % $Nb).' &         0x000000FF   ) ^
                    '.$dw[$i]."\n";
            }
            $decrypt_block .= ');';

            $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
                array(
                   'init_crypt'    => '',
                   'init_encrypt'  => $init_encrypt,
                   'init_decrypt'  => $init_decrypt,
                   'encrypt_block' => $encrypt_block,
                   'decrypt_block' => $decrypt_block
                )
            );
        }
        $this->inline_crypt = $lambda_functions[$code_hash];
    }
}
installer/dup-installer/classes/Crypt/Base.php000064400000305661151336065400015463 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Base Class for all Crypt_* cipher classes
 *
 * PHP versions 4 and 5
 *
 * Internally for phpseclib developers:
 *  If you plan to add a new cipher class, please note following rules:
 *
 *  - The new Crypt_* cipher class should extend Crypt_Base
 *
 *  - Following methods are then required to be overridden/overloaded:
 *
 *    - _encryptBlock()
 *
 *    - _decryptBlock()
 *
 *    - _setupKey()
 *
 *  - All other methods are optional to be overridden/overloaded
 *
 *  - Look at the source code of the current ciphers how they extend Crypt_Base
 *    and take one of them as a start up for the new cipher class.
 *
 *  - Please read all the other comments/notes/hints here also for each class var/method
 *
 * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * @category  Crypt
 * @package   Crypt_Base
 * @author    Jim Wigginton <terrafrost@php.net>
 * @author    Hans-Juergen Petrich <petrich@tronic-media.com>
 * @copyright 2007 Jim Wigginton
 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
 * @link      http://phpseclib.sourceforge.net
 */

/**#@+
 * @access public
 * @see self::encrypt()
 * @see self::decrypt()
 */
/**
 * Encrypt / decrypt using the Counter mode.
 *
 * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
 */
define('CRYPT_MODE_CTR', -1);
/**
 * Encrypt / decrypt using the Electronic Code Book mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
 */
define('CRYPT_MODE_ECB', 1);
/**
 * Encrypt / decrypt using the Code Book Chaining mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
 */
define('CRYPT_MODE_CBC', 2);
/**
 * Encrypt / decrypt using the Cipher Feedback mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
 */
define('CRYPT_MODE_CFB', 3);
/**
 * Encrypt / decrypt using the Output Feedback mode.
 *
 * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
 */
define('CRYPT_MODE_OFB', 4);
/**
 * Encrypt / decrypt using streaming mode.
 */
define('CRYPT_MODE_STREAM', 5);
/**#@-*/

/**#@+
 * @access private
 * @see self::Crypt_Base()
 * @internal These constants are for internal use only
 */
/**
 * Base value for the internal implementation $engine switch
 */
define('CRYPT_ENGINE_INTERNAL', 1);
/**
 * Base value for the mcrypt implementation $engine switch
 */
define('CRYPT_ENGINE_MCRYPT', 2);
/**
 * Base value for the OpenSSL implementation $engine switch
 */
define('CRYPT_ENGINE_OPENSSL', 3);
/**#@-*/

/**
 * Base Class for all Crypt_* cipher classes
 *
 * @package Crypt_Base
 * @author  Jim Wigginton <terrafrost@php.net>
 * @author  Hans-Juergen Petrich <petrich@tronic-media.com>
 * @access  public
 */
class Crypt_Base
{
    /**
     * The Encryption Mode
     *
     * @see self::Crypt_Base()
     * @var int
     * @access private
     */
    var $mode;

    /**
     * The Block Length of the block cipher
     *
     * @var int
     * @access private
     */
    var $block_size = 16;

    /**
     * The Key
     *
     * @see self::setKey()
     * @var string
     * @access private
     */
    var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

    /**
     * The Initialization Vector
     *
     * @see self::setIV()
     * @var string
     * @access private
     */
    var $iv;

    /**
     * A "sliding" Initialization Vector
     *
     * @see self::enableContinuousBuffer()
     * @see self::_clearBuffers()
     * @var string
     * @access private
     */
    var $encryptIV;

    /**
     * A "sliding" Initialization Vector
     *
     * @see self::enableContinuousBuffer()
     * @see self::_clearBuffers()
     * @var string
     * @access private
     */
    var $decryptIV;

    /**
     * Continuous Buffer status
     *
     * @see self::enableContinuousBuffer()
     * @var bool
     * @access private
     */
    var $continuousBuffer = false;

    /**
     * Encryption buffer for CTR, OFB and CFB modes
     *
     * @see self::encrypt()
     * @see self::_clearBuffers()
     * @var array
     * @access private
     */
    var $enbuffer;

    /**
     * Decryption buffer for CTR, OFB and CFB modes
     *
     * @see self::decrypt()
     * @see self::_clearBuffers()
     * @var array
     * @access private
     */
    var $debuffer;

    /**
     * mcrypt resource for encryption
     *
     * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
     * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
     *
     * @see self::encrypt()
     * @var resource
     * @access private
     */
    var $enmcrypt;

    /**
     * mcrypt resource for decryption
     *
     * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
     * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
     *
     * @see self::decrypt()
     * @var resource
     * @access private
     */
    var $demcrypt;

    /**
     * Does the enmcrypt resource need to be (re)initialized?
     *
     * @see Crypt_Twofish::setKey()
     * @see Crypt_Twofish::setIV()
     * @var bool
     * @access private
     */
    var $enchanged = true;

    /**
     * Does the demcrypt resource need to be (re)initialized?
     *
     * @see Crypt_Twofish::setKey()
     * @see Crypt_Twofish::setIV()
     * @var bool
     * @access private
     */
    var $dechanged = true;

    /**
     * mcrypt resource for CFB mode
     *
     * mcrypt's CFB mode, in (and only in) buffered context,
     * is broken, so phpseclib implements the CFB mode by it self,
     * even when the mcrypt php extension is available.
     *
     * In order to do the CFB-mode work (fast) phpseclib
     * use a separate ECB-mode mcrypt resource.
     *
     * @link http://phpseclib.sourceforge.net/cfb-demo.phps
     * @see self::encrypt()
     * @see self::decrypt()
     * @see self::_setupMcrypt()
     * @var resource
     * @access private
     */
    var $ecb;

    /**
     * Optimizing value while CFB-encrypting
     *
     * Only relevant if $continuousBuffer enabled
     * and $engine == CRYPT_ENGINE_MCRYPT
     *
     * It's faster to re-init $enmcrypt if
     * $buffer bytes > $cfb_init_len than
     * using the $ecb resource furthermore.
     *
     * This value depends of the chosen cipher
     * and the time it would be needed for it's
     * initialization [by mcrypt_generic_init()]
     * which, typically, depends on the complexity
     * on its internaly Key-expanding algorithm.
     *
     * @see self::encrypt()
     * @var int
     * @access private
     */
    var $cfb_init_len = 600;

    /**
     * Does internal cipher state need to be (re)initialized?
     *
     * @see self::setKey()
     * @see self::setIV()
     * @see self::disableContinuousBuffer()
     * @var bool
     * @access private
     */
    var $changed = true;

    /**
     * Padding status
     *
     * @see self::enablePadding()
     * @var bool
     * @access private
     */
    var $padding = true;

    /**
     * Is the mode one that is paddable?
     *
     * @see self::Crypt_Base()
     * @var bool
     * @access private
     */
    var $paddable = false;

    /**
     * Holds which crypt engine internaly should be use,
     * which will be determined automatically on __construct()
     *
     * Currently available $engines are:
     * - CRYPT_ENGINE_OPENSSL  (very fast, php-extension: openssl, extension_loaded('openssl') required)
     * - CRYPT_ENGINE_MCRYPT   (fast, php-extension: mcrypt, extension_loaded('mcrypt') required)
     * - CRYPT_ENGINE_INTERNAL (slower, pure php-engine, no php-extension required)
     *
     * @see self::_setEngine()
     * @see self::encrypt()
     * @see self::decrypt()
     * @var int
     * @access private
     */
    var $engine;

    /**
     * Holds the preferred crypt engine
     *
     * @see self::_setEngine()
     * @see self::setPreferredEngine()
     * @var int
     * @access private
     */
    var $preferredEngine;

    /**
     * The mcrypt specific name of the cipher
     *
     * Only used if $engine == CRYPT_ENGINE_MCRYPT
     *
     * @link http://www.php.net/mcrypt_module_open
     * @link http://www.php.net/mcrypt_list_algorithms
     * @see self::_setupMcrypt()
     * @var string
     * @access private
     */
    var $cipher_name_mcrypt;

    /**
     * The openssl specific name of the cipher
     *
     * Only used if $engine == CRYPT_ENGINE_OPENSSL
     *
     * @link http://www.php.net/openssl-get-cipher-methods
     * @var string
     * @access private
     */
    var $cipher_name_openssl;

    /**
     * The openssl specific name of the cipher in ECB mode
     *
     * If OpenSSL does not support the mode we're trying to use (CTR)
     * it can still be emulated with ECB mode.
     *
     * @link http://www.php.net/openssl-get-cipher-methods
     * @var string
     * @access private
     */
    var $cipher_name_openssl_ecb;

    /**
     * The default salt used by setPassword()
     *
     * @see self::setPassword()
     * @var string
     * @access private
     */
    var $password_default_salt = 'phpseclib/salt';

    /**
     * The namespace used by the cipher for its constants.
     *
     * ie: AES.php is using CRYPT_AES_MODE_* for its constants
     *     so $const_namespace is AES
     *
     *     DES.php is using CRYPT_DES_MODE_* for its constants
     *     so $const_namespace is DES... and so on
     *
     * All CRYPT_<$const_namespace>_MODE_* are aliases of
     * the generic CRYPT_MODE_* constants, so both could be used
     * for each cipher.
     *
     * Example:
     * $aes = new Crypt_AES(CRYPT_AES_MODE_CFB); // $aes will operate in cfb mode
     * $aes = new Crypt_AES(CRYPT_MODE_CFB);     // identical
     *
     * @see self::Crypt_Base()
     * @var string
     * @access private
     */
    var $const_namespace;

    /**
     * The name of the performance-optimized callback function
     *
     * Used by encrypt() / decrypt()
     * only if $engine == CRYPT_ENGINE_INTERNAL
     *
     * @see self::encrypt()
     * @see self::decrypt()
     * @see self::_setupInlineCrypt()
     * @see self::$use_inline_crypt
     * @var Callback
     * @access private
     */
    var $inline_crypt;

    /**
     * Holds whether performance-optimized $inline_crypt() can/should be used.
     *
     * @see self::encrypt()
     * @see self::decrypt()
     * @see self::inline_crypt
     * @var mixed
     * @access private
     */
    var $use_inline_crypt;

    /**
     * If OpenSSL can be used in ECB but not in CTR we can emulate CTR
     *
     * @see self::_openssl_ctr_process()
     * @var bool
     * @access private
     */
    var $openssl_emulate_ctr = false;

    /**
     * Determines what options are passed to openssl_encrypt/decrypt
     *
     * @see self::isValidEngine()
     * @var mixed
     * @access private
     */
    var $openssl_options;

    /**
     * Has the key length explicitly been set or should it be derived from the key, itself?
     *
     * @see self::setKeyLength()
     * @var bool
     * @access private
     */
    var $explicit_key_length = false;

    /**
     * Don't truncate / null pad key
     *
     * @see self::_clearBuffers()
     * @var bool
     * @access private
     */
    var $skip_key_adjustment = false;

    /**
     * Default Constructor.
     *
     * Determines whether or not the mcrypt extension should be used.
     *
     * $mode could be:
     *
     * - CRYPT_MODE_ECB
     *
     * - CRYPT_MODE_CBC
     *
     * - CRYPT_MODE_CTR
     *
     * - CRYPT_MODE_CFB
     *
     * - CRYPT_MODE_OFB
     *
     * (or the alias constants of the chosen cipher, for example for AES: CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC ...)
     *
     * If not explicitly set, CRYPT_MODE_CBC will be used.
     *
     * @param int $mode
     * @access public
     */
    function __construct($mode = CRYPT_MODE_CBC)
    {
        // $mode dependent settings
        switch ($mode) {
            case CRYPT_MODE_ECB:
                $this->paddable = true;
                $this->mode = CRYPT_MODE_ECB;
                break;
            case CRYPT_MODE_CTR:
            case CRYPT_MODE_CFB:
            case CRYPT_MODE_OFB:
            case CRYPT_MODE_STREAM:
                $this->mode = $mode;
                break;
            case CRYPT_MODE_CBC:
            default:
                $this->paddable = true;
                $this->mode = CRYPT_MODE_CBC;
        }

        $this->_setEngine();

        // Determining whether inline crypting can be used by the cipher
        if ($this->use_inline_crypt !== false) {
            $this->use_inline_crypt = version_compare(PHP_VERSION, '5.3.0') >= 0 || function_exists('create_function');
        }
    }

    /**
     * PHP4 compatible Default Constructor.
     *
     * @see self::__construct()
     * @param int $mode
     * @access public
     */
    function Crypt_Base($mode = CRYPT_MODE_CBC)
    {
        $this->__construct($mode);
    }

    /**
     * Sets the initialization vector. (optional)
     *
     * SetIV is not required when CRYPT_MODE_ECB (or ie for AES: CRYPT_AES_MODE_ECB) is being used.  If not explicitly set, it'll be assumed
     * to be all zero's.
     *
     * @access public
     * @param string $iv
     * @internal Can be overwritten by a sub class, but does not have to be
     */
    function setIV($iv)
    {
        if ($this->mode == CRYPT_MODE_ECB) {
            return;
        }

        $this->iv = $iv;
        $this->changed = true;
    }

    /**
     * Sets the key length.
     *
     * Keys with explicitly set lengths need to be treated accordingly
     *
     * @access public
     * @param int $length
     */
    function setKeyLength($length)
    {
        $this->explicit_key_length = true;
        $this->changed = true;
        $this->_setEngine();
    }

    /**
     * Returns the current key length in bits
     *
     * @access public
     * @return int
     */
    function getKeyLength()
    {
        return $this->key_length << 3;
    }

    /**
     * Returns the current block length in bits
     *
     * @access public
     * @return int
     */
    function getBlockLength()
    {
        return $this->block_size << 3;
    }

    /**
     * Sets the key.
     *
     * The min/max length(s) of the key depends on the cipher which is used.
     * If the key not fits the length(s) of the cipher it will paded with null bytes
     * up to the closest valid key length.  If the key is more than max length,
     * we trim the excess bits.
     *
     * If the key is not explicitly set, it'll be assumed to be all null bytes.
     *
     * @access public
     * @param string $key
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function setKey($key)
    {
        if (!$this->explicit_key_length) {
            $this->setKeyLength(strlen($key) << 3);
            $this->explicit_key_length = false;
        }

        $this->key = $key;
        $this->changed = true;
        $this->_setEngine();
    }

    /**
     * Sets the password.
     *
     * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows:
     *     {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1:
     *         $hash, $salt, $count, $dkLen
     *
     *         Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php
     *
     * @see Crypt/Hash.php
     * @param string $password
     * @param string $method
     * @return bool
     * @access public
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function setPassword($password, $method = 'pbkdf2')
    {
        $key = '';

        switch ($method) {
            default: // 'pbkdf2' or 'pbkdf1'
                $func_args = func_get_args();

                // Hash function
                $hash = isset($func_args[2]) ? $func_args[2] : 'sha1';

                // WPA and WPA2 use the SSID as the salt
                $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt;

                // RFC2898#section-4.2 uses 1,000 iterations by default
                // WPA and WPA2 use 4,096.
                $count = isset($func_args[4]) ? $func_args[4] : 1000;

                // Keylength
                if (isset($func_args[5]) && $func_args[5] > 0) {
                    $dkLen = $func_args[5];
                } else {
                    $dkLen = $method == 'pbkdf1' ? 2 * $this->key_length : $this->key_length;
                }

                switch (true) {
                    case $method == 'pbkdf1':
                        if (!class_exists('Crypt_Hash')) {
                            include_once 'Crypt/Hash.php';
                        }
                        $hashObj = new Crypt_Hash();
                        $hashObj->setHash($hash);
                        if ($dkLen > $hashObj->getLength()) {
                            user_error('Derived key too long');
                            return false;
                        }
                        $t = $password . $salt;
                        for ($i = 0; $i < $count; ++$i) {
                            $t = $hashObj->hash($t);
                        }
                        $key = substr($t, 0, $dkLen);

                        $this->setKey(substr($key, 0, $dkLen >> 1));
                        $this->setIV(substr($key, $dkLen >> 1));

                        return true;
                    // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable
                    case !function_exists('hash_pbkdf2'):
                    case !function_exists('hash_algos'):
                    case !in_array($hash, hash_algos()):
                        if (!class_exists('Crypt_Hash')) {
                            include_once 'Crypt/Hash.php';
                        }
                        $i = 1;
                        $hmac = new Crypt_Hash();
                        $hmac->setHash($hash);
                        $hmac->setKey($password);
                        while (strlen($key) < $dkLen) {
                            $f = $u = $hmac->hash($salt . pack('N', $i++));
                            for ($j = 2; $j <= $count; ++$j) {
                                $u = $hmac->hash($u);
                                $f^= $u;
                            }
                            $key.= $f;
                        }
                        $key = substr($key, 0, $dkLen);
                        break;
                    default:
                        $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true);
                }
        }

        $this->setKey($key);

        return true;
    }

    /**
     * Encrypts a message.
     *
     * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher
     * implementations may or may not pad in the same manner.  Other common approaches to padding and the reasons why it's
     * necessary are discussed in the following
     * URL:
     *
     * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html}
     *
     * An alternative to padding is to, separately, send the length of the file.  This is what SSH, in fact, does.
     * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that
     * length.
     *
     * @see self::decrypt()
     * @access public
     * @param string $plaintext
     * @return string $ciphertext
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function encrypt($plaintext)
    {
        if ($this->paddable) {
            $plaintext = $this->_pad($plaintext);
        }

        if ($this->engine === CRYPT_ENGINE_OPENSSL) {
            if ($this->changed) {
                $this->_clearBuffers();
                $this->changed = false;
            }
            switch ($this->mode) {
                case CRYPT_MODE_STREAM:
                    return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
                case CRYPT_MODE_ECB:
                    $result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
                    return !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result;
                case CRYPT_MODE_CBC:
                    $result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->encryptIV);
                    if (!defined('OPENSSL_RAW_DATA')) {
                        $result = substr($result, 0, -$this->block_size);
                    }
                    if ($this->continuousBuffer) {
                        $this->encryptIV = substr($result, -$this->block_size);
                    }
                    return $result;
                case CRYPT_MODE_CTR:
                    return $this->_openssl_ctr_process($plaintext, $this->encryptIV, $this->enbuffer);
                case CRYPT_MODE_CFB:
                    // cfb loosely routines inspired by openssl's:
                    // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1}
                    $ciphertext = '';
                    if ($this->continuousBuffer) {
                        $iv = &$this->encryptIV;
                        $pos = &$this->enbuffer['pos'];
                    } else {
                        $iv = $this->encryptIV;
                        $pos = 0;
                    }
                    $len = strlen($plaintext);
                    $i = 0;
                    if ($pos) {
                        $orig_pos = $pos;
                        $max = $this->block_size - $pos;
                        if ($len >= $max) {
                            $i = $max;
                            $len-= $max;
                            $pos = 0;
                        } else {
                            $i = $len;
                            $pos+= $len;
                            $len = 0;
                        }
                        // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
                        $ciphertext = substr($iv, $orig_pos) ^ $plaintext;
                        $iv = substr_replace($iv, $ciphertext, $orig_pos, $i);
                        $plaintext = substr($plaintext, $i);
                    }

                    $overflow = $len % $this->block_size;

                    if ($overflow) {
                        $ciphertext.= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
                        $iv = $this->_string_pop($ciphertext, $this->block_size);

                        $size = $len - $overflow;
                        $block = $iv ^ substr($plaintext, -$overflow);
                        $iv = substr_replace($iv, $block, 0, $overflow);
                        $ciphertext.= $block;
                        $pos = $overflow;
                    } elseif ($len) {
                        $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
                        $iv = substr($ciphertext, -$this->block_size);
                    }

                    return $ciphertext;
                case CRYPT_MODE_OFB:
                    return $this->_openssl_ofb_process($plaintext, $this->encryptIV, $this->enbuffer);
            }
        }

        if ($this->engine === CRYPT_ENGINE_MCRYPT) {
            if ($this->changed) {
                $this->_setupMcrypt();
                $this->changed = false;
            }
            if ($this->enchanged) {
                @mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
                $this->enchanged = false;
            }

            // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps}
            // using mcrypt's default handing of CFB the above would output two different things.  using phpseclib's
            // rewritten CFB implementation the above outputs the same thing twice.
            if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) {
                $block_size = $this->block_size;
                $iv = &$this->encryptIV;
                $pos = &$this->enbuffer['pos'];
                $len = strlen($plaintext);
                $ciphertext = '';
                $i = 0;
                if ($pos) {
                    $orig_pos = $pos;
                    $max = $block_size - $pos;
                    if ($len >= $max) {
                        $i = $max;
                        $len-= $max;
                        $pos = 0;
                    } else {
                        $i = $len;
                        $pos+= $len;
                        $len = 0;
                    }
                    $ciphertext = substr($iv, $orig_pos) ^ $plaintext;
                    $iv = substr_replace($iv, $ciphertext, $orig_pos, $i);
                    $this->enbuffer['enmcrypt_init'] = true;
                }
                if ($len >= $block_size) {
                    if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) {
                        if ($this->enbuffer['enmcrypt_init'] === true) {
                            @mcrypt_generic_init($this->enmcrypt, $this->key, $iv);
                            $this->enbuffer['enmcrypt_init'] = false;
                        }
                        $ciphertext.= @mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size));
                        $iv = substr($ciphertext, -$block_size);
                        $len%= $block_size;
                    } else {
                        while ($len >= $block_size) {
                            $iv = @mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size);
                            $ciphertext.= $iv;
                            $len-= $block_size;
                            $i+= $block_size;
                        }
                    }
                }

                if ($len) {
                    $iv = @mcrypt_generic($this->ecb, $iv);
                    $block = $iv ^ substr($plaintext, -$len);
                    $iv = substr_replace($iv, $block, 0, $len);
                    $ciphertext.= $block;
                    $pos = $len;
                }

                return $ciphertext;
            }

            $ciphertext = @mcrypt_generic($this->enmcrypt, $plaintext);

            if (!$this->continuousBuffer) {
                @mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
            }

            return $ciphertext;
        }

        if ($this->changed) {
            $this->_setup();
            $this->changed = false;
        }
        if ($this->use_inline_crypt) {
            $inline = $this->inline_crypt;
            return $inline('encrypt', $this, $plaintext);
        }

        $buffer = &$this->enbuffer;
        $block_size = $this->block_size;
        $ciphertext = '';
        switch ($this->mode) {
            case CRYPT_MODE_ECB:
                for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
                    $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size));
                }
                break;
            case CRYPT_MODE_CBC:
                $xor = $this->encryptIV;
                for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
                    $block = substr($plaintext, $i, $block_size);
                    $block = $this->_encryptBlock($block ^ $xor);
                    $xor = $block;
                    $ciphertext.= $block;
                }
                if ($this->continuousBuffer) {
                    $this->encryptIV = $xor;
                }
                break;
            case CRYPT_MODE_CTR:
                $xor = $this->encryptIV;
                if (strlen($buffer['ciphertext'])) {
                    for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
                        $block = substr($plaintext, $i, $block_size);
                        if (strlen($block) > strlen($buffer['ciphertext'])) {
                            $buffer['ciphertext'].= $this->_encryptBlock($xor);
                        }
                        $this->_increment_str($xor);
                        $key = $this->_string_shift($buffer['ciphertext'], $block_size);
                        $ciphertext.= $block ^ $key;
                    }
                } else {
                    for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
                        $block = substr($plaintext, $i, $block_size);
                        $key = $this->_encryptBlock($xor);
                        $this->_increment_str($xor);
                        $ciphertext.= $block ^ $key;
                    }
                }
                if ($this->continuousBuffer) {
                    $this->encryptIV = $xor;
                    if ($start = strlen($plaintext) % $block_size) {
                        $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext'];
                    }
                }
                break;
            case CRYPT_MODE_CFB:
                // cfb loosely routines inspired by openssl's:
                // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1}
                if ($this->continuousBuffer) {
                    $iv = &$this->encryptIV;
                    $pos = &$buffer['pos'];
                } else {
                    $iv = $this->encryptIV;
                    $pos = 0;
                }
                $len = strlen($plaintext);
                $i = 0;
                if ($pos) {
                    $orig_pos = $pos;
                    $max = $block_size - $pos;
                    if ($len >= $max) {
                        $i = $max;
                        $len-= $max;
                        $pos = 0;
                    } else {
                        $i = $len;
                        $pos+= $len;
                        $len = 0;
                    }
                    // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
                    $ciphertext = substr($iv, $orig_pos) ^ $plaintext;
                    $iv = substr_replace($iv, $ciphertext, $orig_pos, $i);
                }
                while ($len >= $block_size) {
                    $iv = $this->_encryptBlock($iv) ^ substr($plaintext, $i, $block_size);
                    $ciphertext.= $iv;
                    $len-= $block_size;
                    $i+= $block_size;
                }
                if ($len) {
                    $iv = $this->_encryptBlock($iv);
                    $block = $iv ^ substr($plaintext, $i);
                    $iv = substr_replace($iv, $block, 0, $len);
                    $ciphertext.= $block;
                    $pos = $len;
                }
                break;
            case CRYPT_MODE_OFB:
                $xor = $this->encryptIV;
                if (strlen($buffer['xor'])) {
                    for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
                        $block = substr($plaintext, $i, $block_size);
                        if (strlen($block) > strlen($buffer['xor'])) {
                            $xor = $this->_encryptBlock($xor);
                            $buffer['xor'].= $xor;
                        }
                        $key = $this->_string_shift($buffer['xor'], $block_size);
                        $ciphertext.= $block ^ $key;
                    }
                } else {
                    for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
                        $xor = $this->_encryptBlock($xor);
                        $ciphertext.= substr($plaintext, $i, $block_size) ^ $xor;
                    }
                    $key = $xor;
                }
                if ($this->continuousBuffer) {
                    $this->encryptIV = $xor;
                    if ($start = strlen($plaintext) % $block_size) {
                        $buffer['xor'] = substr($key, $start) . $buffer['xor'];
                    }
                }
                break;
            case CRYPT_MODE_STREAM:
                $ciphertext = $this->_encryptBlock($plaintext);
                break;
        }

        return $ciphertext;
    }

    /**
     * Decrypts a message.
     *
     * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until
     * it is.
     *
     * @see self::encrypt()
     * @access public
     * @param string $ciphertext
     * @return string $plaintext
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function decrypt($ciphertext)
    {
        if ($this->paddable) {
            // we pad with chr(0) since that's what mcrypt_generic does.  to quote from {@link http://www.php.net/function.mcrypt-generic}:
            // "The data is padded with "\0" to make sure the length of the data is n * blocksize."
            $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($this->block_size - strlen($ciphertext) % $this->block_size) % $this->block_size, chr(0));
        }

        if ($this->engine === CRYPT_ENGINE_OPENSSL) {
            if ($this->changed) {
                $this->_clearBuffers();
                $this->changed = false;
            }
            switch ($this->mode) {
                case CRYPT_MODE_STREAM:
                    $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
                    break;
                case CRYPT_MODE_ECB:
                    if (!defined('OPENSSL_RAW_DATA')) {
                        $ciphertext.= openssl_encrypt('', $this->cipher_name_openssl_ecb, $this->key, true);
                    }
                    $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
                    break;
                case CRYPT_MODE_CBC:
                    if (!defined('OPENSSL_RAW_DATA')) {
                        $padding = str_repeat(chr($this->block_size), $this->block_size) ^ substr($ciphertext, -$this->block_size);
                        $ciphertext.= substr(openssl_encrypt($padding, $this->cipher_name_openssl_ecb, $this->key, true), 0, $this->block_size);
                        $offset = 2 * $this->block_size;
                    } else {
                        $offset = $this->block_size;
                    }
                    $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->decryptIV);
                    if ($this->continuousBuffer) {
                        $this->decryptIV = substr($ciphertext, -$offset, $this->block_size);
                    }
                    break;
                case CRYPT_MODE_CTR:
                    $plaintext = $this->_openssl_ctr_process($ciphertext, $this->decryptIV, $this->debuffer);
                    break;
                case CRYPT_MODE_CFB:
                    // cfb loosely routines inspired by openssl's:
                    // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1}
                    $plaintext = '';
                    if ($this->continuousBuffer) {
                        $iv = &$this->decryptIV;
                        $pos = &$this->buffer['pos'];
                    } else {
                        $iv = $this->decryptIV;
                        $pos = 0;
                    }
                    $len = strlen($ciphertext);
                    $i = 0;
                    if ($pos) {
                        $orig_pos = $pos;
                        $max = $this->block_size - $pos;
                        if ($len >= $max) {
                            $i = $max;
                            $len-= $max;
                            $pos = 0;
                        } else {
                            $i = $len;
                            $pos+= $len;
                            $len = 0;
                        }
                        // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $this->blocksize
                        $plaintext = substr($iv, $orig_pos) ^ $ciphertext;
                        $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i);
                        $ciphertext = substr($ciphertext, $i);
                    }
                    $overflow = $len % $this->block_size;
                    if ($overflow) {
                        $plaintext.= openssl_decrypt(substr($ciphertext, 0, -$overflow), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
                        if ($len - $overflow) {
                            $iv = substr($ciphertext, -$overflow - $this->block_size, -$overflow);
                        }
                        $iv = openssl_encrypt(str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
                        $plaintext.= $iv ^ substr($ciphertext, -$overflow);
                        $iv = substr_replace($iv, substr($ciphertext, -$overflow), 0, $overflow);
                        $pos = $overflow;
                    } elseif ($len) {
                        $plaintext.= openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
                        $iv = substr($ciphertext, -$this->block_size);
                    }
                    break;
                case CRYPT_MODE_OFB:
                    $plaintext = $this->_openssl_ofb_process($ciphertext, $this->decryptIV, $this->debuffer);
            }

            return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
        }

        if ($this->engine === CRYPT_ENGINE_MCRYPT) {
            $block_size = $this->block_size;
            if ($this->changed) {
                $this->_setupMcrypt();
                $this->changed = false;
            }
            if ($this->dechanged) {
                @mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
                $this->dechanged = false;
            }

            if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) {
                $iv = &$this->decryptIV;
                $pos = &$this->debuffer['pos'];
                $len = strlen($ciphertext);
                $plaintext = '';
                $i = 0;
                if ($pos) {
                    $orig_pos = $pos;
                    $max = $block_size - $pos;
                    if ($len >= $max) {
                        $i = $max;
                        $len-= $max;
                        $pos = 0;
                    } else {
                        $i = $len;
                        $pos+= $len;
                        $len = 0;
                    }
                    // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
                    $plaintext = substr($iv, $orig_pos) ^ $ciphertext;
                    $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i);
                }
                if ($len >= $block_size) {
                    $cb = substr($ciphertext, $i, $len - $len % $block_size);
                    $plaintext.= @mcrypt_generic($this->ecb, $iv . $cb) ^ $cb;
                    $iv = substr($cb, -$block_size);
                    $len%= $block_size;
                }
                if ($len) {
                    $iv = @mcrypt_generic($this->ecb, $iv);
                    $plaintext.= $iv ^ substr($ciphertext, -$len);
                    $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len);
                    $pos = $len;
                }

                return $plaintext;
            }

            $plaintext = @mdecrypt_generic($this->demcrypt, $ciphertext);

            if (!$this->continuousBuffer) {
                @mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
            }

            return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
        }

        if ($this->changed) {
            $this->_setup();
            $this->changed = false;
        }
        if ($this->use_inline_crypt) {
            $inline = $this->inline_crypt;
            return $inline('decrypt', $this, $ciphertext);
        }

        $block_size = $this->block_size;

        $buffer = &$this->debuffer;
        $plaintext = '';
        switch ($this->mode) {
            case CRYPT_MODE_ECB:
                for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
                    $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size));
                }
                break;
            case CRYPT_MODE_CBC:
                $xor = $this->decryptIV;
                for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
                    $block = substr($ciphertext, $i, $block_size);
                    $plaintext.= $this->_decryptBlock($block) ^ $xor;
                    $xor = $block;
                }
                if ($this->continuousBuffer) {
                    $this->decryptIV = $xor;
                }
                break;
            case CRYPT_MODE_CTR:
                $xor = $this->decryptIV;
                if (strlen($buffer['ciphertext'])) {
                    for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
                        $block = substr($ciphertext, $i, $block_size);
                        if (strlen($block) > strlen($buffer['ciphertext'])) {
                            $buffer['ciphertext'].= $this->_encryptBlock($xor);
                            $this->_increment_str($xor);
                        }
                        $key = $this->_string_shift($buffer['ciphertext'], $block_size);
                        $plaintext.= $block ^ $key;
                    }
                } else {
                    for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
                        $block = substr($ciphertext, $i, $block_size);
                        $key = $this->_encryptBlock($xor);
                        $this->_increment_str($xor);
                        $plaintext.= $block ^ $key;
                    }
                }
                if ($this->continuousBuffer) {
                    $this->decryptIV = $xor;
                    if ($start = strlen($ciphertext) % $block_size) {
                        $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext'];
                    }
                }
                break;
            case CRYPT_MODE_CFB:
                if ($this->continuousBuffer) {
                    $iv = &$this->decryptIV;
                    $pos = &$buffer['pos'];
                } else {
                    $iv = $this->decryptIV;
                    $pos = 0;
                }
                $len = strlen($ciphertext);
                $i = 0;
                if ($pos) {
                    $orig_pos = $pos;
                    $max = $block_size - $pos;
                    if ($len >= $max) {
                        $i = $max;
                        $len-= $max;
                        $pos = 0;
                    } else {
                        $i = $len;
                        $pos+= $len;
                        $len = 0;
                    }
                    // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
                    $plaintext = substr($iv, $orig_pos) ^ $ciphertext;
                    $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i);
                }
                while ($len >= $block_size) {
                    $iv = $this->_encryptBlock($iv);
                    $cb = substr($ciphertext, $i, $block_size);
                    $plaintext.= $iv ^ $cb;
                    $iv = $cb;
                    $len-= $block_size;
                    $i+= $block_size;
                }
                if ($len) {
                    $iv = $this->_encryptBlock($iv);
                    $plaintext.= $iv ^ substr($ciphertext, $i);
                    $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len);
                    $pos = $len;
                }
                break;
            case CRYPT_MODE_OFB:
                $xor = $this->decryptIV;
                if (strlen($buffer['xor'])) {
                    for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
                        $block = substr($ciphertext, $i, $block_size);
                        if (strlen($block) > strlen($buffer['xor'])) {
                            $xor = $this->_encryptBlock($xor);
                            $buffer['xor'].= $xor;
                        }
                        $key = $this->_string_shift($buffer['xor'], $block_size);
                        $plaintext.= $block ^ $key;
                    }
                } else {
                    for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
                        $xor = $this->_encryptBlock($xor);
                        $plaintext.= substr($ciphertext, $i, $block_size) ^ $xor;
                    }
                    $key = $xor;
                }
                if ($this->continuousBuffer) {
                    $this->decryptIV = $xor;
                    if ($start = strlen($ciphertext) % $block_size) {
                        $buffer['xor'] = substr($key, $start) . $buffer['xor'];
                    }
                }
                break;
            case CRYPT_MODE_STREAM:
                $plaintext = $this->_decryptBlock($ciphertext);
                break;
        }
        return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
    }

    /**
     * OpenSSL CTR Processor
     *
     * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream
     * for CTR is the same for both encrypting and decrypting this function is re-used by both Crypt_Base::encrypt()
     * and Crypt_Base::decrypt(). Also, OpenSSL doesn't implement CTR for all of it's symmetric ciphers so this
     * function will emulate CTR with ECB when necessary.
     *
     * @see self::encrypt()
     * @see self::decrypt()
     * @param string $plaintext
     * @param string $encryptIV
     * @param array $buffer
     * @return string
     * @access private
     */
    function _openssl_ctr_process($plaintext, &$encryptIV, &$buffer)
    {
        $ciphertext = '';

        $block_size = $this->block_size;
        $key = $this->key;

        if ($this->openssl_emulate_ctr) {
            $xor = $encryptIV;
            if (strlen($buffer['ciphertext'])) {
                for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
                    $block = substr($plaintext, $i, $block_size);
                    if (strlen($block) > strlen($buffer['ciphertext'])) {
                        $result = openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
                        $result = !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result;
                        $buffer['ciphertext'].= $result;
                    }
                    $this->_increment_str($xor);
                    $otp = $this->_string_shift($buffer['ciphertext'], $block_size);
                    $ciphertext.= $block ^ $otp;
                }
            } else {
                for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
                    $block = substr($plaintext, $i, $block_size);
                    $otp = openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
                    $otp = !defined('OPENSSL_RAW_DATA') ? substr($otp, 0, -$this->block_size) : $otp;
                    $this->_increment_str($xor);
                    $ciphertext.= $block ^ $otp;
                }
            }
            if ($this->continuousBuffer) {
                $encryptIV = $xor;
                if ($start = strlen($plaintext) % $block_size) {
                    $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext'];
                }
            }

            return $ciphertext;
        }

        if (strlen($buffer['ciphertext'])) {
            $ciphertext = $plaintext ^ $this->_string_shift($buffer['ciphertext'], strlen($plaintext));
            $plaintext = substr($plaintext, strlen($ciphertext));

            if (!strlen($plaintext)) {
                return $ciphertext;
            }
        }

        $overflow = strlen($plaintext) % $block_size;
        if ($overflow) {
            $plaintext2 = $this->_string_pop($plaintext, $overflow); // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2
            $encrypted = openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
            $temp = $this->_string_pop($encrypted, $block_size);
            $ciphertext.= $encrypted . ($plaintext2 ^ $temp);
            if ($this->continuousBuffer) {
                $buffer['ciphertext'] = substr($temp, $overflow);
                $encryptIV = $temp;
            }
        } elseif (!strlen($buffer['ciphertext'])) {
            $ciphertext.= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
            $temp = $this->_string_pop($ciphertext, $block_size);
            if ($this->continuousBuffer) {
                $encryptIV = $temp;
            }
        }
        if ($this->continuousBuffer) {
            if (!defined('OPENSSL_RAW_DATA')) {
                $encryptIV.= openssl_encrypt('', $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
            }
            $encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
            if ($overflow) {
                $this->_increment_str($encryptIV);
            }
        }

        return $ciphertext;
    }

    /**
     * OpenSSL OFB Processor
     *
     * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream
     * for OFB is the same for both encrypting and decrypting this function is re-used by both Crypt_Base::encrypt()
     * and Crypt_Base::decrypt().
     *
     * @see self::encrypt()
     * @see self::decrypt()
     * @param string $plaintext
     * @param string $encryptIV
     * @param array $buffer
     * @return string
     * @access private
     */
    function _openssl_ofb_process($plaintext, &$encryptIV, &$buffer)
    {
        if (strlen($buffer['xor'])) {
            $ciphertext = $plaintext ^ $buffer['xor'];
            $buffer['xor'] = substr($buffer['xor'], strlen($ciphertext));
            $plaintext = substr($plaintext, strlen($ciphertext));
        } else {
            $ciphertext = '';
        }

        $block_size = $this->block_size;

        $len = strlen($plaintext);
        $key = $this->key;
        $overflow = $len % $block_size;

        if (strlen($plaintext)) {
            if ($overflow) {
                $ciphertext.= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
                $xor = $this->_string_pop($ciphertext, $block_size);
                if ($this->continuousBuffer) {
                    $encryptIV = $xor;
                }
                $ciphertext.= $this->_string_shift($xor, $overflow) ^ substr($plaintext, -$overflow);
                if ($this->continuousBuffer) {
                    $buffer['xor'] = $xor;
                }
            } else {
                $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
                if ($this->continuousBuffer) {
                    $encryptIV = substr($ciphertext, -$block_size) ^ substr($plaintext, -$block_size);
                }
            }
        }

        return $ciphertext;
    }

    /**
     * phpseclib <-> OpenSSL Mode Mapper
     *
     * May need to be overwritten by classes extending this one in some cases
     *
     * @return int
     * @access private
     */
    function _openssl_translate_mode()
    {
        switch ($this->mode) {
            case CRYPT_MODE_ECB:
                return 'ecb';
            case CRYPT_MODE_CBC:
                return 'cbc';
            case CRYPT_MODE_CTR:
                return 'ctr';
            case CRYPT_MODE_CFB:
                return 'cfb';
            case CRYPT_MODE_OFB:
                return 'ofb';
        }
    }

    /**
     * Pad "packets".
     *
     * Block ciphers working by encrypting between their specified [$this->]block_size at a time
     * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to
     * pad the input so that it is of the proper length.
     *
     * Padding is enabled by default.  Sometimes, however, it is undesirable to pad strings.  Such is the case in SSH,
     * where "packets" are padded with random bytes before being encrypted.  Unpad these packets and you risk stripping
     * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is
     * transmitted separately)
     *
     * @see self::disablePadding()
     * @access public
     */
    function enablePadding()
    {
        $this->padding = true;
    }

    /**
     * Do not pad packets.
     *
     * @see self::enablePadding()
     * @access public
     */
    function disablePadding()
    {
        $this->padding = false;
    }

    /**
     * Treat consecutive "packets" as if they are a continuous buffer.
     *
     * Say you have a 32-byte plaintext $plaintext.  Using the default behavior, the two following code snippets
     * will yield different outputs:
     *
     * <code>
     *    echo $rijndael->encrypt(substr($plaintext,  0, 16));
     *    echo $rijndael->encrypt(substr($plaintext, 16, 16));
     * </code>
     * <code>
     *    echo $rijndael->encrypt($plaintext);
     * </code>
     *
     * The solution is to enable the continuous buffer.  Although this will resolve the above discrepancy, it creates
     * another, as demonstrated with the following:
     *
     * <code>
     *    $rijndael->encrypt(substr($plaintext, 0, 16));
     *    echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16)));
     * </code>
     * <code>
     *    echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16)));
     * </code>
     *
     * With the continuous buffer disabled, these would yield the same output.  With it enabled, they yield different
     * outputs.  The reason is due to the fact that the initialization vector's change after every encryption /
     * decryption round when the continuous buffer is enabled.  When it's disabled, they remain constant.
     *
     * Put another way, when the continuous buffer is enabled, the state of the Crypt_*() object changes after each
     * encryption / decryption round, whereas otherwise, it'd remain constant.  For this reason, it's recommended that
     * continuous buffers not be used.  They do offer better security and are, in fact, sometimes required (SSH uses them),
     * however, they are also less intuitive and more likely to cause you problems.
     *
     * @see self::disableContinuousBuffer()
     * @access public
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function enableContinuousBuffer()
    {
        if ($this->mode == CRYPT_MODE_ECB) {
            return;
        }

        $this->continuousBuffer = true;

        $this->_setEngine();
    }

    /**
     * Treat consecutive packets as if they are a discontinuous buffer.
     *
     * The default behavior.
     *
     * @see self::enableContinuousBuffer()
     * @access public
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function disableContinuousBuffer()
    {
        if ($this->mode == CRYPT_MODE_ECB) {
            return;
        }
        if (!$this->continuousBuffer) {
            return;
        }

        $this->continuousBuffer = false;
        $this->changed = true;

        $this->_setEngine();
    }

    /**
     * Test for engine validity
     *
     * @see self::Crypt_Base()
     * @param int $engine
     * @access public
     * @return bool
     */
    function isValidEngine($engine)
    {
        switch ($engine) {
            case CRYPT_ENGINE_OPENSSL:
                if ($this->mode == CRYPT_MODE_STREAM && $this->continuousBuffer) {
                    return false;
                }
                $this->openssl_emulate_ctr = false;
                $result = $this->cipher_name_openssl &&
                          extension_loaded('openssl') &&
                          // PHP 5.3.0 - 5.3.2 did not let you set IV's
                          version_compare(PHP_VERSION, '5.3.3', '>=');
                if (!$result) {
                    return false;
                }

                // prior to PHP 5.4.0 OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING were not defined. instead of expecting an integer
                // $options openssl_encrypt expected a boolean $raw_data.
                if (!defined('OPENSSL_RAW_DATA')) {
                    $this->openssl_options = true;
                } else {
                    $this->openssl_options = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING;
                }

                $methods = openssl_get_cipher_methods();
                if (in_array($this->cipher_name_openssl, $methods)) {
                    return true;
                }
                // not all of openssl's symmetric cipher's support ctr. for those
                // that don't we'll emulate it
                switch ($this->mode) {
                    case CRYPT_MODE_CTR:
                        if (in_array($this->cipher_name_openssl_ecb, $methods)) {
                            $this->openssl_emulate_ctr = true;
                            return true;
                        }
                }
                return false;
            case CRYPT_ENGINE_MCRYPT:
                return $this->cipher_name_mcrypt &&
                       extension_loaded('mcrypt') &&
                       in_array($this->cipher_name_mcrypt, @mcrypt_list_algorithms());
            case CRYPT_ENGINE_INTERNAL:
                return true;
        }

        return false;
    }

    /**
     * Sets the preferred crypt engine
     *
     * Currently, $engine could be:
     *
     * - CRYPT_ENGINE_OPENSSL  [very fast]
     *
     * - CRYPT_ENGINE_MCRYPT   [fast]
     *
     * - CRYPT_ENGINE_INTERNAL [slow]
     *
     * If the preferred crypt engine is not available the fastest available one will be used
     *
     * @see self::Crypt_Base()
     * @param int $engine
     * @access public
     */
    function setPreferredEngine($engine)
    {
        switch ($engine) {
            //case CRYPT_ENGINE_OPENSSL:
            case CRYPT_ENGINE_MCRYPT:
            case CRYPT_ENGINE_INTERNAL:
                $this->preferredEngine = $engine;
                break;
            default:
                $this->preferredEngine = CRYPT_ENGINE_OPENSSL;
        }

        $this->_setEngine();
    }

    /**
     * Returns the engine currently being utilized
     *
     * @see self::_setEngine()
     * @access public
     */
    function getEngine()
    {
        return $this->engine;
    }

    /**
     * Sets the engine as appropriate
     *
     * @see self::Crypt_Base()
     * @access private
     */
    function _setEngine()
    {
        $this->engine = null;

        $candidateEngines = array(
            $this->preferredEngine,
            CRYPT_ENGINE_OPENSSL,
            CRYPT_ENGINE_MCRYPT
        );
        foreach ($candidateEngines as $engine) {
            if ($this->isValidEngine($engine)) {
                $this->engine = $engine;
                break;
            }
        }
        if (!$this->engine) {
            $this->engine = CRYPT_ENGINE_INTERNAL;
        }

        if ($this->engine != CRYPT_ENGINE_MCRYPT && $this->enmcrypt) {
            // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed,
            // (re)open them with the module named in $this->cipher_name_mcrypt
            @mcrypt_module_close($this->enmcrypt);
            @mcrypt_module_close($this->demcrypt);
            $this->enmcrypt = null;
            $this->demcrypt = null;

            if ($this->ecb) {
                @mcrypt_module_close($this->ecb);
                $this->ecb = null;
            }
        }

        $this->changed = true;
    }

    /**
     * Encrypts a block
     *
     * @access private
     * @param string $in
     * @return string
     * @internal Must be extended by the child Crypt_* class
     */
    function _encryptBlock($in)
    {
        user_error((version_compare(PHP_VERSION, '5.0.0', '>=')  ? __METHOD__ : __FUNCTION__)  . '() must extend by class ' . get_class($this), E_USER_ERROR);
    }

    /**
     * Decrypts a block
     *
     * @access private
     * @param string $in
     * @return string
     * @internal Must be extended by the child Crypt_* class
     */
    function _decryptBlock($in)
    {
        user_error((version_compare(PHP_VERSION, '5.0.0', '>=')  ? __METHOD__ : __FUNCTION__)  . '() must extend by class ' . get_class($this), E_USER_ERROR);
    }

    /**
     * Setup the key (expansion)
     *
     * Only used if $engine == CRYPT_ENGINE_INTERNAL
     *
     * @see self::_setup()
     * @access private
     * @internal Must be extended by the child Crypt_* class
     */
    function _setupKey()
    {
        user_error((version_compare(PHP_VERSION, '5.0.0', '>=')  ? __METHOD__ : __FUNCTION__)  . '() must extend by class ' . get_class($this), E_USER_ERROR);
    }

    /**
     * Setup the CRYPT_ENGINE_INTERNAL $engine
     *
     * (re)init, if necessary, the internal cipher $engine and flush all $buffers
     * Used (only) if $engine == CRYPT_ENGINE_INTERNAL
     *
     * _setup() will be called each time if $changed === true
     * typically this happens when using one or more of following public methods:
     *
     * - setKey()
     *
     * - setIV()
     *
     * - disableContinuousBuffer()
     *
     * - First run of encrypt() / decrypt() with no init-settings
     *
     * @see self::setKey()
     * @see self::setIV()
     * @see self::disableContinuousBuffer()
     * @access private
     * @internal _setup() is always called before en/decryption.
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function _setup()
    {
        $this->_clearBuffers();
        $this->_setupKey();

        if ($this->use_inline_crypt) {
            $this->_setupInlineCrypt();
        }
    }

    /**
     * Setup the CRYPT_ENGINE_MCRYPT $engine
     *
     * (re)init, if necessary, the (ext)mcrypt resources and flush all $buffers
     * Used (only) if $engine = CRYPT_ENGINE_MCRYPT
     *
     * _setupMcrypt() will be called each time if $changed === true
     * typically this happens when using one or more of following public methods:
     *
     * - setKey()
     *
     * - setIV()
     *
     * - disableContinuousBuffer()
     *
     * - First run of encrypt() / decrypt()
     *
     * @see self::setKey()
     * @see self::setIV()
     * @see self::disableContinuousBuffer()
     * @access private
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function _setupMcrypt()
    {
        $this->_clearBuffers();
        $this->enchanged = $this->dechanged = true;

        if (!isset($this->enmcrypt)) {
            static $mcrypt_modes = array(
                CRYPT_MODE_CTR    => 'ctr',
                CRYPT_MODE_ECB    => MCRYPT_MODE_ECB,
                CRYPT_MODE_CBC    => MCRYPT_MODE_CBC,
                CRYPT_MODE_CFB    => 'ncfb',
                CRYPT_MODE_OFB    => MCRYPT_MODE_NOFB,
                CRYPT_MODE_STREAM => MCRYPT_MODE_STREAM,
            );

            $this->demcrypt = @mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
            $this->enmcrypt = @mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');

            // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer()
            // to workaround mcrypt's broken ncfb implementation in buffered mode
            // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps}
            if ($this->mode == CRYPT_MODE_CFB) {
                $this->ecb = @mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, '');
            }
        } // else should mcrypt_generic_deinit be called?

        if ($this->mode == CRYPT_MODE_CFB) {
            @mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size));
        }
    }

    /**
     * Pads a string
     *
     * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize.
     * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to
     * chr($this->block_size - (strlen($text) % $this->block_size)
     *
     * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless
     * and padding will, hence forth, be enabled.
     *
     * @see self::_unpad()
     * @param string $text
     * @access private
     * @return string
     */
    function _pad($text)
    {
        $length = strlen($text);

        if (!$this->padding) {
            if ($length % $this->block_size == 0) {
                return $text;
            } else {
                user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})");
                $this->padding = true;
            }
        }

        $pad = $this->block_size - ($length % $this->block_size);

        return str_pad($text, $length + $pad, chr($pad));
    }

    /**
     * Unpads a string.
     *
     * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong
     * and false will be returned.
     *
     * @see self::_pad()
     * @param string $text
     * @access private
     * @return string
     */
    function _unpad($text)
    {
        if (!$this->padding) {
            return $text;
        }

        $length = ord($text[strlen($text) - 1]);

        if (!$length || $length > $this->block_size) {
            return false;
        }

        return substr($text, 0, -$length);
    }

    /**
     * Clears internal buffers
     *
     * Clearing/resetting the internal buffers is done everytime
     * after disableContinuousBuffer() or on cipher $engine (re)init
     * ie after setKey() or setIV()
     *
     * @access public
     * @internal Could, but not must, extend by the child Crypt_* class
     */
    function _clearBuffers()
    {
        $this->enbuffer = $this->debuffer = array('ciphertext' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true);

        // mcrypt's handling of invalid's $iv:
        // $this->encryptIV = $this->decryptIV = strlen($this->iv) == $this->block_size ? $this->iv : str_repeat("\0", $this->block_size);
        $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0");

        if (!$this->skip_key_adjustment) {
            $this->key = str_pad(substr($this->key, 0, $this->key_length), $this->key_length, "\0");
        }
    }

    /**
     * String Shift
     *
     * Inspired by array_shift
     *
     * @param string $string
     * @param int $index
     * @access private
     * @return string
     */
    function _string_shift(&$string, $index = 1)
    {
        $substr = substr($string, 0, $index);
        $string = substr($string, $index);
        return $substr;
    }

    /**
     * String Pop
     *
     * Inspired by array_pop
     *
     * @param string $string
     * @param int $index
     * @access private
     * @return string
     */
    function _string_pop(&$string, $index = 1)
    {
        $substr = substr($string, -$index);
        $string = substr($string, 0, -$index);
        return $substr;
    }

    /**
     * Increment the current string
     *
     * @see self::decrypt()
     * @see self::encrypt()
     * @param string $var
     * @access private
     */
    function _increment_str(&$var)
    {
        for ($i = 4; $i <= strlen($var); $i+= 4) {
            $temp = substr($var, -$i, 4);
            switch ($temp) {
                case "\xFF\xFF\xFF\xFF":
                    $var = substr_replace($var, "\x00\x00\x00\x00", -$i, 4);
                    break;
                case "\x7F\xFF\xFF\xFF":
                    $var = substr_replace($var, "\x80\x00\x00\x00", -$i, 4);
                    return;
                default:
                    $temp = unpack('Nnum', $temp);
                    $var = substr_replace($var, pack('N', $temp['num'] + 1), -$i, 4);
                    return;
            }
        }

        $remainder = strlen($var) % 4;

        if ($remainder == 0) {
            return;
        }

        $temp = unpack('Nnum', str_pad(substr($var, 0, $remainder), 4, "\0", STR_PAD_LEFT));
        $temp = substr(pack('N', $temp['num'] + 1), -$remainder);
        $var = substr_replace($var, $temp, 0, $remainder);
    }

    /**
     * Setup the performance-optimized function for de/encrypt()
     *
     * Stores the created (or existing) callback function-name
     * in $this->inline_crypt
     *
     * Internally for phpseclib developers:
     *
     *     _setupInlineCrypt() would be called only if:
     *
     *     - $engine == CRYPT_ENGINE_INTERNAL and
     *
     *     - $use_inline_crypt === true
     *
     *     - each time on _setup(), after(!) _setupKey()
     *
     *
     *     This ensures that _setupInlineCrypt() has always a
     *     full ready2go initializated internal cipher $engine state
     *     where, for example, the keys allready expanded,
     *     keys/block_size calculated and such.
     *
     *     It is, each time if called, the responsibility of _setupInlineCrypt():
     *
     *     - to set $this->inline_crypt to a valid and fully working callback function
     *       as a (faster) replacement for encrypt() / decrypt()
     *
     *     - NOT to create unlimited callback functions (for memory reasons!)
     *       no matter how often _setupInlineCrypt() would be called. At some
     *       point of amount they must be generic re-useable.
     *
     *     - the code of _setupInlineCrypt() it self,
     *       and the generated callback code,
     *       must be, in following order:
     *       - 100% safe
     *       - 100% compatible to encrypt()/decrypt()
     *       - using only php5+ features/lang-constructs/php-extensions if
     *         compatibility (down to php4) or fallback is provided
     *       - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-)
     *       - >= 10% faster than encrypt()/decrypt() [which is, by the way,
     *         the reason for the existence of _setupInlineCrypt() :-)]
     *       - memory-nice
     *       - short (as good as possible)
     *
     * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code.
     *       - In case of using inline crypting, _setupInlineCrypt() must extend by the child Crypt_* class.
     *       - The following variable names are reserved:
     *         - $_*  (all variable names prefixed with an underscore)
     *         - $self (object reference to it self. Do not use $this, but $self instead)
     *         - $in (the content of $in has to en/decrypt by the generated code)
     *       - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only
     *
     *
     * @see self::_setup()
     * @see self::_createInlineCryptFunction()
     * @see self::encrypt()
     * @see self::decrypt()
     * @access private
     * @internal If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt()
     */
    function _setupInlineCrypt()
    {
        // If, for any reason, an extending Crypt_Base() Crypt_* class
        // not using inline crypting then it must be ensured that: $this->use_inline_crypt = false
        // ie in the class var declaration of $use_inline_crypt in general for the Crypt_* class,
        // in the constructor at object instance-time
        // or, if it's runtime-specific, at runtime

        $this->use_inline_crypt = false;
    }

    /**
     * Creates the performance-optimized function for en/decrypt()
     *
     * Internally for phpseclib developers:
     *
     *    _createInlineCryptFunction():
     *
     *    - merge the $cipher_code [setup'ed by _setupInlineCrypt()]
     *      with the current [$this->]mode of operation code
     *
     *    - create the $inline function, which called by encrypt() / decrypt()
     *      as its replacement to speed up the en/decryption operations.
     *
     *    - return the name of the created $inline callback function
     *
     *    - used to speed up en/decryption
     *
     *
     *
     *    The main reason why can speed up things [up to 50%] this way are:
     *
     *    - using variables more effective then regular.
     *      (ie no use of expensive arrays but integers $k_0, $k_1 ...
     *      or even, for example, the pure $key[] values hardcoded)
     *
     *    - avoiding 1000's of function calls of ie _encryptBlock()
     *      but inlining the crypt operations.
     *      in the mode of operation for() loop.
     *
     *    - full loop unroll the (sometimes key-dependent) rounds
     *      avoiding this way ++$i counters and runtime-if's etc...
     *
     *    The basic code architectur of the generated $inline en/decrypt()
     *    lambda function, in pseudo php, is:
     *
     *    <code>
     *    +----------------------------------------------------------------------------------------------+
     *    | callback $inline = create_function:                                                          |
     *    | lambda_function_0001_crypt_ECB($action, $text)                                               |
     *    | {                                                                                            |
     *    |     INSERT PHP CODE OF:                                                                      |
     *    |     $cipher_code['init_crypt'];                  // general init code.                       |
     *    |                                                  // ie: $sbox'es declarations used for       |
     *    |                                                  //     encrypt and decrypt'ing.             |
     *    |                                                                                              |
     *    |     switch ($action) {                                                                       |
     *    |         case 'encrypt':                                                                      |
     *    |             INSERT PHP CODE OF:                                                              |
     *    |             $cipher_code['init_encrypt'];       // encrypt sepcific init code.               |
     *    |                                                    ie: specified $key or $box                |
     *    |                                                        declarations for encrypt'ing.         |
     *    |                                                                                              |
     *    |             foreach ($ciphertext) {                                                          |
     *    |                 $in = $block_size of $ciphertext;                                            |
     *    |                                                                                              |
     *    |                 INSERT PHP CODE OF:                                                          |
     *    |                 $cipher_code['encrypt_block'];  // encrypt's (string) $in, which is always:  |
     *    |                                                 // strlen($in) == $this->block_size          |
     *    |                                                 // here comes the cipher algorithm in action |
     *    |                                                 // for encryption.                           |
     *    |                                                 // $cipher_code['encrypt_block'] has to      |
     *    |                                                 // encrypt the content of the $in variable   |
     *    |                                                                                              |
     *    |                 $plaintext .= $in;                                                           |
     *    |             }                                                                                |
     *    |             return $plaintext;                                                               |
     *    |                                                                                              |
     *    |         case 'decrypt':                                                                      |
     *    |             INSERT PHP CODE OF:                                                              |
     *    |             $cipher_code['init_decrypt'];       // decrypt sepcific init code                |
     *    |                                                    ie: specified $key or $box                |
     *    |                                                        declarations for decrypt'ing.         |
     *    |             foreach ($plaintext) {                                                           |
     *    |                 $in = $block_size of $plaintext;                                             |
     *    |                                                                                              |
     *    |                 INSERT PHP CODE OF:                                                          |
     *    |                 $cipher_code['decrypt_block'];  // decrypt's (string) $in, which is always   |
     *    |                                                 // strlen($in) == $this->block_size          |
     *    |                                                 // here comes the cipher algorithm in action |
     *    |                                                 // for decryption.                           |
     *    |                                                 // $cipher_code['decrypt_block'] has to      |
     *    |                                                 // decrypt the content of the $in variable   |
     *    |                 $ciphertext .= $in;                                                          |
     *    |             }                                                                                |
     *    |             return $ciphertext;                                                              |
     *    |     }                                                                                        |
     *    | }                                                                                            |
     *    +----------------------------------------------------------------------------------------------+
     *    </code>
     *
     *    See also the Crypt_*::_setupInlineCrypt()'s for
     *    productive inline $cipher_code's how they works.
     *
     *    Structure of:
     *    <code>
     *    $cipher_code = array(
     *        'init_crypt'    => (string) '', // optional
     *        'init_encrypt'  => (string) '', // optional
     *        'init_decrypt'  => (string) '', // optional
     *        'encrypt_block' => (string) '', // required
     *        'decrypt_block' => (string) ''  // required
     *    );
     *    </code>
     *
     * @see self::_setupInlineCrypt()
     * @see self::encrypt()
     * @see self::decrypt()
     * @param array $cipher_code
     * @access private
     * @return string (the name of the created callback function)
     */
    function _createInlineCryptFunction($cipher_code)
    {
        $block_size = $this->block_size;

        // optional
        $init_crypt    = isset($cipher_code['init_crypt'])    ? $cipher_code['init_crypt']    : '';
        $init_encrypt  = isset($cipher_code['init_encrypt'])  ? $cipher_code['init_encrypt']  : '';
        $init_decrypt  = isset($cipher_code['init_decrypt'])  ? $cipher_code['init_decrypt']  : '';
        // required
        $encrypt_block = $cipher_code['encrypt_block'];
        $decrypt_block = $cipher_code['decrypt_block'];

        // Generating mode of operation inline code,
        // merged with the $cipher_code algorithm
        // for encrypt- and decryption.
        switch ($this->mode) {
            case CRYPT_MODE_ECB:
                $encrypt = $init_encrypt . '
                    $_ciphertext = "";
                    $_plaintext_len = strlen($_text);

                    for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
                        $in = substr($_text, $_i, '.$block_size.');
                        '.$encrypt_block.'
                        $_ciphertext.= $in;
                    }

                    return $_ciphertext;
                    ';

                $decrypt = $init_decrypt . '
                    $_plaintext = "";
                    $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0));
                    $_ciphertext_len = strlen($_text);

                    for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
                        $in = substr($_text, $_i, '.$block_size.');
                        '.$decrypt_block.'
                        $_plaintext.= $in;
                    }

                    return $self->_unpad($_plaintext);
                    ';
                break;
            case CRYPT_MODE_CTR:
                $encrypt = $init_encrypt . '
                    $_ciphertext = "";
                    $_plaintext_len = strlen($_text);
                    $_xor = $self->encryptIV;
                    $_buffer = &$self->enbuffer;
                    if (strlen($_buffer["ciphertext"])) {
                        for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
                            $_block = substr($_text, $_i, '.$block_size.');
                            if (strlen($_block) > strlen($_buffer["ciphertext"])) {
                                $in = $_xor;
                                '.$encrypt_block.'
                                $self->_increment_str($_xor);
                                $_buffer["ciphertext"].= $in;
                            }
                            $_key = $self->_string_shift($_buffer["ciphertext"], '.$block_size.');
                            $_ciphertext.= $_block ^ $_key;
                        }
                    } else {
                        for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
                            $_block = substr($_text, $_i, '.$block_size.');
                            $in = $_xor;
                            '.$encrypt_block.'
                            $self->_increment_str($_xor);
                            $_key = $in;
                            $_ciphertext.= $_block ^ $_key;
                        }
                    }
                    if ($self->continuousBuffer) {
                        $self->encryptIV = $_xor;
                        if ($_start = $_plaintext_len % '.$block_size.') {
                            $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"];
                        }
                    }

                    return $_ciphertext;
                ';

                $decrypt = $init_encrypt . '
                    $_plaintext = "";
                    $_ciphertext_len = strlen($_text);
                    $_xor = $self->decryptIV;
                    $_buffer = &$self->debuffer;

                    if (strlen($_buffer["ciphertext"])) {
                        for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
                            $_block = substr($_text, $_i, '.$block_size.');
                            if (strlen($_block) > strlen($_buffer["ciphertext"])) {
                                $in = $_xor;
                                '.$encrypt_block.'
                                $self->_increment_str($_xor);
                                $_buffer["ciphertext"].= $in;
                            }
                            $_key = $self->_string_shift($_buffer["ciphertext"], '.$block_size.');
                            $_plaintext.= $_block ^ $_key;
                        }
                    } else {
                        for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
                            $_block = substr($_text, $_i, '.$block_size.');
                            $in = $_xor;
                            '.$encrypt_block.'
                            $self->_increment_str($_xor);
                            $_key = $in;
                            $_plaintext.= $_block ^ $_key;
                        }
                    }
                    if ($self->continuousBuffer) {
                        $self->decryptIV = $_xor;
                        if ($_start = $_ciphertext_len % '.$block_size.') {
                            $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"];
                        }
                    }

                    return $_plaintext;
                    ';
                break;
            case CRYPT_MODE_CFB:
                $encrypt = $init_encrypt . '
                    $_ciphertext = "";
                    $_buffer = &$self->enbuffer;

                    if ($self->continuousBuffer) {
                        $_iv = &$self->encryptIV;
                        $_pos = &$_buffer["pos"];
                    } else {
                        $_iv = $self->encryptIV;
                        $_pos = 0;
                    }
                    $_len = strlen($_text);
                    $_i = 0;
                    if ($_pos) {
                        $_orig_pos = $_pos;
                        $_max = '.$block_size.' - $_pos;
                        if ($_len >= $_max) {
                            $_i = $_max;
                            $_len-= $_max;
                            $_pos = 0;
                        } else {
                            $_i = $_len;
                            $_pos+= $_len;
                            $_len = 0;
                        }
                        $_ciphertext = substr($_iv, $_orig_pos) ^ $_text;
                        $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i);
                    }
                    while ($_len >= '.$block_size.') {
                        $in = $_iv;
                        '.$encrypt_block.';
                        $_iv = $in ^ substr($_text, $_i, '.$block_size.');
                        $_ciphertext.= $_iv;
                        $_len-= '.$block_size.';
                        $_i+= '.$block_size.';
                    }
                    if ($_len) {
                        $in = $_iv;
                        '.$encrypt_block.'
                        $_iv = $in;
                        $_block = $_iv ^ substr($_text, $_i);
                        $_iv = substr_replace($_iv, $_block, 0, $_len);
                        $_ciphertext.= $_block;
                        $_pos = $_len;
                    }
                    return $_ciphertext;
                ';

                $decrypt = $init_encrypt . '
                    $_plaintext = "";
                    $_buffer = &$self->debuffer;

                    if ($self->continuousBuffer) {
                        $_iv = &$self->decryptIV;
                        $_pos = &$_buffer["pos"];
                    } else {
                        $_iv = $self->decryptIV;
                        $_pos = 0;
                    }
                    $_len = strlen($_text);
                    $_i = 0;
                    if ($_pos) {
                        $_orig_pos = $_pos;
                        $_max = '.$block_size.' - $_pos;
                        if ($_len >= $_max) {
                            $_i = $_max;
                            $_len-= $_max;
                            $_pos = 0;
                        } else {
                            $_i = $_len;
                            $_pos+= $_len;
                            $_len = 0;
                        }
                        $_plaintext = substr($_iv, $_orig_pos) ^ $_text;
                        $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i);
                    }
                    while ($_len >= '.$block_size.') {
                        $in = $_iv;
                        '.$encrypt_block.'
                        $_iv = $in;
                        $cb = substr($_text, $_i, '.$block_size.');
                        $_plaintext.= $_iv ^ $cb;
                        $_iv = $cb;
                        $_len-= '.$block_size.';
                        $_i+= '.$block_size.';
                    }
                    if ($_len) {
                        $in = $_iv;
                        '.$encrypt_block.'
                        $_iv = $in;
                        $_plaintext.= $_iv ^ substr($_text, $_i);
                        $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len);
                        $_pos = $_len;
                    }

                    return $_plaintext;
                    ';
                break;
            case CRYPT_MODE_OFB:
                $encrypt = $init_encrypt . '
                    $_ciphertext = "";
                    $_plaintext_len = strlen($_text);
                    $_xor = $self->encryptIV;
                    $_buffer = &$self->enbuffer;

                    if (strlen($_buffer["xor"])) {
                        for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
                            $_block = substr($_text, $_i, '.$block_size.');
                            if (strlen($_block) > strlen($_buffer["xor"])) {
                                $in = $_xor;
                                '.$encrypt_block.'
                                $_xor = $in;
                                $_buffer["xor"].= $_xor;
                            }
                            $_key = $self->_string_shift($_buffer["xor"], '.$block_size.');
                            $_ciphertext.= $_block ^ $_key;
                        }
                    } else {
                        for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
                            $in = $_xor;
                            '.$encrypt_block.'
                            $_xor = $in;
                            $_ciphertext.= substr($_text, $_i, '.$block_size.') ^ $_xor;
                        }
                        $_key = $_xor;
                    }
                    if ($self->continuousBuffer) {
                        $self->encryptIV = $_xor;
                        if ($_start = $_plaintext_len % '.$block_size.') {
                             $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"];
                        }
                    }
                    return $_ciphertext;
                    ';

                $decrypt = $init_encrypt . '
                    $_plaintext = "";
                    $_ciphertext_len = strlen($_text);
                    $_xor = $self->decryptIV;
                    $_buffer = &$self->debuffer;

                    if (strlen($_buffer["xor"])) {
                        for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
                            $_block = substr($_text, $_i, '.$block_size.');
                            if (strlen($_block) > strlen($_buffer["xor"])) {
                                $in = $_xor;
                                '.$encrypt_block.'
                                $_xor = $in;
                                $_buffer["xor"].= $_xor;
                            }
                            $_key = $self->_string_shift($_buffer["xor"], '.$block_size.');
                            $_plaintext.= $_block ^ $_key;
                        }
                    } else {
                        for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
                            $in = $_xor;
                            '.$encrypt_block.'
                            $_xor = $in;
                            $_plaintext.= substr($_text, $_i, '.$block_size.') ^ $_xor;
                        }
                        $_key = $_xor;
                    }
                    if ($self->continuousBuffer) {
                        $self->decryptIV = $_xor;
                        if ($_start = $_ciphertext_len % '.$block_size.') {
                             $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"];
                        }
                    }
                    return $_plaintext;
                    ';
                break;
            case CRYPT_MODE_STREAM:
                $encrypt = $init_encrypt . '
                    $_ciphertext = "";
                    '.$encrypt_block.'
                    return $_ciphertext;
                    ';
                $decrypt = $init_decrypt . '
                    $_plaintext = "";
                    '.$decrypt_block.'
                    return $_plaintext;
                    ';
                break;
            // case CRYPT_MODE_CBC:
            default:
                $encrypt = $init_encrypt . '
                    $_ciphertext = "";
                    $_plaintext_len = strlen($_text);

                    $in = $self->encryptIV;

                    for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
                        $in = substr($_text, $_i, '.$block_size.') ^ $in;
                        '.$encrypt_block.'
                        $_ciphertext.= $in;
                    }

                    if ($self->continuousBuffer) {
                        $self->encryptIV = $in;
                    }

                    return $_ciphertext;
                    ';

                $decrypt = $init_decrypt . '
                    $_plaintext = "";
                    $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0));
                    $_ciphertext_len = strlen($_text);

                    $_iv = $self->decryptIV;

                    for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
                        $in = $_block = substr($_text, $_i, '.$block_size.');
                        '.$decrypt_block.'
                        $_plaintext.= $in ^ $_iv;
                        $_iv = $_block;
                    }

                    if ($self->continuousBuffer) {
                        $self->decryptIV = $_iv;
                    }

                    return $self->_unpad($_plaintext);
                    ';
                break;
        }

        // Create the $inline function and return its name as string. Ready to run!
        if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
            eval('$func = function ($_action, &$self, $_text) { ' . $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' } };');
            return $func;
        }

        return create_function('$_action, &$self, $_text', $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }');
    }

    /**
     * Holds the lambda_functions table (classwide)
     *
     * Each name of the lambda function, created from
     * _setupInlineCrypt() && _createInlineCryptFunction()
     * is stored, classwide (!), here for reusing.
     *
     * The string-based index of $function is a classwide
     * unique value representing, at least, the $mode of
     * operation (or more... depends of the optimizing level)
     * for which $mode the lambda function was created.
     *
     * @access private
     * @return array &$functions
     */
    function &_getLambdaFunctions()
    {
        static $functions = array();
        return $functions;
    }

    /**
     * Generates a digest from $bytes
     *
     * @see self::_setupInlineCrypt()
     * @access private
     * @param $bytes
     * @return string
     */
    function _hashInlineCryptFunction($bytes)
    {
        if (!defined('CRYPT_BASE_WHIRLPOOL_AVAILABLE')) {
            define('CRYPT_BASE_WHIRLPOOL_AVAILABLE', (bool)(extension_loaded('hash') && in_array('whirlpool', hash_algos())));
        }

        $result = '';
        $hash = $bytes;

        switch (true) {
            case CRYPT_BASE_WHIRLPOOL_AVAILABLE:
                foreach (str_split($bytes, 64) as $t) {
                    $hash = hash('whirlpool', $hash, true);
                    $result .= $t ^ $hash;
                }
                return $result . hash('whirlpool', $hash, true);
            default:
                $len = strlen($bytes);
                for ($i = 0; $i < $len; $i+=20) {
                    $t = substr($bytes, $i, 20);
                    $hash = pack('H*', sha1($hash));
                    $result .= $t ^ $hash;
                }
                return $result . pack('H*', sha1($hash));
        }
    }

    /**
     * Convert float to int
     *
     * On 32-bit Linux installs running PHP < 5.3 converting floats to ints doesn't always work
     *
     * @access private
     * @param string $x
     * @return int
     */
    function safe_intval($x)
    {
        switch (true) {
            case is_int($x):
            // PHP 5.3, per http://php.net/releases/5_3_0.php, introduced "more consistent float rounding"
            case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
            // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster
            case (PHP_OS & "\xDF\xDF\xDF") === 'WIN':
                return $x;
        }
        return (fmod($x, 0x80000000) & 0x7FFFFFFF) |
            ((fmod(floor($x / 0x80000000), 2) & 1) << 31);
    }

    /**
     * eval()'able string for in-line float to int
     *
     * @access private
     * @return string
     */
    function safe_intval_inline()
    {
        // on 32-bit linux systems with PHP < 5.3 float to integer conversion is bad
        switch (true) {
            case defined('PHP_INT_SIZE') && PHP_INT_SIZE == 8:
            case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
            case (PHP_OS & "\xDF\xDF\xDF") === 'WIN':
                return '%s';
                break;
            default:
                $safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | ';
                return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))';
        }
    }
}
installer/dup-installer/classes/Crypt/index.php000064400000000016151336065400015702 0ustar00<?php
//silentinstaller/dup-installer/classes/Crypt/Random.php000064400000036033151336065400016023 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/**
 * Random Number Generator
 *
 * The idea behind this function is that it can be easily replaced with your own crypt_random_string()
 * function. eg. maybe you have a better source of entropy for creating the initial states or whatever.
 *
 * PHP versions 4 and 5
 *
 * Here's a short example of how to use this library:
 * <code>
 * <?php
 *    include 'Crypt/Random.php';
 *
 *    echo bin2hex(crypt_random_string(8));
 * ?>
 * </code>
 *
 * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * @category  Crypt
 * @package   Crypt_Random
 * @author    Jim Wigginton <terrafrost@php.net>
 * @copyright 2007 Jim Wigginton
 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
 * @link      http://phpseclib.sourceforge.net
 */

// laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently,
// have phpseclib as a requirement as well. if you're developing such a program you may encounter
// a "Cannot redeclare crypt_random_string()" error.
if (!function_exists('crypt_random_string')) {
    /**
     * "Is Windows" test
     *
     * @access private
     */
    define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');

    /**
     * Generate a random string.
     *
     * Although microoptimizations are generally discouraged as they impair readability this function is ripe with
     * microoptimizations because this function has the potential of being called a huge number of times.
     * eg. for RSA key generation.
     *
     * @param int $length
     * @return string
     * @access public
     */
    function crypt_random_string($length)
    {
        if (!$length) {
            return '';
        }

        if (CRYPT_RANDOM_IS_WINDOWS) {
            // method 1. prior to PHP 5.3, mcrypt_create_iv() would call rand() on windows
            if (extension_loaded('mcrypt') && version_compare(PHP_VERSION, '5.3.0', '>=')) {
                return @mcrypt_create_iv($length);
            }
            // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was,
            // to quote <http://php.net/ChangeLog-5.php#5.3.4>, "possible blocking behavior". as of 5.3.4
            // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both
            // call php_win32_get_random_bytes():
            //
            // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008
            // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392
            //
            // php_win32_get_random_bytes() is defined thusly:
            //
            // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80
            //
            // we're calling it, all the same, in the off chance that the mcrypt extension is not available
            if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.4', '>=')) {
                return openssl_random_pseudo_bytes($length);
            }
        } else {
            // method 1. the fastest
            if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.0', '>=')) {
                return openssl_random_pseudo_bytes($length);
            }
            // method 2
            static $fp = true;
            if ($fp === true) {
                // warning's will be output unles the error suppression operator is used. errors such as
                // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc.
                $fp = @fopen('/dev/urandom', 'rb');
            }
            if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource()
                return fread($fp, $length);
            }
            // method 3. pretty much does the same thing as method 2 per the following url:
            // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391
            // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're
            // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir
            // restrictions or some such
            if (extension_loaded('mcrypt')) {
                return @mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
            }
        }
        // at this point we have no choice but to use a pure-PHP CSPRNG

        // cascade entropy across multiple PHP instances by fixing the session and collecting all
        // environmental variables, including the previous session data and the current session
        // data.
        //
        // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively)
        // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but
        // PHP isn't low level to be able to use those as sources and on a web server there's not likely
        // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use
        // however, a ton of people visiting the website. obviously you don't want to base your seeding
        // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled
        // by the user and (2) this isn't just looking at the data sent by the current user - it's based
        // on the data sent by all users. one user requests the page and a hash of their info is saved.
        // another user visits the page and the serialization of their data is utilized along with the
        // server envirnment stuff and a hash of the previous http request data (which itself utilizes
        // a hash of the session data before that). certainly an attacker should be assumed to have
        // full control over his own http requests. he, however, is not going to have control over
        // everyone's http requests.
        static $crypto = false, $v;
        if ($crypto === false) {
            // save old session data
            $old_session_id = session_id();
            $old_use_cookies = ini_get('session.use_cookies');
            $old_session_cache_limiter = session_cache_limiter();
            $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false;
            if ($old_session_id != '') {
                session_write_close();
            }

            session_id(1);
            if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('session.use_cookies'))
                ini_set('session.use_cookies', 0);
            session_cache_limiter('');
            session_start();

            $v = $seed = $_SESSION['seed'] = pack('H*', sha1(
                (isset($_SERVER) ? phpseclib_safe_serialize($_SERVER) : '') .
                (isset($_POST) ? phpseclib_safe_serialize($_POST) : '') .
                (isset($_GET) ? phpseclib_safe_serialize($_GET) : '') .
                (isset($_COOKIE) ? phpseclib_safe_serialize($_COOKIE) : '') .
                phpseclib_safe_serialize($GLOBALS) .
                phpseclib_safe_serialize($_SESSION) .
                phpseclib_safe_serialize($_OLD_SESSION)
            ));
            if (!isset($_SESSION['count'])) {
                $_SESSION['count'] = 0;
            }
            $_SESSION['count']++;

            session_write_close();

            // restore old session data
            if ($old_session_id != '') {
                session_id($old_session_id);
                session_start();
                if (DupLiteSnapLibUtil::wp_is_ini_value_changeable('session.use_cookies'))
                    ini_set('session.use_cookies', $old_use_cookies);
                session_cache_limiter($old_session_cache_limiter);
            } else {
                if ($_OLD_SESSION !== false) {
                    $_SESSION = $_OLD_SESSION;
                    unset($_OLD_SESSION);
                } else {
                    unset($_SESSION);
                }
            }

            // in SSH2 a shared secret and an exchange hash are generated through the key exchange process.
            // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C.
            // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the
            // original hash and the current hash. we'll be emulating that. for more info see the following URL:
            //
            // http://tools.ietf.org/html/rfc4253#section-7.2
            //
            // see the is_string($crypto) part for an example of how to expand the keys
            $key = pack('H*', sha1($seed . 'A'));
            $iv = pack('H*', sha1($seed . 'C'));

            // ciphers are used as per the nist.gov link below. also, see this link:
            //
            // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives
            switch (true) {
                case phpseclib_resolve_include_path('Crypt/AES.php'):
                    if (!class_exists('Crypt_AES')) {
                        include_once 'AES.php';
                    }
                    $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR);
                    break;
                case phpseclib_resolve_include_path('Crypt/Twofish.php'):
                    if (!class_exists('Crypt_Twofish')) {
                        include_once 'Twofish.php';
                    }
                    $crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR);
                    break;
                case phpseclib_resolve_include_path('Crypt/Blowfish.php'):
                    if (!class_exists('Crypt_Blowfish')) {
                        include_once 'Blowfish.php';
                    }
                    $crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR);
                    break;
                case phpseclib_resolve_include_path('Crypt/TripleDES.php'):
                    if (!class_exists('Crypt_TripleDES')) {
                        include_once 'TripleDES.php';
                    }
                    $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR);
                    break;
                case phpseclib_resolve_include_path('Crypt/DES.php'):
                    if (!class_exists('Crypt_DES')) {
                        include_once 'DES.php';
                    }
                    $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR);
                    break;
                case phpseclib_resolve_include_path('Crypt/RC4.php'):
                    if (!class_exists('Crypt_RC4')) {
                        include_once 'RC4.php';
                    }
                    $crypto = new Crypt_RC4();
                    break;
                default:
                    user_error('crypt_random_string requires at least one symmetric cipher be loaded');
                    return false;
            }

            $crypto->setKey($key);
            $crypto->setIV($iv);
            $crypto->enableContinuousBuffer();
        }

        //return $crypto->encrypt(str_repeat("\0", $length));

        // the following is based off of ANSI X9.31:
        //
        // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf
        //
        // OpenSSL uses that same standard for it's random numbers:
        //
        // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c
        // (do a search for "ANS X9.31 A.2.4")
        $result = '';
        while (strlen($result) < $length) {
            $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21
            $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20
            $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20
            $result.= $r;
        }
        return substr($result, 0, $length);
    }
}

if (!function_exists('phpseclib_safe_serialize')) {
    /**
     * Safely serialize variables
     *
     * If a class has a private __sleep() method it'll give a fatal error on PHP 5.2 and earlier.
     * PHP 5.3 will emit a warning.
     *
     * @param mixed $arr
     * @access public
     */
    function phpseclib_safe_serialize(&$arr)
    {
        if (is_object($arr)) {
            return '';
        }
        if (!is_array($arr)) {
            return serialize($arr);
        }
        // prevent circular array recursion
        if (isset($arr['__phpseclib_marker'])) {
            return '';
        }
        $safearr = array();
        $arr['__phpseclib_marker'] = true;
        foreach (array_keys($arr) as $key) {
            // do not recurse on the '__phpseclib_marker' key itself, for smaller memory usage
            if ($key !== '__phpseclib_marker') {
                $safearr[$key] = phpseclib_safe_serialize($arr[$key]);
            }
        }
        unset($arr['__phpseclib_marker']);
        return serialize($safearr);
    }
}

if (!function_exists('phpseclib_resolve_include_path')) {
    /**
     * Resolve filename against the include path.
     *
     * Wrapper around stream_resolve_include_path() (which was introduced in
     * PHP 5.3.2) with fallback implementation for earlier PHP versions.
     *
     * @param string $filename
     * @return string|false
     * @access public
     */
    function phpseclib_resolve_include_path($filename)
    {
        if (function_exists('stream_resolve_include_path')) {
            return stream_resolve_include_path($filename);
        }

        // handle non-relative paths
        if (file_exists($filename)) {
            return realpath($filename);
        }

        $paths = PATH_SEPARATOR == ':' ?
            preg_split('#(?<!phar):#', get_include_path()) :
            explode(PATH_SEPARATOR, get_include_path());
        foreach ($paths as $prefix) {
            // path's specified in include_path don't always end in /
            $ds = substr($prefix, -1) == DIRECTORY_SEPARATOR ? '' : DIRECTORY_SEPARATOR;
            $file = $prefix . $ds . $filename;
            if (file_exists($file)) {
                return realpath($file);
            }
        }

        return false;
    }
}
views/inc.header.php000064400000000226151336065400010415 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
	function duplicator_header($title)
	{
		echo "<h1>".esc_html($title)."</h1>";
	}
?>views/settings/index.php000064400000000016151336065400011361 0ustar00<?php
//silentviews/settings/general.php000064400000043355151336065400011704 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

global $wp_version;
global $wpdb;

$action_updated  = null;
$action_response = __("General Settings Saved", 'duplicator');

//SAVE RESULTS
if (isset($_POST['action']) && $_POST['action'] == 'save') {

    //Nonce Check
    if (!isset($_POST['dup_settings_save_nonce_field']) || !wp_verify_nonce($_POST['dup_settings_save_nonce_field'], 'dup_settings_save')) {
        die('Invalid token permissions to perform this request.');
    }

    DUP_Settings::Set('uninstall_settings', isset($_POST['uninstall_settings']) ? "1" : "0");
    DUP_Settings::Set('uninstall_files', isset($_POST['uninstall_files']) ? "1" : "0");
    DUP_Settings::Set('uninstall_tables', isset($_POST['uninstall_tables']) ? "1" : "0");

    DUP_Settings::Set('wpfront_integrate', isset($_POST['wpfront_integrate']) ? "1" : "0");
    DUP_Settings::Set('package_debug', isset($_POST['package_debug']) ? "1" : "0");

    $skip_archive_scan = filter_input(INPUT_POST, 'skip_archive_scan', FILTER_VALIDATE_BOOLEAN);
    DUP_Settings::Set('skip_archive_scan', $skip_archive_scan);

    $unhook_third_party_js = filter_input(INPUT_POST, 'unhook_third_party_js', FILTER_VALIDATE_BOOLEAN);
    DUP_Settings::Set('unhook_third_party_js', $unhook_third_party_js);

    $unhook_third_party_css = filter_input(INPUT_POST, 'unhook_third_party_css', FILTER_VALIDATE_BOOLEAN);
    DUP_Settings::Set('unhook_third_party_css', $unhook_third_party_css);

    switch (filter_input(INPUT_POST, 'storage_position', FILTER_DEFAULT)) {
        case DUP_Settings::STORAGE_POSITION_LECAGY:
            $setPostion = DUP_Settings::STORAGE_POSITION_LECAGY;
            break;
        case DUP_Settings::STORAGE_POSITION_WP_CONTENT:
        default:
            $setPostion = DUP_Settings::STORAGE_POSITION_WP_CONTENT;
            break;
    }

    if (DUP_Settings::setStoragePosition($setPostion) != true) {
        $targetFolder = ($setPostion === DUP_Settings::STORAGE_POSITION_WP_CONTENT) ? DUP_Settings::getSsdirPathWpCont() : DUP_Settings::getSsdirPathLegacy();
        ?>
        <div id="message" class="notice notice-error is-dismissible">
            <p>
                <b><?php esc_html_e('Storage folder move problem'); ?></b>
            </p>
            <p>
                <?php echo sprintf(__('Duplicator can\'t change the storage folder to <i>%s</i>', 'duplicator'), esc_html($targetFolder)); ?><br>
                <?php echo sprintf(__('Check the parent folder permissions. ( <i>%s</i> )', 'duplicator'), esc_html(dirname($targetFolder))); ?>
            </p>
        </div>
        <?php
    }

    if (isset($_REQUEST['trace_log_enabled'])) {

        dup_log::trace("#### trace log enabled");
        // Trace on

        if (DUP_Settings::Get('trace_log_enabled') == 0) {
            DUP_Log::DeleteTraceLog();
        }

        DUP_Settings::Set('trace_log_enabled', 1);
    } else {
        dup_log::trace("#### trace log disabled");

        // Trace off
        DUP_Settings::Set('trace_log_enabled', 0);
    }

    DUP_Settings::Save();
    $action_updated = true;
    DUP_Util::initSnapshotDirectory();
}

$trace_log_enabled      = DUP_Settings::Get('trace_log_enabled');
$uninstall_settings     = DUP_Settings::Get('uninstall_settings');
$uninstall_files        = DUP_Settings::Get('uninstall_files');
$uninstall_tables       = DUP_Settings::Get('uninstall_tables');
$wpfront_integrate      = DUP_Settings::Get('wpfront_integrate');
$wpfront_ready          = apply_filters('wpfront_user_role_editor_duplicator_integration_ready', false);
$package_debug          = DUP_Settings::Get('package_debug');
$skip_archive_scan      = DUP_Settings::Get('skip_archive_scan');
$unhook_third_party_js  = DUP_Settings::Get('unhook_third_party_js');
$unhook_third_party_css = DUP_Settings::Get('unhook_third_party_css');
?>

<style>
    form#dup-settings-form input[type=text] {width: 400px; }
    div.dup-feature-found {padding:3px; border:1px solid silver; background: #f7fcfe; border-radius: 3px; width:400px; font-size: 12px}
    div.dup-feature-notfound {padding:5px; border:1px solid silver; background: #fcf3ef; border-radius: 3px; width:500px; font-size: 13px; line-height: 18px}
    table.nested-table-data td {padding:5px 5px 5px 0}
</style>

<form id="dup-settings-form" action="<?php echo admin_url('admin.php?page=duplicator-settings&tab=general'); ?>" method="post">

    <?php wp_nonce_field('dup_settings_save', 'dup_settings_save_nonce_field', false); ?>
    <input type="hidden" name="action" value="save">
    <input type="hidden" name="page"   value="duplicator-settings">

    <?php if ($action_updated) : ?>
        <div id="message" class="notice notice-success is-dismissible dup-wpnotice-box"><p><?php echo esc_html($action_response); ?></p></div>
    <?php endif; ?>


    <h3 class="title"><?php esc_html_e("Plugin", 'duplicator') ?> </h3>
    <hr size="1" />
    <table class="form-table">
        <tr valign="top">
            <th scope="row"><label><?php esc_html_e("Version", 'duplicator'); ?></label></th>
            <td>
                <?php 
                    echo DUPLICATOR_VERSION . ' &nbsp; ';
                    echo (stristr(DUPLICATOR_VERSION_BUILD, 'rc'))
                        ? "<span style='color:red'>["  . DUPLICATOR_VERSION_BUILD . "]</span>"
                        : "<span style='color:gray'>[" . DUPLICATOR_VERSION_BUILD . "]</span>";
                ?>
            </td>
        </tr>
        <tr valign="top">
            <th scope="row"><label><?php esc_html_e("Uninstall", 'duplicator'); ?></label></th>
            <td>
                <p>
                    <input type="checkbox" name="uninstall_settings" id="uninstall_settings" <?php echo ($uninstall_settings) ? 'checked="checked"' : ''; ?> />
                    <label for="uninstall_settings"><?php esc_html_e("Delete Plugin Settings", 'duplicator') ?> </label>
                </p>
                <p>
                    <input type="checkbox" name="uninstall_files" id="uninstall_files" <?php echo ($uninstall_files) ? 'checked="checked"' : ''; ?> />
                    <label for="uninstall_files"><?php esc_html_e("Delete Entire Storage Directory", 'duplicator') ?></label><br/>
                </p>
            </td>
        </tr>
    </table>


    <h3 class="title"><?php esc_html_e("Debug", 'duplicator') ?> </h3>
    <hr size="1" />
    <table class="form-table">
        <tr>
            <th scope="row"><label><?php esc_html_e("Debugging", 'duplicator'); ?></label></th>
            <td>
                <input type="checkbox" name="package_debug" id="package_debug" <?php echo ($package_debug) ? 'checked="checked"' : ''; ?> />
                <label for="package_debug"><?php esc_html_e("Enable debug options throughout user interface", 'duplicator'); ?></label>
            </td>
        </tr>
        <tr valign="top">
            <th scope="row"><label><?php esc_html_e("Trace Log", 'duplicator'); ?></label></th>
            <td>
                <input type="checkbox" name="trace_log_enabled" id="trace_log_enabled" <?php echo ($trace_log_enabled == 1) ? 'checked="checked"' : ''; ?> />
                <label for="trace_log_enabled"><?php esc_html_e("Enabled", 'duplicator') ?> </label><br/>
                <p class="description">
                    <?php
                    esc_html_e('Turns on detailed operation logging. Logging will occur in both PHP error and local trace logs.');
                    echo ('<br/>');
                    esc_html_e('WARNING: Only turn on this setting when asked to by support as tracing will impact performance.', 'duplicator');
                    ?>
                </p><br/>
                <button class="button" <?php
                if (!DUP_Log::TraceFileExists()) {
                    echo 'disabled';
                }
                ?> onclick="Duplicator.Pack.DownloadTraceLog(); return false">
                    <i class="fa fa-download"></i> <?php echo esc_html__('Download Trace Log', 'duplicator').' ('.DUP_LOG::GetTraceStatus().')'; ?>
                </button>
            </td>
        </tr>
    </table><br/>

    <!-- ===============================
    ADVANCED SETTINGS -->
    <h3 class="title"><?php esc_html_e('Advanced', 'duplicator'); ?> </h3>
    <hr size="1" />
    <table class="form-table">
        <tr>
            <th scope="row"><label><?php esc_html_e("Settings", 'duplicator'); ?></label></th>
            <td>
                <button class="button" onclick="Duplicator.Pack.ConfirmResetAll(); return false;">
                    <i class="fas fa-redo fa-sm"></i> <?php esc_html_e('Reset Packages', 'duplicator'); ?>
                </button>
                <p class="description">
                    <?php
                    esc_html_e("This process will reset all packages by deleting those without a completed status, reset the active package id and perform a "
                        ."cleanup of the build tmp file.", 'duplicator');
                    ?>
                    <i class="fas fa-question-circle fa-sm"
                       data-tooltip-title="<?php esc_attr_e("Reset Settings", 'duplicator'); ?>"
                       data-tooltip="<?php esc_attr_e('This action should only be used if the packages screen is having issues or a build is stuck.', 'duplicator'); ?>"></i>
                </p>
            </td>
        </tr>
        <tr valign="top">
            <th scope="row"><label><?php esc_html_e('Archive scan', 'duplicator'); ?></label></th>
            <td>
                <input type="checkbox" name="skip_archive_scan" id="_skip_archive_scan" <?php checked($skip_archive_scan, true); ?> value="1" />
                <label for="_skip_archive_scan"><?php esc_html_e("Skip", 'duplicator') ?> </label><br/>
                <p class="description">
                    <?php
                    esc_html_e('If enabled all files check on scan will be skipped before package creation.  '
                        .'In some cases, this option can be beneficial if the scan process is having issues running or returning errors.', 'duplicator');
                    ?>
                </p>
            </td>
        </tr>
        <tr>
            <th scope="row"><label><?php esc_html_e("Foreign JavaScript", 'duplicator'); ?></label></th>
            <td>
                <input type="checkbox" name="unhook_third_party_js" id="unhook_third_party_js" <?php checked($unhook_third_party_js, true); ?>  value="1"/>
                <label for="unhook_third_party_js"><?php esc_html_e("Disable", 'duplicator'); ?></label> <br/>
                <p class="description">
                    <?php
                    esc_html_e("Check this option if other plugins/themes JavaScript files are conflicting with Duplicator.", 'duplicator');
                    ?>
                    <br>
                    <?php
                    esc_html_e("Do not modify this setting unless you know the expected result or have talked to support.", 'duplicator');
                    ?>
                </p>
            </td>
        </tr>
        <tr>
            <th scope="row"><label><?php esc_html_e("Foreign CSS", 'duplicator'); ?></label></th>
            <td>
                <input type="checkbox" name="unhook_third_party_css" id="unhook_third_party_css" <?php checked($unhook_third_party_css, true); ?>  value="1"/>
                <label for="unhook_third_party_css"><?php esc_html_e("Disable", 'duplicator'); ?></label> <br/>
                <p class="description">
                    <?php
                    esc_html_e("Check this option if other plugins/themes CSS files are conflicting with Duplicator.", 'duplicator');
                    ?>
                    <br>
                    <?php
                    esc_html_e("Do not modify this setting unless you know the expected result or have talked to support.", 'duplicator');
                    ?>
                </p>
            </td>
        </tr>
        <tr>
            <th scope="row"><label><?php esc_html_e("Custom Roles", 'duplicator'); ?></label></th>
            <td>
                <input type="checkbox" name="wpfront_integrate" id="wpfront_integrate" <?php echo ($wpfront_integrate) ? 'checked="checked"' : ''; ?> <?php echo $wpfront_ready ? '' : 'disabled'; ?> />
                <label for="wpfront_integrate"><?php esc_html_e("Enable User Role Editor Plugin Integration", 'duplicator'); ?></label>
                <p class="description" style="max-width: 800px">
                    <?php
                    printf('%s <a href="https://wordpress.org/plugins/wpfront-user-role-editor/" target="_blank">%s</a> %s'
                        .' <a href="https://wpfront.com/user-role-editor-pro/?ref=3" target="_blank">%s</a> %s '
                        .' <a href="https://wpfront.com/integrations/duplicator-integration/?ref=3" target="_blank">%s</a>. %s'
                        .' <a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=user_role_plugin&utm_campaign=duplicator_pro" target="_blank">%s</a>.',
                        esc_html__('To enable custom roles with Duplicator please install the ', 'duplicator'),
                        esc_html__('User Role Editor Free', 'duplicator'),
                        esc_html__('OR', 'duplicator'),
                        esc_html__('User Role Editor Professional', 'duplicator'),
                        esc_html__('plugins.  Please note the User Role Editor Plugin is a separate plugin and does not unlock any Duplicator features.  For more information on User Role Editor plugin please see', 'duplicator'),
                        esc_html__('the documentation', 'duplicator'),
                        esc_html__('If you are interested in downloading Duplicator Pro then please use', 'duplicator'),
                        esc_html__('this link', 'duplicator')
                    );
                    ?>
                </p>
            </td>
        </tr>        
    </table>

    <p class="submit" style="margin: 20px 0px 0xp 5px;">
        <br/>
        <input type="submit" name="submit" id="submit" class="button-primary" value="<?php esc_attr_e("Save General Settings", 'duplicator') ?>" style="display: inline-block;" />
    </p>

</form>

<!-- ==========================================
THICK-BOX DIALOGS: -->
<?php
$reset_confirm                 = new DUP_UI_Dialog();
$reset_confirm->title          = __('Reset Packages ?', 'duplicator');
$reset_confirm->message        = __('This will clear and reset all of the current temporary packages.  Would you like to continue?', 'duplicator');
$reset_confirm->progressText   = __('Resetting settings, Please Wait...', 'duplicator');
$reset_confirm->jscallback     = 'Duplicator.Pack.ResetAll()';
$reset_confirm->progressOn     = false;
$reset_confirm->okText         = __('Yes', 'duplicator');
$reset_confirm->cancelText     = __('No', 'duplicator');
$reset_confirm->closeOnConfirm = true;
$reset_confirm->initConfirm();

$msg_ajax_error                 = new DUP_UI_Messages(__('AJAX Call Error!', 'duplicator').'<br>'.__('AJAX error encountered when resetting packages. Please see <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-053-q" target="_blank">this FAQ entry</a> for possible resolutions.', 'duplicator'), DUP_UI_Messages::ERROR);
$msg_ajax_error->hide_on_init   = true;
$msg_ajax_error->is_dismissible = true;
$msg_ajax_error->initMessage();

$msg_response_error                 = new DUP_UI_Messages(__('RESPONSE ERROR!', 'duplicator'), DUP_UI_Messages::ERROR);
$msg_response_error->hide_on_init   = true;
$msg_response_error->is_dismissible = true;
$msg_response_error->initMessage();

$msg_response_success                 = new DUP_UI_Messages('', DUP_UI_Messages::NOTICE);
$msg_response_success->hide_on_init   = true;
$msg_response_success->is_dismissible = true;
$msg_response_success->initMessage();
?>
<script>
    jQuery(document).ready(function ($)
    {
        var msgDebug = <?php echo DUP_Util::isWpDebug() ? 'true' : 'false'; ?>;

        // which: 0=installer, 1=archive, 2=sql file, 3=log
        Duplicator.Pack.DownloadTraceLog = function ()
        {
            var actionLocation = ajaxurl + '?action=DUP_CTRL_Tools_getTraceLog&nonce=' + '<?php echo wp_create_nonce('DUP_CTRL_Tools_getTraceLog'); ?>';
            location.href = actionLocation;
        };

        Duplicator.Pack.ConfirmResetAll = function ()
        {
<?php $reset_confirm->showConfirm(); ?>
        };

        Duplicator.Pack.ResetAll = function ()
        {
            $.ajax({
                type: "POST",
                url: ajaxurl,
                dataType: "json",
                data: {
                    action: 'duplicator_reset_all_settings',
                    nonce: '<?php echo wp_create_nonce('duplicator_reset_all_settings'); ?>'
                },
                success: function (result) {
                    if (msgDebug) {
                        console.log(result);
                    }

                    if (result.success) {
                        var message = '<?php _e('Packages successfully reset', 'duplicator'); ?>';
                        if (msgDebug) {
                            console.log(result.data.message);
                            console.log(result.data.html);
                        }
<?php
$msg_response_success->updateMessage('message');
$msg_response_success->showMessage();
?>
                    } else {
                        var message = '<?php _e('RESPONSE ERROR!', 'duplicator'); ?>' + '<br><br>' + result.data.message;
                        if (msgDebug) {
                            message += '<br><br>' + result.data.html;
                        }
<?php
$msg_response_error->updateMessage('message');
$msg_response_error->showMessage();
?>
                    }
                },
                error: function (result) {
                    if (msgDebug) {
                        console.log(result);
                    }
<?php $msg_ajax_error->showMessage(); ?>
                }
            });
        };
    });
</script>views/settings/gopro.php000064400000041077151336065400011414 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
DUP_Util::hasCapability('export');

require_once(DUPLICATOR_PLUGIN_PATH . '/assets/js/javascript.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');

if(mt_rand(0, 1) == 0) {
    $test_text = esc_html__('Check It Out!', 'duplicator');
    $test_url  = "https://snapcreek.com/duplicator/comparison/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_go_pro_checkitout1&utm_campaign=duplicator_pro";
} else {
    /*Updated from 'Learn More' to 'Check It Out' on 1.4.4 release */
    $test_text = esc_html__('Check It Out!', 'duplicator');
    $test_url  = "https://snapcreek.com/duplicator/comparison/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_go_pro_checkitout2&utm_campaign=duplicator_pro";
}

?>
<style>
    /*================================================
    PAGE-SUPPORT:*/
	div.dup-pro-area {
		padding:10px 70px; max-width:750px; width:90%; margin:auto; text-align:center;
		background:#fff; border-radius:20px; box-shadow:inset 0px 0px 67px 20px rgba(241,241,241,1);
	}
    div.dup-pro-area-no-table {	padding:10px; max-width:850px; margin:40px auto; text-align:center;}
	i.dup-gopro-help {color:#777 !important; margin-left:5px; font-size:14px; }
	td.group-header {background-color:#D5D5D5; color: #000; font-size: 20px; padding:7px !important; font-weight: bold; text-align: left; display:none}
    div.dup-compare-area {width:400px;  float:left; border:1px solid #dfdfdf; border-radius:4px; margin:10px; line-height:18px;box-shadow:0 8px 6px -6px #ccc;}
	div.feature {background:#fff; padding:15px; margin:2px; text-align:center; min-height:20px}
	div.feature a {font-size:18px; font-weight:bold;}
	div.dup-compare-area div.feature div.info {display:none; padding:7px 7px 5px 7px; font-style:italic; color:#555; font-size:14px}
	div.dup-gopro-header {text-align:center; margin:5px 0 15px 0; font-size:18px; line-height:30px}
	div.dup-gopro-header b {font-size:35px}
	#comparison-table { margin-top:25px; border-spacing:0px;  width:100%}
	#comparison-table th { color:#E21906;}
	#comparison-table td, #comparison-table th { font-size:1.2rem; padding:11px; }
	#comparison-table .feature-column { text-align:left; width:46%}
	#comparison-table .check-column { text-align:center; width:27% }
	#comparison-table tr:nth-child(2n+2) { background-color:#f6f6f6; }
</style>

<div class="dup-pro-area-no-table">
	<img src="<?php echo esc_url(DUPLICATOR_PLUGIN_URL."assets/img/logo-dpro-300x50.png"); ?>"  />
	<div style="font-size:18px; font-style:italic; color:gray; border-bottom: 1px solid silver; padding-bottom:10px; margin-bottom: -30px">
		<?php esc_html_e('The simplicity of Duplicator with power for everyone.', 'duplicator') ?>
	</div>

    <div style="margin:60px 0 100px 0">
        <div class="txt-call-action-title">
            <?php esc_html_e('Take Duplicator to the next level with features you’ll really appreciate!', 'duplicator') ?><br/>
            <?php esc_html_e("Check out what you're missing with Duplicator Pro...", 'duplicator') ?>
            
        </div>
        <br/><br/>
        <a href="<?php echo  $test_url ?>" class="dup-btn-call-action" target="_blank"><?php echo  $test_text ?></a>
    </div>


	<table id="comparison-table" style="display:none">
		<tr>
			<th class="feature-column"></th>
			<th class="check-column"><?php esc_html_e('Free', 'duplicator') ?></th>
			<th class="check-column"><?php esc_html_e('Professional', 'duplicator') ?></th>
		</tr>
		<!-- =====================
		CORE FEATURES-->
        <tr>
            <td colspan="3" class="group-header"><?php esc_html_e('Core Features', 'duplicator') ?></td>
        </tr>
		<tr>
			<td class="feature-column"><?php esc_html_e('Backup Files & Database', 'duplicator') ?></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column"><?php esc_html_e('File &amp; Database Table Filters', 'duplicator') ?></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column"><?php esc_html_e('Migration Wizard', 'duplicator') ?></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column"><?php esc_html_e('Overwrite Live Site', 'duplicator') ?></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
        <tr>
            <td class="feature-column"><?php esc_html_e('Drag and Drop Installs', 'duplicator') ?>
             <sup>
                <i class="fa fa-question-circle dup-gopro-help"
                    data-tooltip-title="<?php esc_attr_e("Drag and Drop Site Overwrites", 'duplicator'); ?>"
                    data-tooltip="<?php esc_attr_e('Overwrite a live site just by dragging an archive to the destination site. No FTP or database creation required!', 'duplicator'); ?>"/></i>
             </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
                <tr>
			<td class="feature-column"><?php esc_html_e('Scheduled Backups', 'duplicator') ?></td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
            <td class="feature-column">
                <?php esc_html_e('Recovery Points', 'duplicator') ?>
                <sup>
                <i class="fa fa-question-circle dup-gopro-help"
                    data-tooltip-title="<?php esc_attr_e("Recovery Points", 'duplicator'); ?>"
                    data-tooltip="<?php esc_attr_e('Recovery Points provide great protection against mistakes and bad updates. Simply mark a package as the "Recovery Point", and if anything goes wrong just browse to the Recovery URL for fast site restoration.', 'duplicator'); ?>"/></i></sup>
            <td class="check-column"></td>
            <td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<!-- =====================
		CLOUD STORAGE-->
        <tr>
            <td colspan="3" class="group-header"><?php esc_html_e('Cloud Storage', 'duplicator') ?></td>
        </tr>      
		<tr>
			<td class="feature-column">
				<img src="<?php echo esc_url(DUPLICATOR_PLUGIN_URL."assets/img/amazon-64.png") ?>" style='height:16px; width:16px'  />
				<?php esc_html_e('Amazon S3 Storage', 'duplicator') ?>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column">
				<img src="<?php echo esc_url(DUPLICATOR_PLUGIN_URL."assets/img/dropbox-64.png"); ?>" style='height:16px; width:16px'  />
				<?php esc_html_e('Dropbox Storage ', 'duplicator') ?>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column">
				<img src="<?php echo esc_url(DUPLICATOR_PLUGIN_URL."assets/img/google_drive_64px.png"); ?>" style='height:16px; width:16px'  />
				<?php esc_html_e('Google Drive Storage', 'duplicator') ?>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column">
				<img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/onedrive-48px.png" style='height:16px; width:16px'  />
				<?php esc_html_e('Microsoft OneDrive Storage', 'duplicator') ?>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column">
				<img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/logo_wasbi.png" style='height:16px; width:16px'  />
				<?php esc_html_e('Wasabi Storage', 'duplicator') ?>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
        <tr>
			<td class="feature-column">
				<img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/ftp-64.png" style='height:16px; width:16px'  />
				<?php esc_html_e('Remote FTP/SFTP Storage', 'duplicator') ?>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<!-- =====================
		ENHANCED OPTIONS -->
        <tr>
            <td colspan="3" class="group-header"><?php esc_html_e('Enhanced Options', 'duplicator') ?></td>
        </tr>
		<tr>
			<td class="feature-column">
				<img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/cpanel-48.png" style="width:16px; height:12px" />
				<?php esc_html_e('cPanel Database API', 'duplicator') ?>
				<sup>
					<i  class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("cPanel", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Create the database and database user directly in the installer.  No need to browse to your host\'s cPanel application.', 'duplicator'); ?>"/></i>
                </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
            <td class="feature-column">
                <?php esc_html_e('Large Site Support', 'duplicator') ?>
                <sup>
					<i class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Large Site Support", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Advanced archive engine processes with server background throttling on multi-gig sites - even on stubborn budget hosts!', 'duplicator'); ?>"/></i>
                </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
        <tr>
			<td class="feature-column">
                <?php esc_html_e('Managed Hosting Support', 'duplicator') ?>
                <sup>
                    <i class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Managed Hosting Support", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('In addition to the many standard hosts we\'ve always supported, Duplicator Pro now supports WordPress.com, WPEngine, GoDaddy Managed, Liquid Web Managed and more!', 'duplicator'); ?>"/></i>
                </sup>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
        <tr>
            <td class="feature-column">
                <?php esc_html_e('Streamlined Installer', 'duplicator') ?>
                <sup>
					<i class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Streamlined Installer", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Installer now has two modes: Basic and Advanced. Advanced is like an enhanced Duplicator Lite installer, while Basic is streamlined and only two steps!', 'duplicator'); ?>"/></i>
                </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column"><?php esc_html_e('Email Alerts', 'duplicator') ?></td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
   		<tr>
			<td class="feature-column"><?php esc_html_e('Custom Search & Replace', 'duplicator') ?></td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
   		<tr>
			<td class="feature-column">
                 <?php esc_html_e('Manual/Quick Transfer', 'duplicator') ?>
                <sup>
					<i class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Manual/Quick Transfer", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Manually transfer a package from the default localhost storage to another directory or cloud service at anytime.', 'duplicator'); ?>"/></i>
                </sup>
            </td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>

        <tr>
			<td class="feature-column">
                <?php esc_html_e('WP-Config Extra Control', 'duplicator') ?>
                <sup>
					<i  class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("WP-Config Control Plus", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Control many wp-config.php settings right from the installer!', 'duplicator'); ?>"/></i>
                </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<!-- =====================
		POWER TOOLS  -->
        <tr>
            <td colspan="3" class="group-header">
                <?php esc_html_e('Power Tools', 'duplicator');  ?>
                <span style="font-weight:normal; font-size:11px"><?php esc_html_e('Freelancer+', 'duplicator');  ?></span>
            </td>
        </tr>
   		<tr>
			<td class="feature-column"><?php esc_html_e('Hourly Schedules', 'duplicator') ?></td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
        <tr>
			<td class="feature-column">
                <?php esc_html_e('Installer Branding', 'duplicator') ?>
                <sup>
					<i  class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Installer Branding", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Give the installer a custom header with your brand and logo.', 'duplicator'); ?>"/></i>
                </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
        <tr>
			<td class="feature-column">
                <?php esc_html_e('Migrate Duplicator Settings', 'duplicator') ?>
                <sup>
					<i  class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Migrate Duplicator Settings", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Exports all schedules, storage locations, templates and settings from this Duplicator Pro instance into a downloadable export file.', 'duplicator'); ?>"/></i>
                </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>

        <tr>
			<td class="feature-column">
                <?php esc_html_e('Regenerate Salts', 'duplicator') ?>
                <sup>
					<i  class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Regenerate Salts", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Installer contains option to regenerate salts in the wp-config.php file.  This feature is only available with Freelancer, Business or Gold licenses.', 'duplicator'); ?>"/></i>
                </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column">
				<?php esc_html_e('Priority Customer Support', 'duplicator') ?>
				<sup><i  class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Support", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Pro users get top priority for any requests to our support desk.  In most cases responses will be answered in under 24 hours.', 'duplicator'); ?>"/></i>
                </sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<!-- =====================
		MULTI-SITE -->
        <tr>
            <td colspan="3" class="group-header">
                <?php esc_html_e('MultiSite', 'duplicator');  ?>
            </td>
        </tr>
		<tr>
			<td class="feature-column"><?php esc_html_e('Multisite Network Migration', 'duplicator') ?></td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
        <tr>
			<td class="feature-column"><?php esc_html_e('Multisite Subsite &gt; Standalone', 'duplicator') ?><sup>
					<i  class="fa fa-question-circle dup-gopro-help"
						data-tooltip-title="<?php esc_attr_e("Multisite", 'duplicator'); ?>"
                        data-tooltip="<?php esc_attr_e('Install an individual subsite from a Multisite as a standalone site.  This feature is only available with Business or Gold licenses.', 'duplicator'); ?>"/></i></sup>
			</td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
		<tr>
			<td class="feature-column"><?php esc_html_e('Plus Many Other Features...', 'duplicator') ?></td>
			<td class="check-column"></td>
			<td class="check-column"><i class="fa fa-check"></i></td>
		</tr>
	</table>
</div>

views/settings/license.php000064400000005103151336065400011676 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<h3 class="title"><?php esc_html_e("Activation"); ?> </h3>
<hr size="1" />
<table class="form-table">
<tr valign="top">
	<th scope="row"><?php esc_html_e("Manage") ?></th>
	<td><?php echo sprintf(esc_html__('%1$sManage Licenses%2$s'), '<a target="_blank" href="https://snapcreek.com/dashboard?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=duplicator_pro&utm_content=settings_license_manage_licenses">', '</a>'); ?></td>
</tr>
<tr valign="top">
	<th scope="row"><?php esc_html_e("Type") ?></th>
	<td class="dpro-license-type">
		<?php esc_html_e('Duplicator Free'); ?>
		<div style="padding: 10px">
			<i class="far fa-check-square"></i> <?php esc_html_e('Basic Features'); ?> <br/>
			<i class="far fa-square"></i> <a target="_blank" href="https://snapcreek.com/duplicator/comparison/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=pro_features&utm_campaign=duplicator_pro"><?php esc_html_e('Pro Features'); ?></a><br>
		</div>
	</td>
</tr>
<tr valign="top">
	<th scope="row"><label><?php esc_html_e("License Key"); ?></label></th>
	<td>
		<div class="description" style="max-width:700px">

            <b><?php esc_html_e("Duplicator Lite:", 'duplicator');  ?></b>

            <ul style="list-style-type:circle; margin-left:40px">
                <li>
                     <?php esc_html_e("The free version of Duplicator does not require a license key.", 'duplicator');  ?>
                </li>
                <li>
                    <?php
                        esc_html_e("If you would like to purchase the professional version you can ", 'duplicator');
                        echo '<a href="https://snapcreek.com/duplicator?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=duplicator_pro&utm_content=settings_license_get_copy_here_lite" target="_blank">' .  esc_html__("get a copy here", 'duplicator') . '</a>!';
                    ?>
                </li>
            </ul>

            <b><?php esc_html_e("Duplicator Pro:", 'duplicator');  ?></b>
            <ul style="list-style-type:circle; margin-left: 40px">
                <li>
                    <?php esc_html_e("The professional version is a separate plugin that you download and install. ", 'duplicator');  ?>
                </li>
                <li>
                    <?php esc_html_e("Download professional from the email sent after purchase or login to snapcreek.com", 'duplicator');  ?>
                </li>

            </ul>
		</div>
	</td>
</tr>
</table>



views/settings/schedule.php000064400000001766151336065400012063 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
	div.panel {padding: 20px 5px 10px 10px; text-align: center; }
</style>


<div class="panel">
    <img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/logo-dpro-300x50.png"  />

    <div class="txt-call-action-title">
        <i class="far fa-clock fa-sm"></i>	<?php echo esc_html__('Schedules are available in Duplicator Pro.', 'duplicator');	?>
    </div>

    <div class="txt-call-action-sub">
		<?php
			esc_html_e('Create robust schedules that automatically create packages while you sleep.', 'duplicator');
			echo '<br/>';
			esc_html_e('Simply choose your storage location and when you want it to run.', 'duplicator');
		?>
    </div>

    <a class="dup-btn-call-action" href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_settings_schedule_checkitout&utm_campaign=duplicator_pro" target="_blank">
        <?php esc_html_e('Check It Out!', 'duplicator') ?>
    </a>
</div>views/settings/storage.php000064400000021272151336065400011725 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
    div.panel {padding: 20px 5px 10px 10px;}
    div.area {font-size:16px; text-align: center; line-height: 30px; width:500px; margin:auto}
    ul.li {padding:2px}
</style>

<div class="panel">
    <?php
    $action_updated  = null;
    $action_response = esc_html__("Storage Settings Saved", 'duplicator');

    //SAVE RESULTS
    if (filter_input(INPUT_POST, 'action', FILTER_UNSAFE_RAW) === 'save') {
        //Nonce Check
        if (!wp_verify_nonce(filter_input(INPUT_POST, 'dup_storage_settings_save_nonce_field', FILTER_UNSAFE_RAW), 'dup_settings_save')) {
            die('Invalid token permissions to perform this request.');
        }

        DUP_Settings::Set('storage_htaccess_off', filter_input(INPUT_POST, 'storage_htaccess_off', FILTER_VALIDATE_BOOLEAN));

        switch (filter_input(INPUT_POST, 'storage_position', FILTER_DEFAULT)) {
            case DUP_Settings::STORAGE_POSITION_LECAGY:
                $setPostion = DUP_Settings::STORAGE_POSITION_LECAGY;
                break;
            case DUP_Settings::STORAGE_POSITION_WP_CONTENT:
            default:
                $setPostion = DUP_Settings::STORAGE_POSITION_WP_CONTENT;
                break;
        }

        if (DUP_Settings::setStoragePosition($setPostion) != true) {
            $targetFolder = ($setPostion === DUP_Settings::STORAGE_POSITION_WP_CONTENT) ? DUP_Settings::getSsdirPathWpCont() : DUP_Settings::getSsdirPathLegacy();
            ?>
            <div id="message" class="notice notice-error is-dismissible">
                <p>
                    <b><?php esc_html_e('Storage folder move problem'); ?></b>
                </p>
                <p>
                    <?php echo sprintf(__('Duplicator can\'t change the storage folder to <i>%s</i>', 'duplicator'), esc_html($targetFolder)); ?><br>
                    <?php echo sprintf(__('Check the parent folder permissions. ( <i>%s</i> )', 'duplicator'), esc_html(dirname($targetFolder))); ?>
                </p>
            </div>
            <?php
        }
        DUP_Settings::Save();
        $action_updated = true;
    }
    ?>

    <?php
    $storage_position     = DUP_Settings::Get('storage_position');
    $storage_htaccess_off = DUP_Settings::Get('storage_htaccess_off');
    ?>
    <form id="dup-settings-form" action="<?php echo admin_url('admin.php?page=duplicator-settings&tab=storage'); ?>" method="post">
        <?php wp_nonce_field('dup_settings_save', 'dup_storage_settings_save_nonce_field', false); ?>
        <input type="hidden" name="action" value="save">
        <input type="hidden" name="page"   value="duplicator-settings">

        <?php if ($action_updated) : ?>
            <div id="message" class="notice notice-success is-dismissible dup-wpnotice-box"><p><?php echo esc_html($action_response); ?></p></div>
        <?php endif; ?>

        <table class="form-table">
            <tr valign="top">
                <th scope="row"><label><?php esc_html_e("Location", 'duplicator'); ?></label></th>
                <td>
                    <p>
                        <label>
                            <input type="radio" name="storage_position" 
                                   value="<?php echo DUP_Settings::STORAGE_POSITION_LECAGY; ?>" 
                                   <?php checked($storage_position === DUP_Settings::STORAGE_POSITION_LECAGY); ?> >
                            <span class="storage_pos_fixed_label"><?php esc_html_e('Legacy Path:', 'duplicator'); ?></span>
                            <i><?php echo DUP_Settings::getSsdirPathLegacy(); ?></i>
                        </label>
                    </p>
                    <p>
                        <label>
                            <input type="radio" name="storage_position"
                                   value="<?php echo DUP_Settings::STORAGE_POSITION_WP_CONTENT; ?>"
                                   <?php checked($storage_position === DUP_Settings::STORAGE_POSITION_WP_CONTENT); ?> >
                            <span class="storage_pos_fixed_label" ><?php esc_html_e('Contents Path:', 'duplicator'); ?></span>
                            <i><?php echo DUP_Settings::getSsdirPathWpCont(); ?></i>
                        </label>
                    </p>
                    <p class="description" style="max-width:800px">
                        <?php
                        esc_html_e("The storage location is where all package files are stored to disk. If your host has troubles writing content to the 'Legacy Path' then use "
                            . "the 'Contents Path'.  Upon clicking the save button all files are moved to the new location and the previous path is removed.", 'duplicator');
                        ?><br/>

                        <i class="fas fa-server fa-sm"></i>&nbsp;
                        <span id="duplicator_advanced_storage_text" class="link-style">[<?php esc_html_e("More Advanced Storage Options...", 'duplicator'); ?>]</span>
                    </p>
                </td>
            </tr>
            <tr valign="top">
                <th scope="row"><label><?php esc_html_e("Apache .htaccess", 'duplicator'); ?></label></th>
                <td>
                    <input type="checkbox" name="storage_htaccess_off" id="storage_htaccess_off" <?php echo ($storage_htaccess_off) ? 'checked="checked"' : ''; ?> />
                    <label for="storage_htaccess_off"><?php esc_html_e("Disable .htaccess file in storage directory", 'duplicator') ?> </label>
                    <p class="description">
                        <?php 
                            esc_html_e("When checked this setting will prevent Duplicator from laying down an .htaccess file in the storage location above.", 'duplicator');
                            echo '<br/>';
                            esc_html_e("Only disable this option if issues occur when downloading either the installer/archive files.", 'duplicator');
                        ?>
                    </p>
                </td>
            </tr>
        </table>
        <p class="submit" style="margin: 20px 0px 0xp 5px;">
            <br/>
            <input type="submit" name="submit" id="submit" class="button-primary" value="<?php esc_attr_e("Save Storage Settings", 'duplicator') ?>" style="display: inline-block;" />
        </p>
    </form>
    <br/>
</div>
<!-- ==========================================
THICK-BOX DIALOGS: -->
<?php

function dup_lite_storage_advanced_pro_content()
{
    ob_start();
    ?>
    <div style="text-align: center">
        <img src="<?php echo esc_url(DUPLICATOR_PLUGIN_URL."assets/img/logo-dpro-300x50.png"); ?>" style="height:50px; width:250px" /><br/>
        <?php 
                esc_html_e('Store to Multiple Endpoints', 'duplicator');
                echo '<br/>';
                esc_html_e('with Duplicator Pro', 'duplicator');
        ?>
  
        <div style="text-align: left; margin:auto; width:200px">
            <ul>
                <li><i class="fab fa-amazon"></i>&nbsp;<?php esc_html_e('Amazon S3', 'duplicator'); ?></li>
                <li><i class="fab fa-dropbox"></i>&nbsp;<?php esc_html_e(' Dropbox', 'duplicator'); ?></li>
                <li><i class="fab fa-google-drive"></i>&nbsp;<?php esc_html_e('Google Drive', 'duplicator'); ?></li>
                <li><i class="fa fa-cloud fa-sm"></i>&nbsp;<?php esc_html_e('One Drive', 'duplicator'); ?></li>
                <li><i class="fas fa-network-wired"></i>&nbsp;<?php esc_html_e('FTP &amp; SFTP', 'duplicator'); ?></li>
                <li><i class="fas fa-hdd"></i>&nbsp;<?php esc_html_e('Custom Directory', 'duplicator'); ?></li>
            </ul>
        </div>
        <i>
        <?php esc_html_e('Set up one-time storage locations and automatically', 'duplicator'); ?><br>
        <?php esc_html_e('push the package to your destination.', 'duplicator'); ?>
        </i>
    </div>
    <p style="text-align: center">
        <a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_settings_storage_popup_green&utm_campaign=duplicator_pro"
           target="_blank"
           class="dup-btn-call-action" style="font-size:15px; padding:8px 10px; width: 120px">
            <?php esc_html_e('Learn More', 'duplicator'); ?>
        </a>
    </p>
    <?php
    return ob_get_clean();
}
$storageAlert          = new DUP_UI_Dialog();
$storageAlert->title   = __('Advanced Storage', 'duplicator');
$storageAlert->height  = 500;
$storageAlert->width   = 400;
$storageAlert->okText  = '';
$storageAlert->message = dup_lite_storage_advanced_pro_content();
$storageAlert->initAlert();
?>
<script>
    jQuery(document).ready(function ($) {
        $("#duplicator_advanced_storage_text").click(function () {
<?php $storageAlert->showAlert(); ?>
        });
    });
</script>views/settings/controller.php000064400000005275151336065400012451 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

DUP_Handler::init_error_handler();
DUP_Util::hasCapability('export');

global $wpdb;

//COMMON HEADER DISPLAY
require_once(DUPLICATOR_PLUGIN_PATH . '/assets/js/javascript.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/classes/ui/class.ui.dialog.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/classes/ui/class.ui.messages.php');

$current_tab = isset($_REQUEST['tab']) ? sanitize_text_field($_REQUEST['tab']) : 'general';
?>

<div class="wrap">
    <?php duplicator_header(__("Settings", 'duplicator')) ?>

	<h2 class="nav-tab-wrapper">
        <a href="?page=duplicator-settings&tab=general" class="nav-tab <?php echo ($current_tab == 'general') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('General', 'duplicator'); ?></a>
		<a href="?page=duplicator-settings&tab=package" class="nav-tab <?php echo ($current_tab == 'package') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Packages', 'duplicator'); ?></a>
		<a href="?page=duplicator-settings&tab=schedule" class="nav-tab <?php echo ($current_tab == 'schedule') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Schedules', 'duplicator'); ?></a>
        <a href="?page=duplicator-settings&tab=storage" class="nav-tab <?php echo ($current_tab == 'storage') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Storage', 'duplicator'); ?></a>
		<a href="?page=duplicator-settings&tab=import" class="nav-tab <?php echo ($current_tab == 'import') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Import', 'duplicator'); ?></a>
		<a href="?page=duplicator-settings&tab=license" class="nav-tab <?php echo ($current_tab == 'license') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('License', 'duplicator'); ?></a>
        <a href="?page=duplicator-settings&tab=about" class="nav-tab <?php echo ($current_tab == 'about') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('About', 'duplicator'); ?></a>
    </h2>

    <?php
    switch ($current_tab) {
        case 'general': include(DUPLICATOR_PLUGIN_PATH."views/settings/general.php");
            break;
		case 'package': include(DUPLICATOR_PLUGIN_PATH."views/settings/packages.php");
            break;
		case 'schedule': include(DUPLICATOR_PLUGIN_PATH."views/settings/schedule.php");
            break;
        case 'storage': include(DUPLICATOR_PLUGIN_PATH."views/settings/storage.php");
            break;
        case 'import': include(DUPLICATOR_PLUGIN_PATH."views/settings/import.php");
            break;
        case 'license': include(DUPLICATOR_PLUGIN_PATH."views/settings/license.php");
            break;
        case 'about': include(DUPLICATOR_PLUGIN_PATH."views/settings/about-info.php");
            break;
    }
    ?>
</div>views/settings/about-info.php000064400000022152151336065400012322 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
/*================================================
PAGE-SUPPORT:*/
div.dup-support-all {font-size:13px; line-height:20px}
table.dup-support-hlp-hdrs {border-collapse:collapse; width:100%; border-bottom:1px solid #dfdfdf}
table.dup-support-hlp-hdrs {background-color:#efefef;}
table.dup-support-hlp-hdrs td {
	padding:2px; height:52px;
	font-weight:bold; font-size:17px;
	background-image:-ms-linear-gradient(top, #FFFFFF 0%, #DEDEDE 100%);
	background-image:-moz-linear-gradient(top, #FFFFFF 0%, #DEDEDE 100%);
	background-image:-o-linear-gradient(top, #FFFFFF 0%, #DEDEDE 100%);
	background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #FFFFFF), color-stop(1, #DEDEDE));
	background-image:-webkit-linear-gradient(top, #FFFFFF 0%, #DEDEDE 100%);
	background-image:linear-gradient(to bottom, #FFFFFF 0%, #DEDEDE 100%);
}
table.dup-support-hlp-hdrs td img{margin-left:7px}
div.dup-support-hlp-txt{padding:10px 4px 4px 4px; text-align:center}
div.dup-support-give-area {width:250px; height:225px; float:left; border:1px solid #dfdfdf; border-radius:4px; margin:10px; line-height:18px;box-shadow: 0 8px 6px -6px #ccc;}
div.dup-spread-word {display:inline-block; border:1px solid red; text-align:center}

img#dup-support-approved { -webkit-animation:approve-keyframe 12s 1s infinite alternate backwards}
img#dup-img-5stars {opacity:0.7;}
img#dup-img-5stars:hover {opacity:1.0;}
div.social-item {float:right; width: 170px; padding:10px; border:0px solid red; text-align: left; font-size:20px}

/* EMAIL AREA */
div.dup-support-email-area {width:825px; height:355px; border:1px solid #dfdfdf; border-radius:4px; margin:10px; line-height:18px;box-shadow: 0 8px 6px -6px #ccc;}
#mce-EMAIL {font-size:20px; height:40px; width:500px}
#mce-responses {width:300px}
#mc-embedded-subscribe { height: 35px; font-size: 16px; font-weight: bold}
div.mce_inline_error {width:300px; margin: auto !important}
div#mce-responses {margin: auto; padding: 10px; width:500px; font-weight: bold;}
</style>


<div class="wrap dup-wrap dup-support-all">
<div style="width:850px; margin:auto; margin-top: 20px">
	<table style="width:825px">
		<tr>
			<td style="width:230px">
				<img src="<?php echo esc_url(DUPLICATOR_PLUGIN_URL."assets/img/logo-box.png"); ?>" style='text-align:top; margin:0; height:196px; width:196px'  />
			</td>
			<td valign="top" style="padding-top:10px; font-size:14px">
				<?php
				esc_html_e("Duplicator can streamline your workflow and quickly clone/migrate a WordPress site. The plugin helps admins, designers and developers speed up the "
					. "migration process of moving a WordPress site. Please help us continue development by giving the plugin a 5 star.", 'duplicator');
				?>

				<!-- PARTNER WITH US -->
				<div class="dup-support-give-area">
					<table class="dup-support-hlp-hdrs">
						<tr >
							<td style="height:30px; text-align: center;">
								<span style="display: inline-block; margin-top: 5px"><?php esc_html_e('Rate Duplicator', 'duplicator') ?></span>
							</td>
						</tr>
					</table>
					<table style="text-align: center;width:100%; font-size:11px; font-style:italic; margin-top:35px">
						<tr>
							<td valign="top">
								<a href="https://wordpress.org/support/plugin/duplicator/reviews/?filter=5" target="vote-wp"><img id="dup-img-5stars" src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/5star.png" /></a>
								<div  style=" font-size: 16px; font-weight: bold; line-height: 22px">
									<a href="https://wordpress.org/support/plugin/duplicator/reviews/?filter=5" target="vote-wp">
										<?php
											esc_html_e('Support Duplicator', 'duplicator');
											echo '<br/>';
											esc_html_e('with a 5 star review!', 'duplicator')
										?>
									</a>
								</div>
							</td>
						</tr>
					</table>
				</div>

				<!-- SPREAD THE WORD  -->
				<div class="dup-support-give-area">
					<table class="dup-support-hlp-hdrs">
						<tr>
							<td style="height:30px; text-align: center;">
								<span style="display: inline-block; margin-top: 5px"><?php esc_html_e('Spread the Word', 'duplicator') ?></span>
							</td>
						</tr>
					</table>
					<div class="dup-support-hlp-txt">
						<br/>
						<div class="social-images">
							<a href="https://www.facebook.com/sharer/sharer.php?u=https%3A//snapcreek.com/duplicator/duplicator-free/" target="_blank">
								<div class="social-item"><i class="fab fa-facebook-square fa-lg"></i> <?php esc_html_e('Facebook', 'duplicator') ?></div>
							</a>
							<a href="https://twitter.com/home?status=Checkout%20the%20WordPress%20Duplicator%20plugin!%20%0Ahttps%3A//snapcreek.com/duplicator/duplicator-free/"  target="_blank">
								<div class="social-item"><i class="fab fa-twitter-square fa-lg"></i> <?php esc_html_e('Twitter', 'duplicator') ?></div>
							</a>
							<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A//snapcreek.com/duplicator/duplicator-free/&title=WordPress%20Duplicator%20Plugin&summary=&source=" target="_blank">
								<div class="social-item"><i class="fab fa-linkedin fa-lg"></i> <?php esc_html_e('LinkedIn', 'duplicator') ?></div>
							</a>
						</div>
					</div>
				</div>
				<br style="clear:both" /><br/>


			</td>
		</tr>
	</table><br/>



	<!-- STAY IN THE LOOP  -->
	<div class="dup-support-email-area">
		<table class="dup-support-hlp-hdrs">
			<tr>
				<td style="height:30px; text-align: center;">
					<span style="display: inline-block; margin-top: 5px"><?php esc_html_e('Stay in the Loop', 'duplicator') ?></span>
				</td>
			</tr>
		</table>
		<div class="dup-support-hlp-txt">
			<div class="email-box">
				<div class="email-area">
					<!-- Begin MailChimp Signup Form -->
					<div class="email-form">
						<div style="width:425px; padding: 5px 0 15px 0; text-align: center; font-style: italic; margin: auto">
							<?php esc_html_e('Subscribe to the Duplicator newsletter and stay on top of great ideas, tutorials, and better ways to improve your workflows', 'duplicator') ?>...
						</div>


						<div id="mc_embed_signup">
							<form action="//snapcreek.us11.list-manage.com/subscribe/post?u=e2a9a514bfefa439bf2b7cf16&amp;id=1270a169c1" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
								<div id="mc_embed_signup_scroll">
									<div class="mc-field-group">
										<input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL" placeholder="Your Best Email *">
									</div>
									<div id="mce-responses" class="clear">
										<div class="response" id="mce-error-response" style="display:none"></div>
										<div class="response" id="mce-success-response" style="display:none"></div>
									</div>
									<div style="position:absolute; left:-5000px;"><input type="text" name="b_e2a9a514bfefa439bf2b7cf16_1270a169c1" tabindex="-1" value=""></div>
									<div style="margin: auto; text-align: center">
										<input disabled="disabled" type="submit" class="button-primary button-large" value="Sign me up!" name="subscribe" id="mc-embedded-subscribe" >
									</div>
									<!-- Forces the submission to use Duplicator group -->
									<input style="display:none" checked="checked" type="checkbox" value="1" name="group[15741][1]" id="mce-group[15741]-15741-0">
								</div>
								<div style="margin-top:10px; margin-left:100px; width: 650px;text-align:left">
									<small>
										<input type="checkbox" name="privacy" id="privacy-checkbox" />
										<label for="privacy-checkbox" style="padding-left:5px; display:block; margin-top:-20px; margin-left:20px;">Check box  this box if you would like us to contact you by email with helpful information about Duplicator and other Snap Creek products.<br/></br> We will process your data in accordance with our <a target="_blank" href="//snapcreek.com/privacy-policy">privacy policy</a>. You may withdraw this consent at any time by <a target="_blank" href="mailto:admin@snapcreek.com">emailing us</a> or updating your information by clicking the unsubscribe link in the emails you receive.</span></label>
									</small>

								</div>
							</form>
						</div>
					</div>

					<script type='text/javascript' src='//s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js'></script>
					<script type='text/javascript'>(function($) {window.fnames = new Array(); window.ftypes = new Array();fnames[0]='EMAIL';ftypes[0]='email';fnames[1]='FNAME';ftypes[1]='text';fnames[2]='LNAME';ftypes[2]='text';}(jQuery));var $mcj = jQuery.noConflict(true);</script>
					<!--End mc_embed_signup-->
				</div>
			</div>



		</div>
	</div>
	<br style="clear:both" /><br/>

</div>
</div><br/><br/><br/><br/>
<script>
	jQuery(document).ready(function($)
	{
        $('input[type="checkbox"][name="privacy"]').change(function() {
        if(this.checked) {
             $("#mc-embedded-subscribe").prop("disabled", false);
         } else {
             $("#mc-embedded-subscribe").prop("disabled", true);
         }

        });
    });
</script>views/settings/import.php000064400000002117151336065400011570 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
	div.panel {padding: 20px 5px 10px 10px; text-align: center; }
</style>

<div class="panel">
    <img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/logo-dpro-300x50.png"  />

    <div class="txt-call-action-title">
        <?php echo '<i class="fas fa-arrow-alt-circle-down"></i> ' .  esc_html__('Drag and Drop Imports are available in Duplicator Pro.', 'duplicator'); ?>
    </div>
    <div class="txt-call-action-sub">
        <?php
			esc_html_e('The Import feature lets you skip the FTP and database creation steps when installing a site.', 'duplicator');
            echo '<br/>';
			esc_html_e('Just drag and drop a Duplicator Pro archive to quickly replace an existing WordPress installation!', 'duplicator');
		?>
    </div>

    <a class="dup-btn-call-action" href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_tools_imports_checkitout&utm_campaign=duplicator_pro" target="_blank">
        <?php esc_html_e('Check It Out!', 'duplicator') ?>
    </a>
</div>
views/settings/packages.php000064400000060277151336065400012047 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

global $wp_version;
global $wpdb;

$action_updated     = null;
$action_response    = __("Package Settings Saved", 'duplicator');
$mysqldump_exe_file = '';

//SAVE RESULTS
if (isset($_POST['action']) && $_POST['action'] == 'save') {

    //Nonce Check
    $nonce = sanitize_text_field($_POST['dup_settings_save_nonce_field']);
    if (!isset($_POST['dup_settings_save_nonce_field']) || !wp_verify_nonce($nonce, 'dup_settings_save')) {
        die('Invalid token permissions to perform this request.');
    }

    //Package
    $mysqldump_enabled = isset($_POST['package_dbmode']) && $_POST['package_dbmode'] == 'mysql' ? "1" : "0";
    if (isset($_POST['package_mysqldump_path'])) {
        $mysqldump_exe_file = DupLiteSnapLibUtil::sanitize_non_stamp_chars_newline_and_trim($_POST['package_mysqldump_path']);
        $mysqldump_exe_file = preg_match('/^([A-Za-z]\:)?[\/\\\\]/', $mysqldump_exe_file) ? $mysqldump_exe_file : '';
        $mysqldump_exe_file = preg_replace('/[\'";]/m', '', $mysqldump_exe_file);
        $mysqldump_exe_file = DUP_Util::safePath($mysqldump_exe_file);
        $mysqldump_exe_file = DUP_DB::escSQL(strip_tags($mysqldump_exe_file), true);
    }

    DUP_Settings::Set('last_updated', date('Y-m-d-H-i-s'));
    DUP_Settings::Set('package_zip_flush', isset($_POST['package_zip_flush']) ? "1" : "0");
    DUP_Settings::Set('archive_build_mode', sanitize_text_field($_POST['archive_build_mode']));
    DUP_Settings::Set('package_mysqldump', $mysqldump_enabled ? "1" : "0");
    DUP_Settings::Set('package_phpdump_qrylimit', isset($_POST['package_phpdump_qrylimit']) ? $_POST['package_phpdump_qrylimit'] : "100");
    DUP_Settings::Set('package_mysqldump_path', $mysqldump_exe_file);
    DUP_Settings::Set('package_ui_created', sanitize_text_field($_POST['package_ui_created']));

    switch (filter_input(INPUT_POST, 'installer_name_mode', FILTER_DEFAULT)) {
        case DUP_Settings::INSTALLER_NAME_MODE_WITH_HASH:
            DUP_Settings::Set('installer_name_mode', DUP_Settings::INSTALLER_NAME_MODE_WITH_HASH);
            break;
        case DUP_Settings::INSTALLER_NAME_MODE_SIMPLE:
        default:
            DUP_Settings::Set('installer_name_mode', DUP_Settings::INSTALLER_NAME_MODE_SIMPLE);
            break;
    }

    $action_updated = DUP_Settings::Save();
    DUP_Util::initSnapshotDirectory();
}

$is_shellexec_on        = DUP_Util::hasShellExec();
$package_zip_flush      = DUP_Settings::Get('package_zip_flush');
$phpdump_chunkopts      = array("20", "100", "500", "1000", "2000");
$phpdump_qrylimit       = DUP_Settings::Get('package_phpdump_qrylimit');
$package_mysqldump      = DUP_Settings::Get('package_mysqldump');
$package_mysqldump_path = trim(DUP_Settings::Get('package_mysqldump_path'));
$package_ui_created     = is_numeric(DUP_Settings::Get('package_ui_created')) ? DUP_Settings::Get('package_ui_created') : 1;
$mysqlDumpPath          = DUP_DB::getMySqlDumpPath();
$mysqlDumpFound         = ($mysqlDumpPath) ? true : false;
$archive_build_mode     = DUP_Settings::Get('archive_build_mode');
$installerNameMode      = DUP_Settings::Get('installer_name_mode');
?>

<style>
    form#dup-settings-form input[type=text] {width:500px; }
    #dup-settings-form tr td { line-height: 1.6; }
    div.dup-feature-found {padding:10px 0 5px 0; color:green;}
    div.dup-feature-notfound {color:maroon; width:600px; line-height: 18px}
    select#package_ui_created {font-family: monospace}
    div.engine-radio {float: left; min-width: 100px}
    div.engine-sub-opts {padding:5px 0 10px 15px; display:none }
    i.lock-info {display:inline-block; width: 25px;}
</style>

<form id="dup-settings-form" action="<?php echo admin_url('admin.php?page=duplicator-settings&tab=package'); ?>" method="post">
    <?php wp_nonce_field('dup_settings_save', 'dup_settings_save_nonce_field', false); ?>
    <input type="hidden" name="action" value="save">
    <input type="hidden" name="page"   value="duplicator-settings">

    <?php if ($action_updated) : ?>
        <div id="message" class="notice notice-success is-dismissible dup-wpnotice-box"><p><?php echo esc_html($action_response); ?></p></div>
    <?php endif; ?>


    <h3 class="title"><?php esc_html_e("Database", 'duplicator') ?> </h3>
    <hr size="1" />
    <table class="form-table">
        <tr>
            <th scope="row"><label><?php esc_html_e("SQL Mode", 'duplicator'); ?></label></th>
            <td>
                <div class="engine-radio <?php echo ($is_shellexec_on) ? '' : 'engine-radio-disabled'; ?>">
                    <input type="radio" name="package_dbmode" value="mysql" id="package_mysqldump" <?php echo ($package_mysqldump) ? 'checked="checked"' : ''; ?> />
                    <label for="package_mysqldump"><?php esc_html_e("Mysqldump", 'duplicator'); ?></label>
                </div>

                <div class="engine-radio" >
                    <!-- PHP MODE -->
                    <?php if (!$mysqlDumpFound) : ?>
                        <input type="radio" name="package_dbmode" id="package_phpdump" value="php" checked="checked" />
                    <?php else : ?>
                        <input type="radio" name="package_dbmode" id="package_phpdump" value="php" <?php echo (!$package_mysqldump) ? 'checked="checked"' : ''; ?> />
                    <?php endif; ?>
                    <label for="package_phpdump"><?php esc_html_e("PHP Code", 'duplicator'); ?></label>
                </div>

                <br style="clear:both"/><br/>

                <!-- SHELL EXEC  -->
                <div class="engine-sub-opts" id="dbengine-details-1" style="display:none">
                    <?php if (!$is_shellexec_on) : ?>
                        <p class="description" style="width:550px; margin:5px 0 0 20px">
                            <?php
                            _e("This server does not support the PHP shell_exec or exec function which is required for mysqldump to run. ", 'duplicator');
                            _e("Please contact the host or server administrator to enable this feature.", 'duplicator');
                            ?>
                            <br/>
                            <small>
                                <i style="cursor: pointer"
                                   data-tooltip-title="<?php esc_html_e("Host Recommendation:", 'duplicator'); ?>"
                                   data-tooltip="<?php esc_html_e('Duplicator recommends going with the high performance pro plan or better from our recommended list', 'duplicator'); ?>">
                                    <i class="far fa-lightbulb" aria-hidden="true"></i>
                                    <?php
                                    printf("%s <a target='_blank' href='//snapcreek.com/wordpress-hosting/'>%s</a> %s",
                                        __("Please visit our recommended", 'duplicator'),
                                        __("host list", 'duplicator'),
                                        __("for reliable access to mysqldump", 'duplicator'));
                                    ?>
                                </i>
                            </small>
                            <br/><br/>
                        </p>
                    <?php else : ?>
                        <div style="margin:0 0 0 15px">
                            <?php if ($mysqlDumpFound) : ?>
                                <div class="dup-feature-found">
                                    <i class="fa fa-check-circle"></i>
                                    <?php esc_html_e("Successfully Found:", 'duplicator'); ?> &nbsp;
                                    <i><?php echo esc_html($mysqlDumpPath); ?></i>
                                </div><br/>
                            <?php else : ?>
                                <div class="dup-feature-notfound">
                                    <i class="fa fa-exclamation-triangle fa-sm"></i>
                                    <?php
                                    _e('Mysqldump was not found at its default location or the location provided.  Please enter a custom path to a valid location where mysqldump can run.  '
                                        .'If the problem persist contact your host or server administrator.  ', 'duplicator');

                                    printf("%s <a target='_blank' href='//snapcreek.com/wordpress-hosting/'>%s</a> %s",
                                        __("See the", 'duplicator'),
                                        __("host list", 'duplicator'),
                                        __("for reliable access to mysqldump.", 'duplicator'));
                                    ?>
                                </div><br/>
                            <?php endif; ?>

                            <label><?php esc_html_e("Custom Path", 'duplicator'); ?></label>
                            <i class="fas fa-question-circle fa-sm"
                               data-tooltip-title="<?php esc_attr_e("mysqldump path:", 'duplicator'); ?>"
                               data-tooltip="<?php
                               esc_attr_e('Add a custom path if the path to mysqldump is not properly detected.   For all paths use a forward slash as the '
                                   .'path seperator.  On Linux systems use mysqldump for Windows systems use mysqldump.exe.  If the path tried does not work please contact your hosting '
                                   .'provider for details on the correct path.', 'duplicator');
                               ?>"></i>
                            <br/>
                            <input type="text" name="package_mysqldump_path" id="package_mysqldump_path" value="<?php echo esc_attr($package_mysqldump_path); ?>" placeholder="<?php esc_attr_e("/usr/bin/mypath/mysqldump", 'duplicator'); ?>" />
                            <div class="dup-feature-notfound">
                                <?php
                                if (!$mysqlDumpFound && strlen($mysqldump_exe_file)) {
                                    _e('<i class="fa fa-exclamation-triangle fa-sm"></i> The custom path provided is not recognized as a valid mysqldump file:<br/>', 'duplicator');
                                    $mysqldump_path = esc_html($package_mysqldump_path);
                                    echo "'".esc_html($mysqldump_path)."'";
                                }
                                ?>
                            </div>
                            <br/>
                        </div>

                    <?php endif; ?>
                </div>

                <!-- PHP OPTION -->
                <div class="engine-sub-opts" id="dbengine-details-2" style="display:none; line-height: 35px; margin:0 0 0 15px">
                    <!-- PRO ONLY -->
                    <label><?php esc_html_e("Mode", 'duplicator'); ?>:</label>
                    <select name="">
                        <option selected="selected" value="1">
                            <?php esc_html_e("Single-Threaded", 'duplicator'); ?>
                        </option>
                        <option  disabled="disabled"  value="0">
                            <?php esc_html_e("Multi-Threaded", 'duplicator'); ?>
                        </option>
                    </select>
                    <i style="margin-right:7px;" class="fas fa-question-circle fa-sm"
                       data-tooltip-title="<?php esc_attr_e("PHP Code Mode:", 'duplicator'); ?>"
                       data-tooltip="<?php
                       esc_attr_e('Single-Threaded mode attempts to create the entire database script in one request.  Multi-Threaded mode allows the database script '
                           .'to be chunked over multiple requests.  Multi-Threaded mode is typically slower but much more reliable especially for larger databases.', 'duplicator');
                       esc_attr_e('<br><br><i>Multi-Threaded mode is only available in Duplicator Pro.</i>', 'duplicator');
                       ?>"></i>
                    <div>
                        <label for="package_phpdump_qrylimit"><?php esc_html_e("Query Limit Size", 'duplicator'); ?>:</label> &nbsp;
                        <select name="package_phpdump_qrylimit" id="package_phpdump_qrylimit">
                            <?php
                            foreach ($phpdump_chunkopts as $value) {
                                $selected = ( $phpdump_qrylimit == $value ? "selected='selected'" : '' );
                                echo "<option {$selected} value='".esc_attr($value)."'>".number_format($value).'</option>';
                            }
                            ?>
                        </select>
                        <i class="fas fa-question-circle fa-sm"
                           data-tooltip-title="<?php esc_attr_e("PHP Query Limit Size", 'duplicator'); ?>"
                           data-tooltip="<?php esc_attr_e('A higher limit size will speed up the database build time, however it will use more memory.  If your host has memory caps start off low.', 'duplicator'); ?>"></i>

                    </div>
                </div>
            </td>
        </tr>
    </table>


    <h3 class="title"><?php esc_html_e("Archive", 'duplicator') ?> </h3>
    <hr size="1" />
    <table class="form-table">
        <tr>
            <th scope="row"><label><?php esc_html_e('Archive Engine', 'duplicator'); ?></label></th>
            <td>
                <div class="engine-radio">
                    <input type="radio" name="archive_build_mode" id="archive_build_mode1" onclick="Duplicator.Pack.ToggleArchiveEngine()"
                           value="<?php echo esc_attr(DUP_Archive_Build_Mode::ZipArchive); ?>" <?php echo ($archive_build_mode == DUP_Archive_Build_Mode::ZipArchive) ? 'checked="checked"' : ''; ?> />
                    <label for="archive_build_mode1"><?php esc_html_e('ZipArchive', 'duplicator'); ?></label>
                </div>

                <div class="engine-radio">
                    <input type="radio" name="archive_build_mode" id="archive_build_mode2"  onclick="Duplicator.Pack.ToggleArchiveEngine()"
                           value="<?php echo esc_attr(DUP_Archive_Build_Mode::DupArchive); ?>" <?php echo ($archive_build_mode == DUP_Archive_Build_Mode::DupArchive) ? 'checked="checked"' : ''; ?> />
                    <label for="archive_build_mode2"><?php esc_html_e('DupArchive'); ?></label> &nbsp; &nbsp;
                </div>

                <br style="clear:both"/>

                <!-- ZIPARCHIVE -->
                <div class="engine-sub-opts" id="engine-details-1" style="display:none">
                    <p class="description">
                        <?php
                        esc_html_e('Creates a archive format (archive.zip).', 'duplicator');
                        echo '<br/>';
                        esc_html_e('This option uses the internal PHP ZipArchive classes to create a Zip file.', 'duplicator');
                        ?>
                    </p>
                </div>

                <!-- DUPARCHIVE -->
                <div class="engine-sub-opts" id="engine-details-2" style="display:none">
                    <p class="description">
                        <?php
                        esc_html_e('Creates a custom archive format (archive.daf).', 'duplicator');
                        echo '<br/>';
                        esc_html_e('This option is recommended for large sites or sites on constrained servers.', 'duplicator');
                        ?>
                    </p>
                </div>
            </td>
        </tr>
        <tr>
            <th scope="row"><label><?php esc_html_e("Archive Flush", 'duplicator'); ?></label></th>
            <td>
                <input type="checkbox" name="package_zip_flush" id="package_zip_flush" <?php echo ($package_zip_flush) ? 'checked="checked"' : ''; ?> />
                <label for="package_zip_flush"><?php esc_html_e("Attempt Network Keep Alive", 'duplicator'); ?></label>
                <i style="font-size:12px">(<?php esc_html_e("enable only for large archives", 'duplicator'); ?>)</i>
                <p class="description">
                    <?php
                    esc_html_e("This will attempt to keep a network connection established for large archives.", 'duplicator');
                    echo '<br/>';
                    esc_html_e(" Valid only when Archive Engine for ZipArchive is enabled.");
                    ?>
                </p>
            </td>
        </tr>
    </table><br/>

    <h3 class="title" id="duplicator-installer-settings"><?php esc_html_e("Installer", 'duplicator') ?> </h3>
    <hr size="1" />
    <table class="form-table">
        <tr>
            <th scope="row"><label><?php esc_html_e("Name", 'duplicator'); ?></label></th>
            <td id="installer-name-mode-option" >
                <b><?php esc_html_e("Default 'Save as' name:", 'duplicator'); ?></b> <br/>
                <label>
                    <i class='fas fa-lock lock-info'></i><input type="radio" name="installer_name_mode"
                                                                value="<?php echo DUP_Settings::INSTALLER_NAME_MODE_WITH_HASH; ?>"
                                                                <?php checked($installerNameMode === DUP_Settings::INSTALLER_NAME_MODE_WITH_HASH); ?> />
                    [name]_[hash]_[date]_installer.php <i>(<?php esc_html_e("recommended", 'duplicator'); ?>)</i>
                </label><br>
                <label>
                    <i class='fas fa-lock-open lock-info'></i><input type="radio" name="installer_name_mode"
                                                                     value="<?php echo DUP_Settings::INSTALLER_NAME_MODE_SIMPLE; ?>"
                                                                     <?php checked($installerNameMode === DUP_Settings::INSTALLER_NAME_MODE_SIMPLE); ?> />
                                                                     <?php echo DUP_Installer::DEFAULT_INSTALLER_FILE_NAME_WITHOUT_HASH; ?>
                </label>
                <p class="description">
                    <?php esc_html_e("To understand the importance and usage of the installer name, please", 'duplicator') ?>
                    <a href="javascript:void(0)" onclick="jQuery('#dup-lite-inst-mode-details').toggle()"><?php esc_html_e("read this section", 'duplicator') ?> </a>.
                </p>
                <div id="dup-lite-inst-mode-details">
                    <p>
                        <i><?php esc_html_e('Using the full hashed format provides a higher level of security by helping to prevent the discovery of the installer file.', 'duplicator'); ?></i> <br/>
                        <b><?php esc_html_e('Hashed example', 'duplicator'); ?>:</b>  my-name_64fc6df76c17f2023225_19990101010101_installer.php
                    </p>
                    <p>
                        <?php
                        esc_html_e('The Installer \'Name\' setting specifies the name of the installer used at download-time. It\'s recommended you choose the hashed name to better protect the installer file.  '
                            .'Independent of the value of this setting, you can always change the name in the \'Save as\' file dialog at download-time. If you choose to use a custom name, use a filename that is '
                            .'known only to you. Installer filenames	must end in \'.php\'.', 'duplicator');
                        ?>
                    </p>
                    <p>
                        <?php
                        esc_html_e('It\'s important not to leave the installer files on the destination server longer than necessary.  '
                            .'After installing the migrated or restored site, just logon as a WordPress administrator and follow the prompts to have the plugin remove the files.  '
                            .'Alternatively, you can remove them manually.', 'duplicator');
                        ?>
                    </p>
                    <p>
                        <i class="fas fa-info-circle"></i>
                        <?php
                        esc_html_e('Tip: Each row on the packages screen includes a copy button that copies the installer name to the clipboard.  After clicking this button, paste the installer '
                            .'name into the URL you\'re using to install the destination site. This feature is handy when using the hashed installer name.', 'duplicator');
                        ?>
                    </p>
                </div>
            </td>
        </tr>
    </table>

    <h3 class="title"><?php esc_html_e("Visuals", 'duplicator') ?> </h3>
    <hr size="1" />
    <table class="form-table">
        <tr>
            <th scope="row"><label><?php esc_html_e("Created Format", 'duplicator'); ?></label></th>
            <td>
                <select name="package_ui_created" id="package_ui_created">
                    <!-- YEAR -->
                    <optgroup label="<?php esc_html_e("By Year", 'duplicator'); ?>">
                        <option value="1">Y-m-d H:i &nbsp;	[2000-01-05 12:00]</option>
                        <option value="2">Y-m-d H:i:s		[2000-01-05 12:00:01]</option>
                        <option value="3">y-m-d H:i &nbsp;	[00-01-05   12:00]</option>
                        <option value="4">y-m-d H:i:s		[00-01-05   12:00:01]</option>
                    </optgroup>
                    <!-- MONTH -->
                    <optgroup label="<?php esc_html_e("By Month", 'duplicator'); ?>">
                        <option value="5">m-d-Y H:i  &nbsp; [01-05-2000 12:00]</option>
                        <option value="6">m-d-Y H:i:s		[01-05-2000 12:00:01]</option>
                        <option value="7">m-d-y H:i  &nbsp; [01-05-00   12:00]</option>
                        <option value="8">m-d-y H:i:s		[01-05-00   12:00:01]</option>
                    </optgroup>
                    <!-- DAY -->
                    <optgroup label="<?php esc_html_e("By Day", 'duplicator'); ?>">
                        <option value="9"> d-m-Y H:i &nbsp;	[05-01-2000 12:00]</option>
                        <option value="10">d-m-Y H:i:s		[05-01-2000 12:00:01]</option>
                        <option value="11">d-m-y H:i &nbsp;	[05-01-00	12:00]</option>
                        <option value="12">d-m-y H:i:s		[05-01-00	12:00:01]</option>
                    </optgroup>
                </select>
                <p class="description">
                    <?php esc_html_e("The UTC date format shown in the 'Created' column on the Packages screen.", 'duplicator'); ?> <br/>
                    <small><?php esc_html_e("To use WordPress timezone formats consider an upgrade to Duplicator Pro.", 'duplicator'); ?></small>
                </p>
            </td>
        </tr>
    </table><br/>


    <p class="submit" style="margin: 20px 0px 0xp 5px;">
        <br/>
        <input type="submit" name="submit" id="submit" class="button-primary" value="<?php esc_attr_e("Save Package Settings", 'duplicator') ?>" style="display: inline-block;" />
    </p>
</form>

<script>
    jQuery(document).ready(function ($)
    {
        Duplicator.Pack.SetDBEngineMode = function ()
        {
            var isMysqlDump = $('#package_mysqldump').is(':checked');
            var isPHPMode = $('#package_phpdump').is(':checked');
            var isPHPChunkMode = $('#package_phpchunkingdump').is(':checked');

            $('#dbengine-details-1, #dbengine-details-2').hide();
            switch (true) {
                case isMysqlDump :
                    $('#dbengine-details-1').show();
                    break;
                case isPHPMode	 :
                case isPHPChunkMode :
                    $('#dbengine-details-2').show();
                    break;
            }
        };

        Duplicator.Pack.ToggleArchiveEngine = function ()
        {
            $('#engine-details-1, #engine-details-2').hide();
            if ($('#archive_build_mode1').is(':checked')) {
                $('#engine-details-1').show();
                $('#package_zip_flush').removeAttr('disabled');
            } else {
                $('#engine-details-2').show();
                $('#package_zip_flush').attr('disabled', true);
            }
        };

        Duplicator.Pack.SetDBEngineMode();
        $('#package_mysqldump , #package_phpdump').change(function () {
            Duplicator.Pack.SetDBEngineMode();
        });
        Duplicator.Pack.ToggleArchiveEngine();

        $('#package_ui_created').val(<?php echo esc_js($package_ui_created); ?>);

    });
</script>views/packages/index.php000064400000000016151336065400011277 0ustar00<?php
//silentviews/packages/controller.php000064400000005501151336065400012357 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

DUP_Handler::init_error_handler();
DUP_Util::hasCapability('export');

global $wpdb;

//COMMON HEADER DISPLAY
require_once(DUPLICATOR_PLUGIN_PATH . '/assets/js/javascript.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');

$current_view =  (isset($_REQUEST['action']) && $_REQUEST['action'] == 'detail') ? 'detail' : 'main';

$download_installer_nonce = wp_create_nonce('duplicator_download_installer');
?>
<script>
    jQuery(document).ready(function($) {

        Duplicator.Pack.DownloadInstaller = function (json)
        {
            var actionLocation = ajaxurl + '?action=duplicator_download_installer&id=' + json.id + '&hash='+ json.hash +'&nonce=' + '<?php echo $download_installer_nonce; ?>';
            location.href      = actionLocation;
            return false;
        };

        Duplicator.Pack.DownloadFile = function(json)
        {
            var link = document.createElement('a');        
            link.target = "_blank";
            link.download = json.filename;
            link.href= json.url;
            document.body.appendChild(link);
            
            // click event fire
            if (document.dispatchEvent) {
                // First create an event
                var click_ev = document.createEvent("MouseEvents");
                // initialize the event
                click_ev.initEvent("click", true /* bubble */, true /* cancelable */);
                // trigger the event
                link.dispatchEvent(click_ev);
            } else if (document.fireEvent) {
                link.fireEvent('onclick');
            } else if (link.click()) {
                link.click()
            }

            document.body.removeChild(link);
            return false;
        };


        /*	----------------------------------------
         * METHOD: Toggle links with sub-details */
        Duplicator.Pack.ToggleSystemDetails = function(event) {
            if ($(this).parents('div').children(event.data.selector).is(":hidden")) {
                $(this).children('span').addClass('ui-icon-triangle-1-s').removeClass('ui-icon-triangle-1-e');
                ;
                $(this).parents('div').children(event.data.selector).show(250);
            } else {
                $(this).children('span').addClass('ui-icon-triangle-1-e').removeClass('ui-icon-triangle-1-s');
                $(this).parents('div').children(event.data.selector).hide(250);
            }
        }
    });
</script>

<div class="wrap">
    <?php 
		    switch ($current_view) {
				case 'main': include(DUPLICATOR_PLUGIN_PATH.'views/packages/main/controller.php'); break;
				case 'detail' : include(DUPLICATOR_PLUGIN_PATH.'views/packages/details/controller.php'); break;
    }
    ?>
</div>views/packages/screen.php000064400000017351151336065400011461 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit; 

require_once DUPLICATOR_PLUGIN_PATH . '/classes/ui/class.ui.screen.base.php';

/*
Because the default way is overwriting the option names in the hidden input wp_screen_options[option]
I added all inputs via one option name and saved them with the update_user_meta function.
Also, the set-screen-option is not being triggered inside the class, that's why it's here. -TG
*/
add_filter('set-screen-option', 'dup_packages_set_option', 10, 3);
function dup_packages_set_option($status, $option, $value) {
    if('package_screen_options' == $option){
        $user_id = get_current_user_id();
    }
    return false;
}

class DUP_Package_Screen extends DUP_UI_Screen
{

	public function __construct($page)
    {
       add_action('load-'.$page, array($this, 'Init'));
    }

	public function Init()
	{
		$active_tab = isset($_GET['tab']) ? $_GET['tab'] : 'list';
		$active_tab = isset($_GET['action']) && $_GET['action'] == 'detail' ? 'detail' : $active_tab;
		$this->screen = get_current_screen();

		switch (strtoupper($active_tab)) {
			case 'LIST':	$content = $this->get_list_help();		break;
			case 'NEW1':	$content = $this->get_step1_help();		break;
			case 'NEW2':	$content = $this->get_step2_help(); 	break;
			case 'NEW3':	$content = $this->get_step3_help(); 	break;
			case 'DETAIL':	$content = $this->get_details_help(); 	break;
			default:
				$content = $this->get_list_help();
				break;
		}

		$guide = '#guide-packs';
		$faq   = '#faq-package';
		$content .= "<b>References:</b><br/>"
					. "<a href='".esc_url("https://snapcreek.com/duplicator/docs/guide/".$guide)."' target='_sc-guide'>User Guide</a> | "
					. "<a href='".esc_url("https://snapcreek.com/duplicator/docs/faqs-tech/".$faq)."' target='_sc-guide'>FAQs</a> | "
					. "<a href='https://snapcreek.com/duplicator/docs/quick-start/' target='_sc-guide'>Quick Start</a>";

		$this->screen->add_help_tab( array(
				'id'        => 'dup_help_package_overview',
				'title'     => esc_html__('Overview','duplicator'),
				'content'   => "<p>{$content}</p>"
			)
		);

		$this->getSupportTab($guide, $faq);
		$this->getHelpSidbar();
	}

	public function get_list_help()
	{
		return  __("<b><i class='fa fa-archive'></i> Packages » All</b><br/> The 'Packages' section is the main interface for managing all the packages that have been created.  "
				. "A Package consists of two core files, the 'archive.zip' and the 'installer.php' file.  The archive file is a zip file containing all your WordPress files and a "
				. "copy of your WordPress database.  The installer file is a php file that when browsed to via a web browser presents a wizard that redeploys/installs the website "
				. "by extracting the archive file and installing the database.   To create a package, click the 'Create New' button and follow the prompts. <br/><br/>"

                . "<b><i class='fa fa-download'></i> Downloads</b><br/>"
			    . "To download the package files click on the Installer and Archive buttons after creating a package.  The archive file will have a copy of the installer inside of it named "
				. "installer-backup.php in case the original installer file is lost.  To see the details of a package click on the <i class='fa fa-archive'></i> details button.<br/><br/>"

				. "<b><i class='far fa-file-archive'></i> Archive Types</b><br/>"
				. "An archive file can be saved as either a .zip file or .daf file.  A zip file is a common archive format used to compress and group files.  The daf file short for "
				. "'Duplicator Archive Format' is a custom format used specifically  for working with larger packages and scale-ability issues on many shared hosting platforms.  Both "
				. "formats work very similar.  The main difference is that the daf file can only be extracted using the installer.php file or the "
				. "<a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-052-q' target='_blank'>DAF extraction tool</a>.  The zip file can be used by the installer.php "
				. "or other zip tools like winrar/7zip/winzip or other client-side tools. <br/><br/>"
			,'duplicator');
	}


	public function get_step1_help()
	{
		return __("<b>Packages New » 1 Setup</b> <br/>"
				. "The setup step allows for optional filtered directory paths, files, file extensions and database tables.  To filter specific system files, click the 'Enable File Filters' "
				. "checkbox and add the full path of the file or directory, followed by a semicolon.  For a file extension add the name (i.e. 'zip') followed by a semicolon. <br/><br/>"

				. "To exclude a database table, check the box labeled 'Enable Table Filters' and check the table name to exclude. To include only a copy of your database in the "
				. "archive file check the box labeled 'Archive Only the Database'.  The installer.php file can optionally be pre-filled with data at install time but is not "
				. "required.  <br/><br/>",'duplicator');
	}


	public function get_step2_help()
	{
        $status1   = sprintf('%1$s Good %2$s',   '<span class="badge badge-pass">', '</span>');
        $status2   = sprintf('%1$s Notice %2$s', '<span class="badge badge-warn">', '</span>');

        //TITLE
        $msg   = sprintf('%1$s Packages » 2 Scan %2$s', '<b>', '</b><br/>');
        
        //MESSAGE
        $msg  .= sprintf(
				  'In Step-2 of the build process Duplicator scans your WordPress site files and database for any possible issues.  Each section is expandable '
                . 'and will show more details regarding the parameters of that section. The following indicators will be present for each section: %3$s'
                . '%1$s Indicates that no issues were detected.  It is best to try and get all the values to display this status if possible, but not required. %3$s'
                . '%2$s Indicates a possible issue.  A notice will not prevent the build from running however, if you do have issues then the section should be observed. %4$s',
                $status1,
                $status2,
                '<br/>',
                '<br/><br/>'
        );
        return $msg;
	}

	public function get_step3_help()
	{
		return __("<b>Packages » 3 Build</b> <br/>"
				. "The final step in the build process where the installer script and archive of the website can be downloaded.   To start the install process follow these steps: "
				. "<ol>"
				. "<li>Download the installer.php and archive.zip files to your local computer.</li>"
				. "<li>For localhost installs be sure you have PHP, Apache & MySQL installed on your local computer with software such as XAMPP, Instant WordPress or MAMP for MAC. "
				. "Place the package.zip and installer.php into any empty directory under your webroot then browse to the installer.php via your web browser to launch the install wizard.</li>"
				. "<li>For remote installs use FTP or cPanel to upload both the archive.zip and installer.php to your hosting provider. Place the files in a new empty directory under "
				. "your host's webroot accessible from a valid URL such as http://your-domain/your-wp-directory/installer.php to launch the install wizard. On some hosts the root directory "
				. "will be a something like public_html -or- www.  If your're not sure contact your hosting provider. </li>"
				. "</ol>"
				. "For complete instructions see:<br/>
					<a href='https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&amp;utm_medium=wordpress_plugin&amp;utm_content=package_built_install_help4&amp;utm_campaign=duplicator_free#quick-040-q' target='_blank'>
					How do I install this Package?</a><br/><br/>",'duplicator');
	}

	public function get_details_help()
	{
		return __("<b>Packages » Details</b> <br/>"
				. "The details view will give you a full break-down of the package including any errors that may have occured during the install. <br/><br/>",'duplicator');
	}

}


views/packages/main/s2.scan3.php000064400000136030151336065400012454 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
	/*IDE Helper*/
	/* @var $Package DUP_Package */
	function _duplicatorGetRootPath() {
		$txt   = __('Root Path', 'duplicator');
		$root  = duplicator_get_abs_path();
		$sroot = strlen($root) > 50 ? substr($root, 0, 50) . '...' : $root;
		echo "<div title=".str_replace('\\/', '/', json_encode($root))." class='divider'><i class='fa fa-folder-open'></i> {$sroot}</div>";
	}

$archive_type_label		=  DUP_Settings::Get('archive_build_mode') == DUP_Archive_Build_Mode::ZipArchive ? "ZipArchive" : "DupArchive";
$archive_type_extension =  DUP_Settings::Get('archive_build_mode') == DUP_Archive_Build_Mode::ZipArchive ? "zip" : "daf";
$duparchive_max_limit   = DUP_Util::readableByteSize(DUPLICATOR_MAX_DUPARCHIVE_SIZE);
$skip_archive_scan    = DUP_Settings::Get('skip_archive_scan');
?>

<!-- ================================================================
ARCHIVE -->
<div class="details-title">
	<i class="far fa-file-archive"></i>&nbsp;<?php esc_html_e('Archive', 'duplicator');?>
	<sup class="dup-small-ext-type"><?php echo esc_html($archive_type_extension); ?></sup>
	<div class="dup-more-details" onclick="Duplicator.Pack.showDetailsDlg()" title="<?php esc_attr_e('Show Scan Details', 'duplicator');?>"><i class="fa fa-window-maximize"></i></div>
</div>

<div class="scan-header scan-item-first">
	<i class="fas fa-folder-open"></i>
	<?php esc_html_e("Files", 'duplicator'); ?>
	
	<div class="scan-header-details">
		<div class="dup-scan-filter-status">
			<?php
				if ($Package->Archive->ExportOnlyDB) {
					echo '<i class="fa fa-filter fa-sm"></i> ';
					esc_html_e('Database Only', 'duplicator');
				} elseif ($Package->Archive->FilterOn) {
					echo '<i class="fa fa-filter fa-sm"></i> ';
					esc_html_e('Enabled', 'duplicator');
				}
			?>
		</div>
		<div id="data-arc-size1"></div>
		<i class="fa fa-question-circle data-size-help"
			data-tooltip-title="<?php esc_attr_e('Archive Size', 'duplicator'); ?>"
			data-tooltip="<?php esc_attr_e('This size includes only files BEFORE compression is applied. It does not include the size of the '
						. 'database script or any applied filters.  Once complete the package size will be smaller than this number.', 'duplicator'); ?>"></i>

		<div class="dup-data-size-uncompressed"><?php esc_html_e("uncompressed"); ?></div>
	</div>
</div>

<?php
if ($Package->Archive->ExportOnlyDB) { ?>
<div class="scan-item ">
	<div class='title' onclick="Duplicator.Pack.toggleScanItem(this);">
		<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Database Only', 'duplicator');?></div>
		<div id="only-db-scan-status"><div class="badge badge-warn"><?php esc_html_e("Notice", 'duplicator'); ?></div></div>
	</div>
    <div class="info">
        <?php esc_html_e("Only the database and a copy of the installer will be included in the archive file.  This notice simply indicates that the package "
            . "will not be capable of restoring a full WordPress site, but only the database.  If this is the desired intention then this notice can be ignored.", 'duplicator'); ?>
    </div>
</div>
<?php
} else if ($skip_archive_scan) { ?>
<div class="scan-item ">
	<div class='title' onclick="Duplicator.Pack.toggleScanItem(this);">
		<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Skip archive scan enabled', 'duplicator');?></div>
		<div id="skip-archive-scan-status"><div class="badge badge-warn"><?php esc_html_e("Notice", 'duplicator'); ?></div></div>
	</div>
    <div class="info">
        <?php esc_html_e("All file checks are skipped. This could cause problems during extraction if problematic files are included.", 'duplicator'); ?>
        <br><br>
        <b><?php esc_html_e(" Disable the advanced option to re-enable file controls.", 'duplicator'); ?></b>
    </div>
</div>
<?php
} else {
?>

<!-- ============
TOTAL SIZE -->
<div class="scan-item">
	<div class="title" onclick="Duplicator.Pack.toggleScanItem(this);">
		<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Size Checks', 'duplicator');?></div>
		<div id="data-arc-status-size"></div>
	</div>
	<div class="info" id="scan-itme-file-size">
		<b><?php esc_html_e('Size', 'duplicator');?>:</b> <span id="data-arc-size2"></span>  &nbsp; | &nbsp;
		<b><?php esc_html_e('File Count', 'duplicator');?>:</b> <span id="data-arc-files"></span>  &nbsp; | &nbsp;
		<b><?php esc_html_e('Directory Count', 'duplicator');?>:</b> <span id="data-arc-dirs"></span> <br/>
		<?php
			_e('Compressing larger sites on <i>some budget hosts</i> may cause timeouts.  ' , 'duplicator');
			echo "<i>&nbsp; <a href='javascipt:void(0)' onclick='jQuery(\"#size-more-details\").toggle(100);return false;'>[" . esc_html__('more details...', 'duplicator') . "]</a></i>";
		?>
		<div id="size-more-details">
			<?php
				echo "<b>" . esc_html__('Overview', 'duplicator') . ":</b><br/>";
				$dup_byte_size = '<b>' . DUP_Util::byteSize(DUPLICATOR_SCAN_SIZE_DEFAULT) . '</b>';
				printf(esc_html__('This notice is triggered at [%s] and can be ignored on most hosts.  If during the build process you see a "Host Build Interrupt" message then this '
					. 'host has strict processing limits.  Below are some options you can take to overcome constraints set up on this host.', 'duplicator'), $dup_byte_size);
				echo '<br/><br/>';

				echo "<b>" . esc_html__('Timeout Options', 'duplicator') . ":</b><br/>";
				echo '<ul>';
				echo '<li>' . esc_html__('Apply the "Quick Filters" below or click the back button to apply on previous page.', 'duplicator') . '</li>';
				echo '<li>' . esc_html__('See the FAQ link to adjust this hosts timeout limits: ', 'duplicator') . "&nbsp;<a href='https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=pkg_s2scan3_tolimits#faq-trouble-100-q' target='_blank'>" . esc_html__('What can I try for Timeout Issues?', 'duplicator') . '</a></li>';
				echo '<li>' . esc_html__('Consider trying multi-threaded support in ', 'duplicator');
				echo "<a href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=multithreaded_pro&utm_campaign=duplicator_pro' target='_blank'>" . esc_html__('Duplicator Pro.', 'duplicator') . "</a>";
				echo '</li>';
				echo '</ul>';

				$hlptxt = sprintf(__('Files over %1$s are listed below. Larger files such as movies or zipped content can cause timeout issues on some budget hosts.  If you are having '
				. 'issues creating a package try excluding the directory paths below or go back to Step 1 and add them.', 'duplicator'),
				DUP_Util::byteSize(DUPLICATOR_SCAN_WARNFILESIZE));
			?>
		</div>
		<script id="hb-files-large" type="text/x-handlebars-template">
			<div class="container">
				<div class="hdrs">
					<span style="font-weight:bold">
						<?php esc_html_e('Quick Filters', 'duplicator'); ?>
						<sup><i class="fas fa-question-circle fa-sm" data-tooltip-title="<?php esc_attr_e("Large Files", 'duplicator'); ?>" data-tooltip="<?php echo esc_attr($hlptxt); ?>"></i></sup>
					</span>
					<div class='hdrs-up-down'>
						<i class="fa fa-caret-up fa-lg dup-nav-toggle" onclick="Duplicator.Pack.toggleAllDirPath(this, 'hide')" title="<?php esc_attr_e("Hide All", 'duplicator'); ?>"></i>
						<i class="fa fa-caret-down fa-lg dup-nav-toggle" onclick="Duplicator.Pack.toggleAllDirPath(this, 'show')" title="<?php esc_attr_e("Show All", 'duplicator'); ?>"></i>
					</div>
				</div>
				<div class="data">
					<?php _duplicatorGetRootPath();	?>
					{{#if ARC.FilterInfo.Files.Size}}
						{{#each ARC.FilterInfo.TreeSize as |directory|}}
							<div class="directory">
								<i class="fa fa-caret-right fa-lg dup-nav" onclick="Duplicator.Pack.toggleDirPath(this)"></i> &nbsp;
								{{#if directory.iscore}}
									<i class="far fa-window-close chk-off" title="<?php esc_attr_e('Core WordPress directories should not be filtered. Use caution when excluding files.', 'duplicator'); ?>"></i>
								{{else}}
									<input type="checkbox" name="dir_paths[]" value="{{directory.dir}}" id="lf_dir_{{@index}}" onclick="Duplicator.Pack.filesOff(this)" />
								{{/if}}
								<label for="lf_dir_{{@index}}" title="{{directory.dir}}">
									<i class="size">[{{directory.size}}]</i> {{directory.sdir}}/
								</label> <br/>
								<div class="files">
									{{#each directory.files as |file|}}	
										<input type="checkbox" name="file_paths[]" value="{{file.path}}" id="lf_file_{{directory.dir}}-{{@index}}" />
										<label for="lf_file_{{directory.dir}}-{{@index}}" title="{{file.path}}">
											<i class="size">[{{file.bytes}}]</i>	{{file.name}}
										</label> <br/>
									{{/each}}
								</div>
							</div>
						{{/each}}
					{{else}}
						 <?php 
							if (! isset($_GET['retry'])) {
								_e('No large files found during this scan.', 'duplicator');
							} else {
								echo "<div style='color:maroon'>";
									_e('No large files found during this scan.  If you\'re having issues building a package click the back button and try '
									. 'adding a file filter to non-essential files paths like wp-content/uploads.   These excluded files can then '
									. 'be manually moved to the new location after you have ran the migration installer.', 'duplicator');
								echo "</div>";
							}
						?>
					{{/if}}
				</div>
			</div>


			<div class="apply-btn" style="margin-bottom:5px;float:right">
				<div class="apply-warn">
					 <?php esc_html_e('*Checking a directory will exclude all items recursively from that path down.  Please use caution when filtering directories.', 'duplicator'); ?>
				</div>
				<button type="button" class="button-small duplicator-quick-filter-btn" disabled="disabled" onclick="Duplicator.Pack.applyFilters(this, 'large')">
					<i class="fa fa-filter fa-sm"></i> <?php esc_html_e('Add Filters &amp; Rescan', 'duplicator');?>
				</button>
				<button type="button" class="button-small" onclick="Duplicator.Pack.showPathsDlg('large')" title="<?php esc_attr_e('Copy Paths to Clipboard', 'duplicator');?>">
					<i class="fa far fa-clipboard" aria-hidden="true"></i>
				</button>
			</div>
			<div style="clear:both"></div>


		</script>
		<div id="hb-files-large-result" class="hb-files-style"></div>
	</div>
</div>

<!-- ======================
ADDON SITES -->
<div id="addonsites-block"  class="scan-item">
	<div class='title' onclick="Duplicator.Pack.toggleScanItem(this);">
		<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Addon Sites', 'duplicator');?></div>
		<div id="data-arc-status-addonsites"></div>
	</div>
    <div class="info">
        <div style="margin-bottom:10px;">
            <?php
                printf(__('An "Addon Site" is a separate WordPress site(s) residing in subdirectories within this site. If you confirm these to be separate sites, '
					. 'then it is recommended that you exclude them by checking the corresponding boxes below and clicking the \'Add Filters & Rescan\' button.  To backup the other sites '
					. 'install the plugin on the sites needing to be backed-up.'));
            ?>
        </div>
        <script id="hb-addon-sites" type="text/x-handlebars-template">
            <div class="container">
                <div class="hdrs">
                    <span style="font-weight:bold">
                        <?php esc_html_e('Quick Filters', 'duplicator'); ?>
                    </span>
                </div>
                <div class="data">
                    {{#if ARC.FilterInfo.Dirs.AddonSites.length}}
                        {{#each ARC.FilterInfo.Dirs.AddonSites as |path|}}
                        <div class="directory">
                            <input type="checkbox" name="dir_paths[]" value="{{path}}" id="as_dir_{{@index}}"/>
                            <label for="as_dir_{{@index}}" title="{{path}}">
                                {{path}}
                            </label>
                        </div>
                        {{/each}}
                    {{else}}
                    <?php esc_html_e('No add on sites found.'); ?>
                    {{/if}}
                </div>
            </div>
            <div class="apply-btn">
                <div class="apply-warn">
                    <?php esc_html_e('*Checking a directory will exclude all items in that path recursively.'); ?>
                </div>
                <button type="button" class="button-small duplicator-quick-filter-btn" disabled="disabled" onclick="Duplicator.Pack.applyFilters(this, 'addon')">
                    <i class="fa fa-filter fa-sm"></i> <?php esc_html_e('Add Filters &amp; Rescan');?>
                </button>
            </div>
        </script>
        <div id="hb-addon-sites-result" class="hb-files-style"></div>
    </div>
</div>


<!-- ============
FILE NAME CHECKS -->
<div class="scan-item">
	<div class="title" onclick="Duplicator.Pack.toggleScanItem(this);">
		<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Name Checks', 'duplicator');?></div>
		<div id="data-arc-status-names"></div>
	</div>
	<div class="info">
		<?php
			_e('Unicode and special characters such as "*?><:/\|", can be problematic on some hosts.', 'duplicator');
            esc_html_e('  Only consider using this filter if the package build is failing. Select files that are not important to your site or you can migrate manually.', 'duplicator');
			$txt = __('If this environment/system and the system where it will be installed are set up to support Unicode and long paths then these filters can be ignored.  '
				. 'If you run into issues with creating or installing a package, then is recommended to filter these paths.', 'duplicator');
		?>
		<script id="hb-files-utf8" type="text/x-handlebars-template">
			<div class="container">
				<div class="hdrs">
					<span style="font-weight:bold"><?php esc_html_e('Quick Filters', 'duplicator');?></span>
						<sup><i class="fas fa-question-circle fa-sm" data-tooltip-title="<?php esc_attr_e("Name Checks", 'duplicator'); ?>" data-tooltip="<?php echo esc_attr($txt); ?>"></i></sup>
					<div class='hdrs-up-down'>
						<i class="fa fa-caret-up fa-lg dup-nav-toggle" onclick="Duplicator.Pack.toggleAllDirPath(this, 'hide')" title="<?php esc_attr_e("Hide All", 'duplicator'); ?>"></i>
						<i class="fa fa-caret-down fa-lg dup-nav-toggle" onclick="Duplicator.Pack.toggleAllDirPath(this, 'show')" title="<?php esc_attr_e("Show All", 'duplicator'); ?>"></i>
					</div>
				</div>
				<div class="data">
					<?php _duplicatorGetRootPath();	?>
					{{#if  ARC.FilterInfo.TreeWarning}}
						{{#each ARC.FilterInfo.TreeWarning as |directory|}}
							<div class="directory">
								{{#if directory.count}}
									<i class="fa fa-caret-right fa-lg dup-nav" onclick="Duplicator.Pack.toggleDirPath(this)"></i> &nbsp;
								{{else}}
									<i class="empty"></i>
								{{/if}}
										
								{{#if directory.iscore}}
									<i class="far fa-window-close chk-off" title="<?php esc_attr_e('Core WordPress directories should not be filtered. Use caution when excluding files.', 'duplicator'); ?>"></i>
								{{else}}		
									<input type="checkbox" name="dir_paths[]" value="{{directory.dir}}" id="nc1_dir_{{@index}}" onclick="Duplicator.Pack.filesOff(this)" />
								{{/if}}
								
								<label for="nc1_dir_{{@index}}" title="{{directory.dir}}">
									<i class="count">({{directory.count}})</i>
									{{directory.sdir}}/
								</label> <br/>
								<div class="files">
									{{#each directory.files}}
										<input type="checkbox" name="file_paths[]" value="{{path}}" id="warn_file_{{directory.dir}}-{{@index}}" />
										<label for="warn_file_{{directory.dir}}-{{@index}}" title="{{path}}">
											{{name}}
										</label> <br/>
									{{/each}}
								</div>
							</div>
						{{/each}}
					{{else}}
						<?php esc_html_e('No file/directory name warnings found.', 'duplicator');?>
					{{/if}}
				</div>
			</div>
			<div class="apply-btn">
				<div class="apply-warn">
					 <?php esc_html_e('*Checking a directory will exclude all items recursively from that path down.  Please use caution when filtering directories.', 'duplicator'); ?>
				</div>
				<button type="button" class="button-small duplicator-quick-filter-btn"  disabled="disabled" onclick="Duplicator.Pack.applyFilters(this, 'utf8')">
					<i class="fa fa-filter fa-sm"></i> <?php esc_html_e('Add Filters &amp; Rescan', 'duplicator');?>
				</button>
				<button type="button" class="button-small" onclick="Duplicator.Pack.showPathsDlg('utf8')" title="<?php esc_attr_e('Copy Paths to Clipboard', 'duplicator');?>">
					<i class="fa far fa-clipboard" aria-hidden="true"></i>
				</button>
			</div>
		</script>
		<div id="hb-files-utf8-result" class="hb-files-style"></div>
	</div>
</div>
<!-- ======================
UNREADABLE FILES -->
<div id="scan-unreadable-items" class="scan-item">
    <div class='title' onclick="Duplicator.Pack.toggleScanItem(this);">
        <div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Read Checks');?></div>
        <div id="data-arc-status-unreadablefiles"></div>
    </div>
    <div class="info">
        <?php
        esc_html_e('PHP is unable to read the following items and they will NOT be included in the package.  Please work with your host to adjust the permissions or resolve the '
            . 'symbolic-link(s) shown in the lists below.  If these items are not needed then this notice can be ignored.');
        ?>
        <script id="unreadable-files" type="text/x-handlebars-template">
            <div class="container">
                <div class="data">
                    <b><?php esc_html_e('Unreadable Items:');?></b> <br/>
                    <div class="directory">
                        {{#if ARC.UnreadableItems}}
							{{#each ARC.UnreadableItems as |uitem|}}
								<i class="fa fa-lock fa-xs"></i> {{uitem}} <br/>
							{{/each}}
                        {{else}}
							<i><?php esc_html_e('No unreadable items found.');?><br/></i>
                        {{/if}}
                    </div>

                    <b><?php esc_html_e('Recursive Links:');?> </b> <br/>
                    <div class="directory">
                        {{#if  ARC.RecursiveLinks}}
							{{#each ARC.RecursiveLinks as |link|}}
								<i class="fa fa-lock fa-xs"></i> {{link}} <br/>
							{{/each}}
						{{else}}
							<i><?php esc_html_e('No recursive sym-links found.');?><br/></i>
                        {{/if}}
                    </div>
                </div>
            </div>
        </script>
        <div id="unreadable-files-result" class="hb-files-style"></div>
    </div>
</div>

<?php } ?>



<!-- ============
DATABASE -->
<div id="dup-scan-db">
	<div class="scan-header">
		<i class="fas fa-database fa-sm"></i>
		<?php esc_html_e("Database", 'duplicator');	?>
		<div class="scan-header-details">
			<div class="dup-scan-filter-status">
				<?php
					if ($Package->Database->FilterOn) {
						echo '<i class="fa fa-filter fa-sm"></i> '; esc_html_e('Enabled', 'duplicator');
					}
				?>
			</div>
			<div id="data-db-size1"></div>
			<i class="fa fa-question-circle data-size-help"
				data-tooltip-title="<?php esc_attr_e("Database Size:", 'duplicator'); ?>"
				data-tooltip="<?php esc_attr_e('The database size represents only the included tables. The process for gathering the size uses the query SHOW TABLE STATUS.  '
					. 'The overall size of the database file can impact the final size of the package.', 'duplicator'); ?>"></i>

			<div class="dup-data-size-uncompressed"><?php esc_html_e("uncompressed"); ?></div>

		</div>
	</div>

	<div class="scan-item">
		<div class="title" onclick="Duplicator.Pack.toggleScanItem(this);">
			<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Overview', 'duplicator');?></div>
			<div id="data-db-status-size"></div>
		</div>
		<div class="info">
			<?php echo '<b>' . esc_html__('TOTAL SIZE', 'duplicator') . ' &nbsp; &#8667; &nbsp; </b>'; ?>
			<b><?php esc_html_e('Size', 'duplicator');?>:</b> <span id="data-db-size2"></span> &nbsp; | &nbsp;
			<b><?php esc_html_e('Tables', 'duplicator');?>:</b> <span id="data-db-tablecount"></span> &nbsp; | &nbsp;
			<b><?php esc_html_e('Records', 'duplicator');?>:</b> <span id="data-db-rows"></span><br/>
			<?php
				$dup_scan_tbl_total_trigger_size = DUP_Util::byteSize(DUPLICATOR_SCAN_DB_ALL_SIZE) . ' OR ' . number_format(DUPLICATOR_SCAN_DB_ALL_ROWS);
				printf(__('Total size and row counts are approximate values.  The thresholds that trigger notices are %1$s records total for the entire database.  Larger databases '
					. 'take more time to process.  On some budget hosts that have cpu/memory/timeout limits this may cause issues.', 'duplicator'), $dup_scan_tbl_total_trigger_size);
				echo '<br/><hr size="1" />';

				//TABLE DETAILS
				echo '<b>' . __('TABLE DETAILS:', 'duplicator') . '</b><br/>';
				$dup_scan_tbl_trigger_size = DUP_Util::byteSize(DUPLICATOR_SCAN_DB_TBL_SIZE) . ', ' . number_format(DUPLICATOR_SCAN_DB_TBL_ROWS);
				printf(esc_html__('The notices for tables are %1$s records or names with upper-case characters.  Individual tables will not trigger '
					. 'a notice message, but can help narrow down issues if they occur later on.', 'duplicator'), $dup_scan_tbl_trigger_size);
				
				echo '<div id="dup-scan-db-info"><div id="data-db-tablelist"></div></div>';

				//RECOMMENDATIONS
				echo '<br/><hr size="1" />';
				echo '<b>' . esc_html__('RECOMMENDATIONS:', 'duplicator') . '</b><br/>';
				
				echo '<div style="padding:5px">';
				$lnk = '<a href="maint/repair.php" target="_blank">' . esc_html__('repair and optimization', 'duplicator') . '</a>';
				printf(__('1. Run a %1$s on the table to improve the overall size and performance.', 'duplicator'), $lnk);
				echo '<br/><br/>';
				_e('2. Remove post revisions and stale data from tables.  Tables such as logs, statistical or other non-critical data should be cleared.', 'duplicator');
				echo '<br/><br/>';
				$lnk = '<a href="?page=duplicator-settings&tab=package" target="_blank">' . esc_html__('Enable mysqldump', 'duplicator') . '</a>';
				printf(__('3. %1$s if this host supports the option.', 'duplicator'), $lnk);
				echo '<br/><br/>';
				$lnk = '<a href="http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_lower_case_table_names" target="_blank">' . esc_html__('lower_case_table_names', 'duplicator') . '</a>';
				printf(__('4. For table name case sensitivity issues either rename the table with lower case characters or be prepared to work with the %1$s system variable setting.', 'duplicator'), $lnk);
				echo '</div>';

			?>
		</div>
	</div>
    <?php
    $triggers = $GLOBALS['wpdb']->get_col("SHOW TRIGGERS", 1);
    if (count($triggers)) { ?>
        <div class="scan-item">
            <div class='title' onclick="Duplicator.Pack.toggleScanItem(this);">
                <div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Triggers', 'duplicator');?></div>
                <div id="data-arc-status-triggers"></div>
            </div>
            <div class="info">
                <script id="hb-triggers-result" type="text/x-handlebars-template">
                    <div class="container">
                        <div class="data">
                            <span class="color:maroon">
                               <?php
                                   $lnk = '<a href="https://dev.mysql.com/doc/refman/8.0/en/triggers.html" target="_blank">' . esc_html__('triggers', 'duplicator') . '</a>';
                                   printf(__('This database makes use of %1$s which can manually be imported at install time.  Instructions and SQL statement queries will be '
                                       . 'provided at install time for users to execute. No actions need to be performed at this time, this message is simply a notice.', 'duplicator'), $lnk);
                               ?>
                            </span>
                        </div>
                    </div>
                </script>
                <div id="triggers-result"></div>
            </div>
        </div>
    <?php } ?>
    <?php
    $procedures = $GLOBALS['wpdb']->get_col("SHOW PROCEDURE STATUS WHERE `Db` = '{$GLOBALS['wpdb']->dbname}'", 1);
    $functions  = $GLOBALS['wpdb']->get_col("SHOW FUNCTION STATUS WHERE `Db` = '{$GLOBALS['wpdb']->dbname}'", 1);
    if (count($procedures) || count($functions)) { ?>
    <div id="showcreateprocfunc-block"  class="scan-item">
        <div class='title' onclick="Duplicator.Pack.toggleScanItem(this);">
            <div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Object Access', 'duplicator');?></div>
            <div id="data-arc-status-showcreateprocfunc"></div>
        </div>
        <div class="info">
            <script id="hb-showcreateprocfunc-result" type="text/x-handlebars-template">
                <div class="container">
                    <div class="data">
                        {{#if ARC.Status.showCreateProcFunc}}
                        <?php esc_html_e("The database user for this WordPress site has sufficient permissions to write stored procedures and functions to the sql file of the archive. [The command SHOW CREATE FUNCTION will work.]", 'duplicator'); ?>
                        {{else}}
                        <span style="color: red;">
                            <?php
                            esc_html_e("The database user for this WordPress site does NOT sufficient permissions to write stored procedures or functions to the sql file of the archive.  Stored procedures will not be added to the sql file.", 'duplicator');
                            ?>
                        </span>
                        {{/if}}
                    </div>
                </div>
            </script>
            <div id="showcreateprocfunc-package-result"></div>
        </div>
    </div>
    <?php } ?>
    
	<!-- ============
	TOTAL SIZE -->
    <div class="data-ll-section scan-header" style="display:none">
		<i class="far fa-file-archive"></i>
		<?php esc_html_e("Total Size", 'duplicator');	?>
		<div class="scan-header-details">

			<div id="data-ll-totalsize"></div>
			<i class="fa fa-question-circle data-size-help"
				data-tooltip-title="<?php esc_attr_e("Total Size:", 'duplicator'); ?>"
				data-tooltip="<?php esc_attr_e('The total size of the site (files plus  database).', 'duplicator'); ?>"></i>

			<div class="dup-data-size-uncompressed"><?php esc_html_e("uncompressed"); ?></div>

		</div>
	</div>

	<div class="data-ll-section scan-item" style="display: none">
		<div style="padding: 7px; background-color:#F3B2B7; font-weight: bold ">
		<?php
			printf(__('The build can\'t continue because the total size of files and the database exceeds the %s limit that can be processed when creating a DupArchive package. ', 'duplicator'), $duparchive_max_limit);
		?>
			<a href="javascript:void(0)" onclick="jQuery('#data-ll-status-recommendations').slideToggle('slow');"><?php esc_html_e('Click for recommendations.', 'duplicator'); ?></a>
		</div>
		<div class="info" id="data-ll-status-recommendations">
		<?php
			echo '<b>';
			$lnk = '<a href="admin.php?page=duplicator-settings&tab=package" target="_blank">' . esc_html__('Archive Engine', 'duplicator') . '</a>';
			printf(esc_html__("The %s is set to create packages in the 'DupArchive' format.  This custom format is used to overcome budget host constraints."
					. " With DupArchive, Duplicator is restricted to processing sites up to %s.  To process larger sites, consider these recommendations. ", 'duplicator'), $lnk, $duparchive_max_limit, $duparchive_max_limit);
			echo '</b>';
			echo '<br/><hr size="1" />';

			echo '<b>' . esc_html__('RECOMMENDATIONS:', 'duplicator') . '</b><br/>';
			echo '<div style="padding:5px">';

			$new1_package_url = admin_url('admin.php?page=duplicator&tab=new1');
			$new1_package_nonce_url = wp_nonce_url($new1_package_url, 'new1-package');
			$lnk = '<a href="'.$new1_package_nonce_url.'">' . esc_html__('Step 1', 'duplicator') . '</a>';
			printf(__('- Add data filters to get the package size under %s: ', 'duplicator'), $duparchive_max_limit);
			echo '<div style="padding:0 0 0 20px">';
				_e("- In the 'Size Checks' section above consider adding filters (if notice is shown).", 'duplicator');
				echo '<br/>';
				printf(__("- In %s consider adding file/directory or database table filters.", 'duplicator'), $lnk);
			echo '</div>';
			echo '<br/>';

			$lnk = '<a href="https://snapcreek.com/duplicator/docs/quick-start?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=da_size_two_part&utm_campaign=duplicator_pro#quick-060-q" target="_blank">' . esc_html__('covered here.', 'duplicator') . '</a>';
			printf(__("- Perform a two part install %s", 'duplicator'), $lnk);
			echo '<br/><br/>';

			$lnk = '<a href="admin.php?page=duplicator-settings&tab=package" target="_blank">' . esc_html__('ZipArchive Engine', 'duplicator') . '</a>';
			printf(__("- Switch to the %s which requires a capable hosting provider (VPS recommended).", 'duplicator'),$lnk);
			echo '<br/><br/>';

			$lnk = '<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_da_size_limit&utm_campaign=duplicator_pro" target="_blank">' . esc_html__('Duplicator Pro', 'duplicator') . '</a>';
			printf(__("- Consider upgrading to %s for large site support. (unlimited)", 'duplicator'), $lnk);

			echo '</div>';

		?>
		</div>
	</div>

	<?php
        echo '<div class="dup-pro-support">&nbsp;';
        esc_html_e('Migrate large, multi-gig sites with', 'duplicator');
        echo '&nbsp;<i><a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&amp;utm_medium=wordpress_plugin&amp;utm_content=free_size_warn_multigig&amp;utm_campaign=duplicator_pro" target="_blank">' . esc_html__('Duplicator Pro', 'duplicator') . '!</a></i>';
        echo '</div>';
	?>
</div>
<br/><br/>


<!-- ==========================================
DIALOGS:
========================================== -->
<?php
	$alert1 = new DUP_UI_Dialog();
	$alert1->height     = 600;
	$alert1->width      = 600;
	$alert1->title		= __('Scan Details', 'duplicator');
	$alert1->message	= "<div id='arc-details-dlg'></div>";
	$alert1->initAlert();
	
	$alert2 = new DUP_UI_Dialog();
	$alert2->height     = 450;
	$alert2->width      = 650;
	$alert2->title		= __('Copy Quick Filter Paths', 'duplicator');
	$alert2->message	= "<div id='arc-paths-dlg'></div>";
	$alert2->initAlert();
?>

<!-- =======================
DIALOG: Scan Results -->
<div id="dup-archive-details" style="display:none">
	
	<!-- PACKAGE -->
	<h2><i class="fa fa-archive fa-sm"></i> <?php esc_html_e('Package', 'duplicator');?></h2>
	<b><?php esc_html_e('Name', 'duplicator');?>:</b> <?php echo esc_html($Package->Name); ?><br/>
	<b><?php esc_html_e('Notes', 'duplicator');?>:</b> <?php echo esc_html($Package->Notes); ?> <br/>
	<b><?php esc_html_e('Archive Engine', 'duplicator');?>:</b> <a href="admin.php?page=duplicator-settings&tab=package" target="_blank"><?php echo esc_html($archive_type_label); ?></a>
	<br/><br/>

	<!-- DATABASE -->
	<h2><i class="fas fa-database fa-sm"></i> <?php esc_html_e('Database', 'duplicator');?></h2>
	<table id="db-area">
		<tr><td><b><?php esc_html_e('Name:', 'duplicator');?></b></td><td><?php echo DB_NAME; ?> </td></tr>
		<tr><td><b><?php esc_html_e('Host:', 'duplicator');?></b></td><td><?php echo DB_HOST; ?> </td></tr>
		<tr>
			<td style="vertical-align: top"><b><?php esc_html_e('Build Mode:', 'duplicator');?></b></td>
			<td style="line-height:18px">
				<a href="?page=duplicator-settings&amp;tab=package" target="_blank"><?php echo esc_html($dbbuild_mode); ?></a>
				<?php if ($mysqlcompat_on) :?>
					<br/>
					<small style="font-style:italic; color:maroon">
						<i class="fa fa-exclamation-circle"></i> <?php esc_html_e('MySQL Compatibility Mode Enabled', 'duplicator'); ?>
						<a href="https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_compatible" target="_blank">[<?php esc_html_e('details', 'duplicator'); ?>]</a>
					</small>
				<?php endif;?>
			</td>
		</tr>
	</table><br/>

	<!-- FILE FILTERS -->
	<h2 style="border: none">
		<i class="fa fa-filter fa-sm"></i> <?php esc_html_e('File Filters', 'duplicator');?>:
		<small><?php echo ($Package->Archive->FilterOn) ? __('Enabled', 'duplicator') : __('Disabled', 'duplicator') ;?></small>
	</h2>
	<div class="filter-area">
		<b><i class="fa fa-folder-open"></i> <?php echo duplicator_get_abs_path();?></b>

		<script id="hb-filter-file-list" type="text/x-handlebars-template">
			<div class="file-info">
				<b>[<?php esc_html_e('Directories', 'duplicator');	?>]</b>
				<div class="file-info">
					{{#if ARC.FilterInfo.Dirs.Instance}}
						{{#each ARC.FilterInfo.Dirs.Instance as |dir|}}
							{{stripWPRoot dir}}/<br/>
						{{/each}}
					{{else}}
						 <?php	_e('No custom directory filters set.', 'duplicator');?>
					{{/if}}
				</div>

				<b>[<?php esc_html_e('Extensions', 'duplicator');?>]</b><br/>
				<div class="file-info">
					<?php
						if (strlen( $Package->Archive->FilterExts)) {
							echo esc_html($Package->Archive->FilterExts);
						} else {
							_e('No file extension filters have been set.', 'duplicator');
						}
					?>
				</div>

				<b>[<?php esc_html_e('Files', 'duplicator');	?>]</b>
				<div class="file-info">
					{{#if ARC.FilterInfo.Files.Instance}}
						{{#each ARC.FilterInfo.Files.Instance as |file|}}
							{{stripWPRoot file}}<br/>
						{{/each}}
					{{else}}
						 <?php	_e('No custom file filters set.', 'duplicator');?>
					{{/if}}
				</div>

				<b>[<?php esc_html_e('Auto Directory Filters', 'duplicator');	?>]</b>
				<div class="file-info">
					{{#each ARC.FilterInfo.Dirs.Core as |dir|}}
						{{stripWPRoot dir}}/<br/>
					{{/each}}
					<br/>
					<b>[<?php esc_html_e('Auto File Filters', 'duplicator');	?>]</b><br/>
					{{#each ARC.FilterInfo.Files.Global as |file|}}
						{{stripWPRoot file}}<br/>
					{{/each}}
				</div>

			</div>
		</script>
		<div class="hb-filter-file-list-result"></div>

	</div>

	<small>
		<?php esc_html_e('Path filters will be skipped during the archive process when enabled.', 'duplicator');	?>
		<a href="<?php echo wp_nonce_url(DUPLICATOR_SITE_URL . '/wp-admin/admin-ajax.php?action=duplicator_package_scan', 'duplicator_package_scan', 'nonce'); ?>" target="dup_report">
			<?php esc_html_e('[view json result report]', 'duplicator');?>
		</a>
		<br/>
		<?php esc_html_e('Auto filters are applied to prevent archiving other backup sets.', 'duplicator');	?>
	</small><br/>
</div>

<!-- =======================
DIALOG: PATHS COPY & PASTE -->
<div id="dup-archive-paths" style="display:none">
	
	<b><i class="fa fa-folder"></i> <?php esc_html_e('Directories', 'duplicator');?></b>
	<div class="copy-button">
		<button type="button" class="button-small" onclick="Duplicator.Pack.copyText(this, '#arc-paths-dlg textarea.path-dirs')">
			<i class="fa far fa-clipboard"></i> <?php esc_html_e('Click to Copy', 'duplicator');?>
		</button>
	</div>
	<textarea class="path-dirs"></textarea>
	<br/><br/>

	<b><i class="far fa-copy fa-sm"></i> <?php esc_html_e('Files', 'duplicator');?></b>
	<div class="copy-button">
		<button type="button" class="button-small" onclick="Duplicator.Pack.copyText(this, '#arc-paths-dlg textarea.path-files')">
			<i class="fa far fa-clipboard"></i> <?php esc_html_e('Click to Copy', 'duplicator');?>
		</button>
	</div>
	<textarea class="path-files"></textarea>
	<br/>
	<small><?php esc_html_e('Copy the paths above and apply them as needed on Step 1 &gt; Archive &gt; Files section.', 'duplicator');?></small>
</div>


<script>
jQuery(document).ready(function($)
{

	Handlebars.registerHelper('stripWPRoot', function(path) {
		return path.replace(<?php echo str_replace('\\/', '/', json_encode(duplicator_get_abs_path())); ?>, '');
	});

	//Uncheck file names if directory is checked
	Duplicator.Pack.filesOff = function (dir)
	{
		var $checks = $(dir).parent('div.directory').find('div.files input[type="checkbox"]');
		$(dir).is(':checked')
			? $.each($checks, function() {$(this).attr({disabled : true, checked : false, title : '<?php esc_html_e('Directory applied filter set.', 'duplicator');?>'});})
			: $.each($checks, function() {$(this).removeAttr('disabled checked title');});
		$('div.apply-warn').show(300);
	}

	//Opens a dialog to show scan details
	Duplicator.Pack.showDetailsDlg = function ()
	{
		$('#arc-details-dlg').html($('#dup-archive-details').html());
		<?php $alert1->showAlert(); ?>
		Duplicator.UI.loadQtip();
		return;
	}
	
	//Opens a dialog to show scan details
	Duplicator.Pack.showPathsDlg = function (type)
	{
		var id = (type == 'large') ? '#hb-files-large-result' : '#hb-files-utf8-result'
		var dirFilters  = [];
		var fileFilters = [];
		$(id + " input[name='dir_paths[]']:checked").each(function()  {dirFilters.push($(this).val());});
		$(id + " input[name='file_paths[]']:checked").each(function() {fileFilters.push($(this).val());});

		var $dirs  = $('#dup-archive-paths textarea.path-dirs');
		var $files = $('#dup-archive-paths textarea.path-files');
		(dirFilters.length > 0)
		   ? $dirs.text(dirFilters.join(";\n"))
		   : $dirs.text("<?php esc_html_e('No directories have been selected!', 'duplicator');?>");

	    (fileFilters.length > 0)
		   ? $files.text(fileFilters.join(";\n"))
		   : $files.text("<?php esc_html_e('No files have been selected!', 'duplicator');?>");

		$('#arc-paths-dlg').html($('#dup-archive-paths').html());
		<?php $alert2->showAlert(); ?>
		
		return;
	}

	//Toggles a directory path to show files
	Duplicator.Pack.toggleDirPath = function(item)
	{
		var $dir   = $(item).parents('div.directory');
		var $files = $dir.find('div.files');
		var $arrow = $dir.find('i.dup-nav');
		if ($files.is(":hidden")) {
			$arrow.addClass('fa-caret-down').removeClass('fa-caret-right');
			$files.show();
		} else {
			$arrow.addClass('fa-caret-right').removeClass('fa-caret-down');
			$files.hide(250);
		}
	}

	//Toggles a directory path to show files
	Duplicator.Pack.toggleAllDirPath = function(item, toggle)
	{
		var $dirs  = $(item).parents('div.container').find('div.data div.directory');
		 (toggle == 'hide')
			? $.each($dirs, function() {$(this).find('div.files').show(); $(this).find('i.dup-nav').trigger('click');})
			: $.each($dirs, function() {$(this).find('div.files').hide(); $(this).find('i.dup-nav').trigger('click');});
	}

	Duplicator.Pack.copyText = function(btn, query)
	{
		$(query).select();
		 try {
		   document.execCommand('copy');
		   $(btn).css({color: '#fff', backgroundColor: 'green'});
		   $(btn).text("<?php esc_html_e('Copied to Clipboard!', 'duplicator');?>");
		 } catch(err) {
		   alert("<?php esc_html_e('Manual copy of selected text required on this browser.', 'duplicator');?>")
		 }
	}

	Duplicator.Pack.applyFilters = function(btn, type)
	{
		var $btn = $(btn);
		$btn.html('<i class="fas fa-circle-notch fa-spin"></i> <?php esc_html_e('Initializing Please Wait...', 'duplicator');?>');
		$btn.attr('disabled', 'true');

		//var id = (type == 'large') ? '#hb-files-large-result' : '#hb-files-utf8-result'
		var id = '';
        switch(type){
            case 'large':
                id = '#hb-files-large-result';
                break;
            case 'utf8':
                id = '#hb-files-utf8-result';
                break;
            case 'addon':
                id = '#hb-addon-sites-result';
                break;
        }
		var dirFilters  = [];
		var fileFilters = [];
		$(id + " input[name='dir_paths[]']:checked").each(function()  {dirFilters.push($(this).val());});
		$(id + " input[name='file_paths[]']:checked").each(function() {fileFilters.push($(this).val());});

		var data = {
			action: 'DUP_CTRL_Package_addQuickFilters',
			nonce: '<?php echo wp_create_nonce('DUP_CTRL_Package_addQuickFilters'); ?>',
			dir_paths : dirFilters.join(";"),
			file_paths : fileFilters.join(";"),
		};

		$.ajax({
			type: "POST",
			cache: false,
			dataType: "text",
			url: ajaxurl,
			timeout: 100000,
			data: data,
			complete: function() { },
			success:  function(respData) {
				try {
					var data = Duplicator.parseJSON(respData);
				} catch(err) {
					console.error(err);
					console.error('JSON parse failed for response data: ' + respData);
					console.log(data);
					alert("<?php esc_html_e('Error applying filters.  Please go back to Step 1 to add filter manually!', 'duplicator');?>");
					return false;
				}
				Duplicator.Pack.rescan();
			},
			error: function(data) {
				console.log(data);
				alert("<?php esc_html_e('Error applying filters.  Please go back to Step 1 to add filter manually!', 'duplicator');?>");
			}
		});
	}

	Duplicator.Pack.initArchiveFilesData = function(data)
	{
		//TOTAL SIZE
		//var sizeChecks = data.ARC.Status.Size == 'Warn' || data.ARC.Status.Big == 'Warn' ? 'Warn' : 'Good';
		$('#data-arc-status-size').html(Duplicator.Pack.setScanStatus(data.ARC.Status.Size));
		$('#data-arc-status-names').html(Duplicator.Pack.setScanStatus(data.ARC.Status.Names));
        $('#data-arc-status-unreadablefiles').html(Duplicator.Pack.setScanStatus(data.ARC.Status.UnreadableItems));
        $('#data-arc-status-triggers').html(Duplicator.Pack.setScanStatus(data.DB.Status.Triggers));
        
		$('#data-arc-status-migratepackage').html(Duplicator.Pack.setScanStatus(data.ARC.Status.MigratePackage));
+        $('#data-arc-status-showcreateprocfunc').html(Duplicator.Pack.setScanStatus(data.ARC.Status.showCreateProcFuncStatus));
		$('#data-arc-size1').text(data.ARC.Size || errMsg);
		$('#data-arc-size2').text(data.ARC.Size || errMsg);
		$('#data-arc-files').text(data.ARC.FileCount || errMsg);
		$('#data-arc-dirs').text(data.ARC.DirCount || errMsg);

		//LARGE FILES
        if ($('#hb-files-large').length > 0) {
            var template = $('#hb-files-large').html();
            var templateScript = Handlebars.compile(template);
            var html = templateScript(data);
            $('#hb-files-large-result').html(html);
        }
		//ADDON SITES
        if ($('#hb-addon-sites').length > 0) {
            var template = $('#hb-addon-sites').html();
            var templateScript = Handlebars.compile(template);
            var html = templateScript(data);
            $('#hb-addon-sites-result').html(html);
        }
		//NAME CHECKS
        if ($('#hb-files-utf8').length > 0) {
            var template = $('#hb-files-utf8').html();
            var templateScript = Handlebars.compile(template);
            var html = templateScript(data);
            $('#hb-files-utf8-result').html(html);
        }

        //NAME CHECKS
        if ($('#unreadable-files').length > 0) {
            var template = $('#unreadable-files').html();
            var templateScript = Handlebars.compile(template);
            var html = templateScript(data);
            $('#unreadable-files-result').html(html);
        }

		//SCANNER DETAILS: Dirs
        if ($('#hb-filter-file-list').length > 0) {
            var template = $('#hb-filter-file-list').html();
            var templateScript = Handlebars.compile(template);
            var html = templateScript(data);
            $('div.hb-filter-file-list-result').html(html);
        }

		//MIGRATE PACKAGE
        if ($("#hb-migrate-package-result").length) {
            var template = $('#hb-migrate-package-result').html();
            var templateScript = Handlebars.compile(template);
            var html = templateScript(data);
            $('#migrate-package-result').html(html);
        }

        //SHOW CREATE
        if ($("#hb-showcreateprocfunc-result").length) {
            var template = $('#hb-showcreateprocfunc-result').html();
            var templateScript = Handlebars.compile(template);
            var html = templateScript(data);
            $('#showcreateprocfunc-package-result').html(html);
        }

        //TRIGGERS
        if ($("#hb-triggers-result").length) {
            var template = $('#hb-triggers-result').html();
            var templateScript = Handlebars.compile(template);
            var html = templateScript(data);
            $('#triggers-result').html(html);
        }

		Duplicator.UI.loadQtip();
	}

	Duplicator.Pack.initArchiveDBData = function(data)
	{
		var errMsg = "unable to read";
		var color;
		var html = "";
		var DB_TotalSize = 'Good';
		var DB_TableRowMax  = <?php echo DUPLICATOR_SCAN_DB_TBL_ROWS; ?>;
		var DB_TableSizeMax = <?php echo DUPLICATOR_SCAN_DB_TBL_SIZE; ?>;
		if (data.DB.Status.Success)
		{
			DB_TotalSize = data.DB.Status.DB_Rows == 'Warn' || data.DB.Status.DB_Size == 'Warn' ? 'Warn' : 'Good';
			$('#data-db-status-size').html(Duplicator.Pack.setScanStatus(DB_TotalSize));
			$('#data-db-size1').text(data.DB.Size || errMsg);
			$('#data-db-size2').text(data.DB.Size || errMsg);
			$('#data-db-rows').text(data.DB.Rows || errMsg);
			$('#data-db-tablecount').text(data.DB.TableCount || errMsg);
			//Table Details
			if (data.DB.TableList == undefined || data.DB.TableList.length == 0) {
				html = '<?php esc_html_e("Unable to report on any tables", 'duplicator') ?>';
			} else {
				$.each(data.DB.TableList, function(i) {
					html += '<b>' + i  + '</b><br/>';
					html += '<table><tr>';
					$.each(data.DB.TableList[i], function(key,val) {
						switch(key) {
							case 'Case':
								color = (val == 1) ? 'red' : 'black';
								html += '<td style="color:' + color + '">Uppercase: ' + val + '</td>';
								break;
							case 'Rows':
								color = (val > DB_TableRowMax) ? 'red' : 'black';
								html += '<td style="color:' + color + '">Rows: ' + val + '</td>';
								break;
							case 'USize':
								color = (parseInt(val) > DB_TableSizeMax) ? 'red' : 'black';
								html += '<td style="color:' + color + '">Size: ' + data.DB.TableList[i]['Size'] + '</td>';
								break;
						}	
					});
					html += '</tr></table>';
				});
			}
			$('#data-db-tablelist').html(html);
		} else {
			html = '<?php esc_html_e("Unable to report on database stats", 'duplicator') ?>';
			$('#dup-scan-db').html(html);
		}
	}

    Duplicator.Pack.initLiteLimitData = function(data)
	{       
        if(data.LL.Status.TotalSize == 'Fail') {
            $('.data-ll-section').show();
            $('#dup-build-button').hide();
            $('#dup-scan-warning-continue').hide();
            //$('#data-ll-status-totalsize').html(Duplicator.Pack.setScanStatus(data.LL.Status.TotalSize));
            $('#data-ll-totalsize').text(data.LL.TotalSize || errMsg);
            $('.dup-pro-support').hide();
        } else {
           // $('#dup-scan-warning-continue').show();
            $('#dup-build-button').show();
           // $('#dup-build-button').prop("disabled",true);
            $('.data-ll-section').hide();
        }
	}

	<?php
		if (isset($_GET['retry']) && $_GET['retry'] == '1' ) {
			echo "$('#scan-itme-file-size').show(300)";
		}
	?>

	// alert('before binding ' + $("#form-duplicator").length);
	$("#form-duplicator").on('change', "#hb-files-large-result input[type='checkbox'], #hb-files-utf8-result input[type='checkbox'], #hb-addon-sites-result input[type='checkbox']", function() {
		if ($("#hb-files-large-result input[type='checkbox']:checked").length) {
			var large_disabled_prop = false;
		} else {
			var large_disabled_prop = true;
		}
		$("#hb-files-large-result .duplicator-quick-filter-btn").prop("disabled", large_disabled_prop);
		
		if ($("#hb-files-utf8-result input[type='checkbox']:checked").length) {
			var utf8_disabled_prop = false;
		} else {
			var utf8_disabled_prop = true;
		}
		$("#hb-files-utf8-result .duplicator-quick-filter-btn").prop("disabled", utf8_disabled_prop);
		
		if ($("#hb-addon-sites-result input[type='checkbox']:checked").length) {
			var addon_disabled_prop = false;
		} else {
			var addon_disabled_prop = true;
		}
		$("#hb-addon-sites-result .duplicator-quick-filter-btn").prop("disabled", addon_disabled_prop);			
	});
});
</script>
views/packages/main/s1.setup1.php000064400000036537151336065400012700 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
global $wpdb;

//POST BACK: Rest Button
if (isset($_POST['action'])) {
    $action = sanitize_text_field($_POST['action']);
    $action_result = DUP_Settings::DeleteWPOption($action);
    switch ($action) {
        case 'duplicator_package_active' :
            $action_result = DUP_Settings::DeleteWPOption($action);
            $action_response = __('Package settings have been reset.', 'duplicator');
            break;
    }
}

DUP_Util::initSnapshotDirectory();

$Package = DUP_Package::getActive();
$dup_tests = array();
$dup_tests = DUP_Server::getRequirements();

//View State
$ctrl_ui = new DUP_CTRL_UI();
$ctrl_ui->setResponseType('PHP');
$data = $ctrl_ui->GetViewStateList();

$ui_css_storage = (isset($data->payload['dup-pack-storage-panel']) && $data->payload['dup-pack-storage-panel']) ? 'display:block' : 'display:none';
$ui_css_archive = (isset($data->payload['dup-pack-archive-panel']) && $data->payload['dup-pack-archive-panel']) ? 'display:block' : 'display:none';
$ui_css_installer = (isset($data->payload['dup-pack-installer-panel']) && $data->payload['dup-pack-installer-panel']) ? 'display:block' : 'display:none';
$dup_intaller_files = implode(", ", array_keys(DUP_Server::getInstallerFiles()));
$dbbuild_mode = (DUP_Settings::Get('package_mysqldump') && DUP_DB::getMySqlDumpPath()) ? 'mysqldump' : 'PHP';
$archive_build_mode = DUP_Settings::Get('archive_build_mode') == DUP_Archive_Build_Mode::ZipArchive ? 'zip' : 'daf';

//="No Selection", 1="Try Again", 2="Two-Part Install"
$retry_state = isset($_GET['retry']) ? $_GET['retry'] : 0;
?>

<style>
    /* REQUIREMENTS*/
    div.dup-sys-section {margin:1px 0px 5px 0px}
    div.dup-sys-title {display:inline-block; width:250px; padding:1px; }
    div.dup-sys-title div {display:inline-block;float:right; }
    div.dup-sys-info {display:none; max-width: 98%; margin:4px 4px 12px 4px}	
    div.dup-sys-pass {display:inline-block; color:green;font-weight:bold}
    div.dup-sys-fail {display:inline-block; color:#AF0000;font-weight:bold}
    div.dup-sys-contact {padding:5px 0px 0px 10px; font-size:11px; font-style:italic}
    span.dup-toggle {float:left; margin:0 2px 2px 0; }
    table.dup-sys-info-results td:first-child {width:200px}
    table.dup-sys-info-results td:nth-child(2) {width:100px; font-weight:bold}
    table.dup-sys-info-results td:nth-child(3) {font-style:italic}
</style>


<!-- ============================
TOOL BAR: STEPS -->
<table id="dup-toolbar">
    <tr valign="top">
        <td style="white-space: nowrap">
            <div id="dup-wiz">
                <div id="dup-wiz-steps">
                    <div class="active-step"><a>1 <?php esc_html_e('Setup', 'duplicator'); ?></a></div>
                    <div><a>2 <?php esc_html_e('Scan', 'duplicator'); ?> </a></div>
                    <div><a>3 <?php esc_html_e('Build', 'duplicator'); ?> </a></div>
                </div>
            </div>
            <div id="dup-wiz-title" class="dup-guide-txt-color">
                <i class="fab fa-wordpress"></i>
                <?php esc_html_e('Step 1: Choose the WordPress contents to backup.', 'duplicator'); ?>
            </div>
        </td>
        <td>&nbsp;</td>
    </tr>
</table>	
<hr class="dup-toolbar-line">

<?php if (!empty($action_response)) : ?>
    <div id="message" class="notice notice-success is-dismissible"><p><?php echo esc_html($action_response); ?></p></div>
<?php endif; ?>	


<!-- ============================
SYSTEM REQUIREMENTS -->
<?php if (!$dup_tests['Success'] || $dup_tests['Warning']) : ?>
    <div class="dup-box">
        <div class="dup-box-title">
            <?php
            esc_html_e("Requirements:", 'duplicator');
            echo ($dup_tests['Success']) ? ' <div class="dup-sys-pass">Pass</div>' : ' <div class="dup-sys-fail">Fail</div>';
            ?>
            <div class="dup-box-arrow"></div>
        </div>

        <div class="dup-box-panel">

            <div class="dup-sys-section">
                <i><?php esc_html_e("System requirements must pass for the Duplicator to work properly.  Click each link for details.", 'duplicator'); ?></i>
            </div>

            <!-- PHP SUPPORT -->
            <div class='dup-sys-req'>
                <div class='dup-sys-title'>
                    <a><?php esc_html_e('PHP Support', 'duplicator'); ?></a>
                    <div><?php echo esc_html($dup_tests['PHP']['ALL']); ?></div>
                </div>
                <div class="dup-sys-info dup-info-box">
                    <table class="dup-sys-info-results">
                        <tr>
                            <td><?php printf("%s [%s]", esc_html__("PHP Version", 'duplicator'), phpversion()); ?></td>
                            <td><?php echo esc_html($dup_tests['PHP']['VERSION']); ?></td>
                            <td><?php esc_html_e('PHP versions 5.2.9+ or higher is required.')?></td>
                        </tr>
                        <?php if ($archive_build_mode == 'zip') : ?>
                            <tr>
                                <td><?php esc_html_e('Zip Archive Enabled', 'duplicator'); ?></td>
                                <td><?php echo esc_html($dup_tests['PHP']['ZIP']); ?></td>
                                <td>
                                    <?php printf("%s <a href='admin.php?page=duplicator-settings&tab=package'>%s</a> %s", 
                                        esc_html__("ZipArchive extension is required or", 'duplicator'),
                                        esc_html__("Switch to DupArchive", 'duplicator'),
                                        esc_html__("to by-pass this requirement.", 'duplicator'));
                                   ?>
                                </td>
                            </tr>
                        <?php endif; ?>
                        <tr>
                            <td><?php esc_html_e('Safe Mode Off', 'duplicator'); ?></td>
                            <td><?php echo esc_html($dup_tests['PHP']['SAFE_MODE']); ?></td>
                            <td><?php esc_html_e('Safe Mode should be set to Off in you php.ini file and is deprecated as of PHP 5.3.0.')?></td>
                        </tr>					
                        <tr>
                            <td><?php esc_html_e('Function', 'duplicator'); ?> <a href="http://php.net/manual/en/function.file-get-contents.php" target="_blank">file_get_contents</a></td>
                            <td><?php echo esc_html($dup_tests['PHP']['FUNC_1']); ?></td>
                            <td><?php echo ''; ?></td>
                        </tr>					
                        <tr>
                            <td><?php esc_html_e('Function', 'duplicator'); ?> <a href="http://php.net/manual/en/function.file-put-contents.php" target="_blank">file_put_contents</a></td>
                            <td><?php echo esc_html($dup_tests['PHP']['FUNC_2']); ?></td>
                            <td><?php echo ''; ?></td>
                        </tr>
                        <tr>
                            <td><?php esc_html_e('Function', 'duplicator'); ?> <a href="http://php.net/manual/en/mbstring.installation.php" target="_blank">mb_strlen</a></td>
                            <td><?php echo esc_html($dup_tests['PHP']['FUNC_3']); ?></td>
                            <td><?php echo ''; ?></td>
                        </tr>					
                    </table>
                    <small>
                        <?php esc_html_e("For any issues in this section please contact your hosting provider or server administrator.  For additional information see our online documentation.", 'duplicator'); ?>
                    </small>
                </div>
            </div>		

            <!-- PERMISSIONS -->
            <div class='dup-sys-req'>
                <div class='dup-sys-title'>
                    <a><?php esc_html_e('Required Paths', 'duplicator'); ?></a>
                       <div>
                        <?php
                        if (!in_array('Fail', $dup_tests['IO'])) {
                            echo in_array('Warn', $dup_tests['IO']) ? 'Warn' : 'Pass';
                        } else {
                            echo 'Fail';
                        }
                        ?>
                    </div>
                </div>
                <div class="dup-sys-info dup-info-box">
                    <?php
                    $abs_path = duplicator_get_abs_path();

                    printf("<b>%s</b> &nbsp; [%s] <br/>", $dup_tests['IO']['SSDIR'], DUP_Settings::getSsdirPath());
                    printf("<b>%s</b> &nbsp; [%s] <br/>", $dup_tests['IO']['SSTMP'], DUP_Settings::getSsdirTmpPath());
                    printf("<b>%s</b> &nbsp; [%s] <br/>", $dup_tests['IO']['WPROOT'], $abs_path);
                    ?>
                    <div style="font-size:11px; padding-top: 3px">
                        <?php
                        if ($dup_tests['IO']['WPROOT'] == 'Warn') {
                            echo sprintf(__('If the root WordPress path is not writable by PHP on some systems this can cause issues.', 'duplicator'), $abs_path);
                            echo '<br/>';
                        }
                        esc_html_e("If Duplicator does not have enough permissions then you will need to manually create the paths above. &nbsp; ", 'duplicator');
                        ?>
                    </div>
                </div>
            </div>

            <!-- SERVER SUPPORT -->
            <div class='dup-sys-req'>
                <div class='dup-sys-title'>
                    <a><?php esc_html_e('Server Support', 'duplicator'); ?></a>
                    <div><?php echo esc_html($dup_tests['SRV']['ALL']); ?></div>
                </div>
                <div class="dup-sys-info dup-info-box">
                    <table class="dup-sys-info-results">
                        <tr>
                            <td><?php printf("%s [%s]", esc_html__("MySQL Version", 'duplicator'), esc_html(DUP_DB::getVersion())); ?></td>
                            <td><?php echo esc_html($dup_tests['SRV']['MYSQL_VER']); ?></td>
                        </tr>
                        <tr>
                            <td><?php printf("%s", esc_html__("MySQLi Support", 'duplicator')); ?></td>
                            <td><?php echo esc_html($dup_tests['SRV']['MYSQLi']); ?></td>
                        </tr>
                    </table>
                    <small>
                        <?php
                        esc_html_e("MySQL version 5.0+ or better is required and the PHP MySQLi extension (note the trailing 'i') is also required.  Contact your server administrator and request that mysqli extension and MySQL Server 5.0+ be installed.", 'duplicator');
                        echo "&nbsp;<i><a href='http://php.net/manual/en/mysqli.installation.php' target='_blank'>[" . esc_html__('more info', 'duplicator') . "]</a></i>";
                        ?>										
                    </small>
                    <hr>
                    <table class="dup-sys-info-results">
                        <tr>
                            <td><a href="https://www.php.net/manual/en/mysqli.real-escape-string.php" target="_blank">mysqli_real_escape_string</a></td>
                            <td><?php echo esc_html($dup_tests['SRV']['MYSQL_ESC']); ?></td>
                        </tr>
                    </table>
                    <small>
                        <?php esc_html_e("The function mysqli_real_escape_string is not working properly. Please consult host support and ask them to switch to a different PHP version or configuration."); ?>
                    </small>
                </div>
            </div>

            <!-- RESERVED FILES -->
            <div class='dup-sys-req'>
                <div class='dup-sys-title'>
                    <a><?php esc_html_e('Reserved Files', 'duplicator'); ?></a> <div><?php echo esc_html($dup_tests['RES']['INSTALL']); ?></div>
                </div>
                <div class="dup-sys-info dup-info-box">
                    <?php if ($dup_tests['RES']['INSTALL'] == 'Pass') : ?>
                        <?php
                        esc_html_e("None of the reserved files where found from a previous install.  This means you are clear to create a new package.", 'duplicator');
                        echo "  [".esc_html($dup_intaller_files)."]";
                        ?>
                    <?php
                    else:
                        $duplicator_nonce = wp_create_nonce('duplicator_cleanup_page');
                        ?> 
                        <form method="post" action="admin.php?page=duplicator-tools&tab=diagnostics&section=info&action=installer&_wpnonce=<?php echo esc_js($duplicator_nonce); ?>">
                            <b><?php esc_html_e('WordPress Root Path:', 'duplicator'); ?></b>  <?php echo esc_html(duplicator_get_abs_path()); ?><br/>
                            <?php esc_html_e("A reserved file(s) was found in the WordPress root directory. Reserved file names include [{$dup_intaller_files}].  To archive your data correctly please remove any of these files from your WordPress root directory.  Then try creating your package again.", 'duplicator'); ?>
                            <br/><input type='submit' class='button button-small' value='<?php esc_attr_e('Remove Files Now', 'duplicator') ?>' style='font-size:10px; margin-top:5px;' />
                        </form>
                    <?php endif; ?>
                </div>
            </div>

        </div>
    </div><br/>
<?php endif; ?>


<!-- ============================
FORM PACKAGE OPTIONS -->
<div style="padding:5px 5px 2px 5px">
    <?php include('s1.setup2.php'); ?>
</div>

<!-- CACHE PROTECTION: If the back-button is used from the scanner page then we need to
refresh page in-case any filters where set while on the scanner page -->
<form id="cache_detection">
    <input type="hidden" id="cache_state" name="cache_state" value="" />
</form>

<script>
    jQuery(document).ready(function ($)
    {
        Duplicator.Pack.checkPageCache = function ()
        {
            var $state = $('#cache_state');
            if ($state.val() == "") {
                $state.val("fresh-load");
            } else {
                $state.val("cached");
                <?php
                $redirect = admin_url('admin.php?page=duplicator&tab=new1');
                $redirect_nonce_url = wp_nonce_url($redirect, 'new1-package');
                echo "window.location.href = '{$redirect_nonce_url}'";
                ?>
            }
        }

        //INIT
        Duplicator.Pack.checkPageCache();

        //Toggle for system requirement detail links
        $('.dup-sys-title a').each(function () {
            $(this).attr('href', 'javascript:void(0)');
            $(this).click({selector: '.dup-sys-info'}, Duplicator.Pack.ToggleSystemDetails);
            $(this).prepend("<span class='ui-icon ui-icon-triangle-1-e dup-toggle' />");
        });

        //Color code Pass/Fail/Warn items
        $('.dup-sys-title div').each(function () {
            console.log($(this).text());
            var state = $(this).text().trim();
            $(this).removeClass();
            $(this).addClass((state == 'Pass') ? 'dup-sys-pass' : 'dup-sys-fail');
        });
    });
</script>views/packages/main/index.php000064400000000016151336065400012223 0ustar00<?php
//silentviews/packages/main/s3.build.php000064400000117702151336065400012552 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
//Nonce Check
if (!isset($_POST['dup_form_opts_nonce_field']) || !wp_verify_nonce(sanitize_text_field($_POST['dup_form_opts_nonce_field']), 'dup_form_opts')) {
    DUP_UI_Notice::redirect('admin.php?page=duplicator&tab=new1&_wpnonce='.wp_create_nonce('new1-package'));
}
require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/duparchive/class.pack.archive.duparchive.php');

$retry_nonuce           = wp_create_nonce('new1-package');
$zip_build_nonce        = wp_create_nonce('duplicator_package_build');
$duparchive_build_nonce = wp_create_nonce('duplicator_duparchive_package_build');
$active_package_present = true;

//Help support Duplicator
$atext0  = "<a target='_blank' href='https://wordpress.org/support/plugin/duplicator/reviews/?filter=5'>";
$atext0 .= __('Help review the plugin', 'duplicator') . '!</a>';

//Get even more power & features with Duplicator Pro
$atext1 = __('Want more power?  Try', 'duplicator');
$atext1 .= "&nbsp;<a target='_blank' href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=package_build_more_power&utm_campaign=duplicator_pro'>";
$atext1 .= __('Duplicator Pro', 'duplicator').'</a>!';

if (DUP_Settings::Get('installer_name_mode') == DUP_Settings::INSTALLER_NAME_MODE_SIMPLE) {
    $txtInstallHelpMsg = __("When clicking the Installer download button, the 'Save as' dialog will default the name to 'installer.php'. "
        . "To improve the security and get more information, goto: Settings ❯ Packages Tab ❯ Installer Name option.", 'duplicator');
} else {
    $txtInstallHelpMsg = __("When clicking the Installer download button, the 'Save as' dialog will save the name as '[name]_[hash]_[date]_installer.php'. "
        . "This is the secure and recommended option.  For more information goto: Settings ❯ Packages Tab ❯ Installer Name Option.  To quickly copy the hashed "
        . "installer name, to your clipboard use the copy icon link.", 'duplicator');
}

$rand_txt    = array();
$rand_txt[0] = $atext0;

?>

<style>
	a#dup-create-new {margin-left:-5px}
    div#dup-progress-area {text-align:center; max-width:800px; min-height:200px;  border:1px solid silver; border-radius:3px; margin:25px auto 10px auto;
                           padding:0px; box-shadow:0 8px 6px -6px #999;}
    div.dup-progress-title {font-size:22px;padding:5px 0 20px 0; font-weight:bold}
    div#dup-progress-area div.inner {padding:10px; line-height:22px}
    div#dup-progress-area h2.title {background-color:#efefef; margin:0px}
    div#dup-progress-area span.label {font-weight:bold}
    div#dup-msg-success {color:#18592A; padding:5px;}
    div.dup-no-mu {font-size:13px; margin-top:15px; color:maroon; line-height:18px}
    sup.dup-new {font-weight:normal; color:#b10202; font-size:12px}

    div.dup-msg-success-stats{color:#999;margin:5px 0; font-size:11px; line-height:13px}
    div.dup-msg-success-links {margin:20px 5px 5px 5px; font-size:13px;}
    div#dup-progress-area div.done-title {font-size:18px; font-weight:bold; margin:0px 0px 10px 0px}
    div#dup-progress-area div.dup-panel-title {background-color:#dfdfdf;}
	div.hdr-pack-complete {font-size:14px; color:green; font-weight:bold}

    div#dup-create-area-nolink, div#dup-create-area-link {float:right; font-weight:bold; margin:0; padding:0}
    div#dup-create-area-link {display:none; margin-left:-5px}
    div#dup-progress-area div.dup-panel-panel { border-top:1px solid silver}
    fieldset.download-area {border:2px dashed #b5b5b5; padding:20px 20px 20px 20px; border-radius:4px; margin:auto; width:500px }
    fieldset.download-area legend {font-weight:bold; font-size:18px; margin:auto; color:#000}
    button#dup-btn-installer, button#dup-btn-archive { line-height:28px; min-width:175px; height:38px !important; padding-top:3px !important; }
    a#dup-link-download-both {min-width:200px; padding:3px;}
    div.one-click-download {margin:20px 0 10px 0; font-size:16px; font-weight:bold}
    div.one-click-download i.fa-bolt{padding-right:5px}
    div.one-click-download i.fa-file-archive-o{padding-right:5px}

    div.dup-button-footer {text-align:right; margin:20px 10px 0px 0px}
    button.button {font-size:16px !important; height:30px !important; font-weight:bold; padding:0px 10px 5px 10px !important; min-width:150px }
    span.dup-btn-size {font-size:11px;font-weight:normal}
    p.get-pro {font-size:13px; color:#222; border-top:1px solid #eeeeee; padding:5px 0 0 0; margin:0; font-style:italic}
    div.dup-howto-exe {font-size:14px; font-weight:bold; margin:25px 0 40px 0;line-height:20px; color:#000; padding-top:10px;}
    div.dup-howto-exe-title {font-size:18px; margin:0 0 8px 0; color:#000}
    div.dup-howto-exe-title a {text-decoration:none; outline:none; box-shadow:none}
    div.dup-howto-exe small {font-weight:normal; display:block; margin-top:-2px; font-style:italic; font-size:12px; color:#444 }
    div.dup-howto-exe a {margin-top:8px; display:inline-block}
    div.dup-howto-exe-info {display:none; border:1px dotted #b5b5b5; padding:20px; margin:auto; width:500px; background-color:#F0F0F1; border-radius:4px;}
    div.dup-howto-exe-info a i {display:inline-block; margin:0 2px 0 2px}
    div.dup-howto-exe-area {display: flex; justify-content: center;}
    div.dup-howto-exe-txt {text-align: left; font-size:16px}
    div.dup-howto-exe-txt sup.modes {font-weight: normal; color:#999; font-style: italic;}
    div.dup-howto-exe-txt small {padding:4px 0 4px 0}
    span#dup-installer-name {display:inline-block; color:silver; font-style: italic;}
    span#dup-installer-name a {text-decoration: none}
    span#dup-installer-name-help-icon {display:none}

    /*HOST TIMEOUT */
    div#dup-msg-error {color:maroon; padding:5px;}
    div.dup-box-title {text-align:left; background-color:#F6F6F6}
    div.dup-box-title:hover { background-color:#efefef}
    div.dup-box-panel {text-align:left}
    div.no-top {border-top:none}
    div.dup-box-panel b.opt-title {font-size:18px}
    div.dup-msg-error-area {overflow-y:scroll; padding:5px 15px 15px 15px; height:100px; width:95%; border:1px solid #EEEEEE;
                        border-radius:2px; line-height:22px; text-align: left; background-color: #FFFFF3}
    div#dup-logs {text-align:center; margin:auto; padding:5px; width:350px;}
    div#dup-logs a {display:inline-block;}
    span.sub-data {display:inline-block; padding-left:20px}
</style>

<!-- =========================================
TOOL BAR:STEPS -->
<table id="dup-toolbar">
    <tr valign="top">
        <td style="white-space:nowrap">
            <div id="dup-wiz">
                <div id="dup-wiz-steps">
                    <div class="completed-step"><a>1 <?php esc_html_e('Setup', 'duplicator'); ?></a></div>
                    <div class="completed-step"><a>2 <?php esc_html_e('Scan', 'duplicator'); ?> </a></div>
                    <div class="active-step"><a>3 <?php esc_html_e('Build', 'duplicator'); ?> </a></div>
                </div>
                <div id="dup-wiz-title" class="dup-guide-txt-color">
                    <i class="fab fa-wordpress"></i>
                    <?php esc_html_e('Step 3: Build and download the package files.', 'duplicator'); ?>
                </div>
            </div>
        </td>
        <td style="padding-bottom:4px">
            <span>
                <a id="dup-packages-btn" href="?page=duplicator" class="button <?php echo ($active_package_present ? 'no-display' :''); ?>">
                    <?php esc_html_e("Packages",'duplicator'); ?>
                </a>
            </span>
            <?php
			$package_url = admin_url('admin.php?page=duplicator&tab=new1');
			$package_nonce_url = wp_nonce_url($package_url, 'new1-package');
			?>
			<a id="dup-create-new"
               onclick="return !jQuery(this).hasClass('disabled');"
               href="<?php echo $package_nonce_url;?>"
               class="button <?php echo ($active_package_present ? 'no-display' :''); ?>">
                <?php esc_html_e("Create New", 'duplicator'); ?>
            </a>
        </td>
    </tr>
</table>
<hr class="dup-toolbar-line">


<form id="form-duplicator" method="post" action="?page=duplicator">
<?php wp_nonce_field('dup_form_opts', 'dup_form_opts_nonce_field', false); ?>

<!--  PROGRESS BAR -->
<div id="dup-progress-bar-area">
	<div class="dup-progress-title"><?php esc_html_e('Building Package', 'duplicator'); ?> <i class="fa fa-cog fa-spin"></i> <span id="dup-progress-percent">0%</span></div>
	<div id="dup-progress-bar"></div>
	<b><?php esc_html_e('Please Wait...', 'duplicator'); ?></b><br/><br/>
	<i><?php esc_html_e('Keep this window open and do not close during the build process.', 'duplicator'); ?></i><br/>
	<i><?php esc_html_e('This may take several minutes to complete.', 'duplicator'); ?></i><br/>
</div>

<div id="dup-progress-area" class="dup-panel" style="display:none">
	<div class="dup-panel-title"><b style="font-size:22px"><?php esc_html_e('Build Status', 'duplicator'); ?></b></div>
	<div class="dup-panel-panel">

		<!--  =========================
		SUCCESS MESSAGE -->
		<div id="dup-msg-success" style="display:none">
			<div class="hdr-pack-complete">
				<i class="far fa-check-square fa-lg"></i> <?php esc_html_e('Package Build Completed', 'duplicator'); ?>
			</div>

			<div class="dup-msg-success-stats">
				<b><?php esc_html_e('Build Time', 'duplicator'); ?>:</b> <span id="data-time"></span><br/>
			</div><br/>

			<!-- DOWNLOAD FILES -->
			<fieldset class="download-area">
				<legend>
					&nbsp; <i class="fa fa-download"></i> <?php esc_html_e("Download Package Files", 'duplicator') ?>  &nbsp;
				</legend>
				<button id="dup-btn-installer" class="button button-primary button-large" title="<?php esc_attr_e("Click to download installer file", 'duplicator') ?>">
					<i class="fa fa-bolt fa-sm"></i> <?php esc_html_e("Installer", 'duplicator') ?> &nbsp;
				</button> &nbsp;
				<button id="dup-btn-archive" class="button button-primary button-large" title="<?php esc_attr_e("Click to download archive file", 'duplicator') ?>">
					<i class="far fa-file-archive"></i> <?php esc_html_e("Archive", 'duplicator') ?>
					<span id="dup-btn-archive-size" class="dup-btn-size"></span> &nbsp;
				</button>
				<div class="one-click-download">
                    <a href="javascript:void(0)" id="dup-link-download-both" title="<?php esc_attr_e("Click to download both files", 'duplicator') ?>" class="button">
                        <i class="fa fa-bolt fa-sm"></i><i class="far fa-file-archive"></i>
                        <?php esc_html_e("Download Both Files",   'duplicator') ?>
					</a>
					<sup>
						<i class="fas fa-question-circle fa-sm" style='font-size:11px'
							data-tooltip-title="<?php esc_attr_e("Download Both Files:", 'duplicator'); ?>"
							data-tooltip="<?php esc_attr_e('Clicking this button will open the installer and archive download prompts one after the other with one click verses '
                                . 'downloading each file separately with two clicks.  On some browsers you may have to disable pop-up warnings on this domain for this to '
                                . 'work correctly.', 'duplicator'); ?>">
						</i>
					</sup>
				</div>
                <div style="margin-top:20px; font-size:11px">
                    <span id="dup-click-to-copy-installer-name"
                          class="link-style no-decoration"
                          data-dup-copy-text="<?php echo esc_attr(DUP_Installer::DEFAULT_INSTALLER_FILE_NAME_WITHOUT_HASH); ?>">
                        <?php esc_html_e("[Copy Installer Name to Clipboard]", 'duplicator'); ?>
                        <i class="far fa-copy"></i>
                    </span><br/>
                    <span id="dup-installer-name" data-installer-name="">
                        <a href="javascript:void(0)" onclick="Duplicator.Pack.ShowInstallerName()">
                            <?php esc_html_e("[Show Installer Name]", 'duplicator'); ?>
                        </a>
                    </span>
                    <span id="dup-installer-name-help-icon">
                        <i class="fas fa-question-circle fa-sm"
                            data-tooltip-title="<?php esc_attr_e("Installer Name:", 'duplicator'); ?>"
                            data-tooltip="<?php echo $txtInstallHelpMsg ?>">
                        </i>
                    </span>
                </div>
			</fieldset>

            <?php
                if (is_multisite()) {
                    echo '<div class="dup-no-mu">';
                    echo '<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>&nbsp;';
                    esc_html_e('Notice:Duplicator Lite does not officially support WordPress multisite.', 'duplicator');
                    echo "<br/>";
                    esc_html_e('We strongly recommend upgrading to ', 'duplicator');
                    echo "&nbsp;<i><a href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_is_mu_warn6&utm_campaign=duplicator_pro' target='_blank'>[" . esc_html__('Duplicator Pro', 'duplicator') . "]</a></i>.";
                    echo '</div>';
                }
            ?>

			<div class="dup-howto-exe">
                <div class="dup-howto-exe-title" onclick="Duplicator.Pack.ToggleHelpInstall(this)">
                    <a href="javascript:void(0)">
                        <i class="far fa-plus-square"></i>
                        <?php esc_html_e('How to install this package?', 'duplicator'); ?>
                    </a>
                </div>
                <div class="dup-howto-exe-info">
                    <div class="dup-howto-exe-area">
                        <div class="dup-howto-exe-txt">
               
                            <!-- CLASSIC -->
                            <i class="far fa-save fa-sm fa-fw"></i>
                            <a href="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=package_built_install_help1_bwording2&utm_campaign=duplicator_free#quick-040-q" target="_blank">
                                <?php esc_html_e('Install to Empty Directory ', 'duplicator'); ?>
                            </a>
                            <sup class="modes">
                                <i class="fas fa-external-link-alt fa-xs"></i>
                            </sup>
                            <br/>

                            <small>
                                <?php
                                    _e('Install to an empty directory like a new WordPress install does.', 'duplicator');
                                ?>
                            </small><br/>

                            <!-- OVERWRITE -->
                            <i class="far fa-window-close fa-sm fa-fw"></i>
                            <a href="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=package_built_install_help2_bwording2&utm_campaign=duplicator_free#quick-043-q" target="_blank">
                                <?php esc_html_e('Overwrite Site', 'duplicator'); ?>
                            </a>
                            <sup class="modes">
                                <i class="fas fa-external-link-alt fa-xs"></i>
                            </sup>
                            <br/>

                            <small><?php  _e("Quickly overwrite an existing WordPress site in a few clicks.", 'duplicator');?></small>
                            <br/>


                            <!-- IMPORT -->
                            <i class="fas fa-arrow-alt-circle-down fa-sm fa-fw"></i>
                            <a href="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=package_built_install_help3_bwording2&utm_campaign=duplicator_free#quick-045-q" target="_blank">
                                <?php esc_html_e('Import Archive and Overwrite Site', 'duplicator'); ?>
                            </a>
                            <sup class="modes">
                                <i class="fas fa-external-link-alt fa-xs"></i>
                            </sup>
                            <br/>
                            <small><?php  _e("Drag-n-drop or use a URL for super-fast installs (requires Pro*)", 'duplicator');?></small>

                        </div>
                    </div>
                </div>
			</div>

			<p class="get-pro">
				<?php echo $rand_txt[array_rand($rand_txt, 1)]; ?>
			</p>
		</div>

		<!--  =========================
		ERROR MESSAGE -->
		<div id="dup-msg-error" style="display:none; color:#000">
			<div class="done-title"><i class="fa fa-chain-broken"></i> <?php esc_html_e('Host Build Interrupt', 'duplicator'); ?></div>
			<b><?php esc_html_e('This server cannot complete the build due to host setup constraints, see the error message for more details.', 'duplicator'); ?></b><br/>
            <i><?php esc_html_e("If the error details are not specific consider the options below by clicking each section.", 'duplicator'); ?></i>
            <br/><br/>

			<!-- OPTION 1:Try DupArchive Engine -->
			<div class="dup-box">
				<div class="dup-box-title">
                    <i class="far fa-check-circle fa-sm fa-fw"></i>
                    <?php esc_html_e('Option 1: DupArchive', 'duplicator'); ?>
					<div class="dup-box-arrow"><i class="fa fa-caret-down"></i></div>
				</div>
				<div class="dup-box-panel" id="dup-pack-build-try1" style="display:none">

					<?php esc_html_e('Enable the DupArchive format which is specific to Duplicator and designed to perform better on constrained budget hosts.', 'duplicator'); ?>
					<br/><br/>

					<div style="font-style:italic">
						<?php esc_html_e('Note:DupArchive on Duplicator only supports sites up to 500MB.  If your site is over 500MB then use a file filter on step 1 to get the size '
						. 'below 500MB or try the other options mentioned below.  Alternatively, you may want to consider',
						'duplicator'); ?>
						<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&amp;utm_medium=wordpress_plugin&amp;utm_content=build_interrupt&amp;utm_campaign=duplicator_pro" target="_blank">
							Duplicator Pro,
						</a>
                        <?php esc_html_e(' which is capable of migrating sites much larger than 500MB.'); ?>
					</div><br/>

					<b><i class="far fa-file-alt fa-sm"></i> <?php esc_html_e('Overview', 'duplicator'); ?></b><br/>
					<?php esc_html_e('Please follow these steps:', 'duplicator'); ?>
					<ol>
						<li><?php esc_html_e('On the scanner step check to make sure your package is under 500MB. If not see additional options below.', 'duplicator'); ?></li>
						<li>
							<?php esc_html_e('Go to Duplicator &gt; Settings &gt; Packages Tab &gt; Archive Engine &gt;', 'duplicator'); ?>
							<a href="admin.php?page=duplicator-settings&tab=package"><?php esc_html_e('Enable DupArchive', 'duplicator'); ?></a>
						</li>
						<li><?php esc_html_e('Build a new package using the new engine format.', 'duplicator'); ?></li>
					</ol>

					<small style="font-style:italic">
						<?php esc_html_e('Note:The DupArchive engine will generate an archive.daf file. This file is very similar to a .zip except that it can only be extracted by the '
							. 'installer.php file or the', 'duplicator'); ?>
						<a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-052-q" target="_blank"><?php esc_html_e('commandline extraction tool'); ?></a>.
					</small>
				</div>
			</div>

			<!-- OPTION 2:TRY AGAIN -->
			<div class="dup-box  no-top">
				<div class="dup-box-title">
					<i class="fas fa-filter fa-sm fa-fw"></i>
                    <?php esc_html_e('Option 2: File Filters', 'duplicator'); ?>
					<div class="dup-box-arrow"><i class="fa fa-caret-down"></i></div>
				</div>
				<div class="dup-box-panel" style="display:none">
					<?php
						esc_html_e('The first pass for reading files on some budget hosts maybe slow and have conflicts with strict timeout settings setup by the hosting provider.  '
						. 'In these cases, it is recommended to retry the build by adding file filters to larger files/directories.', 'duplicator');

						echo '	<br/><br/>';

						esc_html_e('For example, you could  filter out the  "/wp-content/uploads/" folder to create the package then move the files from that directory over manually.  '
							. 'If this work-flow is not desired or does not work please check-out the other options below.', 'duplicator');
					?>
					<br/><br/>
					<div style="text-align:center; margin:10px 0 2px 0">
						<input type="button" class="button-large button-primary" value="<?php esc_attr_e('Retry Build With Filters', 'duplicator'); ?>" onclick="window.history.back()" />
					</div>

					<div style="color:#777; padding:15px 5px 5px 5px">
						<b> <?php esc_html_e('Notice', 'duplicator'); ?></b><br/>
						<?php
						printf('<b><i class="fa fa-folder-o"></i> %s %s</b> <br/> %s', esc_html__('Build Folder:'), DUP_Settings::getSsdirTmpPath(),
							__("On some servers the build will continue to run in the background. To validate if a build is still running; open the 'tmp' folder above and see "
								."if the archive file is growing in size or check the main packages screen to see if the package completed. If it is not then your server "
								."has strict timeout constraints.", 'duplicator')
						);
						?>
					</div>
				</div>
			</div>

			<!-- OPTION 3:Two-Part Install -->
			<div class="dup-box no-top">
				<div class="dup-box-title">
					<i class="fas fa-random fa-sm fa-fw"></i>
                    <?php esc_html_e('Option 3: Two-Part Install', 'duplicator'); ?>
					<div class="dup-box-arrow"><i class="fa fa-caret-down"></i></div>
				</div>
				<div class="dup-box-panel" style="display:none">

					<?php esc_html_e('A two-part install minimizes server load and can avoid I/O and CPU issues encountered on some budget hosts. With this procedure you simply build a '
						.'\'database-only\' archive, manually move the website files, and then run the installer to complete the process.', 'duplicator');
					?><br/><br/>

					<b><i class="far fa-file-alt fa-sm"></i><?php esc_html_e(' Overview', 'duplicator'); ?></b><br/>
						<?php esc_html_e('Please follow these steps:', 'duplicator'); ?><br/>
					<ol>
						<li><?php esc_html_e('Click the button below to go back to Step 1.', 'duplicator'); ?></li>
						<li><?php esc_html_e('On Step 1 the "Archive Only the Database" checkbox will be auto checked.', 'duplicator'); ?></li>
						<li>
							<?php esc_html_e('Complete the package build and follow the ', 'duplicator'); ?>
							<?php
							printf('%s "<a href="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=host_interupt_2partlink2&utm_campaign=build_issues#quick-060-q" target="faq">%s</a>".',
								'', esc_html__('Quick Start Two-Part Install Instructions', 'duplicator'));
							?>
						</li>
					</ol>

					<div style="text-align:center; margin:10px">
						<input type="checkbox" id="dup-two-part-check" onclick="Duplicator.Pack.ToggleTwoPart()">
						<label for="dup-two-part-check"><?php esc_html_e('Yes. I have read the above overview and would like to continue!', 'duplicator'); ?></label><br/><br/>
						<button id="dup-two-part-btn"  type="button" class="button-large button-primary" disabled="true" onclick="window.location = 'admin.php?page=duplicator&tab=new1&retry=2&_wpnonce=<?php echo $retry_nonuce; ?>'">
							<i class="fa fa-random"></i> <?php esc_html_e('Start Two-Part Install Process', 'duplicator'); ?>
						</button>
					</div><br/>
				</div>
			</div>

			<!-- OPTION 4:DIAGNOSE SERVER -->
			<div class="dup-box no-top">
				<div class="dup-box-title">
                    <i class="fas fa-cog fa-sm fa-fw"></i>
                    <?php esc_html_e('Option 4: Configure Server', 'duplicator'); ?>
					<div class="dup-box-arrow"><i class="fa fa-caret-down"></i></div>
				</div>
				<div class="dup-box-panel" id="dup-pack-build-try3" style="display:none">
				<!--	<b class="opt-title"><?php esc_html_e('OPTION 4:', 'duplicator'); ?></b><br/>-->
					<?php esc_html_e('This option is available on some hosts that allow for users to adjust server configurations.  With this option you will be directed to an '
						. 'FAQ page that will show various recommendations you can take to improve/unlock constraints set up on this server.', 'duplicator');
					?><br/><br/>

					<div style="text-align:center; margin:10px; font-size:16px; font-weight:bold">
						<a href="https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=host_interupt_diagnosebtn&utm_campaign=build_issues#faq-trouble-100-q" target="_blank">
							[<?php esc_html_e('Diagnose Server Setup', 'duplicator'); ?>]
						</a>
					</div>

					<b><?php esc_html_e('RUNTIME DETAILS', 'duplicator'); ?>:</b><br/>
					<div class="dup-msg-error-area">
						<div id="dup-msg-error-response-time">
							<span class="label"><?php esc_html_e("Allowed Runtime:", 'duplicator'); ?></span>
							<span class="data"></span>
						</div>
						<div id="dup-msg-error-response-php">
							<span class="label"><?php esc_html_e("PHP Max Execution", 'duplicator'); ?></span><br/>
							<span class="data sub-data">
								<span class="label"><?php esc_html_e("Time", 'duplicator'); ?>:</span>
								<?php
								$try_value   = @ini_get('max_execution_time');
								$try_update  = set_time_limit(0);
								echo "$try_value <a href='http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time' target='_blank'> (default)</a>";
								?>
								<i class="fa fa-question-circle data-size-help"
								   data-tooltip-title="<?php esc_attr_e("PHP Max Execution Time", 'duplicator'); ?>"
								   data-tooltip="<?php esc_attr_e('This value is represented in seconds. A value of 0 means no timeout limit is set for PHP.',    'duplicator'); ?>"></i>
							</span><br/>

							<span class="data sub-data">
								<span class="label"><?php esc_html_e("Mode", 'duplicator'); ?>:</span>
								   <?php
								   $try_update  = $try_update ? 'is dynamic' :'value is fixed';
								   echo "{$try_update}";
								   ?>
								<i class="fa fa-question-circle data-size-help"
								   data-tooltip-title="<?php esc_attr_e("PHP Max Execution Mode", 'duplicator'); ?>"
								   data-tooltip="<?php
								   esc_html_e('If the value is [dynamic] then its possible for PHP to run longer than the default.  '
									   .'If the value is [fixed] then PHP will not be allowed to run longer than the default. <br/><br/> If this value is larger than the [Allowed Runtime] above then '
									   .'the web server has been enabled with a timeout cap and is overriding the PHP max time setting.', 'duplicator');
								   ?>"></i>
							</span>
						</div>
						<div id="dup-msg-error-response-status">
							<span class="label"><?php esc_html_e("Server Status:", 'duplicator'); ?></span>
							<span class="data"><?php esc_html_e("unavailable", 'duplicator'); ?></span>
						</div>
					</div>
				</div>
			</div>
            <br/><br/>


            <!-- ERROR DETAILS-->
			<div class="dup-box no-top">
				<div class="dup-box-title" id="dup-pack-build-err-info" >
					<i class="fas fa-file-contract fa-fw fa-sm"></i>
                    <?php esc_html_e('System Details', 'duplicator'); ?>
					<div class="dup-box-arrow"><i class="fa fa-caret-down"></i></div>
				</div>
				<div class="dup-box-panel" style="display:none">
                    <span class="label"><?php esc_html_e("Error Message:", 'duplicator'); ?></span>
                    <div class="dup-msg-error-area">
                        <div id="dup-msg-error-response-text">
                            <span class="data"><?php esc_html_e("Error status unavailable.", 'duplicator'); ?></span>
                        </div>
                    </div>

                    <div id="dup-logs" style="color:maroon; font-size:16px">
                        <br/>
                        <i class="fas fa-file-contract fa-fw "></i>
                        <a href='javascript:void(0)' style="color:maroon" onclick='Duplicator.OpenLogWindow(true)'>
                            <?php esc_html_e('See Package Log For Complete Details', 'duplicator'); ?>
                        </a>
                    </div>
				</div>
			</div>
            <br/><br/>

		</div>


	</div>
</div>
</form>

<script>
jQuery(document).ready(function ($) {

	Duplicator.Pack.DupArchiveFailureCount = 0;
	Duplicator.Pack.DupArchiveMaxRetries = 10;
	Duplicator.Pack.DupArchiveRetryDelayInMs = 8000;
	Duplicator.Pack.DupArchiveStartTime = new Date().getTime();
	Duplicator.Pack.StatusFrequency = 8000;

	/*	----------------------------------------
	 *	METHOD:Performs Ajax post to create a new package
	 *	Timeout (10000000 = 166 minutes)  */
	Duplicator.Pack.CreateZip = function ()	{
		var startTime;
		var data = {action:'duplicator_package_build', nonce:'<?php echo esc_js($zip_build_nonce); ?>'}
		var statusInterval = setInterval(Duplicator.Pack.GetActivePackageStatus, Duplicator.Pack.StatusFrequency);

		$.ajax({
			type:"POST",
			cache:false,
			dataType:"text",
			url:ajaxurl,
			timeout:0, // no timeout
			data:data,
			beforeSend:function () {
				startTime = new Date().getTime();
			},
			complete:function () {
				Duplicator.Pack.PostTransferCleanup(statusInterval, startTime);
			},
			success:function (respData, textStatus, xHr) {
				try {
					var data = Duplicator.parseJSON(respData);
				} catch(err) {
					console.error(err);
					console.error('JSON parse failed for response data:' + respData);
					$('#dup-progress-bar-area').hide();
					$('#dup-progress-area, #dup-msg-error').show(200);
					var status = xHr.status + ' -' + data.statusText;
					var response = (xHr.responseText != undefined && xHr.responseText.trim().length > 1)
                        ? xHr.responseText.trim()
                        : 'No client side error - see package log file';
					$('#dup-msg-error-response-status span.data').html(status)
					$('#dup-msg-error-response-text span.data').html(response);
					console.log(xHr);
					return false;
				}

                if ((data != null) && (typeof (data) != 'undefined') && data.status == 1) {
                    Duplicator.Pack.WireDownloadLinks(data);
                } else {
                    var message = (typeof (data.error) != 'undefined' && data.error.length) ? data.error :'Error processing package';
                    Duplicator.Pack.DupArchiveProcessingFailed(message);
                }

			},
			error:function (xHr) {
				$('#dup-progress-bar-area').hide();
				$('#dup-progress-area, #dup-msg-error').show(200);
				var status = xHr.status + ' -' + data.statusText;
				var response = (xHr.responseText != undefined && xHr.responseText.trim().length > 1)
                    ? xHr.responseText.trim()
                    : 'No client side error - see package log file';
				$('#dup-msg-error-response-status span.data').html(status)
				$('#dup-msg-error-response-text span.data').html(response);
				console.log(xHr);
			}
		});
		return false;
	}

	/*	----------------------------------------
	 *	METHOD:Performs Ajax post to create a new DupArchive-based package */
	Duplicator.Pack.CreateDupArchive = function () {
		console.log('Duplicator.Pack.CreateDupArchive');
		var data = {action:'duplicator_duparchive_package_build', nonce:'<?php echo esc_js($duparchive_build_nonce); ?>'}
		var statusInterval = setInterval(Duplicator.Pack.GetActivePackageStatus, Duplicator.Pack.StatusFrequency);

		$.ajax({
			type:"POST",
			timeout:0, // no timeout
			dataType:"text",
			url:ajaxurl,
			data:data,
			complete:function () {
				Duplicator.Pack.PostTransferCleanup(statusInterval, Duplicator.Pack.DupArchiveStartTime);
			},
			success:function (respData, textStatus, xHr) {
				try {
					var data = Duplicator.parseJSON(respData);
				} catch(err) {
					console.log(err);
					console.log('JSON parse failed for response data:' + respData);
					console.log('DupArchive AJAX error!');
					console.log("jqHr:");
					console.log(xHr);
					console.log("textStatus:");
					console.log(textStatus);
					Duplicator.Pack.HandleDupArchiveInterruption(xHr.responseText);
					return false;
				}

				console.log("CreateDupArchive:AJAX success. Data equals:");
				console.log(data);
				// DATA FIELDS
				// archive_offset, archive_size, failures, file_index, is_done, timestamp

				if ((data != null) && (typeof (data) != 'undefined') && ((data.status == 1) || (data.status == 3) || (data.status == 4))) {

					Duplicator.Pack.DupArchiveFailureCount = 0;

					// Status = 1 means complete, 4 means more to process
					console.log("CreateDupArchive:Passed");
					var criticalFailureText = Duplicator.Pack.GetFailureText(data.failures, true);

					if (data.failures.length > 0) {
						console.log("CreateDupArchive:There are failures present. (" + data.failures.length) + ")";
					}

					if ((criticalFailureText === '') && (data.status != 3)) {
						console.log("CreateDupArchive:No critical failures");
						if (data.status == 1) {

							// Don't stop for non-critical failures - just display those at the end TODO:put these in the log not popup
							console.log("CreateDupArchive:archive has completed");
							if (data.failures.length > 0) {
								console.log(data.failures);
								var errorMessage = "CreateDupArchive:Problems during package creation. These may be non-critical so continue with install.\n------\n";
								var len = data.failures.length;

								for (var j = 0; j < len; j++) {
									failure = data.failures[j];
									errorMessage += failure + "\n";
								}
								alert(errorMessage);
							}

						    Duplicator.Pack.WireDownloadLinks(data);

						} else {
							// data.Status == 4
							console.log('CreateDupArchive:Archive not completed so continue ping DAWS in 500');
							setTimeout(Duplicator.Pack.CreateDupArchive, 500);
						}
					} else {
						console.log("CreateDupArchive:critical failures present");
						// If we get a critical failure it means it's something we can't recover from so no purpose in retrying, just fail immediately.
						var errorString = 'Error Processing Step 1<br/>';
						errorString += criticalFailureText;
						Duplicator.Pack.DupArchiveProcessingFailed(errorString);
					}
				} else {
					// data is null or Status is warn or fail
					var errorString = '';
					if(data == null) {
						errorString = "Data returned from web service is null.";
					}
					else {
						var errorString = '';
						if(data.failures.length > 0) {
							errorString += Duplicator.Pack.GetFailureText(data.failures, false);
						}
					}
					Duplicator.Pack.HandleDupArchiveInterruption(errorString);
				}
			},
			error:function (xHr, textStatus) {
				console.log('DupArchive AJAX error!');
				console.log("jqHr:");
				console.log(xHr);
				console.log("textStatus:");
				console.log(textStatus);
				Duplicator.Pack.HandleDupArchiveInterruption(xHr.responseText);
			}
		});
	};

	/*	----------------------------------------
	 *	METHOD:Retrieves package status and updates UI with build percentage */
	Duplicator.Pack.GetActivePackageStatus = function () {
		var data = {action:'DUP_CTRL_Package_getActivePackageStatus', nonce:'<?php echo wp_create_nonce('DUP_CTRL_Package_getActivePackageStatus'); ?>'}
		console.log('####Duplicator.Pack.GetActivePackageStatus');

		$.ajax({
			type:"POST",
			url:ajaxurl,
			dataType:"text",
			timeout:0, // no timeout
			data:data,
			success:function (respData, textStatus, xHr) {
				try {
					var data = Duplicator.parseJSON(respData);
				} catch(err) {
					console.error(err);
					console.error('JSON parse failed for response data:' + respData);
					console.log('Error retrieving build status');
                    console.log(xHr);
					return false;
				}
				if(data.report.status == 1) {
					$('#dup-progress-percent').html(data.payload.status + "%");
				} else {
					console.log('Error retrieving build status');
					console.log(data);
				}
			},
			error:function (xHr) {
				console.log('Error retrieving build status');
				console.log(xHr);
			}
		});
		return false;
	}

	Duplicator.Pack.PostTransferCleanup = function(statusInterval, startTime) {
		clearInterval(statusInterval);
		endTime = new Date().getTime();
		var millis = (endTime - startTime);
		var minutes = Math.floor(millis / 60000);
		var seconds = ((millis % 60000) / 1000).toFixed(0);
		var status = minutes + ":" + (seconds < 10 ? '0' :'') + seconds;
		$('#dup-msg-error-response-time span.data').html(status);
	};

	Duplicator.Pack.WireDownloadLinks = function(data) {
		var pack = data.package;
		var archive_json = {
		    filename:pack.Archive.File,
            url:"<?php echo DUP_Settings::getSsdirUrl(); ?>" + "/" + pack.Archive.File
        };
		var installer_json = {
		    id:pack.ID,
            hash:pack.Hash
        };

		$('#dup-progress-bar-area').hide();
		$('#dup-progress-area, #dup-msg-success').show(300);

		$('#dup-btn-archive-size').append('&nbsp; (' + data.archiveSize + ')')
		$('#data-name-hash').text(pack.NameHash || 'error read');
		$('#data-time').text(data.runtime || 'unable to read time');
        $('#dup-create-new').removeClass('no-display');
        $('#dup-packages-btn').removeClass('no-display');

		//Wire Up Downloads
		$('#dup-btn-installer').click(function() {
		    Duplicator.Pack.DownloadInstaller(installer_json);
		    return false;
		});

		$('#dup-btn-archive').click(function() {
			Duplicator.Pack.DownloadFile(archive_json);
			return false;
		});

		$('#dup-link-download-both').on("click", function () {
			$('#dup-btn-installer').trigger('click');
			setTimeout(function(){
				$('#dup-btn-archive').trigger('click');
			}, 700);
			return false;
		});

		$('#dup-click-to-copy-installer-name').data('dup-copy-text', data.instDownloadName);
        $('#dup-installer-name').data('data-installer-name', data.instDownloadName);
	};

	Duplicator.Pack.HandleDupArchiveInterruption = function (errorText)	{
		Duplicator.Pack.DupArchiveFailureCount++;

		if (Duplicator.Pack.DupArchiveFailureCount <= Duplicator.Pack.DupArchiveMaxRetries) {
			console.log("Failure count:" + Duplicator.Pack.DupArchiveFailureCount);
			// / rsr todo don’t worry about this right now Duplicator.Pack.DupArchiveThrottleDelay = 9;	// Equivalent of 'low' server throttling (ms)
			console.log('Relaunching in ' + Duplicator.Pack.DupArchiveRetryDelayInMs);
			setTimeout(Duplicator.Pack.CreateDupArchive, Duplicator.Pack.DupArchiveRetryDelayInMs);
		} else {
			console.log('Too many failures.' + errorText);
			// Processing problem
			Duplicator.Pack.DupArchiveProcessingFailed("Too many retries when building DupArchive package. " + errorText);
		}
	};

	Duplicator.Pack.DupArchiveProcessingFailed = function (errorText) {
		$('#dup-progress-bar-area').hide();
		$('#dup-progress-area, #dup-msg-error').show(200);
		$('#dup-msg-error-response-text span.data').html(errorText);
        $('#dup-pack-build-err-info').trigger('click');
	};

	Duplicator.Pack.GetFailureText = function (failures, onlyCritical)
	{
		var retVal = '';
		if ((failures !== null) && (typeof failures !== 'undefined')) {
			var len = failures.length;

			for (var j = 0; j < len; j++) {
				failure = failures[j];
				if (!onlyCritical || failure.isCritical) {
					retVal += failure.description;
					retVal += "<br/>";
				}
			}
		}
		return retVal;
	};

	Duplicator.Pack.ToggleTwoPart = function () {
		var $btn = $('#dup-two-part-btn');
		if ($('#dup-two-part-check').is(':checked')) {
			$btn.removeAttr("disabled");
		} else {
			$btn.attr("disabled", true);
		}
	};

    Duplicator.Pack.ToggleHelpInstall = function (div) {
		var $div    = $(div);
        var $icon   = $div.find('i.far')
        var $info   = $('div.dup-howto-exe-info');
		if ($icon.hasClass('fa-plus-square')) {
			$icon.attr('class', 'far fa-minus-square');
            $info.show();
		} else {
			$icon.attr('class', 'far fa-plus-square');
            $info.hide();
		}
	};

    Duplicator.Pack.ShowInstallerName = function () {
		var txt = $('#dup-installer-name').data('data-installer-name');
        $('#dup-installer-name').html(txt);
        $('#dup-installer-name-help-icon').show();
	};

	//Page Init:
	Duplicator.UI.AnimateProgressBar('dup-progress-bar');

	<?php if (DUP_Settings::Get('archive_build_mode') == DUP_Archive_Build_Mode::ZipArchive):?>
		Duplicator.Pack.CreateZip();
	<?php else:?>
		Duplicator.Pack.CreateDupArchive();
	<?php endif; ?>
});
</script>views/packages/main/s2.scan2.php000064400000036056151336065400012462 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<!-- ================================================================
SETUP  -->
<div class="details-title">
	<i class="fas fa-tasks"></i> <?php esc_html_e("Setup", 'duplicator');	?>
	<div class="dup-more-details">
		<a href="?page=duplicator-tools&tab=diagnostics" target="_blank" title="<?php esc_attr_e('Show Diagnostics', 'duplicator');?>"><i class="fa fa-microchip"></i></a>&nbsp;
        <a href="site-health.php" target="_blank" title="<?php esc_attr_e('Check Site Health', 'duplicator');?>"><i class="fas fa-file-medical-alt"></i></a>
	</div>
</div>

<!-- ============
SYSTEM AND WORDPRESS -->
<div class="scan-item scan-item-first">

    <?php
    
    //TODO Login Need to go here

    $core_dir_included   = array();
    $core_files_included = array();
    //by default fault
    $core_dir_notice     = false;
    $core_file_notice    = false;

    if (!$Package->Archive->ExportOnlyDB && isset($_POST['filter-on']) && isset($_POST['filter-dirs'])) {

        //findout matched core directories
        $filter_dirs = explode(";", trim(sanitize_text_field(($_POST['filter-dirs']))));

        // clean possible blank spaces before and after the paths
        for ($i = 0; $i < count($filter_dirs); $i++) {
            $filter_dirs[$i] = trim($filter_dirs[$i]);
            $filter_dirs[$i] = (substr($filter_dirs[$i], -1) == "/") ? substr($filter_dirs[$i],0, strlen($filter_dirs[$i])-1):$filter_dirs[$i] ;

        }
        $core_dir_included = array_intersect($filter_dirs,
            DUP_Util::getWPCoreDirs());
        if (count($core_dir_included)) $core_dir_notice   = true;


        //find out core files
        $filter_files = explode(";", trim($_POST['filter-files']));

        // clean possible blank spaces before and after the paths
        for ($i = 0; $i < count($filter_files); $i++) {
            $filter_files[$i] = trim($filter_files[$i]);
        }
        $core_files_included = array_intersect($filter_files,
            DUP_Util::getWPCoreFiles());
        if (count($core_files_included)) $core_file_notice    = true;
    }
    ?>
	<div class='title' onclick="Duplicator.Pack.toggleScanItem(this);">
		<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('System', 'duplicator');?></div>
		<div id="data-srv-sys-all"></div>
	</div>
	<div class="info">
	<?php
		//WEB SERVER
		$web_servers = implode(', ', $GLOBALS['DUPLICATOR_SERVER_LIST']);
		echo '<span id="data-srv-php-websrv"></span>&nbsp;<b>' . esc_html__('Web Server', 'duplicator') . ":</b>&nbsp; '".esc_attr($_SERVER['SERVER_SOFTWARE'])."' <br/>";
		_e("Supported web servers: ", 'duplicator');
		echo "<i>".esc_html($web_servers)."</i>";

		//PHP VERSION
		echo '<hr size="1" /><span id="data-srv-php-version"></span>&nbsp;<b>' . esc_html__('PHP Version', 'duplicator') . "</b> <br/>";
		_e('The minimum PHP version supported by Duplicator is 5.2.9. It is highly recommended to use PHP 5.3+ for improved stability.  For international language support please use PHP 7.0+.', 'duplicator');
		
		//OPEN_BASEDIR
		$test = ini_get("open_basedir");
		$test = ($test) ? 'ON' : 'OFF';
		echo '<hr size="1" /><span id="data-srv-php-openbase"></span>&nbsp;<b>' . esc_html__('PHP Open Base Dir', 'duplicator') . ":</b>&nbsp; '{$test}' <br/>";
		_e('Issues might occur when [open_basedir] is enabled. Work with your server admin to disable this value in the php.ini file if you’re having issues building a package.', 'duplicator');
		echo "&nbsp;<i><a href='http://php.net/manual/en/ini.core.php#ini.open-basedir' target='_blank'>[" . esc_html__('details', 'duplicator') . "]</a></i><br/>";

		//MAX_EXECUTION_TIME
		$test = (@set_time_limit(0)) ? 0 : ini_get("max_execution_time");
		echo '<hr size="1" /><span id="data-srv-php-maxtime"></span>&nbsp;<b>' . esc_html__('PHP Max Execution Time', 'duplicator') . ":</b>&nbsp; '{$test}' <br/>";
		_e('Timeouts may occur for larger packages when [max_execution_time] time in the php.ini is too low.  A value of 0 (recommended) indicates that PHP has no time limits. '
			. 'An attempt is made to override this value if the server allows it.', 'duplicator');
		echo '<br/><br/>';
		_e('Note: Timeouts can also be set at the web server layer, so if the PHP max timeout passes and you still see a build timeout messages, then your web server could be killing '
			. 'the process.   If you are on a budget host and limited on processing time, consider using the database or file filters to shrink the size of your overall package.   '
			. 'However use caution as excluding the wrong resources can cause your install to not work properly.', 'duplicator');
		echo "&nbsp;<i><a href='http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time' target='_blank'>[" . esc_html__('details', 'duplicator')  . "]</a></i>";
        if ($zip_check != null) {
            echo '<br/><br/>';
            echo '<span style="font-weight:bold">';
            _e('Get faster builds with Duplicator Pro with access to shell_exec zip.', 'duplicator');
            echo '</span>';
            echo "&nbsp;<i><a href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_max_execution_time_warn&utm_campaign=duplicator_pro' target='_blank'>[" . esc_html__('details', 'duplicator') . "]</a></i>";
        }

        //MANAGED HOST
        $test = DUP_Custom_Host_Manager::getInstance()->isManaged() ? "true" : "false";
        echo '<hr size="1" /><span id="data-srv-sys-managedHost"></span>&nbsp;<b>' . esc_html__('Managed Host', 'duplicator') . ":</b>&nbsp; '{$test}' <br/>";
        _e('A managed host is a WordPress host that tightly controls the server environment so that the software running on it can be closely ‘managed’ by the hosting company. '
            .'Managed hosts typically have constraints imposed to facilitate this management, including the locking down of certain files and directories as well as non-standard configurations.', 'duplicator');
        echo '<br/><br/>';
        _e('Duplicator Lite allows users to build a package on managed hosts, however, the installer may not properly install packages created on managed hosts due to the non-standard configurations of managed hosts. '
            .'It is also possible the package engine of Duplicator Lite won’t be able to capture all of the necessary data of a site running on a managed host.', 'duplicator');
        echo '<br/><br/>';
        _e('<b>Due to these constraints Lite does not officially support the migration of managed hosts.</b> '
            .'It’s possible one could get the package to install but it may require custom manual effort. '
            .'To get support and the advanced installer processing required for managed host support we encourage users to <i>'
            .'<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&amp;utm_medium=wordpress_plugin&amp;utm_content=free_is_mu_warn3&amp;utm_campaign=duplicator_pro" target="_blank">upgrade to Duplicator Pro</a></i>. '
            .'Pro has more sophisticated package and installer logic and accounts for odd configurations associated with managed hosts.', 'duplicator');
        echo '<br/><br/>';

	?>
	</div>
</div>

<!-- ============
WP SETTINGS -->
<div class="scan-item">

	<div class="title" onclick="Duplicator.Pack.toggleScanItem(this);">
		<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('WordPress', 'duplicator');?></div>
		<div id="data-srv-wp-all"></div>
	</div>
	<div class="info">
		<?php
		//VERSION CHECK
		echo '<span id="data-srv-wp-version"></span>&nbsp;<b>' . esc_html__('WordPress Version', 'duplicator') . ":</b>&nbsp; '{$wp_version}' <br/>";
		printf(__('It is recommended to have a version of WordPress that is greater than %1$s.  Older version of WordPress can lead to migration issues and are a security risk. '
			. 'If possible please update your WordPress site to the latest version.', 'duplicator'), DUPLICATOR_SCAN_MIN_WP);

		//CORE FILES
		echo '<hr size="1" /><span id="data-srv-wp-core"></span>&nbsp;<b>' . esc_html__('Core Files', 'duplicator') . "</b> <br/>";
	
               
                $filter_text="";
                if($core_dir_notice) {
                    echo '<small id="data-srv-wp-core-missing-dirs">';
                       esc_html_e("The core WordPress paths below will NOT be included in the archive. These paths are required for WordPress to function!", 'duplicator');
                       echo "<br/>";
                       foreach($core_dir_included as $core_dir) {
                           echo '&nbsp; &nbsp; <b><i class="fa fa-exclamation-circle scan-warn"></i>&nbsp;'. $core_dir . '</b><br/>';
					   }
                   echo '</small><br/>';
                   $filter_text="directories";
				}

                if($core_file_notice) {
                    echo '<small id="data-srv-wp-core-missing-dirs">';
                       esc_html_e("The core WordPress file below will NOT be included in the archive. This file is required for WordPress to function!", 'duplicator');
                       echo "<br/>";
                       foreach($core_files_included as $core_file) {
                            echo '&nbsp; &nbsp; <b><i class="fa fa-exclamation-circle scan-warn"></i>&nbsp;'. $core_file . '</b><br/>';
					   }
                  echo '</small><br/>';
                  $filter_text .= (strlen($filter_text) > 0) ? " and file" : "files";

				}

                if(strlen($filter_text) > 0) {
					echo '<small>';
                    esc_html_e("Note: Please change the {$filter_text} filters if you wish to include the WordPress core files otherwise the data will have to be manually copied"
					. " to the new location for the site to function properly.", 'duplicator');
					echo '</small>';
				}


                if(!$core_dir_notice && !$core_file_notice):
                    esc_html_e("If the scanner is unable to locate the wp-config.php file in the root directory, then you will need to manually copy it to its new location. "
							. "This check will also look for core WordPress paths that should be included in the archive for WordPress to work correctly.", 'duplicator');
                endif;



		//CACHE DIR
		/*
		$cache_path = DUP_Util::safePath(WP_CONTENT_DIR) . '/cache';
		$cache_size = DUP_Util::byteSize(DUP_Util::getDirectorySize($cache_path));
		echo '<hr size="1" /><span id="data-srv-wp-cache"></span>&nbsp;<b>' . esc_html__('Cache Path', 'duplicator') . ":</b>&nbsp; '".esc_html($cache_path)."' (".esc_html($cache_size).") <br/>";
		_e("Cached data will lead to issues at install time and increases your archive size. Empty your cache directory before building the package by using  "
			. "your cache plugins clear cache feature.  Use caution if manually removing files the cache folder. The cache "
			. "size minimum threshold that triggers this warning is currently set at ", 'duplicator');
		echo esc_html(DUP_Util::byteSize(DUPLICATOR_SCAN_CACHESIZE)) . '.';
		*/

		//MU SITE
		if (is_multisite()) {
			echo '<hr size="1" /><span><div class="scan-warn"><i class="fa fa-exclamation-triangle fa-sm"></i></div></span>&nbsp;<b>' . esc_html__('Multisite: Unsupported', 'duplicator') . "</b> <br/>";
			esc_html_e('Duplicator does not support WordPress multisite migrations.  We strongly recommend using Duplicator Pro which currently supports full multisite migrations and various other '
				. 'subsite scenarios.', 'duplicator');
			echo '<br/><br/>';

			esc_html_e('While it is not recommended you can still continue with the build of this package.  At install time additional manual custom configurations will '
				. 'need to be made to finalize this multisite migration.  Please note that any support requests for mulitsite with Duplicator Lite will not be supported.', 'duplicator');
			echo "&nbsp;<i><a href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_is_mu_warn4&utm_campaign=duplicator_pro' target='_blank'>[" . esc_html__('upgrade to pro', 'duplicator') . "]</a></i>";
		} else {
			echo '<hr size="1" /><span><div class="scan-good"><i class="fa fa-check"></i></div></span>&nbsp;<b>' . esc_html__('Multisite: N/A', 'duplicator') . "</b> <br/>";
			esc_html_e('This is not a multisite install so duplication will proceed without issue.  Duplicator does not officially support multisite. However, Duplicator Pro supports '
				. 'duplication of a full multisite network and also has the ability to install a multisite subsite as a standalone site.', 'duplicator');
			echo "&nbsp;<i><a href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_is_mu_warn5&utm_campaign=duplicator_pro' target='_blank'>[" . esc_html__('upgrade to pro', 'duplicator') . "]</a></i>";
		}
		?>
	</div>
</div>

<!-- ======================
MIGRATION STATUS -->
<div id="migratepackage-block"  class="scan-item">
	<div class='title' onclick="Duplicator.Pack.toggleScanItem(this);">
		<div class="text"><i class="fa fa-caret-right"></i> <?php esc_html_e('Migration Status', 'duplicator');?></div>
        <div id="data-arc-status-migratepackage"></div>
	</div>
    <div class="info">
        <script id="hb-migrate-package-result" type="text/x-handlebars-template">
            <div class="container">
                <div class="data">
                    {{#if ARC.Status.CanbeMigratePackage}}
                        <?php esc_html_e("The package created here can be migrated to a new server.", 'duplicator'); ?>
                    {{else}}
                        <span style="color: red;">
                            <?php
                            esc_html_e("The package created here cannot be migrated to a new server.
                                The Package created here can be restored on the same server.", 'duplicator');
                            ?>
                        </span>
                    {{/if}}
                </div>
            </div>
        </script>
        <div id="migrate-package-result"></div>
    </div>
</div>

<script>
(function($){

	//Ints the various server data responses from the scan results
	Duplicator.Pack.intServerData= function(data)
	{
		$('#data-srv-php-websrv').html(Duplicator.Pack.setScanStatus(data.SRV.PHP.websrv));
		$('#data-srv-php-openbase').html(Duplicator.Pack.setScanStatus(data.SRV.PHP.openbase));
		$('#data-srv-php-maxtime').html(Duplicator.Pack.setScanStatus(data.SRV.PHP.maxtime));
		$('#data-srv-php-version').html(Duplicator.Pack.setScanStatus(data.SRV.PHP.version));
		$('#data-srv-php-openssl').html(Duplicator.Pack.setScanStatus(data.SRV.PHP.openssl));
		$('#data-srv-sys-managedHost').html(Duplicator.Pack.setScanStatus(data.SRV.SYS.managedHost));
		$('#data-srv-sys-all').html(Duplicator.Pack.setScanStatus(data.SRV.SYS.ALL));

		$('#data-srv-wp-version').html(Duplicator.Pack.setScanStatus(data.SRV.WP.version));
		$('#data-srv-wp-core').html(Duplicator.Pack.setScanStatus(data.SRV.WP.core));
		// $('#data-srv-wp-cache').html(Duplicator.Pack.setScanStatus(data.SRV.WP.cache));
		var duplicatorScanWPStatus = $('#data-srv-wp-all');
		duplicatorScanWPStatus.html(Duplicator.Pack.setScanStatus(data.SRV.WP.ALL));
		if ('Warn' == data.SRV.WP.ALL) {
			duplicatorScanWPStatus.parent().click();
		}
	}
	
})(jQuery);
</script>views/packages/main/s2.scan1.php000064400000053047151336065400012460 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
	//Nonce Check
	if (! isset( $_POST['dup_form_opts_nonce_field'] ) || ! wp_verify_nonce( sanitize_text_field($_POST['dup_form_opts_nonce_field']), 'dup_form_opts' ) ) {
		DUP_UI_Notice::redirect('admin.php?page=duplicator&tab=new1&_wpnonce='.wp_create_nonce('new1-package'));
	}

	global $wp_version;
	wp_enqueue_script('dup-handlebars');

	if (empty($_POST)) {
		//F5 Refresh Check
		$redirect = admin_url('admin.php?page=duplicator&tab=new1');
		$redirect_nonce_url = wp_nonce_url($redirect, 'new1-package');
		die("<script>window.location.href = '{$reredirect_nonce_url}'</script>");
	}

	$Package = new DUP_Package();
	$Package->saveActive($_POST);

    DUP_Settings::Set('active_package_id', -1);
    DUP_Settings::Save();
    
	$Package = DUP_Package::getActive();
	
	$mysqldump_on	 = DUP_Settings::Get('package_mysqldump') && DUP_DB::getMySqlDumpPath();
	$mysqlcompat_on  = isset($Package->Database->Compatible) && strlen($Package->Database->Compatible);
	$mysqlcompat_on  = ($mysqldump_on && $mysqlcompat_on) ? true : false;
	$dbbuild_mode    = ($mysqldump_on) ? 'mysqldump' : 'PHP';
    $zip_check		 = DUP_Util::getZipPath();

	$action_url = admin_url('admin.php?page=duplicator&tab=new3');
	$action_nonce_url = wp_nonce_url($action_url, 'new3-package');
?>

<style>
	/*PROGRESS-BAR - RESULTS - ERROR */
	form#form-duplicator {text-align:center; max-width:750px; min-height:200px; margin:0px auto 0px auto; padding:0px;}
	div.dup-progress-title {font-size:22px; padding:5px 0 20px 0; font-weight:bold}
	div#dup-msg-success {padding:0 5px 5px 5px; text-align:left}
	div#dup-msg-success div.details {padding:10px 15px 10px 15px; margin:5px 0 15px 0; background:#fff; border-radius:3px; border:1px solid #ddd; box-shadow:0 8px 6px -6px #999; }
	div#dup-msg-success div.details-title {font-size:20px; border-bottom:1px solid #dfdfdf; padding:5px; margin:0 0 10px 0; font-weight:bold}
	div#dup-msg-success-subtitle {color:#999; margin:0; font-size:11px}
	div.dup-scan-filter-status {display:inline; font-size:11px; margin-right:10px; color:#630f0f;}
	div#dup-msg-error {color:#A62426; padding:5px; max-width:790px;}
	div#dup-msg-error-response-text { max-height:500px; overflow-y:scroll; border:1px solid silver; border-radius:3px; padding:10px;background:#fff}
	div.dup-hdr-error-details {text-align:left; margin:20px 0}
	i[data-tooltip].fa-question-circle {color:#555}

	/*SCAN ITEMS: Sections */
	div.scan-header { font-size:16px; padding:7px 5px 7px 7px; font-weight:bold; background-color:#E0E0E0; border-bottom:0px solid #C0C0C0 }
	div.scan-header-details {float:right; margin-top:-5px}
	div.scan-item {border:1px solid #E0E0E0; border-top:none;}
	div.scan-item-first {
        border-top:1px solid #E0E0E0
    }
	div.scan-item div.title {background-color:#F1F1F1; width:100%; padding:8px 0 8px 0; cursor:pointer; height:20px;}
	div.scan-item div.title:hover {background-color:#ECECEC;}
	div.scan-item div.text {font-weight:bold; font-size:14px; float:left;  position:relative; left:10px}
	div.scan-item div.badge {float:right; border-radius:4px; color:#fff; min-width:40px; text-align:center; position:relative; right:10px; font-size:12px; padding:0 3px 1px 3px}
	div.scan-item div.badge-pass {background:#197b19;}
	div.scan-item div.badge-warn {background:#636363;}
	div.scan-item div.info {display:none; padding:10px; background:#fff}
	div.scan-good {display:inline-block; color:green;font-weight:bold;}
	div.scan-warn {display:inline-block; color:#d61212;font-weight:bold;}
	div.dup-more-details {float:right; font-size:14px}
	div.dup-more-details a{color:black}
	div.dup-more-details a:hover {color:#777; cursor:pointer}
	div.dup-more-details:hover {color:#777; cursor:pointer}

    div.help-tab-content span.badge-pass{display:inline-block; border-radius:4px; color:#fff; min-width:40px; text-align:center;padding:0 3px 1px 3px; background: #197b19; margin-top:4px}
    div.help-tab-content span.badge-warn{display:inline-block; border-radius:4px; color:#fff; min-width:40px; text-align:center;padding:0 3px 1px 3px; background: #636363; margin-top:4px}

	/*FILES */
	div#data-arc-size1 {display:inline-block; font-size:11px; margin-right:1px;}
	sup.dup-small-ext-type {font-size:11px; font-weight: normal; font-style: italic}
	i.data-size-help { font-size:12px; display:inline-block;  margin:0; padding:0}
	div.dup-data-size-uncompressed {font-size:10px; text-align: right; padding:0; margin:-7px 0 0 0; font-style: italic; font-weight: normal; border:0px solid red; clear:both}
	div.hb-files-style div.container {border:1px solid #E0E0E0; border-radius:4px; margin:5px 0 10px 0}
	div.hb-files-style div.container b {font-weight:bold}
	div.hb-files-style div.container div.divider {margin-bottom:2px; font-weight:bold}
	div.hb-files-style div.data {padding:8px; line-height:21px; height:175px; overflow-y:scroll; }
	div.hb-files-style div.hdrs {padding:0 4px 4px 6px; border-bottom:1px solid #E0E0E0; font-weight:bold}
	div.hb-files-style div.hdrs sup i.fa {font-size:11px}
	div.hb-files-style div.hdrs-up-down {float:right;  margin:2px 12px 0 0}
	div.hb-files-style i.dup-nav-toggle:hover {cursor:pointer; color:#999}
	div.hb-files-style div.directory {margin-left:12px}
	div.hb-files-style div.directory i.size {font-size:11px;  font-style:normal; display:inline-block; min-width:50px}
	div.hb-files-style div.directory i.count {font-size:11px; font-style:normal; display:inline-block; min-width:20px}
	div.hb-files-style div.directory i.empty {width:15px; display:inline-block}
	div.hb-files-style div.directory i.dup-nav {cursor:pointer}
	div.hb-files-style div.directory i.fa {width:8px}
	div.hb-files-style div.directory i.chk-off {width:20px; color:#777; cursor: help; margin:0; font-size:1.25em}
	div.hb-files-style div.directory label {font-weight:bold; cursor:pointer; vertical-align:top;display:inline-block; width:475px; white-space: nowrap; overflow:hidden; text-overflow:ellipsis;}
	div.hb-files-style div.directory label:hover {color:#025d02}
	div.hb-files-style div.files {padding:2px 0 0 35px; font-size:12px; display:none; line-height:18px}
	div.hb-files-style div.files i.size {font-style:normal; display:inline-block; min-width:50px}
	div.hb-files-style div.files label {font-weight: normal; font-size:11px; vertical-align:top;display:inline-block;width:450px; white-space: nowrap; overflow:hidden; text-overflow:ellipsis;}
	div.hb-files-style div.files label:hover {color:#025d02; cursor: pointer}
	div.hb-files-style div.apply-btn {text-align:right; margin: 1px 0 10px 0; width:100%}
	div.hb-files-style div.apply-warn {float:left; font-size:11px; color:maroon; margin-top:-7px; font-style: italic; display:none; text-align: left}

	div#size-more-details {display:none; margin:5px 0 20px 0; border:1px solid #dfdfdf; padding:8px; border-radius: 4px; background-color: #F1F1F1}
	div#size-more-details ul {list-style-type:circle; padding-left:20px; margin:0}
	div#size-more-details li {margin:0}

	/*DATABASE*/
	div#dup-scan-db-info {margin-top:5px}
	div#data-db-tablelist {max-height:250px; overflow-y:scroll; border:1px solid silver; padding:8px; background: #efefef; border-radius: 4px}
	div#data-db-tablelist td{padding:0 5px 3px 20px; min-width:100px}
	div#data-db-size1, div#data-ll-totalsize {display:inline-block; font-size:11px; margin-right:1px;}
	/*FILES */
	div#dup-confirm-area {color:maroon; display:none; text-align: center; font-size:14px; line-height:24px; font-weight: bold; margin: -5px 0 10px 0}
	div#dup-confirm-area label {font-size:14px !important}
	
	/*WARNING-CONTINUE*/
	div#dup-scan-warning-continue {display:none; text-align:center; padding:0 0 15px 0}
	div#dup-scan-warning-continue div.msg1 label{font-size:16px; color:#630f0f}
	div#dup-scan-warning-continue div.msg2 {padding:2px; line-height:13px}
	div#dup-scan-warning-continue div.msg2 label {font-size:11px !important}
	div.dup-pro-support {text-align:center; font-style:italic; font-size:13px; margin-top:20px;font-weight:bold}

	/*DIALOG WINDOWS*/
	div#arc-details-dlg {font-size:12px; line-height:18px !important}
	div#arc-details-dlg h2 {margin:0; padding:0 0 5px 0; border-bottom:1px solid #dfdfdf;}
	div#arc-details-dlg hr {margin:3px 0 10px 0}
	div#arc-details-dlg table#db-area {margin:0;  width:98%}
	div#arc-details-dlg table#db-area td {padding:0;}
	div#arc-details-dlg table#db-area td:first-child {font-weight:bold;  white-space:nowrap; width:100px}
	div#arc-details-dlg div.filter-area {height:245px; overflow-y:scroll; border:1px solid #dfdfdf; padding:8px; margin:2px 0}
	div#arc-details-dlg div.file-info {padding:0 0 10px 15px; width:500px; white-space:nowrap;}
	div#arc-details-dlg div.file-info i.fa-question-circle { margin-right: 5px;  font-size: 11px;}

	div#arc-paths-dlg textarea.path-dirs,
		textarea.path-files {font-size:12px; border: 1px solid silver; padding: 10px; background: #fff; margin:5px; height:125px; width:100%; white-space:pre}
	div#arc-paths-dlg div.copy-button {float:right;}
	div#arc-paths-dlg div.copy-button button {font-size:12px}
	
	/*FOOTER*/
	div.dup-button-footer {text-align:center; margin:0}
	button.button {font-size:15px !important; height:30px !important; font-weight:bold; padding:3px 5px 5px 5px !important;}
        i.scan-warn {color:#630f0f;}
</style>

<?php
$validator = $Package->validateInputs();
if (!$validator->isSuccess()) {
    ?>
    <form id="form-duplicator" method="post" action="<?php echo $action_nonce_url; ?>">
        <!--  ERROR MESSAGE -->
        <div id="dup-msg-error" >
            <div class="dup-hdr-error"><i class="fa fa-exclamation-circle"></i> <?php _e('Input fields not valid', 'duplicator'); ?></div>
            <i><?php esc_html_e('Please try again!', 'duplicator'); ?></i><br/>
            <div class="dup-hdr-error-details">
                <b><?php esc_html_e("Error Message:", 'duplicator'); ?></b>
                <div id="dup-msg-error-response-text">
                    <ul>
                        <?php
                        $validator->getErrorsFormat("<li>%s</li>");
                        ?>
                    </ul>
                </div>
            </div>
        </div>
        <input type="button" value="&#9664; <?php esc_html_e("Back", 'duplicator') ?>" onclick="window.location.assign('?page=duplicator&tab=new1&_wpnonce=<?php echo wp_create_nonce('new1-package'); ?>')" class="button button-large" />
    </form>
    <?php
    return;
}
?>

<!-- =========================================
TOOL BAR:STEPS -->
<table id="dup-toolbar">
	<tr valign="top">
		<td style="white-space:nowrap">
			<div id="dup-wiz">
				<div id="dup-wiz-steps">
					<div class="completed-step"><a>1 <?php esc_html_e('Setup', 'duplicator'); ?></a></div>
					<div class="active-step"><a>2 <?php esc_html_e('Scan', 'duplicator'); ?> </a></div>
					<div><a>3 <?php esc_html_e('Build', 'duplicator'); ?> </a></div>
				</div>
                <div id="dup-wiz-title" class="dup-guide-txt-color">
                    <i class="fab fa-wordpress"></i>
                    <?php esc_html_e('Step 2: Scan site for configuration &amp; system notices.', 'duplicator'); ?>
                </div>
			</div>	
		</td>
        <td>&nbsp;</td>
	</tr>
</table>		
<hr class="dup-toolbar-line">

<form id="form-duplicator" method="post" action="<?php echo $action_nonce_url; ?>">
<?php wp_nonce_field('dup_form_opts', 'dup_form_opts_nonce_field', false); ?>

	<!--  PROGRESS BAR -->
	<div id="dup-progress-bar-area">
		<div class="dup-progress-title"><i class="fas fa-circle-notch fa-spin"></i> <?php esc_html_e('Scanning Site', 'duplicator'); ?></div>
		<div id="dup-progress-bar"></div>
		<b><?php esc_html_e('Please Wait...', 'duplicator'); ?></b><br/><br/>
		<i><?php esc_html_e('Keep this window open during the scan process.', 'duplicator'); ?></i><br/>
		<i><?php esc_html_e('This can take several minutes.', 'duplicator'); ?></i><br/>
	</div>

	<!--  ERROR MESSAGE -->
	<div id="dup-msg-error" style="display:none">
		<div class="dup-hdr-error"><i class="fa fa-exclamation-circle"></i> <?php esc_html_e('Scan Error', 'duplicator'); ?></div>
		<i><?php esc_html_e('Please try again!', 'duplicator'); ?></i><br/>
		<div class="dup-hdr-error-details">
			<b><?php esc_html_e("Server Status:", 'duplicator'); ?></b> &nbsp;
			<div id="dup-msg-error-response-status" style="display:inline-block"></div><br/>

			<b><?php esc_html_e("Error Message:", 'duplicator'); ?></b>
			<div id="dup-msg-error-response-text"></div>
		</div>
	</div>

	<!--  SUCCESS MESSAGE -->
	<div id="dup-msg-success" style="display:none">

		<div style="text-align:center">
			<div class="dup-hdr-success"><i class="far fa-check-square fa-lg"></i> <?php esc_html_e('Scan Complete', 'duplicator'); ?></div>
			<div id="dup-msg-success-subtitle">
				<?php esc_html_e('Scan Time:', 'duplicator'); ?> <span id="data-rpt-scantime"></span>
			</div>
		</div>

		<div class="details">
			<?php
				include ('s2.scan2.php');
				echo '<br/>';
				include ('s2.scan3.php');
			?>
		</div>

		<!-- WARNING CONTINUE -->
		<div id="dup-scan-warning-continue">
			<div class="msg1">
				<label for="dup-scan-warning-continue-checkbox">
					<?php esc_html_e('A notice status has been detected, are you sure you want to continue?', 'duplicator');?>
				</label>
				<div style="padding:8px 0">
					<input type="checkbox" id="dup-scan-warning-continue-checkbox" onclick="Duplicator.Pack.warningContinue(this)"/>
					<label for="dup-scan-warning-continue-checkbox"><?php esc_html_e('Yes.  Continue with the build process!', 'duplicator');?></label>
				</div>
			</div>
			<div class="msg2">
				<label for="dup-scan-warning-continue-checkbox">
					<?php
						_e("Scan checks are not required to pass, however they could cause issues on some systems.", 'duplicator');
						echo '<br/>';
						_e("Please review the details for each section by clicking on the detail title.", 'duplicator');
					?>
				</label>
			</div>
		</div>

		<div id="dup-confirm-area"> 
			<label for="duplicator-confirm-check"><?php esc_html_e('Do you want to continue?', 'duplicator'); 
			echo '<br/> '; 
			esc_html_e('At least one or more checkboxes was checked in "Quick Filters".', 'duplicator') ?><br/> 
			<i style="font-weight:normal"><?php esc_html_e('To apply a "Quick Filter" click the "Add Filters & Rescan" button', 'duplicator') ?></i><br/> 
			<input type="checkbox" id="duplicator-confirm-check" onclick="jQuery('#dup-build-button').removeAttr('disabled');"> 
			<?php esc_html_e('Yes. Continue without applying any file filters.', 'duplicator') ?></label><br/> 
		</div> 

		<div class="dup-button-footer" style="display:none">
			<input type="button" value="&#9664; <?php esc_html_e("Back", 'duplicator') ?>" onclick="window.location.assign('?page=duplicator&tab=new1&_wpnonce=<?php echo wp_create_nonce('new1-package');?>')" class="button button-large" />
			<input type="button" value="<?php esc_attr_e("Rescan", 'duplicator') ?>" onclick="Duplicator.Pack.rescan()" class="button button-large" />
			<input type="submit"  onclick="return Duplicator.Pack.startBuild();" value="<?php esc_attr_e("Build", 'duplicator') ?> &#9654" class="button button-primary button-large" id="dup-build-button" />
		</div>
	</div>

</form>

<script>
jQuery(document).ready(function($)
{
	// Performs ajax call to get scanner retults via JSON response
	Duplicator.Pack.runScanner = function()
	{
		var data = {action : 'duplicator_package_scan',file_notice:'<?= $core_file_notice; ?>',dir_notice:'<?= $core_dir_notice; ?>', nonce: '<?php echo wp_create_nonce('duplicator_package_scan'); ?>'}
		$.ajax({
			type: "POST",
			dataType: "text",
			cache: false,
			url: ajaxurl,
			timeout: 10000000,
			data: data,
			complete: function() {$('.dup-button-footer').show()},
			success:  function(respData, textStatus, xHr) {
				try {
					var data = Duplicator.parseJSON(respData);
				} catch(err) {
					console.error(err);
					console.error('JSON parse failed for response data: ' + respData);
					$('#dup-progress-bar-area').hide();
					var status = xHr.status + ' -' + xHr.statusText;
					$('#dup-msg-error-response-status').html(status)
					$('#dup-msg-error-response-text').html(xHr.responseText);
					$('#dup-msg-error').show(200);
					console.log(data);
					return false;
				}
				Duplicator.Pack.loadScanData(data);
			},
			error: function(data) {
				$('#dup-progress-bar-area').hide();
				var status = data.status + ' -' + data.statusText;
				$('#dup-msg-error-response-status').html(status)
				$('#dup-msg-error-response-text').html(data.responseText);
				$('#dup-msg-error').show(200);
				console.log(data);
			}
		});
	}

	//Loads the scanner data results into the various sections of the screen
	Duplicator.Pack.loadScanData = function(data)
	{
		$('#dup-progress-bar-area').hide();

		//ERROR: Data object is corrupt or empty return error
		if (data == undefined || data.RPT == undefined) {
			Duplicator.Pack.intErrorView();
			console.log('JSON Report Data:');
			console.log(data);
			return;
		}

		$('#data-rpt-scantime').text(data.RPT.ScanTime || 0);
		Duplicator.Pack.intServerData(data);
		Duplicator.Pack.initArchiveFilesData(data);
		Duplicator.Pack.initArchiveDBData(data);
        
		//Addon Sites
		$('#data-arc-status-addonsites').html(Duplicator.Pack.setScanStatus(data.ARC.Status.AddonSites));
		if (data.ARC.FilterInfo.Dirs.AddonSites !== undefined && data.ARC.FilterInfo.Dirs.AddonSites.length > 0) {
			$("#addonsites-block").show();
		}

		$('#dup-msg-success').show();

		//Waring Check
		var warnCount = data.RPT.Warnings || 0;
		if (warnCount > 0) {
			$('#dup-scan-warning-continue').show();
			$('#dup-build-button').prop("disabled",true).removeClass('button-primary');
			if ($('#dup-scan-warning-continue-checkbox').is(':checked')) {
				$('#dup-build-button').removeAttr('disabled').addClass('button-primary');
			}
		} else {
			$('#dup-scan-warning-continue').hide();
			$('#dup-build-button').prop("disabled",false).addClass('button-primary');
		}

	    <?php if (DUP_Settings::Get('archive_build_mode') == DUP_Archive_Build_Mode::DupArchive) :?>
			Duplicator.Pack.initLiteLimitData(data);
		<?php endif; ?>
	}

	Duplicator.Pack.startBuild = function()
	{
		if ($('#duplicator-confirm-check').is(":checked")) {
			$('#form-duplicator').submit();
			return true;
		}

		var sizeChecks = $('#hb-files-large-result input:checked');
		var addonChecks = $('#hb-addon-sites-result input:checked');
		var utf8Checks = $('#hb-files-utf8-result input:checked');
		if (sizeChecks.length > 0 || addonChecks.length > 0 || utf8Checks.length > 0) {
			$('#dup-confirm-area').show();
			$('#dup-build-button').prop('disabled', true);
			return false;
		} else {
			$('#form-duplicator').submit();
		}
	}

	//Toggles each scan item to hide/show details
	Duplicator.Pack.toggleScanItem = function(item)
	{
		var $info = $(item).parents('div.scan-item').children('div.info');
		var $text = $(item).find('div.text i.fa');
		if ($info.is(":hidden")) {
			$text.addClass('fa-caret-down').removeClass('fa-caret-right');
			$info.show();
		} else {
			$text.addClass('fa-caret-right').removeClass('fa-caret-down');
			$info.hide(250);
		}
	}

	//Returns the scanner without a page refresh
	Duplicator.Pack.rescan = function()
	{
		$('#dup-msg-success,#dup-msg-error, #dup-confirm-area, .dup-button-footer').hide();
		$('#dup-progress-bar-area').show();
		Duplicator.Pack.runScanner();
	}

	//Allows user to continue with build if warnings found
	Duplicator.Pack.warningContinue = function(checkbox)
	{
		($(checkbox).is(':checked'))
			?	$('#dup-build-button').prop('disabled',false).addClass('button-primary')
			:	$('#dup-build-button').prop('disabled',true).removeClass('button-primary');
	}

	//Show the error message if the JSON data is corrupted
	Duplicator.Pack.intErrorView = function()
	{
		var html_msg;
		html_msg  = '<?php esc_html_e("Unable to perform a full scan, please try the following actions:", 'duplicator') ?><br/><br/>';
		html_msg += '<?php esc_html_e("1. Go back and create a root path directory filter to validate the site is scan-able.", 'duplicator') ?><br/>';
		html_msg += '<?php esc_html_e("2. Continue to add/remove filters to isolate which path is causing issues.", 'duplicator') ?><br/>';
		html_msg += '<?php esc_html_e("3. This message will go away once the correct filters are applied.", 'duplicator') ?><br/><br/>';

		html_msg += '<?php esc_html_e("Common Issues:", 'duplicator') ?><ul>';
		html_msg += '<li><?php esc_html_e("- On some budget hosts scanning over 30k files can lead to timeout/gateway issues. Consider scanning only your main WordPress site and avoid trying to backup other external directories.", 'duplicator') ?></li>';
		html_msg += '<li><?php esc_html_e("- Symbolic link recursion can cause timeouts.  Ask your server admin if any are present in the scan path.  If they are add the full path as a filter and try running the scan again.", 'duplicator') ?></li>';
		html_msg += '</ul>';
		$('#dup-msg-error-response-status').html('Scan Path Error [<?php echo esc_js(duplicator_get_abs_path()); ?>]');
		$('#dup-msg-error-response-text').html(html_msg);
		$('#dup-msg-error').show(200);
	}

	//Sets various can statuses
	Duplicator.Pack.setScanStatus = function(status)
	{
		var result;
		switch (status) {
			case false :    result = '<div class="scan-warn"><i class="fa fa-exclamation-triangle fa-sm"></i></div>'; break;
			case 'Warn' :   result = '<div class="badge badge-warn"><?php esc_html_e("Notice", 'duplicator') ?></div>'; break;
			case true :     result = '<div class="scan-good"><i class="fa fa-check"></i></div>'; break;
			case 'Good' :   result = '<div class="badge badge-pass"><?php esc_html_e("Good", 'duplicator') ?></div>'; break;
            case 'Fail' :   result = '<div class="badge badge-warn"><?php esc_html_e("Fail", 'duplicator') ?></div>'; break;
			default :
				result = 'unable to read';
		}
		return result;
	}

	//PAGE INIT:
	Duplicator.UI.AnimateProgressBar('dup-progress-bar');
	Duplicator.Pack.runScanner();

});
</script>views/packages/main/packages.php000064400000071260151336065400012703 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
/* @var $Package DUP_Package */

// Never display incomplete packages and purge those that are no longer active
DUP_Package::purge_incomplete_package();

$totalElements          = DUP_Package::count_by_status();
$completeCount          = DUP_Package::count_by_status(array(array('op' => '>=', 'status' => DUP_PackageStatus::COMPLETE))); // total packages completed
$active_package_present = DUP_Package::is_active_package_present();
$is_mu                  = is_multisite();

$package_running      = false;
global $packageTablerowCount;
$packageTablerowCount = 0;

if (DUP_Settings::Get('installer_name_mode') == DUP_Settings::INSTALLER_NAME_MODE_SIMPLE) {
    $packageExeNameModeMsg = __("When clicking the Installer download button, the 'Save as' dialog is currently defaulting the name to 'installer.php'. "
        ."To improve the security and get more information, go to: Settings > Packages Tab > Installer > Name option or click on the gear icon at the top of this page.", 'duplicator');
} else {
    $packageExeNameModeMsg = __("When clicking the Installer download button, the 'Save as' dialog is defaulting the name to '[name]_[hash]_[date]_installer.php'. "
        ."This is the secure and recommended option.  For more information, go to: Settings > Packages Tab > Installer > Name or click on the gear icon at the top of this page.<br/><br/>"
        ."To quickly copy the hashed installer name, to your clipboard use the copy icon link or click the installer name and manually copy the selected text.", 'duplicator');
}
?>

<style>
    div#dup-list-alert-nodata {padding:70px 20px;text-align:center; font-size:20px; line-height:26px}
    div.dup-notice-msg {border:1px solid silver; padding: 10px; border-radius:3px; width: 550px;
                        margin:40px auto 0px auto; font-size:12px; text-align: left; word-break:normal;
                        background: #fefcea; 
                        background: -moz-linear-gradient(top,  #fefcea 0%, #efe5a2 100%);
                        background: -ms-linear-gradient(top,  #fefcea 0%,#efe5a2 100%);
                        background: linear-gradient(to bottom,  #fefcea 0%,#efe5a2 100%);
    }
    input#dup-bulk-action-all {margin:0 2px 0 0;padding:0 2px 0 0 }
    button.dup-button-selected {border:1px solid #000 !important; background-color:#dfdfdf !important;}
    div.dup-quick-start {font-style:italic; font-size: 13px; line-height: 18px; margin-top: 15px}
    div.dup-no-mu {font-size:13px; margin-top:25px; color:maroon; line-height:18px}
    a.dup-btn-disabled {color:#999 !important; border: 1px solid #999 !important}

    /* Table package details */
    table.dup-pack-table {word-break:break-all;}
    table.dup-pack-table th {white-space:nowrap !important;}
    table.dup-pack-table td.pack-name {text-overflow:ellipsis; white-space:nowrap}
    table.dup-pack-table td.pack-size {min-width: 65px; }

    table.dup-pack-table input[name="delete_confirm"] {margin-left:15px}
    table.dup-pack-table td.fail {border-left: 4px solid maroon;}
    table.dup-pack-table td.pass {border-left: 4px solid #2ea2cc;}

    .dup-pack-info {height:50px;}
    .dup-pack-info td {vertical-align: middle; }
    tr.dup-pack-info td {white-space:nowrap; padding:2px 30px 2px 7px;}
    tr.dup-pack-info td.get-btns {text-align:right; padding:3px 5px 6px 0px !important;}
    tr.dup-pack-info td.get-btns button {box-shadow:none}
    textarea.dup-pack-debug {width:98%; height:300px; font-size:11px; display:none}
    td.error-msg a {color:maroon; text-decoration: underline}
    td.error-msg a:hover {color:maroon; text-decoration:none}
    td.error-msg {padding:7px 18px 0px 0px; color:maroon; text-align: center !important;}
    div#dup-help-dlg i {display: inline-block; width: 15px; padding:2px;line-height:28px; font-size:14px;}
    tr.dup-pack-info sup  {font-style:italic;font-size:10px; cursor: pointer; vertical-align: baseline; position: relative; top: -0.8em;}
    tr#pack-processing {display: none}

    th.inst-name {width: 1000px; padding: 2px 7px; }
    .inst-name  input {width: 175px; margin: 0 5px; border:1px solid #CCD0D4; cursor:pointer;}
    .inst-name  input:focus { width: 600px;}

    /* Building package */
    .dup-pack-info .building-info {display: none; color: #2C8021; font-style: italic}
    .dup-pack-info .building-info .perc {font-weight: bold}
    .dup-pack-info.is-running .building-info {display: inline;}
    .dup-pack-info.is-running .get-btns button {display: none;}
    div.sc-footer-left {color:maroon; font-size:11px; font-style: italic; float:left}
    div.sc-footer-right {font-style: italic; float:right; font-size:12px}
</style>

<form id="form-duplicator" method="post">

    <!-- ====================
    TOOL-BAR -->
    <table id="dup-toolbar">
        <tr valign="top">
            <td style="white-space: nowrap">
                <select id="dup-pack-bulk-actions">
                    <option value="-1" selected="selected"><?php esc_html_e("Bulk Actions", 'duplicator') ?></option>
                    <option value="delete" title="<?php esc_attr_e("Delete selected package(s)", 'duplicator') ?>"><?php esc_html_e("Delete", 'duplicator') ?></option>
                </select>
                <input type="button" id="dup-pack-bulk-apply" class="button action" value="<?php esc_html_e("Apply", 'duplicator') ?>" onclick="Duplicator.Pack.ConfirmDelete()">
                <span class="btn-separator"></span>
                <a href="javascript:void(0)" class="button"  title="<?php esc_attr_e("Get Help", 'duplicator') ?>" onclick="Duplicator.Pack.showHelp()"><i class="fa fa-question-circle"></i></a>
                <a href="admin.php?page=duplicator-settings&tab=package" class="button" title="<?php esc_attr_e("Settings", 'duplicator') ?>"><i class="fas fa-sliders-h"></i></a>
                <a href="admin.php?page=duplicator-tools&tab=templates" class="button dup-btn-disabled" title="<?php esc_html_e("Templates", 'duplicator'); ?>"><i class="far fa-clone"></i></a>
                <span class="btn-separator"></span>
                <a href="admin.php?page=duplicator-settings&tab=import" class="button dup-btn-disabled" title="<?php esc_html_e("Import", 'duplicator'); ?>"><i class="fas fa-arrow-alt-circle-down"></i></a>
                <a href="admin.php?page=duplicator-tools&tab=recovery" class="button dup-btn-disabled" title="<?php esc_html_e("Recovery", 'duplicator'); ?>"><i class="fas fa-undo-alt"></i></a>
            </td>
            <td>						
                <?php
                $package_url       = admin_url('admin.php?page=duplicator&tab=new1');
                $package_nonce_url = wp_nonce_url($package_url, 'new1-package');
                ?>
                <a id="dup-create-new" 
                   onclick="return Duplicator.Pack.CreateNew(this);"
                   href="<?php echo $package_nonce_url; ?>"
                   class="button <?php echo ($active_package_present ? 'disabled' : ''); ?>">
                       <?php esc_html_e("Create New", 'duplicator'); ?>
                </a>
            </td>
        </tr>
    </table>

    <?php if ($totalElements == 0) : ?>
        <!-- ====================
        NO-DATA MESSAGES-->
        <table class="widefat dup-pack-table">
            <thead><tr><th>&nbsp;</th></tr></thead>
            <tbody>
                <tr>
                    <td>
                        <div id='dup-list-alert-nodata'>
                            <i class="fa fa-archive fa-sm"></i> 
                            <?php esc_html_e("No Packages Found", 'duplicator'); ?><br/>
                            <i><?php esc_html_e("Click 'Create New' to Archive Site", 'duplicator'); ?></i><br/>
                            <div class="dup-quick-start" <?php echo ($is_mu) ? 'style="display:none"' : ''; ?>>
                                <b><?php esc_html_e("New to Duplicator?", 'duplicator'); ?></b><br/>
                                <a href="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=packages_empty1&utm_campaign=quick_start" target="_blank">
                                    <?php esc_html_e("Visit the 'Quick Start' guide!", 'duplicator'); ?>
                                </a>
                            </div>
                            <?php if ($is_mu) {
                                    echo '<div class="dup-no-mu">';
                                    echo '<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>&nbsp;';
                                    esc_html_e('Duplicator Lite does not officially support WordPress multisite.', 'duplicator');
                                    echo "<br/>";
                                    esc_html_e('We strongly recommend upgrading to ', 'duplicator');
                                    echo "&nbsp;<i><a href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_is_mu_warn1&utm_campaign=duplicator_pro' target='_blank'>[" . esc_html__('Duplicator Pro', 'duplicator') . "]</a></i>.";
                                    echo '</div>';
                                } 
                            ?>
                            <div style="height:75px">&nbsp;</div>
                        </div>
                    </td>
                </tr>
            </tbody>
            <tfoot><tr><th>&nbsp;</th></tr></tfoot>
        </table>
    <?php else : ?>	
        <!-- ====================
        LIST ALL PACKAGES -->
        <table class="widefat dup-pack-table">
            <thead>
                <tr>
                    <th style="width: 30px;">
                        <input type="checkbox" id="dup-bulk-action-all"  title="<?php esc_attr_e("Select all packages", 'duplicator') ?>" style="margin-left:12px" onclick="Duplicator.Pack.SetDeleteAll()" />
                    </th>
                    <th style="width: 100px;" ><?php esc_html_e("Created", 'duplicator') ?></th>
                    <th style="width: 70px;"><?php esc_html_e("Size", 'duplicator') ?></th>
                    <th style="min-width: 70px;"><?php esc_html_e("Name", 'duplicator') ?></th>
                    <th class="inst-name">
                        <?php esc_html_e("Installer Name", 'duplicator'); ?>
                        <i class="fas fa-question-circle fa-sm" 
                           data-tooltip-title="<?php esc_html_e("Installer Name:", 'duplicator'); ?>"
                           data-tooltip="<?php echo esc_attr($packageExeNameModeMsg); ?>" >
                        </i>
                    </th>
                    <th style="text-align:center; width: 200px;">
                        <?php esc_html_e("Package", 'duplicator') ?>
                    </th>
                </tr>
            </thead>
            <tr id="pack-processing">
                <td colspan="6">
                    <div id='dup-list-alert-nodata'>
                        <i class="fa fa-archive fa-sm"></i>
                        <?php esc_html_e("No Packages Found", 'duplicator'); ?><br/>
                        <i><?php esc_html_e("Click 'Create New' to Archive Site", 'duplicator'); ?></i><br/>
                        <div class="dup-quick-start">
                            <?php esc_html_e("New to Duplicator?", 'duplicator'); ?><br/>
                            <a href="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=packages_empty2&utm_campaign=quick_start" target="_blank">
                                <?php esc_html_e("Visit the 'Quick Start' guide!", 'duplicator'); ?>
                            </a>
                        </div>
                        <div style="height:75px">&nbsp;</div>
                    </div>
                </td>
            </tr>
            <?php

            function tablePackageRow(DUP_Package $Package)
            {
                global $packageTablerowCount;

                $is_running_package = $Package->isRunning();
                $pack_name          = $Package->Name;
                $pack_archive_size  = $Package->getArchiveSize();
                $pack_perc          = $Package->Status;
                $pack_dbonly        = $Package->Archive->ExportOnlyDB;
                $pack_build_mode    = ($Package->Archive->Format === 'ZIP') ? true : false;

                //Links
                $uniqueid    = $Package->NameHash;
                $packagepath = DUP_Settings::getSsdirUrl().'/'.$Package->Archive->File;

                $css_alt = ($packageTablerowCount % 2 != 0) ? '' : 'alternate';

                if ($Package->Status >= 100 || $is_running_package) :
                    ?>
                    <tr class="dup-pack-info <?php echo esc_attr($css_alt); ?> <?php echo $is_running_package ? 'is-running' : ''; ?>">
                        <td><input name="delete_confirm" type="checkbox" id="<?php echo absint($Package->ID); ?>" /></td>
                        <td>
                            <?php
                            echo DUP_Package::getCreatedDateFormat($Package->Created, DUP_Settings::get_create_date_format());
                            echo ' '.($pack_build_mode ?
                                "<sup title='".__('Archive created as zip file', 'duplicator')."'>zip</sup>" :
                                "<sup title='".__('Archive created as daf file', 'duplicator')."'>daf</sup>");
                            ?>
                        </td>
                        <td class="pack-size"><?php echo DUP_Util::byteSize($pack_archive_size); ?></td>
                        <td class='pack-name'>
                            <?php echo ($pack_dbonly) ? "{$pack_name} <sup title='".esc_attr(__('Database Only', 'duplicator'))."'>DB</sup>" : esc_html($pack_name); ?><br/>
                            <span class="building-info" >
                                <i class="fa fa-cog fa-sm fa-spin"></i> <b>Building Package</b> <span class="perc"><?php echo $pack_perc; ?></span>%
                                &nbsp; <i class="fas fa-question-circle fa-sm" style="color:#2C8021"
                                          data-tooltip-title="<?php esc_attr_e("Package Build Running", 'duplicator'); ?>"
                                          data-tooltip="<?php esc_attr_e('To stop or reset this package build goto Settings > Advanced > Reset Packages', 'duplicator'); ?>"></i>
                            </span>
                        </td>
                        <td class="inst-name">
                            <?php
                            switch (DUP_Settings::Get('installer_name_mode')) {
                                case DUP_Settings::INSTALLER_NAME_MODE_SIMPLE:
                                    $lockIcon      = 'fa-lock-open';
                                    break;
                                case DUP_Settings::INSTALLER_NAME_MODE_WITH_HASH:
                                default:
                                    $lockIcon      = 'fa-lock';
                                    break;
                            }
                            $installerName = $Package->getInstDownloadName();
                            ?>
                            <a href="admin.php?page=duplicator-settings&tab=packageadmin.php?page=duplicator-settings&tab=package#duplicator-installer-settings" title="<?php esc_html_e("Click to open settings page.", 'duplicator') ?>">
                                <i class="fas <?php echo $lockIcon; ?>"></i>
                            </a>
                            <input type="text" readonly="readonly" value="<?php echo esc_attr($installerName); ?>" title="<?php echo esc_attr($installerName); ?>" onfocus="jQuery(this).select();"/>
                            <span data-dup-copy-text="<?php echo $installerName; ?>" ><i class='far fa-copy' style='cursor: pointer'></i>
                        </td>
                        <td class="get-btns">
                            <button id="<?php echo esc_attr("{$uniqueid}_installer.php"); ?>" class="button no-select" onclick="Duplicator.Pack.DownloadInstaller(<?php echo DupLiteSnapJsonU::json_encode_esc_attr($Package->getInstallerDownloadInfo()); ?>); return false;">
                                <i class="fa fa-bolt fa-sm"></i> <?php esc_html_e("Installer", 'duplicator') ?>
                            </button>
                            <button id="<?php echo esc_attr("{$uniqueid}_archive.zip"); ?>" class="button no-select" onclick="Duplicator.Pack.DownloadFile(<?php echo DupLiteSnapJsonU::json_encode_esc_attr($Package->getPackageFileDownloadInfo(DUP_PackageFileType::Archive)); ?>); return false;">
                                <i class="far fa-file-archive"></i> <?php esc_html_e("Archive", 'duplicator') ?>
                            </button>
                            <button type="button" class="button no-select" title="<?php esc_attr_e("Package Details", 'duplicator') ?>" onclick="Duplicator.Pack.OpenPackageDetails(<?php echo "{$Package->ID}"; ?>);">
                                <i class="fa fa-archive fa-sm" ></i>
                            </button>
                        </td>
                    </tr>
                    <?php
                else :
                    $error_url = "?page=duplicator&action=detail&tab=detail&id={$Package->ID}";
                    ?>
                    <tr class="dup-pack-info  <?php echo esc_attr($css_alt); ?>">
                        <td><input name="delete_confirm" type="checkbox" id="<?php echo absint($Package->ID); ?>" /></td>
                        <td><?php echo DUP_Package::getCreatedDateFormat($Package->Created, DUP_Settings::get_create_date_format()); ?></td>
                        <td class="pack-size"><?php echo DUP_Util::byteSize($pack_archive_size); ?></td>
                        <td class='pack-name'><?php echo esc_html($pack_name); ?></td>
                        <td>&nbsp;</td>
                        <td class="get-btns error-msg" colspan="3">
                            <i class="fa fa-exclamation-triangle fa-sm"></i>
                            <a href="<?php echo esc_url($error_url); ?>"><?php esc_html_e("Error Processing", 'duplicator') ?></a>
                        </td>
                    </tr>
                <?php endif; ?>
                <?php
                //$totalSize = $totalSize + $pack_archive_size;
                $packageTablerowCount++;
            }
            DUP_Package::by_status_callback('tablePackageRow', array(), false, 0, '`id` DESC');
            ?>
            <tfoot>
                <tr>
                    <th colspan="11">
                        <div class="sc-footer-left">
                            <?php
                            if ( DUP_Settings::Get('trace_log_enabled')) {
                                esc_html_e("Trace Logging Enabled.  Please disable when trace capture is complete.", 'duplicator');
                                echo '<br/>';
                            }
                            if ($is_mu) {
                                esc_html_e('Duplicator Lite does not officially support WordPress multisite.', 'duplicator');
                                echo '<br/>';
                                esc_html_e('We strongly recommend using', 'duplicator');
                                echo "&nbsp;<i><a href='https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_is_mu_warn2&utm_campaign=duplicator_pro' target='_blank'>[" . esc_html__('Duplicator Pro', 'duplicator') . "]</a></i>.";
                            }
                            ?>
                        </div>
                        <div class="sc-footer-right">
                           <span style="cursor:help" title="<?php esc_attr_e("Current Server Time", 'duplicator') ?>">
                            <?php
                            $dup_serv_time = @date("H:i");
                            esc_html_e("Time", 'duplicator');
                            echo ": {$dup_serv_time}";
                            ?>
                        </span>
                        </div>

                    </th>
                </tr>
            </tfoot>
        </table>

        <div style="float:right; padding:10px 5px">
            <?php
            echo $totalElements;
            echo '&nbsp;';
            esc_html_e("Items", 'duplicator');
            ?>
        </div>

    <?php endif; ?>	
</form>

<!-- ==========================================
THICK-BOX DIALOGS: -->
<?php
$alert1          = new DUP_UI_Dialog();
$alert1->title   = __('Bulk Action Required', 'duplicator');
$alert1->message = '<i class="fa fa-exclamation-triangle fa-sm"></i>&nbsp;';
$alert1->message .= __('No selections made! Please select an action from the "Bulk Actions" drop down menu.', 'duplicator');
$alert1->initAlert();

$alert2          = new DUP_UI_Dialog();
$alert2->title   = __('Selection Required', 'duplicator', 'duplicator');
$alert2->message = '<i class="fa fa-exclamation-triangle fa-sm"></i>&nbsp;';
$alert2->message .= __('No selections made! Please select at least one package to delete.', 'duplicator');
$alert2->initAlert();

$confirm1               = new DUP_UI_Dialog();
$confirm1->title        = __('Delete Packages?', 'duplicator');
$confirm1->message      = __('Are you sure you want to delete the selected package(s)?', 'duplicator');
$confirm1->progressText = __('Removing Packages, Please Wait...', 'duplicator');
$confirm1->jscallback   = 'Duplicator.Pack.Delete()';
$confirm1->initConfirm();

$alert3          = new DUP_UI_Dialog();
$alert3->height  = 400;
$alert3->width   = 450;
$alert3->title   = __('Duplicator Help', 'duplicator');
$alert3->message = "<div id='dup-help-dlg'></div>";
$alert3->initAlert();

$alertPackRunning          = new DUP_UI_Dialog();
$alertPackRunning->title   = __('Alert!', 'duplicator');
$alertPackRunning->message = __('A package is being processed. Retry later.', 'duplicator');
$alertPackRunning->initAlert();
?>

<!-- =======================
DIALOG: HELP DIALOG -->
<div id="dup-help-dlg-info" style="display:none">
    <b><?php esc_html_e("Common Questions:", 'duplicator') ?></b><hr size='1'/>
    <i class="far fa-file-alt fa-sm"></i> <a href="https://snapcreek.com/duplicator/docs/quick-start?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=help_btn_pack_help&utm_campaign=duplicator_free#quick-010-q" target="_blank"><?php esc_html_e("How do I create a package", 'duplicator') ?></a> <br/>
    <i class="far fa-file-alt fa-sm"></i> <a href="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=help_btn_install_help&utm_campaign=duplicator_free#install_site" target="_blank"><?php esc_html_e('How do I install a package?', 'duplicator'); ?></a>	 <br/>
    <i class="far fa-file-code"></i> <a href="https://snapcreek.com/duplicator/docs/faqs-tech?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=help_btn_faq&utm_campaign=duplicator_free" target="_blank"><?php esc_html_e("Frequently Asked Questions!", 'duplicator') ?></a>
    <br/><br/>

    <b><?php esc_html_e("Other Resources:", 'duplicator') ?></b><hr size='1'/>
    <i class="fas fa-question-circle fa-sm fa-fw"></i>
    <a href="https://snapcreek.com/ticket?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=help_btn_ticket&utm_campaign=duplicator_free" target="_blank"><?php esc_html_e("Need help with the plugin?", 'duplicator') ?></a> <br/>

    <i class="fa fa-lightbulb fa-fw"></i>
    <a href="https://snapcreek.com/ticket/index.php?a=add&category=69" target="_blank"><?php esc_html_e("Have an idea for the plugin?", 'duplicator') ?></a> <br/>
    <?php if ($completeCount >= 3) : ?>
        <i class="fa fa-star fa-fw"></i>
        <a href="https://wordpress.org/support/plugin/duplicator/reviews/?filter=5" target="vote-wp"><?php esc_html_e("Help review the plugin!", 'duplicator') ?></a>
    <?php endif; ?>
</div>

<script>
    jQuery(document).ready(function ($)
    {
        /** Create new package check */
        Duplicator.Pack.CreateNew = function (e) {
            var cButton = $(e);
            if (cButton.hasClass('disabled')) {
<?php $alertPackRunning->showAlert(); ?>
            } else {
                Duplicator.Pack.GetActivePackageInfo(function (info) {
                    if (info.present) {
                        cButton.addClass('disabled');
                        // reloag current page to update packages list
                        location.reload(true);
                    } else {
                        // no active package. Load step1 page.
                        window.location = cButton.attr('href');
                    }
                });
            }
            return false;
        };

        /*	Creats a comma seperate list of all selected package ids  */
        Duplicator.Pack.GetDeleteList = function ()
        {
            var arr = new Array;
            var count = 0;
            $("input[name=delete_confirm]").each(function () {
                if (this.checked) {
                    arr[count++] = this.id;
                }
            });
            return arr;
        }

        /*	Provides the correct confirmation items when deleting packages */
        Duplicator.Pack.ConfirmDelete = function ()
        {
            if ($("#dup-pack-bulk-actions").val() != "delete") {
<?php $alert1->showAlert(); ?>
                return;
            }

            var list = Duplicator.Pack.GetDeleteList();
            if (list.length == 0) {
<?php $alert2->showAlert(); ?>
                return;
            }
<?php $confirm1->showConfirm(); ?>
        }


        /*	Removes all selected package sets 
         *	@param event	To prevent bubbling */
        Duplicator.Pack.Delete = function (event)
        {
            var list = Duplicator.Pack.GetDeleteList();

            $.ajax({
                type: "POST",
                url: ajaxurl,
                data: {
                    action: 'duplicator_package_delete',
                    package_ids: list,
                    nonce: '<?php echo esc_js(wp_create_nonce('duplicator_package_delete')); ?>'
                },
                complete: function (data) {
                    console.log(data);
                    Duplicator.ReloadWindow(data);
                }
            });

        };

        Duplicator.Pack.ActivePackageInfo = function (info) {
            $('.dup-pack-info.is-running .pack-size').text(info.size_format);

            if (info.present) {
                $('.dup-pack-info.is-running .building-info .perc').text(info.status);

                setTimeout(function () {
                    Duplicator.Pack.GetActivePackageInfo(Duplicator.Pack.ActivePackageInfo);
                }, 1000);

            } else {
                $('.dup-pack-info.is-running').removeClass('is-running');
                $('#dup-create-new.disabled').removeClass('disabled');
            }
        }

        /*	Get active package info
         *
         *	  */
        Duplicator.Pack.GetActivePackageInfo = function (callbackOnSuccess)
        {
            $.ajax({
                type: "POST",
                cache: false,
                url: ajaxurl,
                dataType: "json",
                timeout: 10000000,
                data: {
                    action: 'duplicator_active_package_info',
                    nonce: '<?php echo esc_js(wp_create_nonce('duplicator_active_package_info')); ?>'
                },
                complete: function () {},
                success: function (result) {
                    console.log(result);
                    if (result.success) {
                        if ($.isFunction(callbackOnSuccess)) {
                            callbackOnSuccess(result.data.active_package);
                        }
                    } else {
                        // @todo manage error
                    }
                },
                error: function (result) {
                    var result = result || new Object();
                    // @todo manage error
                }
            });
        };

        /* Toogles the Bulk Action Check boxes */
        Duplicator.Pack.SetDeleteAll = function ()
        {
            var state = $('input#dup-bulk-action-all').is(':checked') ? 1 : 0;
            $("input[name=delete_confirm]").each(function () {
                this.checked = (state) ? true : false;
            });
        }

        /*	Opens detail screen */
        Duplicator.Pack.OpenPackageDetails = function (package_id)
        {
            window.location.href = '?page=duplicator&action=detail&tab=detail&id=' + package_id;
        }

        /*	Toggles the feedback form */
        Duplicator.Pack.showHelp = function ()
        {
            $('#dup-help-dlg').html($('#dup-help-dlg-info').html());
<?php $alert3->showAlert(); ?>
        }

<?php if ($package_running) : ?>
            $('#pack-processing').show();
    <?php
endif;

if ($active_package_present) :
    ?>
            Duplicator.Pack.GetActivePackageInfo(Duplicator.Pack.ActivePackageInfo);
<?php endif; ?>

    });
</script>views/packages/main/s1.setup2.php000064400000117144151336065400012673 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
    /* -----------------------------
    PACKAGE OPTS*/
    form#dup-form-opts label {line-height:22px}
    form#dup-form-opts input[type=checkbox] {margin-top:3px}
    form#dup-form-opts textarea, input[type="text"] {width:100%}

    textarea#package-notes {height:75px;}
	div.dup-notes-add {float:right; margin:-4px 2px 4px 0;}
    div#dup-notes-area {display:none}
	input#package-name {padding:4px; height: 2em;  font-size: 1.2em;  line-height: 100%; width: 100%;   margin: 0 0 3px;}
	tr.dup-store-path td {padding:14px}
    label.lbl-larger {font-size:1.2em}
    form#dup-form-opts ul li.tabs {font-size:16px}
    div.tab-hdr-title {font-size: 16px; font-weight: bold; padding: 1px; margin:2px 0 5px 0; border-bottom:1px solid #dcdcde }

    /*EXPANDER TITLE BOXES */
    div.dup-box-title div.dup-title-txt {float:left}
    div.dup-box-title 
    div.dup-title-icons { margin-top:-5px; font-weight:normal; font-size:13px; float:left}
    div.dup-box-title div.dup-title-icons > span {border-left:1px solid silver; padding:2px 14px 5px 14px; user-select:none}
    span#dup-installer-secure-lock, span#dup-installer-secure-unlock  {border:none; padding:0 12px 5px 2px;}

    /*TAB-1: ARCHIVE SECTION*/
    form#dup-form-opts div.tabs-panel{max-height:800px; padding:15px 20px 20px 20px; min-height:280px}
    form#dup-form-opts ul li.tabs{font-weight:bold}
	sup.archive-ext {font-style:italic;font-size:10px; cursor: pointer; vertical-align: baseline; position: relative; top: -0.8em; font-weight: normal}
    ul.category-tabs li {padding:4px 15px 4px 15px}
    select#archive-format {min-width:100px; margin:1px 0 4px 0}
    span#dup-archive-filter-file {color:#A62426; display:none}
    span#dup-archive-filter-db {color:#A62426; display:none}
	span#dup-archive-db-only {color:#A62426; display:none; font-weight: normal}
    div#dup-file-filter-items {padding:5px 0 0;}
    div#dup-db-filter-items {padding:0; margin-top:-15px}
	div#dup-db-filter-items {font-stretch:ultra-condensed; font-family:Calibri; }
    form#dup-form-opts textarea#filter-dirs {height:125px; background:#fafafa; padding:5px 10px 5px 10px;}
    form#dup-form-opts textarea#filter-exts {height:30px; background:#fafafa; padding:3px 10px 1px 10px;}
	form#dup-form-opts textarea#filter-files {height:125px; background:#fafafa; padding:5px 10px 5px 10px;}
    div.dup-quick-links {font-size:11px; float:right; display:inline-block; margin-top:2px; font-style:italic}
    div.dup-tabs-opts-help {font-style:italic; font-size:11px; margin:10px 0 0 2px; color:#777;}
    
    /* TAB-2: DATABASE */
    table#dup-dbtables td {padding:0 20px 5px 10px;}
    label.core-table,
    label.non-core-table {padding:2px 0 2px 0; font-size:14px; display: inline-block}
	label.core-table {color:#9A1E26;font-style:italic;font-weight:bold}
	i.core-table-info {color:#9A1E26;font-style:italic;}
	label.non-core-table {color:#000}
	label.non-core-table:hover, label.core-table:hover {text-decoration:line-through}
	table.dbmysql-compatibility {margin-top:-10px}
    table.dbmysql-compatibility td{padding:0 20px 0 2px}
	div.dup-store-pro {font-size:12px; font-style:italic;}
	div.dup-store-pro img {height:14px; width:14px; vertical-align:text-top}
	div.dup-store-pro a {text-decoration:underline}
	span.dup-pro-text {font-style:italic; font-size:12px; color:#555; font-style:italic }
	div#dup-exportdb-items-checked, div#dup-exportdb-items-off {min-height:275px; display:none}
	div#dup-exportdb-items-checked {padding: 5px; max-width:700px}
    div.dup-tbl-scroll {white-space:nowrap; height:350px; overflow-y: scroll; border:1px solid silver; padding:5px 10px; border-radius: 2px;
     background:#fafafa; margin:3px 0 0 0; width:98%}

    /*INSTALLER SECTION*/
    div.dup-installer-header-1 {font-weight:bold; padding-bottom:2px; width:100%}
    div.dup-install-hdr-2 {font-weight:bold; border-bottom:1px solid #dfdfdf; padding-bottom:2px; width:100%}
	span#dup-installer-secure-lock {color:#A62426; display:none; font-size:14px}
	span#dup-installer-secure-unlock {color:#A62426; display:none; font-size:14px}
    label.chk-labels {display:inline-block; margin-top:1px}
	table.dup-install-setup {width:100%; margin-left:2px}
	table.dup-install-setup tr{vertical-align: top}
	div.dup-installer-panel-optional {text-align: center; font-style: italic; font-size: 12px; color:maroon}
	div.secure-pass-area {}
	label.secure-pass-lbl {display:inline-block; width:125px}
	div#dup-pass-toggle {position: relative; margin:8px 0 0 0; width:243px}
	input#secure-pass {border-radius:4px 0 0 4px; width:217px; height: 23px; min-height: auto; margin:0; padding: 0 4px;}
	button.pass-toggle {height: 23px; width: 27px; position:absolute; top:0px; right:0px; border:1px solid silver; border-radius:0 4px 4px 0; cursor:pointer}
    div.dup-install-prefill-tab-pnl.tabs-panel {overflow:visible;}
	
	/*TABS*/
	ul.add-menu-item-tabs li, ul.category-tabs li {padding:3px 30px 5px}
	div.dup-install-prefill-tab-pnl {min-height:180px !important; }
</style>
<?php
$action_url         = admin_url("admin.php?page=duplicator&tab=new2&retry={$retry_state}");
$action_nonce_url   = wp_nonce_url($action_url, 'new2-package');
$storage_position   = DUP_Settings::Get('storage_position');
?>
<form id="dup-form-opts" method="post" action="<?php echo $action_nonce_url; ?>" data-parsley-validate="" autocomplete="oldpassword">
<input type="hidden" id="dup-form-opts-action" name="action" value="">
<?php wp_nonce_field('dup_form_opts', 'dup_form_opts_nonce_field', false); ?>

<div>
	<label for="package-name" class="lbl-larger"><b>&nbsp;<?php esc_html_e('Name', 'duplicator') ?>:</b> </label>
	<div class="dup-notes-add">
		<a href="javascript:void(0)" onclick="jQuery('#dup-notes-area').toggle()">
			[<?php esc_html_e('Add Notes', 'duplicator') ?>]
		</a>
	</div>
	<a href="javascript:void(0)" onclick="Duplicator.Pack.ResetName()" title="<?php esc_attr_e('Toggle a default name', 'duplicator') ?>"><i class="fa fa-undo"></i></a> <br/>
	<input id="package-name"  name="package-name" type="text" value="<?php echo esc_html($Package->Name); ?>" maxlength="40"  data-required="true" data-regexp="^[0-9A-Za-z|_]+$" /> <br/>
	<div id="dup-notes-area">
		<label class="lbl-larger"><b>&nbsp;<?php esc_html_e('Notes', 'duplicator') ?>:</b></label> <br/>
		<textarea id="package-notes" name="package-notes" maxlength="300" /><?php echo esc_html($Package->Notes); ?></textarea>
	</div>
</div>
<br/>

<!-- ===================
STORAGE -->
<div class="dup-box">
	<div class="dup-box-title">
		<i class="fas fa-server fa-fw fa-sm"></i>
        <?php  esc_html_e("Storage", 'duplicator'); ?>
		<div class="dup-box-arrow"></div>
	</div>			
	<div class="dup-box-panel" id="dup-pack-storage-panel" style="<?php echo esc_html($ui_css_storage); ?>">
        <div style="padding:0 5px 3px 0">
            <span class="dup-guide-txt-color">
                <?php esc_html_e("This is the storage location on this server where the archive and installer files will be saved.", 'duplicator'); ?>
            </span>
            <div style="float:right">
                <a href="admin.php?page=duplicator-settings&tab=storage"><?php  esc_html_e("[Storage Options]", 'duplicator'); ?> </a>
            </div>
        </div>

        <table class="widefat package-tbl" style="margin-bottom:15px" >
            <thead>
                <tr>
                    <th style='width:30px'></th>
                    <th style='width:200px'><?php esc_html_e("Name", 'duplicator'); ?></th>
                    <th style='width:100px'><?php esc_html_e("Type", 'duplicator'); ?></th>
                    <th style="white-space:nowrap"><?php esc_html_e("Location", 'duplicator'); ?></th>
                </tr>
            </thead>
            <tbody>
                <tr class="dup-store-path">
                    <td>
                        <input type="checkbox" checked="checked" disabled="disabled" style="margin-top:-2px"/>
                    </td>
                    <td>
                        <?php  esc_html_e('Default', 'duplicator');?> 
                        <i>
                            <?php
                                if ($storage_position === DUP_Settings::STORAGE_POSITION_LECAGY) {
                                    esc_html_e("(Legacy Path)", 'duplicator');
                                } else {
                                    esc_html_e("(Contents Path)", 'duplicator');
                                }
                            ?>
                        </i>
                    </td>
                    <td>
                        <i class="far fa-hdd fa-fw"></i>
                        <?php esc_html_e("Local", 'duplicator'); ?>
                    </td>
                    <td><?php echo DUP_Settings::getSsdirPath(); ?></td>
                </tr>
                <tr>
                    <td colspan="4" class="dup-store-promo-area">
                        <div class="dup-store-pro">
                            <span class="dup-pro-text">
                                <?php echo sprintf(__('Back up this site to %1$s, %2$s, %3$s, %4$s, %5$s and other locations with ', 'duplicator'),
                                    '<i class="fab fa-aws  fa-fw"></i>&nbsp;' .'Amazon', 
                                    '<i class="fab fa-dropbox fa-fw"></i>&nbsp;' . 'Dropbox', 
                                    '<i class="fab fa-google-drive  fa-fw"></i>&nbsp;' . 'Google Drive',
                                    '<i class="fas fa-cloud  fa-fw"></i>&nbsp;' . 'OneDrive',
                                    '<i class="fas fa-network-wired fa-fw"></i>&nbsp;' . 'FTP/SFTP');
                                ?>
                                <a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_storage_bw&utm_campaign=duplicator_pro" target="_blank"><?php esc_html_e('Duplicator Pro', 'duplicator');?></a>
                                <i class="fas fa-question-circle"
                                    data-tooltip-title="<?php esc_attr_e("Additional Storage:", 'duplicator'); ?>"
                                    data-tooltip="<?php esc_attr_e('Duplicator Pro allows you to create a package and store it at a custom location on this server or to a remote '
                                            . 'cloud location such as Google Drive, Amazon, Dropbox and many more.', 'duplicator'); ?>">
                                 </i>
                            </span>
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
	</div>
</div><br/>


<!-- ============================
ARCHIVE -->
<div class="dup-box">
    <div class="dup-box-title">
        <div class="dup-title-txt">
        <i class="far fa-file-archive"></i>
			<?php
				_e('Archive', 'duplicator');
				echo "&nbsp;<sup class='archive-ext'>{$archive_build_mode}</sup>";
			?> &nbsp; &nbsp;
        </div>
        <div class="dup-title-icons" >
            <span id="dup-archive-filter-file" title="<?php esc_attr_e('File filter enabled', 'duplicator') ?>">
                <i class="far fa-copy fa-fw"></i>
                <sup><i class="fa fa-filter fa-sm"></i></sup>
            </span>
            <span id="dup-archive-filter-db" title="<?php esc_attr_e('Database filter enabled', 'duplicator') ?>">
                <i class="fa fa-table fa-fw"></i>
                <sup><i class="fa fa-filter fa-sm"></i></sup>
            </span>
            <span id="dup-archive-db-only" title="<?php esc_attr_e('Archive Only the Database', 'duplicator') ?>">
                <i class="fas fa-database fa-fw"></i> <?php esc_html_e('Database Only', 'duplicator') ?>
                <sup>&nbsp;</sup>
            </span>
        </div>
        <div class="dup-box-arrow"></div>
    </div>		
    <div class="dup-box-panel" id="dup-pack-archive-panel" style="<?php echo esc_html($ui_css_archive); ?>">
        <input type="hidden" name="archive-format" value="ZIP" />

        <!-- NESTED TABS -->
        <div data-dup-tabs='true'>
            <ul>
                <li><?php esc_html_e('Files', 'duplicator') ?></li>
                <li><?php esc_html_e('Database', 'duplicator') ?></li>
            </ul>

            <!-- TAB1:PACKAGE -->
            <div>
                <div class="tab-hdr-title">
                    <?php esc_html_e('Filters', 'duplicator') ?>
                </div>

                <!-- FILTERS -->
                <?php
					$uploads = wp_upload_dir();
					$upload_dir = DUP_Util::safePath($uploads['basedir']);
					$filter_dir_count  = isset($Package->Archive->FilterDirs)  ? count(explode(";", $Package->Archive->FilterDirs)) -1  : 0;
					$filter_file_count = isset($Package->Archive->FilterFiles) ? count(explode(";", $Package->Archive->FilterFiles)) -1 : 0;
                ?>
           
				<input type="checkbox"  id="export-onlydb" name="export-onlydb"  onclick="Duplicator.Pack.ExportOnlyDB()" <?php echo ($Package->Archive->ExportOnlyDB) ? "checked='checked'" :""; ?> />
				<label for="export-onlydb"><?php esc_html_e('Archive Only the Database', 'duplicator') ?></label>

				<div id="dup-exportdb-items-off" style="<?php echo ($Package->Archive->ExportOnlyDB) ? 'none' : 'block'; ?>">
                    <input type="checkbox" id="filter-on" name="filter-on" onclick="Duplicator.Pack.ToggleFileFilters()" <?php echo ($Package->Archive->FilterOn) ? "checked='checked'" :""; ?> />	
                    <label for="filter-on" id="filter-on-label"><?php esc_html_e("Enable File Filters", 'duplicator') ?></label>
					<i class="fas fa-question-circle fa-sm" 
					   data-tooltip-title="<?php esc_attr_e("File Filters:", 'duplicator'); ?>" 
					   data-tooltip="<?php esc_attr_e('File filters allow you to ignore directories and file extensions.  When creating a package only include the data you '
					   . 'want and need.  This helps to improve the overall archive build time and keep your backups simple and clean.', 'duplicator'); ?>">
					</i>

					<div id="dup-file-filter-items">
						<label for="filter-dirs" title="<?php esc_attr_e("Separate all filters by semicolon", 'duplicator'); ?>">
							<?php
								_e("Folders:", 'duplicator');
								echo sprintf("<sup title='%s'>({$filter_dir_count})</sup>", esc_html__("Number of directories filtered", 'duplicator'));
							?>
						</label>
						<div class='dup-quick-links'>
							<a href="javascript:void(0)" onclick="Duplicator.Pack.AddExcludePath('<?php echo esc_js(duplicator_get_abs_path()); ?>')">[<?php esc_html_e("root path", 'duplicator') ?>]</a>
							<a href="javascript:void(0)" onclick="Duplicator.Pack.AddExcludePath('<?php echo esc_js(rtrim($upload_dir, '/')); ?>')">[<?php esc_html_e("wp-uploads", 'duplicator') ?>]</a>
							<a href="javascript:void(0)" onclick="Duplicator.Pack.AddExcludePath('<?php echo esc_js(DUP_Util::safePath(WP_CONTENT_DIR)); ?>/cache')">[<?php esc_html_e("cache", 'duplicator') ?>]</a>
							<a href="javascript:void(0)" onclick="jQuery('#filter-dirs').val('')"><?php esc_html_e("(clear)", 'duplicator') ?></a>
						</div>
						<textarea name="filter-dirs" id="filter-dirs" placeholder="/full_path/exclude_path1;/full_path/exclude_path2;"><?php echo str_replace(";", ";\n", esc_textarea($Package->Archive->FilterDirs)) ?></textarea>
                        <br/><br/>

						<label class="no-select" title="<?php esc_attr_e("Separate all filters by semicolon", 'duplicator'); ?>">
                            <?php esc_html_e("File extensions", 'duplicator') ?>:
                        </label>
						<div class='dup-quick-links'>
							<a href="javascript:void(0)" onclick="Duplicator.Pack.AddExcludeExts('avi;mov;mp4;mpeg;mpg;swf;wmv;aac;m3u;mp3;mpa;wav;wma')">[<?php esc_html_e("media", 'duplicator') ?>]</a>
							<a href="javascript:void(0)" onclick="Duplicator.Pack.AddExcludeExts('zip;rar;tar;gz;bz2;7z')">[<?php esc_html_e("archive", 'duplicator') ?>]</a>
							<a href="javascript:void(0)" onclick="jQuery('#filter-exts').val('')"><?php esc_html_e("(clear)", 'duplicator') ?></a>
						</div>
						<textarea name="filter-exts" id="filter-exts" placeholder="<?php esc_attr_e("example:", 'duplicator'); ?> mov;zip;mp4"><?php echo esc_textarea($Package->Archive->FilterExts); ?></textarea>
                        <br/><br/>

						<label class="no-select" title="<?php esc_attr_e("Separate all filters by semicolon", 'duplicator'); ?>">
							<?php
								_e("Files:", 'duplicator');
								echo sprintf("<sup title='%s'>({$filter_file_count})</sup>", esc_html__("Number of files filtered", 'duplicator'));
							?>
						</label>
						<div class='dup-quick-links'>
							<a href="javascript:void(0)" onclick="Duplicator.Pack.AddExcludeFilePath('<?php echo esc_js(duplicator_get_abs_path()); ?>')"><?php esc_html_e("(file path)", 'duplicator') ?></a>
							<a href="javascript:void(0)" onclick="jQuery('#filter-files').val('')"><?php esc_html_e("(clear)", 'duplicator') ?></a>
						</div>
						<textarea name="filter-files" id="filter-files" placeholder="/full_path/exclude_file_1.ext;/full_path/exclude_file2.ext"><?php echo str_replace(";", ";\n", esc_textarea($Package->Archive->FilterFiles)) ?></textarea>

						<div class="dup-tabs-opts-help">
							<?php esc_html_e("The directory, file and extensions paths above will be excluded from the archive file if enabled is checked.", 'duplicator'); ?> <br/>
							<?php esc_html_e("Use the full path for directories and files with semicolons to separate all paths.", 'duplicator'); ?>
						</div>
					</div>
				</div>

				<div id="dup-exportdb-items-checked"  style="<?php echo ($Package->Archive->ExportOnlyDB) ? 'block' : 'none'; ?>">
					<?php

						if ($retry_state == '2') {
							echo '<i style="color:maroon">';
							_e("This option has automatically been checked because you have opted for a <i class='fa fa-random'></i> Two-Part Install Process.  Please complete the package build and continue with the ", 'duplicator');
								printf('%s <a href="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=host_interupt_2partlink1&utm_campaign=build_issues#quick-060-q" target="faq">%s</a>.',
								'',
								esc_html__('Quick Start Two-Part Install Instructions', 'duplicator'));
							echo '</i><br/><br/>';
						}

						_e("<b>Overview:</b><br/> This advanced option excludes all files from the archive.  Only the database and a copy of the installer.php "
						. "will be included in the archive.zip file. The option can be used for backing up and moving only the database.", 'duplicator');

						echo '<br/><br/>';

						_e("<b><i class='fa fa-exclamation-circle'></i> Notice:</b><br/>", 'duplicator');

						_e("Please use caution when installing only the database over an existing site and be sure the correct files correspond with the database. For example, "
							. "if WordPress 4.6 is on this site and you copy the database to a host that has WordPress 4.8 files then the source code of the files will not be "
							. "in sync with the database causing possible errors.  If you’re immediately moving the source files with the database then you can ignore this notice. "
							. "Please use this advanced feature with caution!", 'duplicator');
					?>
					<br/><br/>
				</div>

            </div>

            <!-- TAB2: DATABASE -->
            <div>
                <div class="tab-hdr-title">
                    <?php esc_html_e('Filters', 'duplicator') ?>
                </div>

				<table>
					<tr>
						<td><input type="checkbox" id="dbfilter-on" name="dbfilter-on" onclick="Duplicator.Pack.ToggleDBFilters()" <?php echo ($Package->Database->FilterOn) ? "checked='checked'" :""; ?> /></td>
						<td>
							<label for="dbfilter-on"><?php esc_html_e("Enable Table Filters", 'duplicator') ?>&nbsp;</label>
							<i class="fas fa-question-circle fa-sm"
							   data-tooltip-title="<?php esc_attr_e("Enable Table Filters:", 'duplicator'); ?>"
							   data-tooltip="<?php esc_attr_e('Checked tables will not be added to the database script.  Excluding certain tables can possibly cause your site or plugins to not work correctly after install!', 'duplicator'); ?>">
							</i>
						</td>
					</tr>
				</table>
                <div id="dup-db-filter-items">
                    <div style="float:right; padding-right:10px;">
                        <a href="javascript:void(0)" id="dball" onclick="jQuery('#dup-dbtables .checkbox').prop('checked', true).trigger('click');"><?php esc_html_e('Include All', 'duplicator'); ?></a> &nbsp;
                        <a href="javascript:void(0)" id="dbnone" onclick="jQuery('#dup-dbtables .checkbox').prop('checked', false).trigger('click');"><?php esc_html_e('Exclude All', 'duplicator'); ?></a>
                    </div>
                    <div class="dup-tbl-scroll">
					<?php
						$tables = $wpdb->get_results("SHOW FULL TABLES FROM `" . DB_NAME . "` WHERE Table_Type = 'BASE TABLE' ", ARRAY_N);
						$num_rows = count($tables);
						$next_row = round($num_rows / 4, 0);
						$counter = 0;
						$tableList = explode(',', $Package->Database->FilterTables);

						echo '<table id="dup-dbtables"><tr><td valign="top">';
						foreach ($tables as $table) {
							if (DUP_Util::isTableExists($table[0])) {
								if (DUP_Util::isWPCoreTable($table[0])) {
									$core_css = 'core-table';
									$core_note = '*';
								} else {
									$core_css = 'non-core-table';
									$core_note = '';
								}

								if (in_array($table[0], $tableList)) {
									$checked = 'checked="checked"';
									$css	 = 'text-decoration:line-through';
								} else {
									$checked = '';
									$css	 = '';
								}
								echo  "<label for='dbtables-{$table[0]}' style='{$css}' class='{$core_css}'>"
									. "<input class='checkbox dbtable' $checked type='checkbox' name='dbtables[]' id='dbtables-{$table[0]}' value='{$table[0]}' onclick='Duplicator.Pack.ExcludeTable(this)' />"
									. "&nbsp;{$table[0]}{$core_note}</label><br />";
								$counter++;
								if ($next_row <= $counter) {
									echo '</td><td valign="top">';
									$counter = 0;
								}
							}
						}
						echo '</td></tr></table>';
					?>
                    </div>	
                </div>

				<div class="dup-tabs-opts-help">
					<?php
						_e("Checked tables will be <u>excluded</u> from the database script. ", 'duplicator');
						_e("Excluding certain tables can cause your site or plugins to not work correctly after install!<br/>", 'duplicator');
						_e("<i class='core-table-info'> Use caution when excluding tables! It is highly recommended to not exclude WordPress core tables*, unless you know the impact.</i>", 'duplicator');
					?>
				</div>
                <br/>

                <div class="tab-hdr-title">
                    <?php esc_html_e('Configuration', 'duplicator') ?>
                </div>

                <div class="db-configuration" style="line-height: 30px">

                    <?php esc_html_e("SQL Mode", 'duplicator') ?>:&nbsp;
                    <a href="?page=duplicator-settings&amp;tab=package" target="settings"><?php echo esc_html($dbbuild_mode); ?></a>

                    <br/>
                    <?php esc_html_e("Compatibility Mode", 'duplicator') ?>:&nbsp;
                    <i class="fas fa-question-circle fa-sm"
                       data-tooltip-title="<?php esc_attr_e("Compatibility Mode:", 'duplicator'); ?>"
                       data-tooltip="<?php esc_attr_e('This is an advanced database backwards compatibility feature that should ONLY be used if having problems installing packages.'
                               . ' If the database server version is lower than the version where the package was built then these options may help generate a script that is more compliant'
                               . ' with the older database server. It is recommended to try each option separately starting with mysql40.', 'duplicator'); ?>">
                    </i>&nbsp;
                    <small style="font-style:italic">
                        <a href="https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_compatible" target="_blank">[<?php esc_html_e('details', 'duplicator'); ?>]</a>
                    </small>

                    <?php if ($dbbuild_mode == 'mysqldump') :?>
                        <?php
                            $modes = explode(',', $Package->Database->Compatible);
                            $is_mysql40		= in_array('mysql40',	$modes);
                            $is_no_table	= in_array('no_table_options',  $modes);
                            $is_no_key		= in_array('no_key_options',	$modes);
                            $is_no_field	= in_array('no_field_options',	$modes);
                        ?>
                        <table class="dbmysql-compatibility">
                            <tr>
                                <td>
                                    <input type="checkbox" name="dbcompat[]" id="dbcompat-mysql40" value="mysql40" <?php echo $is_mysql40 ? 'checked="true"' :''; ?> >
                                    <label for="dbcompat-mysql40"><?php esc_html_e("mysql40", 'duplicator') ?></label>
                                </td>
                                <td>
                                    <input type="checkbox" name="dbcompat[]" id="dbcompat-no_table_options" value="no_table_options" <?php echo $is_no_table ? 'checked="true"' :''; ?>>
                                    <label for="dbcompat-no_table_options"><?php esc_html_e("no_table_options", 'duplicator') ?></label>
                                </td>
                                <td>
                                    <input type="checkbox" name="dbcompat[]" id="dbcompat-no_key_options" value="no_key_options" <?php echo $is_no_key ? 'checked="true"' :''; ?>>
                                    <label for="dbcompat-no_key_options"><?php esc_html_e("no_key_options", 'duplicator') ?></label>
                                </td>
                                <td>
                                    <input type="checkbox" name="dbcompat[]" id="dbcompat-no_field_options" value="no_field_options" <?php echo $is_no_field ? 'checked="true"' :''; ?>>
                                    <label for="dbcompat-no_field_options"><?php esc_html_e("no_field_options", 'duplicator') ?></label>
                                </td>
                            </tr>
                        </table>
                    <?php else :?>
                        <i><?php esc_html_e("This option is only available with mysqldump mode.", 'duplicator'); ?></i>
                    <?php endif; ?>
               </div>
            </div>
        </div>		
    </div>
</div><br/>

<!-- ============================
INSTALLER -->
<div class="dup-box">
<div class="dup-box-title">
    <div class="dup-title-txt">
        <i class="fa fa-bolt fa-sm"></i> <?php esc_html_e('Installer', 'duplicator') ?>&nbsp;
    </div>
     <div class="dup-title-icons">
        <span id="dup-installer-secure-lock" title="<?php esc_attr_e('Installer password protection is on', 'duplicator') ?>">
            <i class="fas fa-lock fa-sm"></i>
        </span>
        <span id="dup-installer-secure-unlock" title="<?php esc_attr_e('Installer password protection is off', 'duplicator') ?>">
            <i class="fas fa-unlock-alt fa-sm"></i>
        </span>
    </div>

	<div class="dup-box-arrow"></div>
</div>			

<div class="dup-box-panel" id="dup-pack-installer-panel" style="<?php echo esc_html($ui_css_installer); ?>">

	<div class="dup-installer-panel-optional">
        <span class="dup-guide-txt-color">
              <?php esc_html_e("The installer file is used to redeploy/install the archive contents.", 'duplicator'); ?>
        </span><br/>
		<b><?php esc_html_e('All values in this section are', 'duplicator'); ?> <u><?php esc_html_e('optional', 'duplicator'); ?></u></b>
		<i class="fas fa-question-circle fa-sm"
				data-tooltip-title="<?php esc_attr_e("Setup/Prefills", 'duplicator'); ?>"
				data-tooltip="<?php esc_attr_e('All values in this section are OPTIONAL! If you know ahead of time the database input fields the installer will use, then you can '
					. 'optionally enter them here and they will be prefilled at install time.  Otherwise you can just enter them in at install time and ignore all these '
					. 'options in the Installer section.', 'duplicator'); ?>">
		</i>
	</div>

	<table class="dup-install-setup" style="margin-top: -10px">
		<tr>
			<td colspan="2"><div class="dup-install-hdr-2"><?php esc_html_e("Setup", 'duplicator') ?></div></td>
		</tr>
		<tr>
			<td style="width:130px;"><b><?php esc_html_e("Branding", 'duplicator') ?></b></td>
			<td>
				<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_branding&utm_campaign=duplicator_pro" target="_blank">
					<span class="dup-pro-text"><?php esc_html_e('Available with Duplicator Pro - Freelancer!', 'duplicator'); ?></span></a> 
				<i class="fas fa-question-circle fa-sm"
					   data-tooltip-title="<?php esc_attr_e("Branding", 'duplicator'); ?>:"
					   data-tooltip="<?php esc_attr_e('Branding is a way to customize the installer look and feel.  With branding you can create multiple brands of installers.', 'duplicator'); ?>"></i>
				<br/><br/>
			</td>
		</tr>
		<tr>
			<td style="width:130px"><b><?php esc_html_e("Security", 'duplicator') ?></b></td>
			<td>
				<?php
					$dup_install_secure_on = isset($Package->Installer->OptsSecureOn) ? $Package->Installer->OptsSecureOn : 0;
					$dup_install_secure_pass = isset($Package->Installer->OptsSecurePass) ? DUP_Util::installerUnscramble($Package->Installer->OptsSecurePass) : '';
				?>
				<input type="checkbox" name="secure-on" id="secure-on" onclick="Duplicator.Pack.EnableInstallerPassword()" <?php  echo ($dup_install_secure_on) ? 'checked' : ''; ?> />
				<label for="secure-on"><?php esc_html_e("Enable Password Protection", 'duplicator') ?></label>
				<i class="fas fa-question-circle fa-sm"
				   data-tooltip-title="<?php esc_attr_e("Security:", 'duplicator'); ?>"
				   data-tooltip="<?php esc_attr_e('Enabling this option will allow for basic password protection on the installer. Before running the installer the '
							   . 'password below must be entered before proceeding with an install.  This password is a general deterrent and should not be substituted for properly '
							   . 'keeping your files secure.  Be sure to remove all installer files when the install process is completed.', 'duplicator'); ?>"></i>

				<div id="dup-pass-toggle">
					<input type="password" name="secure-pass" id="secure-pass" required="required" value="<?php echo esc_attr($dup_install_secure_pass); ?>" />
					<button type="button" id="secure-btn" class="pass-toggle" onclick="Duplicator.Pack.ToggleInstallerPassword()" title="<?php esc_attr_e('Show/Hide Password', 'duplicator'); ?>"><i class="fas fa-eye fa-xs"></i></button>
				</div>
				<br/>
			</td>
		</tr>
	</table>

	<table style="width:100%">
		<tr>
			<td colspan="2"><div class="dup-install-hdr-2"><?php esc_html_e("Prefills", 'duplicator') ?></div></td>
		</tr>
	</table>

	<!-- ===================
	BASIC/CPANEL TABS -->
	<div data-dup-tabs="true">
		<ul>
			<li><?php esc_html_e('Basic', 'duplicator') ?></li>
			<li id="dpro-cpnl-tab-lbl"><?php esc_html_e('cPanel', 'duplicator') ?></li>
		</ul>

		<!-- ===================
		TAB1: Basic -->
		<div class="dup-install-prefill-tab-pnl">
			<table class="dup-install-setup">
				<tr>
					<td colspan="2"><div class="dup-install-hdr-2"><?php esc_html_e(" MySQL Server", 'duplicator') ?></div></td>
				</tr>
				<tr>
					<td style="width:130px"><?php esc_html_e("Host", 'duplicator') ?></td>
					<td><input type="text" name="dbhost" id="dbhost" value="<?php echo esc_attr($Package->Installer->OptsDBHost); ?>"  maxlength="200" placeholder="<?php esc_attr_e('example: localhost (value is optional)', 'duplicator'); ?>"/></td>
				</tr>
				<tr>
					<td><?php esc_html_e("Host Port", 'duplicator') ?></td>
					<td><input type="text" name="dbport" id="dbport" value="<?php echo esc_attr($Package->Installer->OptsDBPort); ?>"  maxlength="200" placeholder="<?php esc_attr_e('example: 3306 (value is optional)', 'duplicator'); ?>"/></td>
				</tr>
				<tr>
					<td><?php esc_html_e("Database", 'duplicator') ?></td>
					<td><input type="text" name="dbname" id="dbname" value="<?php echo esc_attr($Package->Installer->OptsDBName); ?>" maxlength="100" placeholder="<?php esc_attr_e('example: DatabaseName (value is optional)', 'duplicator'); ?>" /></td>
				</tr>
				<tr>
					<td><?php esc_html_e("User", 'duplicator') ?></td>
					<td><input type="text" name="dbuser" id="dbuser" value="<?php echo esc_attr($Package->Installer->OptsDBUser); ?>"  maxlength="100" placeholder="<?php esc_attr_e('example: DatabaseUserName (value is optional)', 'duplicator'); ?>" /></td>
				</tr>
				<tr>
					<td><?php esc_html_e("Charset", 'duplicator') ?></td>
					<td><input type="text" name="dbcharset" id="dbcharset" value="<?php echo esc_attr($Package->Installer->OptsDBCharset); ?>"  maxlength="100" placeholder="<?php esc_attr_e('example: utf8 (value is optional)', 'duplicator'); ?>" /></td>
				</tr>
				<tr>
					<td><?php esc_html_e("Collation", 'duplicator') ?></td>
					<td><input type="text" name="dbcollation" id="dbcollation" value="<?php echo esc_attr($Package->Installer->OptsDBCollation); ?>"  maxlength="100" placeholder="<?php esc_attr_e('example: utf8_general_ci (value is optional)', 'duplicator'); ?>" /></td>
				</tr>
			</table><br />
		</div>
		
		<!-- ===================
		TAB2: cPanel -->
		<div class="dup-install-prefill-tab-pnl">
			<div style="padding:10px 0 0 12px;">
					<img src="<?php echo esc_url(DUPLICATOR_PLUGIN_URL."assets/img/cpanel-48.png"); ?>" style="width:16px; height:12px" />
					<?php esc_html_e("Create the database and database user at install time without leaving the installer!", 'duplicator'); ?><br/>
					<?php esc_html_e("This feature is only availble in ", 'duplicator'); ?>
					<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_cpanel&utm_campaign=duplicator_pro" target="_blank"><?php esc_html_e('Duplicator Pro!', 'duplicator');?></a><br/>
					<small><i><?php esc_html_e("This feature works only with hosts that support cPanel.", 'duplicator'); ?></i></small>
			</div>
		</div>

	</div>


</div>		
</div><br/>


<div class="dup-button-footer">
    <input type="button" value="<?php esc_attr_e("Reset", 'duplicator') ?>" class="button button-large" <?php echo ($dup_tests['Success']) ? '' :'disabled="disabled"'; ?> onclick="Duplicator.Pack.ConfirmReset();" />
    <input type="submit" value="<?php esc_html_e("Next", 'duplicator') ?> &#9654;" class="button button-primary button-large" <?php echo ($dup_tests['Success']) ? '' :'disabled="disabled"'; ?> />
</div>

</form>

<!-- ==========================================
THICK-BOX DIALOGS: -->
<?php	
	$confirm1 = new DUP_UI_Dialog();
	$confirm1->title			= __('Reset Package Settings?', 'duplicator');
	$confirm1->message			= __('This will clear and reset all of the current package settings.  Would you like to continue?', 'duplicator');
	$confirm1->jscallback		= 'Duplicator.Pack.ResetSettings()';
	$confirm1->initConfirm();

	$default_name1 = DUP_Package::getDefaultName();
	$default_name2 = DUP_Package::getDefaultName(false);
?>
<script>
jQuery(document).ready(function ($) 
{
	var DUP_NAMEDEFAULT1 = '<?php echo esc_js($default_name1); ?>';
	var DUP_NAMEDEFAULT2 = '<?php echo esc_js($default_name2); ?>';
	var DUP_NAMELAST = $('#package-name').val();

	Duplicator.Pack.ExportOnlyDB = function ()
	{
		$('#dup-exportdb-items-off, #dup-exportdb-items-checked').hide();
		if ($("#export-onlydb").is(':checked')) {
			$('#dup-exportdb-items-checked').show();
			$('#dup-archive-db-only').show(100);
			$('#dup-archive-filter-db').hide();
			$('#dup-archive-filter-file').hide();
		} else {
			$('#dup-exportdb-items-off').show();
			$('#dup-exportdb-items-checked').hide();
			$('#dup-archive-db-only').hide();
			Duplicator.Pack.ToggleFileFilters();
		}

		Duplicator.Pack.ToggleDBFilters();
	};

	/* Enable/Disable the file filter elements */
	Duplicator.Pack.ToggleFileFilters = function () 
	{
		var $filterItems = $('#dup-file-filter-items');
		if ($("#filter-on").is(':checked')) {
			$filterItems.removeAttr('disabled').css({color:'#000'});
			$('#filter-exts,#filter-dirs, #filter-files').removeAttr('readonly').css({color:'#000'});
			$('#dup-archive-filter-file').show();
		} else {
			$filterItems.attr('disabled', 'disabled').css({color:'#999'});
			$('#filter-dirs, #filter-exts,  #filter-files').attr('readonly', 'readonly').css({color:'#999'});
			$('#dup-archive-filter-file').hide();
		}
	};

	/* Appends a path to the directory filter */
	Duplicator.Pack.ToggleDBFilters = function () 
	{
		var $filterItems = $('#dup-db-filter-items');
		if ($("#dbfilter-on").is(':checked')) {
			$filterItems.removeAttr('disabled').css({color:'#000'});
			$('#dup-dbtables input').removeAttr('readonly').css({color:'#000'});
			$('#dup-archive-filter-db').show();
            $('div.dup-tbl-scroll label').css({color:'#000'});
		} else {
			$filterItems.attr('disabled', 'disabled').css({color:'#999'});
			$('#dup-dbtables input').attr('readonly', 'readonly').css({color:'#999'});
            $('div.dup-tbl-scroll label').css({color:'#999'});
			$('#dup-archive-filter-db').hide();
		}
	};


	/* Appends a path to the directory filter  */
	Duplicator.Pack.AddExcludePath = function (path) 
	{
		var text = $("#filter-dirs").val() + path + ';\n';
		$("#filter-dirs").val(text);
	};

	/* Appends a path to the extention filter  */
	Duplicator.Pack.AddExcludeExts = function (path) 
	{
		var text = $("#filter-exts").val() + path + ';';
		$("#filter-exts").val(text);
	};

	Duplicator.Pack.AddExcludeFilePath = function (path)
	{
		var text = $("#filter-files").val() + path + '/file.ext;\n';
		$("#filter-files").val(text);
	};
	
	Duplicator.Pack.ConfirmReset = function () 
	{
		 <?php $confirm1->showConfirm(); ?>
	}

	Duplicator.Pack.ResetSettings = function () 
	{
		var key = 'duplicator_package_active';
		jQuery('#dup-form-opts-action').val(key);
		jQuery('#dup-form-opts').attr('action', '');
		jQuery('#dup-form-opts').submit();
	}

	Duplicator.Pack.ResetName = function () 
	{
		var current = $('#package-name').val();
		switch (current) {
			case DUP_NAMEDEFAULT1 : $('#package-name').val(DUP_NAMELAST); break;
			case DUP_NAMEDEFAULT2 : $('#package-name').val(DUP_NAMEDEFAULT1); break;
			case DUP_NAMELAST     : $('#package-name').val(DUP_NAMEDEFAULT2); break;
			default:	$('#package-name').val(DUP_NAMELAST);
		}
	}

	Duplicator.Pack.ExcludeTable = function (check) 
	{
		var $cb = $(check);
		if ($cb.is(":checked")) {
			$cb.closest("label").css('textDecoration', 'line-through');
		} else {
			$cb.closest("label").css('textDecoration', 'none');
		}
	}

	Duplicator.Pack.EnableInstallerPassword = function ()
	{
		var $button =  $('#secure-btn');
		if ($('#secure-on').is(':checked')) {
			$('#secure-pass').attr('readonly', false);
			$('#secure-pass').attr('required', 'true').focus();
			$('#dup-installer-secure-lock').show();
			$('#dup-installer-secure-unlock').hide();
			$button.removeAttr('disabled');
		} else {
			$('#secure-pass').removeAttr('required');
			$('#secure-pass').attr('readonly', true);
			$('#dup-installer-secure-lock').hide();
			$('#dup-installer-secure-unlock').show();
			$button.attr('disabled', 'true');
		}
	};

	Duplicator.Pack.ToggleInstallerPassword = function()
	{
		var $input  = $('#secure-pass');
		var $button =  $('#secure-btn');
		if (($input).attr('type') == 'text') {
			$input.attr('type', 'password');
			$button.html('<i class="fas fa-eye fa-sm"></i>');
		} else {
			$input.attr('type', 'text');
			$button.html('<i class="fas fa-eye-slash fa-sm"></i>');
		}
	}

	<?php if ($retry_state == '2') :?>
		$('#dup-pack-archive-panel').show();
		$('#export-onlydb').prop( "checked", true );
	<?php endif; ?>
	
	//Init:Toggle OptionTabs
	Duplicator.Pack.ToggleFileFilters();
	Duplicator.Pack.ToggleDBFilters();
	Duplicator.Pack.ExportOnlyDB();
	Duplicator.Pack.EnableInstallerPassword();
	$('input#package-name').focus().select();

});
</script>views/packages/main/controller.php000064400000006540151336065400013307 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

require_once(DUPLICATOR_PLUGIN_PATH . '/classes/ui/class.ui.dialog.php');

$current_tab = isset($_REQUEST['tab']) ? sanitize_text_field($_REQUEST['tab']) : 'list';
$_GET['_wpnonce'] = isset($_GET['_wpnonce']) ? $_GET['_wpnonce'] : null;

$txt_invalid_msg1 = __("An invalid request was made to this page.", 'duplicator');
$txt_invalid_msg2 = __("Please retry by going to the", 'duplicator');
$txt_invalid_lnk  = __("Packages Screen", 'duplicator');

switch ($current_tab) {
	case 'new1':
		if (!wp_verify_nonce($_GET['_wpnonce'], 'new1-package')) {
			die(printf("%s <br/>%s <a href='admin.php?page=duplicator'>%s</a>.", $txt_invalid_msg1, $txt_invalid_msg2, $txt_invalid_lnk));
		}
		break;
	case 'new2':
		if (!wp_verify_nonce($_GET['_wpnonce'], 'new2-package')) {
			die(printf("%s <br/>%s <a href='admin.php?page=duplicator'>%s</a>.", $txt_invalid_msg1, $txt_invalid_msg2, $txt_invalid_lnk));
		}
		break;
	case 'new3':
		if (!wp_verify_nonce($_GET['_wpnonce'], 'new3-package')) {
			die(printf("%s <br/>%s <a href='admin.php?page=duplicator'>%s</a>.", $txt_invalid_msg1, $txt_invalid_msg2, $txt_invalid_lnk));
		}
		break;
}
?>

<style>
	/*TOOLBAR TABLE*/
	table#dup-toolbar td {white-space: nowrap !important; padding:10px 0 0 0}
	table#dup-toolbar td .button {box-shadow: none !important;}
	table#dup-toolbar {width:100%; border:0 solid red; padding: 0; margin:8px 0 4px 0; height: 35px}
	table#dup-toolbar td:last-child {font-size:16px; width:100%; text-align: right; vertical-align: bottom;white-space:nowrap; padding:0}
	table#dup-toolbar td:last-child a {top:0; margin-top:10px;  }
	table#dup-toolbar td:last-child span {display:inline-block; padding:0 5px 5px 5px; color:#000;}
	hr.dup-toolbar-line {margin:2px 0 10px 0}
	
    /*WIZARD TABS */
    div#dup-wiz {padding:0px; margin:0;  }
    div#dup-wiz-steps {margin:10px 0px 0px 10px; padding:0px;  clear:both; font-size:13px; min-width:350px;}
    div#dup-wiz-title {padding:8px 0 0 15px; clear:both;}
    #dup-wiz a { position:relative; display:block; width:auto; min-width:80px; height:25px; margin-right:12px; padding:0px 10px 0px 10px; float:left; line-height:24px;
		color:#000; background:#E4E4E4; border-radius:2px; letter-spacing:1px; border:1px solid #E4E4E4; text-align: center }
    #dup-wiz .active-step a {color:#fff; background:#ACACAC; font-weight: bold; border:1px solid #888; box-shadow: 3px 3px 3px 0 #999}
    #dup-wiz .completed-step a {color:#E1E1E1; background:#BBBBBB; }

    /*Footer */
    div.dup-button-footer input {min-width: 105px}
    div.dup-button-footer {padding: 1px 10px 0px 0px; text-align: right}
</style>

<?php
	switch ($current_tab) {
		case 'list': 
			duplicator_header(__("Packages &raquo; All", 'duplicator'));
			include(DUPLICATOR_PLUGIN_PATH.'views/packages/main/packages.php');
			break;
		case 'new1': 
			duplicator_header(__("Packages &raquo; New", 'duplicator'));
			include(DUPLICATOR_PLUGIN_PATH.'views/packages/main/s1.setup1.php');
			break;
		case 'new2': 
			duplicator_header(__("Packages &raquo; New", 'duplicator'));
			include(DUPLICATOR_PLUGIN_PATH.'views/packages/main/s2.scan1.php');
			break;
		case 'new3': 
			duplicator_header(__("Packages &raquo; New", 'duplicator'));
			include(DUPLICATOR_PLUGIN_PATH.'views/packages/main/s3.build.php');
			break;
	}
?>views/packages/details/controller.php000064400000005462151336065400014012 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
DUP_Util::hasCapability('manage_options');
global $wpdb;

//COMMON HEADER DISPLAY
$current_tab = isset($_REQUEST['tab']) ? sanitize_text_field($_REQUEST['tab']) : 'detail';
$package_id  = isset($_REQUEST["id"])  ? sanitize_text_field($_REQUEST["id"]) : 0;

$package			= DUP_Package::getByID($package_id);
$err_found		    = ($package == null || $package->Status < 100);
$link_log			= DUP_Settings::getSsdirUrl()."/{$package->NameHash}.log";
$err_link_log		= "<a target='_blank' href='".esc_url($link_log)."' >" . esc_html__('package log', 'duplicator') . '</a>';
$err_link_faq		= '<a target="_blank" href="https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=pkg_details_faq">' . esc_html__('FAQ', 'duplicator') . '</a>';
$err_link_ticket	= '<a target="_blank" href="https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=pkg_details_resources#faq-resource">' . esc_html__('resources page', 'duplicator') . '</a>';
?>

<style>
    .narrow-input { width: 80px; }
    .wide-input {width: 400px; }
	 table.form-table tr td { padding-top: 25px; }
	 div.all-packages {float:right; margin-top: -35px; }
</style>

<div class="wrap">
    <?php
		duplicator_header(__("Package Details &raquo; {$package->Name}", 'duplicator'));
	?>

	<?php if ($err_found) :?>
	<div class="error">
		<p>
			<?php echo esc_html__('This package contains an error.  Please review the ', 'duplicator') . $err_link_log .  esc_html__(' for details.', 'duplicator'); ?>
			<?php echo esc_html__('For help visit the ', 'duplicator') . $err_link_faq . esc_html__(' and ', 'duplicator') . $err_link_ticket; ?>
		</p>
	</div>
	<?php endif; ?>

    <h2 class="nav-tab-wrapper">
        <a href="?page=duplicator&action=detail&tab=detail&id=<?php echo absint($package_id); ?>" class="nav-tab <?php echo ($current_tab == 'detail') ? 'nav-tab-active' : '' ?>">
			<?php esc_html_e('Details', 'duplicator'); ?>
		</a>
		<a href="?page=duplicator&action=detail&tab=transfer&id=<?php echo absint($package_id); ?>" class="nav-tab <?php echo ($current_tab == 'transfer') ? 'nav-tab-active' : '' ?>">
			<?php esc_html_e('Transfer', 'duplicator'); ?>
		</a>
    </h2>
	<div class="all-packages"><a href="?page=duplicator" class="button"><i class="fa fa-archive fa-sm"></i> <?php esc_html_e('Packages', 'duplicator'); ?></a></div>

    <?php
    switch ($current_tab) {
        case 'detail': include(DUPLICATOR_PLUGIN_PATH.'views/packages/details/detail.php');
            break;
		case 'transfer': include(DUPLICATOR_PLUGIN_PATH.'views/packages/details/transfer.php');
            break;
    }
    ?>
</div>
views/packages/details/transfer.php000064400000003235151336065400013447 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
	div.panel {padding: 20px 5px 10px 10px;}
	div.area {font-size:16px; text-align: center; line-height: 30px; width:500px; margin:auto}
	ul.li {padding:2px}
</style>

<div class="panel">
	<br/>
	<div class="area" style="width:450px">
		<img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/logo-dpro-300x50.png"  />
		<h2>
			<?php esc_html_e('Transfer your packages to multiple locations  with Duplicator Pro', 'duplicator') ?>
		</h2>

		<div style='text-align: left; margin:auto; width:200px'>
			<ul>
				<li><i class="fab fa-amazon"></i> <?php esc_html_e('Amazon S3', 'duplicator'); ?></li>
				<li><i class="fab fa-dropbox"></i> <?php esc_html_e('Dropbox', 'duplicator'); ?></li>
				<li><i class="fab fa-google-drive"></i> <?php esc_html_e('Google Drive', 'duplicator'); ?></li>
				<li><i class="fa fa-cloud fa-sm"></i> <?php esc_html_e('One Drive', 'duplicator'); ?></li>
				<li><i class="fas fa-network-wired"></i> <?php esc_html_e('FTP &amp; SFTP', 'duplicator'); ?></li>
				<li><i class="fas fa-hdd"></i> <?php esc_html_e('Custom Directory', 'duplicator'); ?></li>
			</ul>
		</div>
		<?php
			esc_html_e('Set up a one-time storage location and automatically push the package to your destination.', 'duplicator');
		?>
	</div><br/>

	<p style="text-align:center">
		<a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=manual_transfer&utm_campaign=duplicator_pro" target="_blank" class="button button-primary button-large dup-check-it-btn" >
			<?php esc_html_e('Learn More', 'duplicator') ?>
		</a>
	</p>
</div>
views/packages/details/index.php000064400000000016151336065400012724 0ustar00<?php
//silentviews/packages/details/detail.php000064400000057610151336065400013073 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
$view_state = DUP_UI_ViewState::getArray();
$ui_css_general = (isset($view_state['dup-package-dtl-general-panel']) && $view_state['dup-package-dtl-general-panel']) ? 'display:block' : 'display:none';
$ui_css_storage = (isset($view_state['dup-package-dtl-storage-panel']) && $view_state['dup-package-dtl-storage-panel']) ? 'display:block' : 'display:none';
$ui_css_archive = (isset($view_state['dup-package-dtl-archive-panel']) && $view_state['dup-package-dtl-archive-panel']) ? 'display:block' : 'display:none';
$ui_css_install = (isset($view_state['dup-package-dtl-install-panel']) && $view_state['dup-package-dtl-install-panel']) ? 'display:block' : 'display:none';

$archiveDownloadInfo       = $package->getPackageFileDownloadInfo(DUP_PackageFileType::Archive);
$logDownloadInfo           = $package->getPackageFileDownloadInfo(DUP_PackageFileType::Log);
$installerDownloadInfo     = $package->getInstallerDownloadInfo();
$archiveDownloadInfoJson   = DupLiteSnapJsonU::json_encode_esc_attr($archiveDownloadInfo);
$logDownloadInfoJson       = DupLiteSnapJsonU::json_encode_esc_attr($logDownloadInfo);
$installerDownloadInfoJson = DupLiteSnapJsonU::json_encode_esc_attr($installerDownloadInfo);
$showLinksDialogJson       = DupLiteSnapJsonU::json_encode_esc_attr(array(
    "archive" => $archiveDownloadInfo["url"],
    "log"     => $logDownloadInfo["url"],
));

$debug_on	     = DUP_Settings::Get('package_debug');
$mysqldump_on	 = DUP_Settings::Get('package_mysqldump') && DUP_DB::getMySqlDumpPath();
$mysqlcompat_on  = isset($Package->Database->Compatible) && strlen($Package->Database->Compatible);
$mysqlcompat_on  = ($mysqldump_on && $mysqlcompat_on) ? true : false;
$dbbuild_mode    = ($mysqldump_on) ? 'mysqldump' : 'PHP';
$archive_build_mode = ($package->Archive->Format === 'ZIP') ? 'ZipArchive (zip)' : 'DupArchive (daf)';
$dup_install_secure_on   = isset($package->Installer->OptsSecureOn) ? $package->Installer->OptsSecureOn : 0;
$dup_install_secure_pass = isset($package->Installer->OptsSecurePass) ? DUP_Util::installerUnscramble($package->Installer->OptsSecurePass) : '';
?>

<style>
	/*COMMON*/
	div.toggle-box {float:right; margin: 5px 5px 5px 0}
	div.dup-box {margin-top: 15px; font-size:14px; clear: both}
	table.dup-dtl-data-tbl {width:100%}
	table.dup-dtl-data-tbl tr {vertical-align: top}
	table.dup-dtl-data-tbl tr:first-child td {margin:0; padding-top:0 !important;}
	table.dup-dtl-data-tbl td {padding:0 5px 0 0; padding-top:10px !important;}
	table.dup-dtl-data-tbl td:first-child {font-weight: bold; width:130px}
	table.dup-sub-list td:first-child {white-space: nowrap; vertical-align: middle; width:100px !important;}
	table.dup-sub-list td {white-space: nowrap; vertical-align:top; padding:2px !important;}
	div.dup-box-panel-hdr {font-size:14px; display:block; border-bottom: 1px solid #efefef; margin:5px 0 5px 0; font-weight: bold; padding: 0 0 5px 0}
    td.sub-notes {font-weight: normal !important; font-style: italic; color:#999; padding-top:10px;}

	/*STORAGE*/
	div.dup-store-pro {font-size:12px; font-style:italic;}
	div.dup-store-pro img {height:14px; width:14px; vertical-align: text-top}
	div.dup-store-pro a {text-decoration: underline}

	/*GENERAL*/
	div#dup-name-info, div#dup-version-info {display: none; line-height:20px; margin:4px 0 0 0}
    table.dup-sub-info td {padding: 1px !important}
    table.dup-sub-info td:first-child {font-weight: bold; width:100px; padding-left:10px}

	div#dup-downloads-area {padding: 5px 0 5px 0; }
	div#dup-downloads-msg {margin-bottom:-5px; font-style: italic}
	div.sub-section {padding:7px 0 0 0}
	textarea.file-info {width:100%; height:100px; font-size:12px }

	/*INSTALLER*/
	div#dup-pass-toggle {position: relative; margin:0; width:273px}
	input#secure-pass {border-radius:4px 0 0 4px; width:250px; height: 23px; margin:0}
	button#secure-btn {height:23px; width:27px; position:absolute; top:0px; right:0px;border:1px solid silver;  border-radius:0 4px 4px 0; cursor:pointer}
	div.dup-install-hdr-2 {font-weight:bold; border-bottom:1px solid #dfdfdf; padding-bottom:2px; width:100%}
</style>

<?php if ($package_id == 0) :?>
	<div class="notice notice-error is-dismissible"><p><?php esc_html_e('Invalid Package ID request.  Please try again!', 'duplicator'); ?></p></div>
<?php endif; ?>

<div class="toggle-box">
	<a href="javascript:void(0)" onclick="Duplicator.Pack.OpenAll()">[open all]</a> &nbsp;
	<a href="javascript:void(0)" onclick="Duplicator.Pack.CloseAll()">[close all]</a>
</div>

<!-- ===============================
GENERAL -->
<div class="dup-box">
<div class="dup-box-title">
	<i class="fa fa-archive fa-sm"></i> <?php esc_html_e('General', 'duplicator') ?>
	<div class="dup-box-arrow"></div>
</div>
<div class="dup-box-panel" id="dup-package-dtl-general-panel" style="<?php echo esc_attr($ui_css_general); ?>">
	<table class='dup-dtl-data-tbl'>
		<tr>
			<td><?php esc_html_e('Name', 'duplicator') ?>:</td>
			<td>
				<a href="javascript:void(0);" onclick="jQuery('#dup-name-info').toggle()"><?php echo esc_js($package->Name); ?></a>
				<div id="dup-name-info">
                    <table class="dup-sub-info">
                        <tr>
                            <td><?php esc_html_e('ID', 'duplicator') ?>:</td>
                            <td><?php echo absint($package->ID); ?></td>
                        </tr>
                        <tr>
                            <td><?php esc_html_e('Hash', 'duplicator') ?>:</td>
                            <td><?php echo esc_html($package->Hash); ?></td>
                        </tr>
                        <tr>
                            <td><?php esc_html_e('Full Name', 'duplicator') ?>:</td>
                            <td><?php echo esc_html($package->NameHash); ?></td>
                        </tr>                        
                    </table>
				</div>
			</td>
		</tr>
		<tr>
			<td><?php esc_html_e('Notes', 'duplicator') ?>:</td>
			<td><?php echo strlen($package->Notes) ? $package->Notes : esc_html__('- no notes -', 'duplicator') ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('Created', 'duplicator') ?>:</td>
			<td><?php echo $package->Created; ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('Versions', 'duplicator') ?>:</td>
			<td>
				<a href="javascript:void(0);" onclick="jQuery('#dup-version-info').toggle()"><?php echo esc_html($package->Version); ?></a>
				<div id="dup-version-info">
                    <table class="dup-sub-info">
                        <tr>
                            <td><?php esc_html_e('WordPress', 'duplicator') ?>:</td>
                            <td><?php echo strlen($package->VersionWP) ? esc_html($package->VersionWP) : esc_html__('- unknown -', 'duplicator') ?></td>
                        </tr>
                        <tr>
                            <td><?php esc_html_e('PHP', 'duplicator') ?>: </td>
                            <td><?php echo strlen($package->VersionPHP) ? esc_html($package->VersionPHP) : esc_html__('- unknown -', 'duplicator') ?></td>
                        </tr>
                        <tr>
                            <td><?php esc_html_e('Mysql', 'duplicator') ?>:</td>
                            <td>
                                <?php echo strlen($package->VersionDB) ? esc_html($package->VersionDB) : esc_html__('- unknown -', 'duplicator') ?> |
                                <?php echo strlen($package->Database->Comments) ? esc_html($package->Database->Comments) : esc_html__('- unknown -', 'duplicator') ?>
                            </td>
                        </tr>
                    </table>
				</div>
			</td>
		</tr>
		<tr>
			<td><?php esc_html_e('Runtime', 'duplicator') ?>:</td>
			<td><?php echo strlen($package->Runtime) ? esc_html($package->Runtime) : esc_html__("error running", 'duplicator'); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('Status', 'duplicator') ?>:</td>
			<td><?php echo ($package->Status >= 100) ? esc_html__('completed', 'duplicator')  : esc_html__('in-complete', 'duplicator') ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('User', 'duplicator') ?>:</td>
			<td><?php echo strlen($package->WPUser) ? esc_html($package->WPUser) : esc_html__('- unknown -', 'duplicator') ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('Files', 'duplicator') ?>: </td>
			<td>
				<div id="dup-downloads-area">
					<?php if  (!$err_found) :?>
                    <button class="button" onclick="Duplicator.Pack.DownloadInstaller(<?php echo $installerDownloadInfoJson; ?>);return false;"><i class="fa fa-bolt fa-sm"></i>&nbsp; Installer</button>
                        <button class="button" onclick="Duplicator.Pack.DownloadFile(<?php echo $archiveDownloadInfoJson; ?>);return false;"><i class="far fa-file-archive"></i>&nbsp; Archive - <?php echo esc_html($package->ZipSize); ?></button>
                        <!--button class="button" onclick="Duplicator.Pack.DownloadFile(<?php echo $logDownloadInfoJson; ?>);return false;"><i class="fas fa-file-contract fa-sm"></i>&nbsp; <?php esc_html_e('Log', 'duplicator'); ?> </button-->
						<button class="button" onclick="Duplicator.Pack.ShowLinksDialog(<?php echo $showLinksDialogJson;?>);" class="thickbox"><i class="fas fa-share-alt"></i>&nbsp; <?php esc_html_e("Share File Links", 'duplicator')?></button>
					<?php else: ?>
                        <button class="button" onclick="Duplicator.Pack.DownloadFile(<?php echo $logDownloadInfoJson; ?>);return false;"><i class="fas fa-file-contract fa-sm"></i>&nbsp; Log </button>
					<?php endif; ?>
				</div>
				<?php if (!$err_found) :?>
				<table class="dup-sub-list">
					<tr>
						<td><?php esc_html_e('Archive', 'duplicator') ?>: </td>
						<td><a href="<?php echo esc_url($archiveDownloadInfo["url"]); ?>"><?php echo esc_html($package->Archive->File); ?></a></td>
					</tr>
					<tr>
						<td><?php esc_html_e('Installer', 'duplicator') ?>: </td>
						<td><a href="#" onclick="Duplicator.Pack.DownloadInstaller(<?php echo $installerDownloadInfoJson; ?>);return false;" ><?php echo esc_html($package->Installer->File) ?></a></td>
					</tr>
                    <tr>
                        <td><?php esc_html_e("Build Log", 'duplicator') ?>: </td>
                        <td><a href="<?php echo $logDownloadInfo["url"] ?>" target="file_results"><?php echo $logDownloadInfo["filename"]; ?></a></td>
                    </tr>
                    <tr>
                        <td class="sub-notes">
                            <i class="fas fa-download"></i> <?php _e("Click links to download", 'duplicator-pro') ?>
                        </td>
                    </tr>
				</table>
				<?php endif; ?>
			</td>
		</tr>
	</table>
</div>
</div>

<!-- ==========================================
DIALOG: QUICK PATH -->
<?php add_thickbox(); ?>
<div id="dup-dlg-quick-path" title="<?php esc_attr_e('Download Links', 'duplicator'); ?>" style="display:none">
	<p style="color:maroon">
		<i class="fa fa-lock fa-xs"></i>
		<?php esc_html_e("The following links contain sensitive data. Share with caution!", 'duplicator');	?>
	</p>

	<div style="padding: 0px 5px 5px 5px;">
		<a href="javascript:void(0)" style="display:inline-block; text-align:right" onclick="Duplicator.Pack.GetLinksText()">[Select All]</a> <br/>
		<textarea id="dup-dlg-quick-path-data" style='border:1px solid silver; border-radius:2px; width:100%; height:175px; font-size:11px'></textarea><br/>
		<i style='font-size:11px'>
			<?php
				printf("%s <a href='https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-052-q' target='_blank'>%s</a>",
					esc_html__("A copy of the database.sql and installer.php files can both be found inside of the archive.zip/daf file.  "
						. "Download and extract the archive file to get a copy of the installer which will be named 'installer-backup.php'. "
						. "For details on how to extract a archive.daf file please see: ", 'duplicator'),
					esc_html__("How to work with DAF files and the DupArchive extraction tool?", 'duplicator'));
			?>
		</i>
	</div>
</div>

<!-- ===============================
STORAGE -->
<div class="dup-box">
<div class="dup-box-title">
    <i class="fas fa-server fa-sm"></i>
    <?php esc_html_e('Storage', 'duplicator') ?>
	<div class="dup-box-arrow"></div>
</div>
<div class="dup-box-panel" id="dup-package-dtl-storage-panel" style="<?php echo esc_attr($ui_css_storage); ?>">

    <table class="widefat package-tbl" style="margin-bottom:15px" >
        <thead>
            <tr>
                <th style='width:200px'><?php esc_html_e("Name", 'duplicator'); ?></th>
                <th style='width:100px'><?php esc_html_e("Type", 'duplicator'); ?></th>
                <th style="white-space:nowrap"><?php esc_html_e("Location", 'duplicator'); ?></th>
            </tr>
        </thead>
        <tbody>
            <tr class="dup-store-path">
                <td>
                    <?php  esc_html_e('Default', 'duplicator');?>
                    <i>
                        <?php
                            if ($storage_position === DUP_Settings::STORAGE_POSITION_LECAGY) {
                                esc_html_e("(Legacy Path)", 'duplicator');
                            } else {
                                esc_html_e("(Contents Path)", 'duplicator');
                            }
                        ?>
                    </i>
                </td>
                <td>
                    <i class="far fa-hdd fa-fw"></i>
                    <?php esc_html_e("Local", 'duplicator'); ?>
                </td>
                <td><?php echo DUP_Settings::getSsdirPath(); ?></td>
            </tr>
            <tr>
                <td colspan="4" class="dup-store-promo-area">
                    <div class="dup-store-pro">
                        <span class="dup-pro-text">
                            <?php echo sprintf(__('Back up this site to %1$s, %2$s, %3$s, %4$s, %5$s and other locations with ', 'duplicator'),
                                '<i class="fab fa-aws  fa-fw"></i>&nbsp;' .'Amazon',
                                '<i class="fab fa-dropbox fa-fw"></i>&nbsp;' . 'Dropbox',
                                '<i class="fab fa-google-drive  fa-fw"></i>&nbsp;' . 'Google Drive',
                                '<i class="fas fa-cloud  fa-fw"></i>&nbsp;' . 'OneDrive',
                                '<i class="fas fa-network-wired fa-fw"></i>&nbsp;' . 'FTP/SFTP');
                            ?>
                            <a href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_storage_detail_bw&utm_campaign=duplicator_pro" target="_blank"><?php esc_html_e('Duplicator Pro', 'duplicator');?></a>
                            <i class="fas fa-question-circle"
                                data-tooltip-title="<?php esc_attr_e("Additional Storage:", 'duplicator'); ?>"
                                data-tooltip="<?php esc_attr_e('Duplicator Pro allows you to create a package and store it at a custom location on this server or to a remote '
                                        . 'cloud location such as Google Drive, Amazon, Dropbox and many more.', 'duplicator'); ?>">
                             </i>
                        </span>
                    </div>
                </td>
            </tr>
        </tbody>
    </table>

	</div>
</div>

<!-- ===============================
ARCHIVE -->
<div class="dup-box">
<div class="dup-box-title">
	<i class="far fa-file-archive"></i> <?php esc_html_e('Archive', 'duplicator') ?>
	<div class="dup-box-arrow"></div>
</div>
<div class="dup-box-panel" id="dup-package-dtl-archive-panel" style="<?php echo esc_attr($ui_css_archive); ?>">

	<!-- FILES -->
    <div class="dup-box-panel-hdr">
        <i class="fas fa-folder-open fa-sm"></i>
        <?php esc_html_e('FILES', 'duplicator'); ?>
    </div>
	<table class='dup-dtl-data-tbl'>
		<tr>
			<td><?php esc_html_e('Build Mode', 'duplicator') ?>: </td>

			<td><?php echo esc_html($archive_build_mode); ?></td>
		</tr>

		<?php if ($package->Archive->ExportOnlyDB) : ?>
			<tr>
				<td><?php esc_html_e('Database Mode', 'duplicator') ?>: </td>
				<td><?php esc_html_e('Archive Database Only Enabled', 'duplicator')	?></td>
			</tr>
		<?php else : ?>
			<tr>
				<td><?php esc_html_e('Filters', 'duplicator') ?>: </td>
				<td>
					<?php echo $package->Archive->FilterOn == 1 ? 'On' : 'Off'; ?>
					<div class="sub-section">
						<b><?php esc_html_e('Directories', 'duplicator') ?>:</b> <br/>
						<?php
							$txt = strlen($package->Archive->FilterDirs)
								? str_replace(';', ";\n", $package->Archive->FilterDirs)
								: esc_html__('- no filters -', 'duplicator');
						?>
						<textarea class='file-info' readonly="true"><?php echo esc_textarea($txt); ?></textarea>
					</div>

					<div class="sub-section">
						<b><?php esc_html_e('Extensions', 'duplicator') ?>: </b><br/>
						<?php
						echo isset($package->Archive->FilterExts) && strlen($package->Archive->FilterExts)
							? esc_html($package->Archive->FilterExts)
							: esc_html__('- no filters -', 'duplicator');
						?>
					</div>

					<div class="sub-section">
						<b><?php esc_html_e('Files', 'duplicator') ?>:</b><br/>
						<?php
							$txt = strlen($package->Archive->FilterFiles)
								? str_replace(';', ";\n", $package->Archive->FilterFiles)
								: esc_html__('- no filters -', 'duplicator');
						?>
						<textarea class='file-info' readonly="true"><?php echo esc_html($txt); ?></textarea>
					</div>
				</td>
			</tr>
		<?php endif; ?>
	</table><br/>

	<!-- DATABASE -->
	<div class="dup-box-panel-hdr">
        <i class="fas fa-database fa-sm"></i>
        <?php esc_html_e('DATABASE', 'duplicator'); ?>
    </div>
	<table class='dup-dtl-data-tbl'>
		<tr>
			<td><?php esc_html_e('Name', 'duplicator') ?>: </td>
			<td><?php echo esc_html($package->Database->info->name); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('Type', 'duplicator') ?>: </td>
			<td><?php echo esc_html($package->Database->Type); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('SQL Mode', 'duplicator') ?>: </td>
			<td>
				<a href="?page=duplicator-settings&tab=package" target="_blank"><?php echo esc_html($dbbuild_mode); ?></a>
				<?php if ($mysqlcompat_on) : ?>
					<br/>
					<small style="font-style:italic; color:maroon">
						<i class="fa fa-exclamation-circle"></i> <?php esc_html_e('MySQL Compatibility Mode Enabled', 'duplicator'); ?>
						<a href="https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_compatible" target="_blank">[<?php esc_html_e('details', 'duplicator'); ?>]</a>
					</small>
				<?php endif; ?>
			</td>
		</tr>
		<tr>
			<td><?php esc_html_e('Filters', 'duplicator') ?>: </td>
			<td><?php echo $package->Database->FilterOn == 1 ? 'On' : 'Off'; ?></td>
		</tr>
		<tr class="sub-section">
			<td>&nbsp;</td>
			<td>
                <b><?php esc_html_e('Tables', 'duplicator') ?>:</b><br/>
				<?php
					echo isset($package->Database->FilterTables) && strlen($package->Database->FilterTables)
						? str_replace(',', "<br>\n", $package->Database->FilterTables)
						: esc_html__('- no filters -', 'duplicator');
				?>
			</td>
		</tr>
	</table>
</div>
</div>


<!-- ===============================
INSTALLER -->
<div class="dup-box" style="margin-bottom: 50px">
<div class="dup-box-title">
	<i class="fa fa-bolt fa-sm"></i> <?php esc_html_e('Installer', 'duplicator') ?>
	<div class="dup-box-arrow"></div>
</div>
<div class="dup-box-panel" id="dup-package-dtl-install-panel" style="<?php echo esc_html($ui_css_install); ?>">

	<table class='dup-dtl-data-tbl'>
		<tr>
            <td colspan="2"><div class="dup-install-hdr-2"><?php esc_html_e(" Security", 'duplicator') ?></div></td>
        </tr>
		<tr>
			<td colspan="2">
				<?php esc_html_e("Password Protection", 'duplicator');?>:
				<?php echo $dup_install_secure_on ? "&nbsp; On" : "&nbsp; Off" ?>
			</td>
		</tr>
		<?php if ($dup_install_secure_on) :?>
			<tr>
				<td colspan="2">
					<div id="dup-pass-toggle">
						<input type="password" name="secure-pass" id="secure-pass" readonly="true" value="<?php echo esc_attr($dup_install_secure_pass); ?>" />
						<button type="button" id="secure-btn" onclick="Duplicator.Pack.TogglePassword()" title="<?php esc_attr_e('Show/Hide Password', 'duplicator'); ?>"><i class="fas fa-eye fa-xs"></i></button>
					</div>
				</td>
			</tr>
		<?php endif; ?>
	</table>
	<br/><br/>

	<table class='dup-dtl-data-tbl'>
		<tr>
			<td colspan="2"><div class="dup-install-hdr-2"><?php esc_html_e(" MySQL Server", 'duplicator') ?></div></td>
		</tr>
		<tr>
			<td><?php esc_html_e('Host', 'duplicator') ?>:</td>
			<td><?php echo strlen($package->Installer->OptsDBHost) ? esc_html($package->Installer->OptsDBHost) : esc_html__('- not set -', 'duplicator') ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('Database', 'duplicator') ?>:</td>
			<td><?php echo strlen($package->Installer->OptsDBName) ? esc_html($package->Installer->OptsDBName) : esc_html__('- not set -', 'duplicator') ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e('User', 'duplicator') ?>:</td>
			<td><?php echo strlen($package->Installer->OptsDBUser) ? esc_html($package->Installer->OptsDBUser) : esc_html__('- not set -', 'duplicator') ?></td>
		</tr>
	</table>
</div>
</div>

<?php if ($debug_on) : ?>
	<div style="margin:0">
		<a href="javascript:void(0)" onclick="jQuery(this).parent().find('.dup-pack-debug').toggle()">[<?php esc_html_e('View Package Object', 'duplicator') ?>]</a><br/>
		<pre class="dup-pack-debug" style="display:none"><?php @print_r($package); ?> </pre>
	</div>
<?php endif; ?>


<script>
jQuery(document).ready(function($)
{

	/*	Shows the 'Download Links' dialog
	 *	@param db		The path to the sql file
	 *	@param install	The path to the install file
	 *	@param pack		The path to the package file */
	Duplicator.Pack.ShowLinksDialog = function(json)
	{
		var url = '#TB_inline?width=650&height=325&inlineId=dup-dlg-quick-path';
		tb_show("<?php esc_html_e('Package File Links', 'duplicator') ?>", url);

        var msg = <?php printf(
            '"%s" + "\n\n%s:\n" + json.archive + "\n\n%s:\n" + json.log + "\n\n%s";',
            '=========== SENSITIVE INFORMATION START ===========',
            esc_html__("ARCHIVE", 'duplicator'),
            esc_html__("LOG", 'duplicator'),
            '=========== SENSITIVE INFORMATION END ==========='
            );
        ?>
		$("#dup-dlg-quick-path-data").val(msg);
		return false;
	}

	//LOAD: 'Download Links' Dialog and other misc setup
	Duplicator.Pack.GetLinksText = function() {$('#dup-dlg-quick-path-data').select();};

	Duplicator.Pack.OpenAll = function () {
		Duplicator.UI.IsSaveViewState = false;
		var states = [];
		$("div.dup-box").each(function() {
			var pan = $(this).find('div.dup-box-panel');
			var panel_open = pan.is(':visible');
			if (! panel_open)
				$( this ).find('div.dup-box-title').trigger("click");
			states.push({
				key: pan.attr('id'),
				value: 1
			});
		});
		Duplicator.UI.SaveMulViewStates(states);
		Duplicator.UI.IsSaveViewState = true;
	};

	Duplicator.Pack.CloseAll = function () {
		Duplicator.UI.IsSaveViewState = false;
		var states = [];
		$("div.dup-box").each(function() {
			var pan = $(this).find('div.dup-box-panel');
			var panel_open = pan.is(':visible');
			if (panel_open)
				$( this ).find('div.dup-box-title').trigger("click");
			states.push({
				key: pan.attr('id'),
				value: 0
			});
		});
		Duplicator.UI.SaveMulViewStates(states);
		Duplicator.UI.IsSaveViewState = true;
	};

	Duplicator.Pack.TogglePassword = function()
	{
		var $input  = $('#secure-pass');
		var $button =  $('#secure-btn');
		if (($input).attr('type') == 'text') {
			$input.attr('type', 'password');
			$button.html('<i class="fas fa-eye fa-xs"></i>');
		} else {
			$input.attr('type', 'text');
			$button.html('<i class="fas fa-eye-slash fa-xs"></i>');
		}
	}
});
</script>views/index.php000064400000000016151336065400007521 0ustar00<?php
//silentviews/tools/diagnostics/information.php000064400000024170151336065400014415 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
wp_enqueue_script('dup-handlebars');
require_once(DUPLICATOR_PLUGIN_PATH . '/classes/utilities/class.u.scancheck.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/classes/class.io.php');

$installer_files	= DUP_Server::getInstallerFiles();
$package_name		= (isset($_GET['package'])) ?  esc_html($_GET['package']) : '';
$abs_path			= duplicator_get_abs_path();

// For auto detect archive file name logic
if (empty($package_name)) {
    $installer_file_path = $abs_path . '/' . 'installer.php';
    if (file_exists($installer_file_path)) {
        $installer_file_data = file_get_contents($installer_file_path);
        if (preg_match("/const ARCHIVE_FILENAME	 = '(.*?)';/", $installer_file_data, $match)) {
            $temp_archive_file = esc_html($match[1]);
            $temp_archive_file_path = $abs_path . '/' . $temp_archive_file;
            if (file_exists($temp_archive_file_path)) {
                $package_name = $temp_archive_file;
            }
        }
    }
}
$package_path	= empty($package_name) ? '' : $abs_path . '/' . $package_name;
$txt_found		= __('File Found: Unable to remove', 'duplicator');
$txt_removed	= __('Removed', 'duplicator');
$nonce			= wp_create_nonce('duplicator_cleanup_page');
$section		= (isset($_GET['section'])) ?$_GET['section']:'';

if ($section == "info" || $section == '') {

	$_GET['action'] = isset($_GET['action']) ? $_GET['action'] : 'display';

	if (isset($_REQUEST['_wpnonce'])) {
		if (($_GET['action'] == 'installer') || ($_GET['action'] == 'tmp-cache')) {
			if (! wp_verify_nonce($_REQUEST['_wpnonce'], 'duplicator_cleanup_page')) {
				exit; // Get out of here bad nounce!
			}
		}
	}

	switch ($_GET['action']) {
		case 'installer' :
			$action_response = __('Installer file cleanup ran!', 'duplicator');
			break;
		case 'tmp-cache':
			DUP_Package::tempFileCleanup(true);
			$action_response = __('Build cache removed.', 'duplicator');
			break;
	}

	 if ($_GET['action'] != 'display')  :	?>
		<div id="message" class="notice notice-success is-dismissible  dup-wpnotice-box">
			<p><b><?php echo esc_html($action_response); ?></b></p>
			<?php 
                if ( $_GET['action'] == 'installer') :
                    $remove_error = false;

					// Move installer log before cleanup
    				DUP_Util::initSnapshotDirectory();
					$installer_log_path = DUPLICATOR_INSTALLER_DIRECTORY.'/dup-installer-log__'.DUPLICATOR_INSTALLER_HASH_PATTERN.'.txt';
					$glob_files = glob($installer_log_path);
					if (!empty($glob_files)) {
						foreach ($glob_files as $glob_file) {
							$installer_log_file_path = $glob_file;
							DUP_IO::copyFile($installer_log_file_path, DUP_Settings::getSsdirInstallerPath());
						}
					}

					$html = "";
					//REMOVE CORE INSTALLER FILES
					$installer_files = DUP_Server::getInstallerFiles();
					$removed_files = false;
					foreach ($installer_files as $filename => $path) {
						$file_path = '';
						if (stripos($filename, '[hash]') !== false) {
							$glob_files = glob($path);
                            
							if (!empty($glob_files)) {
                                if(count($glob_files) > 10) {                                
                                    throw new Exception('Trying to delete too many files. Please contact Duplicator support.');
                                }
                                
								foreach ($glob_files as $glob_file) {
									$file_path = $glob_file;
									DUP_IO::deleteFile($file_path);
									$removed_files = true;
								}
							}
						} else if (is_file($path)) {
							$file_path = $path;
							DUP_IO::deleteFile($path);
							$removed_files = true;
						} else if (is_dir($path)) {
							$file_path = $path;

							// Extra protection to ensure we only are deleting the installer directory
							if(DUP_STR::contains($path, 'dup-installer')) {
								DUP_IO::deleteTree($path);
								$removed_files = true;
							}
						}                            

						if (!empty($file_path)) {
                            if (file_exists($file_path)) {
                                echo "<div class='failed'><i class='fa fa-exclamation-triangle fa-sm'></i> {$txt_found} - ".esc_html($file_path)."  </div>";
                                $remove_error = true;
                            } else {
                                echo "<div class='success'> <i class='fa fa-check'></i> {$txt_removed} - ".esc_html($file_path)."	</div>";
                            }
						}
					}

					//No way to know exact name of archive file except from installer.
					//The only place where the package can be removed is from installer
					//So just show a message if removing from plugin.
					if (file_exists($package_path)) {
						$path_parts	 = pathinfo($package_name);
						$path_parts	 = (isset($path_parts['extension'])) ? $path_parts['extension'] : '';
						$valid_ext = ($path_parts == "zip" || $path_parts == "daf");
						if ($valid_ext && !is_dir($package_path)) {
							$html .= (@unlink($package_path))
										? "<div class='success'><i class='fa fa-check'></i> ".esc_html($txt_removed)." - ".esc_html($package_path)."</div>"
										: "<div class='failed'><i class='fa fa-exclamation-triangle fa-sm'></i> ".esc_html($txt_found)." - ".esc_html($package_path)."</div>";
						}
					}
					echo $html;

					if (!$removed_files) {
						echo '<div class="dup-alert-no-files-msg success">'
								. '<i class="fa fa-check"></i> <b>' . esc_html__('No Duplicator installer files found on this WordPress Site.', 'duplicator') . '</b>'
							. '</div>';
					}
				 ?>

				<div class="dup-alert-secure-note">
					<?php
						echo '<b><i class="fa fa-shield-alt"></i> ' . esc_html__('Security Notes', 'duplicator') . ':</b>&nbsp;';
						_e('If the installer files do not successfully get removed with this action, then they WILL need to be removed manually through your hosts control panel  '
						 . 'or FTP.  Please remove all installer files to avoid any security issues on this site.  For more details please visit '
						 . 'the FAQ link <a href="https://snapcreek.com/duplicator/docs/faqs-tech/#faq-installer-295-q" target="_blank">Which files need to be removed after an install?</a>', 'duplicator');

						echo '<br/><br/>';

                        if ($remove_error) {
                            echo  __('Some of the installer files did not get removed, ', 'duplicator').
                                    '<a href="#" onclick="Duplicator.Tools.deleteInstallerFiles(); return false;" >'.
                                    __('please retry the installer cleanup process', 'duplicator').
                                    '</a>.'.
                                    __(' If this process continues please see the previous FAQ link.', 'duplicator').
                                    '<br><br>';
                        }

						echo '<b><i class="fa fa-thumbs-up"></i> ' . esc_html__('Help Support Duplicator', 'duplicator') . ':</b>&nbsp;';
						_e('The Duplicator team has worked many years to make moving a WordPress site a much easier process.  Show your support with a '
						 . '<a href="https://wordpress.org/support/plugin/duplicator/reviews/?filter=5" target="_blank">5 star review</a>!  We would be thrilled if you could!', 'duplicator');
					?>
				</div>

			<?php endif; ?>
		</div>
	<?php endif;
	if(isset($_GET['action']) && $_GET['action']=="installer" && get_option("duplicator_exe_safe_mode")){
		$safe_title = __('This site has been successfully migrated!');
		$safe_msg = __('Please test the entire site to validate the migration process!');

		switch(get_option("duplicator_exe_safe_mode")){

			//safe_mode basic
			case 1:
				$safe_msg = __('NOTICE: Safe mode (Basic) was enabled during install, be sure to re-enable all your plugins.');
			break;

			//safe_mode advance
			case 2:
				$safe_msg = __('NOTICE: Safe mode (Advanced) was enabled during install, be sure to re-enable all your plugins.');

				$temp_theme = null;
				$active_theme = wp_get_theme();
				$available_themes = wp_get_themes();
				foreach($available_themes as $theme){
					if($temp_theme == null && $theme->stylesheet != $active_theme->stylesheet){
						$temp_theme = array('stylesheet' => $theme->stylesheet, 'template' => $theme->template);
						break;
					}
				}

				if($temp_theme != null){
					//switch to another theme then backto default
					switch_theme($temp_theme['template'], $temp_theme['stylesheet']);
					switch_theme($active_theme->template, $active_theme->stylesheet);
				}

			break;
		}

		if (! DUP_Server::hasInstallerFiles()) {
			echo  "<div class='notice notice-success cleanup-notice'><p><b class='title'><i class='fa fa-check-circle'></i> ".esc_html($safe_title)."</b> "
				. "<div class='notice-safemode'>".esc_html($safe_msg)."</p></div></div>";
		}

		delete_option("duplicator_exe_safe_mode");
	}
}
?>


<form id="dup-settings-form" action="<?php echo admin_url( 'admin.php?page=duplicator-tools&tab=diagnostics&section=info' ); ?>" method="post">
	<?php wp_nonce_field( 'duplicator_settings_page', '_wpnonce', false ); ?>
	<input type="hidden" id="dup-remove-options-value" name="remove-options" value="">

	<?php
		if (isset($_POST['remove-options'])) {
			$remove_options = sanitize_text_field($_POST['remove-options']);
			$action_result = DUP_Settings::DeleteWPOption($remove_options);
			switch ($remove_options)
			{
				case 'duplicator_settings'		 : 	$remove_response = __('Plugin settings reset.', 'duplicator');		break;
				case 'duplicator_ui_view_state'  : 	$remove_response = __('View state settings reset.', 'duplicator');	 break;
				case 'duplicator_package_active' : 	$remove_response = __('Active package settings reset.', 'duplicator'); break;
			}
		}

		if (! empty($remove_response))  {
			echo "<div id='message' class='notice notice-success is-dismissible dup-wpnotice-box'><p>".esc_html($remove_response)."</p></div>";
		}

		include_once 'inc.data.php';
		include_once 'inc.settings.php';
		include_once 'inc.validator.php';
		include_once 'inc.phpinfo.php';
	?>
</form>
views/tools/diagnostics/logging.php000064400000020276151336065400013521 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
require_once(DUPLICATOR_PLUGIN_PATH . '/assets/js/javascript.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');

function _duplicatorSortFiles($a,$b) {
	return filemtime($b) - filemtime($a);
}

$logs = glob(DUP_Settings::getSsdirPath() . '/*.log') ;
if ($logs != false && count($logs))  {
	usort($logs, '_duplicatorSortFiles');
	@chmod(DUP_Util::safePath($logs[0]), 0644);
}

$logname	 = (isset($_GET['logname'])) ? trim(sanitize_text_field($_GET['logname'])) : "";
$refresh	 = (isset($_POST['refresh']) && $_POST['refresh'] == 1) ? 1 : 0;
$auto		 = (isset($_POST['auto'])    && $_POST['auto'] == 1)    ? 1 : 0;

//Check for invalid file
if (!empty($logname))
{
	$validFiles = array_map('basename', $logs);
	if (validate_file($logname, $validFiles) > 0) {
		unset($logname);
	}
	unset($validFiles);
}

if (!isset($logname) || !$logname) {
	$logname  = (count($logs) > 0) ? basename($logs[0]) : "";
}

$logurl   = DUP_Settings::getSsdirUrl().'/'.$logname;
$logfound = (strlen($logname) > 0) ? true : false;
?>

<style>
    div#dup-refresh-count {display: inline-block}
    table#dup-log-panels {width:100%; }
    td#dup-log-panel-left {width:75%;}
    td#dup-log-panel-left div.name {float:left; margin: 0px 0px 5px 5px;}
    td#dup-log-panel-left div.opts {float:right;}
    td#dup-log-panel-right {vertical-align: top; padding-left:15px; max-width: 375px}
    #dup-log-content {
        padding:5px; 
        background: #fff; 
        min-height:500px; 
        width: calc(100vw - 630px);; 
        border:1px solid silver;
        overflow:scroll; 
        word-wrap: break-word; 
        margin:0;
        line-height: 2;
    }

    /* OPTIONS */
    div.dup-log-hdr {font-weight: bold; font-size:16px; padding:2px; }
    div.dup-log-hdr small{font-weight:normal; font-style: italic}
    div.dup-log-file-list {font-family:monospace;}
    div.dup-log-file-list a, span.dup-log{display: inline-block; white-space: nowrap; text-overflow: ellipsis; max-width: 375px; overflow:hidden}
    div.dup-log-file-list span {color:green}
    div.dup-opts-items {border:1px solid silver; background: #efefef; padding: 5px; border-radius: 4px; margin:2px 0px 10px -2px;}
    label#dup-auto-refresh-lbl {display: inline-block;}
</style>

<script>
jQuery(document).ready(function($)
{
	Duplicator.Tools.FullLog = function() {
		var $panelL = $('#dup-log-panel-left');
		var $panelR = $('#dup-log-panel-right');

		if ($panelR.is(":visible") ) {
			$panelR.hide(400);
			$panelL.css({width: '100%'});
		} else {
			$panelR.show(200);
			$panelL.css({width: '75%'});
		}
	}

	Duplicator.Tools.Refresh = function() {
		$('#refresh').val(1);
		$('#dup-form-logs').submit();
	}

	Duplicator.Tools.RefreshAuto = function() {
		if ( $("#dup-auto-refresh").is(":checked")) {
			$('#auto').val(1);
			startTimer();
		}  else {
			$('#auto').val(0);
		}
	}

	Duplicator.Tools.GetLog = function(log) {
		window.location =  log;
	}

	Duplicator.Tools.WinResize = function() {
		var height = $(window).height() - 225;
		$("#dup-log-content").css({height: height + 'px'});
	}

    Duplicator.Tools.readLogfile = function() {
        $.get(<?php echo str_replace('\\/', '/', json_encode($logurl)); ?>, function(data) {
            $('#dup-log-content').text(data);
        }, 'text');
    };

	var duration = 10;
	var count = duration;
	var timerInterval;
	function timer() {
		count = count - 1;
		$("#dup-refresh-count").html(count.toString());
		if (! $("#dup-auto-refresh").is(":checked")) {
			 clearInterval(timerInterval);
			 $("#dup-refresh-count").text(count.toString().trim());
			 return;
		}

		if (count <= 0) {
			count = duration + 1;
			Duplicator.Tools.Refresh();
		}
	}

	function startTimer() {
		timerInterval = setInterval(timer, 1000);
	}

	//INIT Events
	$(window).resize(Duplicator.Tools.WinResize);
	$('#dup-options').click(Duplicator.Tools.FullLog);
	$("#dup-refresh").click(Duplicator.Tools.Refresh);
	$("#dup-auto-refresh").click(Duplicator.Tools.RefreshAuto);
	$("#dup-refresh-count").html(duration.toString());

    // READ LOG FILE
    Duplicator.Tools.readLogfile();

	//INIT
	Duplicator.Tools.WinResize();
	<?php if ($refresh)  :	?>
		//Scroll to Bottom
		$("#dup-log-content").load(function () {
			var $contents = $('#dup-log-content').contents();
			$contents.scrollTop($contents.height());
		});
		<?php if ($auto)  :	?>
			$("#dup-auto-refresh").prop('checked', true);
			Duplicator.Tools.RefreshAuto();
		<?php endif; ?>
	<?php endif; ?>
});
</script>

<form id="dup-form-logs" method="post" action="">
<input type="hidden" id="refresh" name="refresh" value="<?php echo ($refresh) ? 1 : 0 ?>" />
<input type="hidden" id="auto" name="auto" value="<?php echo ($auto) ? 1 : 0 ?>" />

<?php if (! $logfound)  :	?>
	<div style="padding:20px">
		<h2><?php esc_html_e("Log file not found or unreadable", 'duplicator') ?>.</h2>
		<?php esc_html_e("Try to create a package, since no log files were found in the snapshots directory with the extension *.log", 'duplicator') ?>.<br/><br/>
		<?php esc_html_e("Reasons for log file not showing", 'duplicator') ?>: <br/>
		- <?php esc_html_e("The web server does not support returning .log file extentions", 'duplicator') ?>. <br/>
		- <?php esc_html_e("The snapshots directory does not have the correct permissions to write files.  Try setting the permissions to 755", 'duplicator') ?>. <br/>
		- <?php esc_html_e("The process that PHP runs under does not have enough permissions to create files.  Please contact your hosting provider for more details", 'duplicator') ?>. <br/>
	</div>
<?php else: ?>
	<table id="dup-log-panels">
		<tr>
			<td id="dup-log-panel-left">
				<div class="name">
					<i class='fas fa-file-contract fa-fw'></i> <b><?php echo basename($logurl); ?></b> &nbsp; | &nbsp;
					<i style="cursor: pointer"
						data-tooltip-title="<?php esc_attr_e("Host Recommendation:", 'duplicator'); ?>"
						data-tooltip="<?php esc_attr_e('Duplicator recommends going with the high performance pro plan or better from our recommended list', 'duplicator'); ?>">
						 <i class="far fa-lightbulb" aria-hidden="true"></i>
							<?php
								printf("%s <a target='_blank' href='//snapcreek.com/wordpress-hosting/'>%s</a> %s",
								esc_html__("Consider our recommended", 'duplicator'),
								esc_html__("host list", 'duplicator'),
								esc_html__("if you’re unhappy with your current provider", 'duplicator'));
							?>
					</i>
				</div>
				<div class="opts"><a href="javascript:void(0)" id="dup-options"><?php esc_html_e("Options", 'duplicator') ?> <i class="fa fa-angle-double-right"></i></a> &nbsp;</div>
				<br style="clear:both" />
				<pre id="dup-log-content"></pre>
			</td>
			<td id="dup-log-panel-right">
				<h2><?php esc_html_e("Options", 'duplicator') ?> </h2>
				<div class="dup-opts-items">
					<input type="button" class="button button-small" id="dup-refresh" value="<?php esc_attr_e("Refresh", 'duplicator') ?>" /> &nbsp;
					<input type='checkbox' id="dup-auto-refresh" style="margin-top:1px" />
					<label id="dup-auto-refresh-lbl" for="dup-auto-refresh">
						<?php esc_attr_e("Auto Refresh", 'duplicator') ?>
						[<div id="dup-refresh-count"></div>]
					</label>
				</div>

				<div class="dup-log-hdr">
					<?php esc_html_e("Package Logs", 'duplicator') ?>
					<small><?php esc_html_e("Top 20", 'duplicator') ?></small>
				</div>

				<div class="dup-log-file-list">
					<?php
						$count=0;
						$active = basename($logurl);
						foreach ($logs as $log) {
							$time = date('m/d/y h:i:s', filemtime($log));
							$name = basename($log);
							$url  = '?page=duplicator-tools&tab=diagnostics&section=log&logname=' . esc_html($name);
							echo ($active == $name)
								? "<span class='dup-log' title='".esc_attr($name)."'>".esc_html($time)."-".esc_html($name)."</span>"
								: "<a href='javascript:void(0)'  title='".esc_attr($name)."' onclick='Duplicator.Tools.GetLog(\"".esc_js($url)."\")'>".esc_html($time)."-".esc_html($name)."</a>";
							if ($count > 20) break;
						}
					?>
				</div>
			</td>
		</tr>
	</table>
<?php endif; ?>
</form>
views/tools/diagnostics/inc.settings.php000064400000022365151336065400014504 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
	$dbvar_maxtime  = DUP_DB::getVariable('wait_timeout');
	$dbvar_maxpacks = DUP_DB::getVariable('max_allowed_packet');
	$dbvar_maxtime  = is_null($dbvar_maxtime)  ? __("unknow", 'duplicator') : $dbvar_maxtime;
	$dbvar_maxpacks = is_null($dbvar_maxpacks) ? __("unknow", 'duplicator') : $dbvar_maxpacks;

	$abs_path = duplicator_get_abs_path();
	$space = @disk_total_space($abs_path);
	$space_free = @disk_free_space($abs_path);
	$perc = @round((100/$space)*$space_free,2);
	$mysqldumpPath = DUP_DB::getMySqlDumpPath();
	$mysqlDumpSupport = ($mysqldumpPath) ? $mysqldumpPath : 'Path Not Found';

	$client_ip_address = DUP_Server::getClientIP();
	$error_log_path = ini_get('error_log');
?>

<!-- ==============================
SERVER SETTINGS -->
<div class="dup-box">
<div class="dup-box-title">
	<i class="fas fa-tachometer-alt"></i>
	<?php esc_html_e("Server Settings", 'duplicator') ?>
	<div class="dup-box-arrow"></div>
</div>
<div class="dup-box-panel" id="dup-settings-diag-srv-panel" style="<?php echo esc_html($ui_css_srv_panel); ?>">
	<table class="widefat" cellspacing="0">
		<tr>
			<td class='dup-settings-diag-header' colspan="2"><?php esc_html_e("General", 'duplicator'); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Duplicator Version", 'duplicator'); ?></td>
			<td>
				<?php echo esc_html(DUPLICATOR_VERSION); ?> -
				<?php echo esc_html(DUPLICATOR_VERSION_BUILD); ?>
			</td>
		</tr>
		<tr>
			<td><?php esc_html_e("Operating System", 'duplicator'); ?></td>
			<td><?php echo esc_html(PHP_OS) ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Timezone", 'duplicator'); ?></td>
			<td><?php echo esc_html(date_default_timezone_get()); ?> &nbsp; <small><i>This is a <a href='options-general.php'>WordPress setting</a></i></small></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Server Time", 'duplicator'); ?></td>
			<td><?php echo date("Y-m-d H:i:s"); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Web Server", 'duplicator'); ?></td>
			<td><?php echo esc_html($_SERVER['SERVER_SOFTWARE']); ?></td>
		</tr>
		<?php
		$abs_path = duplicator_get_abs_path();
		?>
		<tr>
			<td><?php esc_html_e("Root Path", 'duplicator'); ?></td>
			<td><?php echo esc_html($abs_path); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("ABSPATH", 'duplicator'); ?></td>
			<td><?php echo esc_html($abs_path); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Plugins Path", 'duplicator'); ?></td>
			<td><?php echo esc_html(DUP_Util::safePath(WP_PLUGIN_DIR)); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Loaded PHP INI", 'duplicator'); ?></td>
			<td><?php echo esc_html(php_ini_loaded_file()); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Server IP", 'duplicator'); ?></td>
			<?php
			if (isset($_SERVER['SERVER_ADDR'])) {
				$server_address = $_SERVER['SERVER_ADDR'];
			} elseif (isset($_SERVER['SERVER_NAME']) && function_exists('gethostbyname')) {
				$server_address = gethostbyname($_SERVER['SERVER_NAME']);
			} else {
				$server_address = __("Can't detect", 'duplicator');
			}
			?>
			<td><?php echo esc_html($server_address); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Client IP", 'duplicator'); ?></td>
			<td><?php echo esc_html($client_ip_address);?></td>
		</tr>
		<tr>
			<td class='dup-settings-diag-header' colspan="2">WordPress</td>
		</tr>
		<tr>
			<td><?php esc_html_e("Version", 'duplicator'); ?></td>
			<td><?php echo esc_html($wp_version); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Language", 'duplicator'); ?></td>
			<td><?php bloginfo('language'); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Charset", 'duplicator'); ?></td>
			<td><?php bloginfo('charset'); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Memory Limit ", 'duplicator'); ?></td>
			<td><?php echo esc_html(WP_MEMORY_LIMIT); ?> (<?php esc_html_e("Max", 'duplicator'); echo '&nbsp;' . esc_html(WP_MAX_MEMORY_LIMIT); ?>)</td>
		</tr>
		<tr>
			<td class='dup-settings-diag-header' colspan="2">PHP</td>
		</tr>
		<tr>
			<td><?php esc_html_e("Version", 'duplicator'); ?></td>
			<td><?php echo esc_html(phpversion()); ?></td>
		</tr>
		<tr>
			<td>SAPI</td>
			<td><?php echo esc_html(PHP_SAPI); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("User", 'duplicator'); ?></td>
			<td><?php echo DUP_Util::getCurrentUser(); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Process", 'duplicator'); ?></td>
			<td><?php echo esc_html(DUP_Util::getProcessOwner()); ?></td>
		</tr>
		<tr>
			<td><a href="http://php.net/manual/en/features.safe-mode.php" target="_blank"><?php esc_html_e("Safe Mode", 'duplicator'); ?></a></td>
			<td>
			<?php echo (((strtolower(@ini_get('safe_mode')) == 'on')	  ||  (strtolower(@ini_get('safe_mode')) == 'yes') ||
						 (strtolower(@ini_get('safe_mode')) == 'true') ||  (ini_get("safe_mode") == 1 )))
						 ? esc_html__('On', 'duplicator') : esc_html__('Off', 'duplicator');
			?>
			</td>
		</tr>
		<tr>
			<td><a href="http://www.php.net/manual/en/ini.core.php#ini.memory-limit" target="_blank"><?php esc_html_e("Memory Limit", 'duplicator'); ?></a></td>
			<td><?php echo @ini_get('memory_limit') ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Memory In Use", 'duplicator'); ?></td>
			<td><?php echo size_format(@memory_get_usage(TRUE), 2) ?></td>
		</tr>
		<tr>
			<td><a href="http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time" target="_blank"><?php esc_html_e("Max Execution Time", 'duplicator'); ?></a></td>
			<td>
				<?php
					echo @ini_get('max_execution_time');
					$try_update = set_time_limit(0);
					$try_update = $try_update ? 'is dynamic' : 'value is fixed';
					echo " (default) - {$try_update}";
				?>
				<i class="fa fa-question-circle data-size-help"
					data-tooltip-title="<?php esc_attr_e("Max Execution Time", 'duplicator'); ?>"
					data-tooltip="<?php esc_attr_e('If the value shows dynamic then this means its possible for PHP to run longer than the default.  '
						. 'If the value is fixed then PHP will not be allowed to run longer than the default.', 'duplicator'); ?>"></i>
			</td>
		</tr>
		<tr>
			<td><a href="http://us3.php.net/shell_exec" target="_blank"><?php esc_html_e("Shell Exec", 'duplicator'); ?></a></td>
			<td><?php echo (DUP_Util::hasShellExec()) ? esc_html__("Is Supported", 'duplicator') : esc_html__("Not Supported", 'duplicator'); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Shell Exec Zip", 'duplicator'); ?></td>
			<td><?php echo (DUP_Util::getZipPath() != null) ? esc_html__("Is Supported", 'duplicator') : esc_html__("Not Supported", 'duplicator'); ?></td>
		</tr>
        <tr>
            <td><a href="https://suhosin.org/stories/index.html" target="_blank"><?php esc_html_e("Suhosin Extension", 'duplicator'); ?></a></td>
            <td><?php echo extension_loaded('suhosin') ? esc_html__("Enabled", 'duplicator') : esc_html__("Disabled", 'duplicator'); ?></td>
        </tr>
		<tr>
			<td><?php esc_html_e("Architecture ", 'duplicator'); ?></td>
			<td>                    
				<?php echo DUP_Util::getArchitectureString(); ?>
			</td>
		</tr>
		<tr>
            <td><?php esc_html_e("Error Log File ", 'duplicator'); ?></td>
            <td><?php echo esc_html($error_log_path); ?></td>
        </tr>
		<tr>
			<td class='dup-settings-diag-header' colspan="2">MySQL</td>
		</tr>
		<tr>
			<td><?php esc_html_e("Version", 'duplicator'); ?></td>
			<td><?php echo esc_html(DUP_DB::getVersion()); ?></td>
		</tr>
        <tr>
			<td><?php esc_html_e("Comments", 'duplicator'); ?></td>
            <td><?php echo esc_html(DUP_DB::getVariable('version_comment')); ?></td>
		</tr>
		<tr>
			<td><?php esc_html_e("Charset", 'duplicator'); ?></td>
			<td><?php echo defined('DB_CHARSET') ? DB_CHARSET : 'DB_CHARSET not set' ; ?></td>
		</tr>
		<tr>
			<td><a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout" target="_blank"><?php esc_html_e("Wait Timeout", 'duplicator'); ?></a></td>
			<td><?php echo esc_html($dbvar_maxtime); ?></td>
		</tr>
		<tr>
			<td style="white-space:nowrap"><a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_allowed_packet" target="_blank"><?php esc_html_e("Max Allowed Packets", 'duplicator'); ?></a></td>
			<td><?php echo esc_html($dbvar_maxpacks); ?></td>
		</tr>
		<tr>
			<td><a href="http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html" target="_blank"><?php esc_html_e("msyqldump Path", 'duplicator'); ?></a></td>
			<td><?php echo esc_html($mysqlDumpSupport); ?></td>
		</tr>
		 <tr>
			 <td class='dup-settings-diag-header' colspan="2"><?php esc_html_e("Server Disk", 'duplicator'); ?></td>
		 </tr>
		 <tr valign="top">
			 <td><?php esc_html_e('Free space', 'hyper-cache'); ?></td>
			 <td><?php echo esc_html($perc);?>% -- <?php echo esc_html(DUP_Util::byteSize($space_free));?> from <?php echo esc_html(DUP_Util::byteSize($space));?><br/>
				  <small>
					  <?php esc_html_e("Note: This value is the physical servers hard-drive allocation.", 'duplicator'); ?> <br/>
					  <?php esc_html_e("On shared hosts check your control panel for the 'TRUE' disk space quota value.", 'duplicator'); ?>
				  </small>
			 </td>
		 </tr>

	</table><br/>

</div> <!-- end .dup-box-panel -->
</div> <!-- end .dup-box -->
<br/>views/tools/diagnostics/inc.data.php000064400000012001151336065400013537 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
	$sql = "SELECT * FROM `{$wpdb->prefix}options` WHERE  `option_name` LIKE  '%duplicator_%' AND  `option_name` NOT LIKE '%duplicator_pro%' ORDER BY option_name";
?>

<!-- ==============================
OPTIONS DATA -->
<div class="dup-box">
	<div class="dup-box-title">
		<i class="fa fa-th-list"></i>
		<?php esc_html_e("Stored Data", 'duplicator'); ?>
		<div class="dup-box-arrow"></div>
	</div>
	<div class="dup-box-panel" id="dup-settings-diag-opts-panel" style="<?php echo esc_html($ui_css_opts_panel); ?>">
		<div style="padding-left:10px">
			<h3 class="title"><?php esc_html_e('Data Cleanup', 'duplicator') ?></h3>
			<table class="dup-reset-opts">
				<tr style="vertical-align:text-top">
					<td>
						<button id="dup-remove-installer-files-btn" type="button" class="button button-small dup-fixed-btn" onclick="Duplicator.Tools.deleteInstallerFiles();">
							<?php esc_html_e("Remove Installation Files", 'duplicator'); ?>
						</button>
					</td>
					<td>
						<?php esc_html_e("Removes all reserved installer files.", 'duplicator'); ?>
						<a href="javascript:void(0)" onclick="jQuery('#dup-tools-delete-moreinfo').toggle()">[<?php esc_html_e("more info", 'duplicator'); ?>]</a><br/>

						<div id="dup-tools-delete-moreinfo">
							<?php
								esc_html_e("Clicking on the 'Remove Installation Files' button will attempt to remove the installer files used by Duplicator.  These files should not "
								. "be left on production systems for security reasons. Below are the files that should be removed.", 'duplicator');
								echo "<br/><br/>";

								$installer_files = array_keys($installer_files);
								array_push($installer_files, '[HASH]_archive.zip/daf');
								echo '<i>' . implode('<br/>', $installer_files) . '</i>';
								echo "<br/><br/>";
							?>
						</div>
					</td>
				</tr>
				<tr>
					<td>
						<button type="button" class="button button-small dup-fixed-btn" onclick="Duplicator.Tools.ConfirmClearBuildCache()">
							<?php esc_html_e("Clear Build Cache", 'duplicator'); ?>
						</button>
					</td>
					<td><?php esc_html_e("Removes all build data from:", 'duplicator'); ?> [<?php echo DUP_Settings::getSsdirTmpPath() ?>].</td>
				</tr>
			</table>
		</div>
		<div style="padding:0px 20px 0px 25px">
			<h3 class="title" style="margin-left:-15px"><?php esc_html_e("Options Values", 'duplicator') ?> </h3>
			<table class="widefat" cellspacing="0">
				<thead>
					<tr>
						<th>Key</th>
						<th>Value</th>
					</tr>
				</thead>
				<tbody>
				<?php
					foreach( $wpdb->get_results("{$sql}") as $key => $row) { ?>
					<tr>
						<td>
							<?php
								 echo (in_array($row->option_name, $GLOBALS['DUPLICATOR_OPTS_DELETE']))
									? "<a href='javascript:void(0)' onclick='Duplicator.Settings.ConfirmDeleteOption(this)'>".esc_html($row->option_name)."</a>"
									: $row->option_name;
							?>
						</td>
						<td><textarea class="dup-opts-read" readonly="readonly"><?php echo esc_textarea($row->option_value); ?></textarea></td>
					</tr>
				<?php } ?>
				</tbody>
			</table>
		</div>

	</div>
</div>
<br/>

<!-- ==========================================
THICK-BOX DIALOGS: -->
<?php
	$confirm1 = new DUP_UI_Dialog();
	$confirm1->title			= __('Delete Option?', 'duplicator');
	$confirm1->message			= __('Delete the option value just selected?', 'duplicator');
	$confirm1->progressText	= __('Removing Option, Please Wait...', 'duplicator');
	$confirm1->jscallback		= 'Duplicator.Settings.DeleteOption()';
	$confirm1->initConfirm();

	$confirm2 = new DUP_UI_Dialog();
	$confirm2->title			= __('Clear Build Cache?', 'duplicator');
	$confirm2->message			= __('This process will remove all build cache files.  Be sure no packages are currently building or else they will be cancelled.', 'duplicator');
	$confirm2->jscallback		= 'Duplicator.Tools.ClearBuildCache()';
	$confirm2->initConfirm();
?>

<script>
jQuery(document).ready(function($)
{
	Duplicator.Settings.ConfirmDeleteOption = function (anchor)
	{
		var key = $(anchor).text();
		var msg_id = '<?php echo esc_js($confirm1->getMessageID()); ?>';
		var msg    = '<?php esc_html_e('Delete the option value', 'duplicator');?>' + ' [' + key + '] ?';
		jQuery('#dup-remove-options-value').val(key);
		jQuery('#' + msg_id).html(msg)
		<?php $confirm1->showConfirm(); ?>
	}

	Duplicator.Settings.DeleteOption = function ()
	{
		jQuery('#dup-settings-form').submit();
	}

	Duplicator.Tools.ConfirmClearBuildCache = function ()
	{
		 <?php $confirm2->showConfirm(); ?>
	}

	Duplicator.Tools.ClearBuildCache = function ()
	{
		window.location = '?page=duplicator-tools&tab=diagnostics&action=tmp-cache&_wpnonce=<?php echo esc_js($nonce); ?>';
	}
});


Duplicator.Tools.deleteInstallerFiles = function()
{
	<?php
	$url = "?page=duplicator-tools&tab=diagnostics&action=installer&_wpnonce=".esc_js($nonce)."&package=".esc_js($package_name);
	echo "window.location = '{$url}';";
	?>
}
</script>
views/tools/diagnostics/inc.phpinfo.php000064400000001447151336065400014305 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
	ob_start();
	phpinfo();
	$serverinfo = ob_get_contents();
	ob_end_clean();

	$serverinfo = preg_replace( '%^.*<body>(.*)</body>.*$%ms',  '$1',  $serverinfo);
	$serverinfo = preg_replace( '%^.*<title>(.*)</title>.*$%ms','$1',  $serverinfo);
?>

<!-- ==============================
PHP INFORMATION -->
<div class="dup-box">
	<div class="dup-box-title">
		<i class="fa fa-info-circle"></i>
		<?php esc_html_e("PHP Information", 'duplicator'); ?>
		<div class="dup-box-arrow"></div>
	</div>
	<div class="dup-box-panel" style="display:none">
		<div id="dup-phpinfo" style="width:95%">
			<?php
				echo "<div id='dup-server-info-area'>{$serverinfo}</div>";
				$serverinfo = null;
			?>
		</div><br/>
	</div>
</div>
<br/>
views/tools/diagnostics/support.php000064400000016430151336065400013604 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
    div.dup-support-all {font-size:13px; line-height:20px}
    div.dup-support-txts-links {width:100%;font-size:14px; font-weight:bold; line-height:26px; text-align:center}
    div.dup-support-hlp-area {width:375px; height:160px; float:left; border:1px solid #dfdfdf; border-radius:4px; margin:10px; line-height:18px;box-shadow: 0 8px 6px -6px #ccc;}
    table.dup-support-hlp-hdrs {border-collapse:collapse; width:100%; border-bottom:1px solid #dfdfdf}
    table.dup-support-hlp-hdrs {background-color:#efefef;}
    div.dup-support-hlp-hdrs {
        font-weight:bold; font-size:17px; height: 35px; padding:5px 5px 5px 10px;
        background-image:-ms-linear-gradient(top, #FFFFFF 0%, #DEDEDE 100%);
        background-image:-moz-linear-gradient(top, #FFFFFF 0%, #DEDEDE 100%);
        background-image:-o-linear-gradient(top, #FFFFFF 0%, #DEDEDE 100%);
        background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #FFFFFF), color-stop(1, #DEDEDE));
        background-image:-webkit-linear-gradient(top, #FFFFFF 0%, #DEDEDE 100%);
        background-image:linear-gradient(to bottom, #FFFFFF 0%, #DEDEDE 100%);
    }
    div.dup-support-hlp-hdrs div {padding:5px; margin:4px 20px 0px -20px;  text-align: center;}
    div.dup-support-hlp-txt{padding:10px 4px 4px 4px; text-align:center}
</style>


<div class="wrap dup-wrap dup-support-all">

    <div style="width:800px; margin:auto; margin-top: 20px">
        <table>
            <tr>
                <td style="width:70px"><i class="fa fa-question-circle fa-5x"></i></td>
                <td valign="top" style="padding-top:10px; font-size:13px">
					<?php
					esc_html_e("Migrating WordPress is a complex process and the logic to make all the magic happen smoothly may not work quickly with every site.  With over 30,000 plugins and a very complex server eco-system some migrations may run into issues.  This is why the Duplicator includes a detailed knowledgebase that can help with many common issues.  Resources to additional support, approved hosting, and alternatives to fit your needs can be found below.",
						'duplicator');
					?>
                </td>
            </tr>
        </table>
        <br/><br/>

        <!-- HELP LINKS -->
        <div class="dup-support-hlp-area">
            <div class="dup-support-hlp-hdrs">
                <i class="fas fa-cube fa-2x fa-pull-left"></i>
                <div><?php esc_html_e('Knowledgebase', 'duplicator') ?></div>
            </div>
            <div class="dup-support-hlp-txt">
<?php esc_html_e('Complete Online Documentation', 'duplicator'); ?><br/>
                <select id="dup-support-kb-lnks" style="margin-top:18px; font-size:16px; min-width: 170px">
                    <option> <?php esc_html_e('Choose A Section', 'duplicator') ?> </option>
                    <option value="https://snapcreek.com/duplicator/docs/quick-start/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=support_qs"><?php esc_html_e('Quick Start',
	'duplicator') ?></option>
                    <option value="https://snapcreek.com/duplicator/docs/guide/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=support_guide"><?php esc_html_e('User Guide',
	'duplicator') ?></option>
                    <option value="https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=support_FAQs"><?php esc_html_e('FAQs',
	'duplicator') ?></option>
                    <option value="https://snapcreek.com/duplicator/docs/changelog/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=support_changelog&lite"><?php esc_html_e('Change Log',
	'duplicator') ?></option>
                </select>
            </div>
        </div>

        <!-- ONLINE SUPPORT -->
        <div class="dup-support-hlp-area">
            <div class="dup-support-hlp-hdrs">
                <i class="far fa-lightbulb fa-2x fa-pull-left"></i>
                <div><?php esc_html_e('Online Support', 'duplicator') ?></div>
            </div>
            <div class="dup-support-hlp-txt">
<?php esc_html_e("Get Help From IT Professionals", 'duplicator'); ?>
                <br/>
                <div class="dup-support-txts-links" style="margin:10px 0 10px 0">
                    <button class="button  button-primary button-large" onclick="Duplicator.OpenSupportWindow();return false;">
<?php esc_html_e('Get Support!', 'duplicator') ?>
					</button> <br/>
                </div>
				<small>Pro Users <a href="https://snapcreek.com/ticket?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=support_prousers_here" target="_blank">Support Here</a></small>
            </div>
        </div>
        <br style="clear:both" /><br/><br/>


        <!-- APPROVED HOSTING -->
        <div class="dup-support-hlp-area">

            <div class="dup-support-hlp-hdrs">
                <i class="fa fa-bolt fa-sm fa-2x fa-pull-left"></i>
                <div><?php esc_html_e('Approved Hosting', 'duplicator') ?></div>
            </div>
            <div class="dup-support-hlp-txt">
<?php esc_html_e('Servers That Work With Duplicator', 'duplicator'); ?>
                <br/><br/>
                <div class="dup-support-txts-links">
                    <button class="button button-primary button-large" onclick="window.open('https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=support_servers#faq-resource-040-q', 'litg');"><?php esc_html_e('Trusted Providers!',
	'duplicator') ?></button> &nbsp;
                </div>
            </div>
        </div>

        <!-- ALTERNATIVES -->
        <div class="dup-support-hlp-area">

            <div class="dup-support-hlp-hdrs">
                <i class="fas fa-code-branch fa-2x fa-pull-left"></i>
                <div><?php esc_html_e('Alternatives', 'duplicator') ?></div>
            </div>
            <div class="dup-support-hlp-txt">
<?php esc_html_e('Other Commercial Resources', 'duplicator'); ?>
                <br/><br/>
                <div class="dup-support-txts-links">
                    <button class="button button-primary button-large" onclick="window.open('https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=support_pro_sln#faq-resource-050-q', 'litg');"><?php esc_html_e('Pro Solutions!',
	'duplicator') ?></button> &nbsp;
                </div>
            </div>
        </div>
    </div>
</div><br/><br/><br/><br/>

<script>
	jQuery(document).ready(function ($) {

		Duplicator.OpenSupportWindow = function () {
			var url = 'https://snapcreek.com/duplicator/docs/faqs-tech/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_campaign=problem_resolution&utm_content=support_window#faq-resource';
			window.open(url, 'litg');
		}

		//ATTACHED EVENTS
		jQuery('#dup-support-kb-lnks').change(function () {
			if (jQuery(this).val() != "null")
				window.open(jQuery(this).val())
		});

	});
</script>views/tools/diagnostics/main.php000064400000007027151336065400013016 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
	div.success {color:#4A8254}
	div.failed {color:red}
	table.dup-reset-opts td:first-child {font-weight: bold}
	table.dup-reset-opts td {padding:10px}
	button.dup-fixed-btn {min-width: 150px; text-align: center}
	div#dup-tools-delete-moreinfo {display: none; padding: 5px 0 0 20px; border:1px solid silver; background-color: #fff; border-radius:3px; padding:10px; margin:5px; width:750px }
	div.dup-alert-no-files-msg {padding:10px 0 10px 0}
	div.dup-alert-secure-note {font-style: italic; max-width:800px; padding:15px 0 20px 0}

	div#message {margin:0px 0px 10px 0px}
	div#dup-server-info-area { padding:10px 5px;  }
	div#dup-server-info-area table { padding:1px; background:#dfdfdf;  -webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px; width:100% !important; box-shadow:0 8px 6px -6px #777; }
	div#dup-server-info-area td, th {padding:3px; background:#fff; -webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;}
	div#dup-server-info-area tr.h img { display:none; }
	div#dup-server-info-area tr.h td{ background:none; }
	div#dup-server-info-area tr.h th{ text-align:center; background-color:#efefef;  }
	div#dup-server-info-area td.e{ font-weight:bold }
	td.dup-settings-diag-header {background-color:#D8D8D8; font-weight: bold; border-style: none; color:black}
	.widefat th {font-weight:bold; }
	.widefat td {padding:2px 2px 2px 8px}
	.widefat td:nth-child(1) {width:10px;}
	.widefat td:nth-child(2) {padding-left: 20px; width:100% !important}
	textarea.dup-opts-read {width:100%; height:40px; font-size:12px}
	div.lite-sub-tabs {padding: 10px 0 10px 0; font-size: 14px}
</style>


<?php
$action_response = null;

$ctrl_ui = new DUP_CTRL_UI();
$ctrl_ui->setResponseType('PHP');
$data = $ctrl_ui->GetViewStateList();

$ui_css_srv_panel   = (isset($data->payload['dup-settings-diag-srv-panel'])  && $data->payload['dup-settings-diag-srv-panel'])   ? 'display:block' : 'display:none';
$ui_css_opts_panel  = (isset($data->payload['dup-settings-diag-opts-panel']) && $data->payload['dup-settings-diag-opts-panel'])  ? 'display:block' : 'display:none';

$section        = isset($_GET['section']) ? $_GET['section'] : 'info';
$txt_diagnostic = __('Information', 'duplicator');
$txt_log        = __('Logs', 'duplicator');
$txt_support    = __('Support', 'duplicator');;
$tools_url      = 'admin.php?page=duplicator-tools&tab=diagnostics';

switch ($section) {
    case 'info':
        echo "<div class='lite-sub-tabs'><b>".esc_html($txt_diagnostic)."</b> &nbsp;|&nbsp; <a href='".esc_url($tools_url."&section=log")."'>".esc_html($txt_log)."</a> &nbsp;|&nbsp; <a href='".esc_url($tools_url."&section=support")."'>".esc_html($txt_support)."</a></div>";
        include(dirname(__FILE__) . '/information.php');
        break;

    case 'log':
        echo "<div class='lite-sub-tabs'><a href='".esc_url($tools_url."&section=info")."'>".esc_html($txt_diagnostic)."</a>  &nbsp;|&nbsp;<b>".esc_html($txt_log)."</b>  &nbsp;|&nbsp; <a href='".esc_url($tools_url."&section=support")."'>".esc_html($txt_support)."</a></div>";
        include(dirname(__FILE__) . '/logging.php');
        break;

    case 'support':
        echo "<div class='lite-sub-tabs'><a href='".esc_url($tools_url."&section=info")."'>".esc_html($txt_diagnostic)."</a> &nbsp;|&nbsp; <a href='".esc_url($tools_url."&section=log")."'>".esc_html($txt_log)."</a> &nbsp;|&nbsp; <b>".esc_html($txt_support)."</b> </div>";
        include(dirname(__FILE__) . '/support.php');
        break;
}
?>views/tools/diagnostics/inc.validator.php000064400000012431151336065400014622 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
	$action = isset($_POST['action']) ? sanitize_text_field($_POST['action']) : '';
	$scan_run = ($action == 'duplicator_recursion') ? true :false;
	$ajax_nonce	= wp_create_nonce('DUP_CTRL_Tools_runScanValidator');
?>

<style>
	div#hb-result {padding: 10px 5px 0 5px; line-height:20px; font-size: 12px}
</style>

<!-- ==========================================
THICK-BOX DIALOGS: -->
<?php
	$confirm1 = new DUP_UI_Dialog();
	$confirm1->title			= __('Run Validator', 'duplicator');
	$confirm1->message			= __('This will run the scan validation check.  This may take several minutes.  Do you want to Continue?', 'duplicator');
	$confirm1->progressOn		= false;
	$confirm1->jscallback		= 'Duplicator.Tools.runScanValidator()';
	$confirm1->initConfirm();
?>

<!-- ==============================
SCAN VALIDATOR -->
<div class="dup-box">
	<div class="dup-box-title">
		<i class="far fa-check-square"></i>
		<?php esc_html_e("Scan Validator", 'duplicator'); ?>
		<div class="dup-box-arrow"></div>
	</div>
	<div class="dup-box-panel" style="display: <?php echo $scan_run ? 'block' : 'none';  ?>">
		<?php
			esc_html_e("This utility will help to find unreadable files and sys-links in your environment  that can lead to issues during the scan process.  ", "duplicator");
			esc_html_e("The utility will also shows how many files and directories you have in your system.  This process may take several minutes to run.  ", "duplicator");
			esc_html_e("If there is a recursive loop on your system then the process has a built in check to stop after a large set of files and directories have been scanned.  ", "duplicator");
			esc_html_e("A message will show indicated that that a scan depth has been reached. If you have issues with the package scanner (step 2) during the build process then try to add "
			. "The paths below to your file filters to allow the scanner to finish.", "duplicator");
		?>
		<br/><br/>


		<button id="scan-run-btn" type="button" class="button button-large button-primary" onclick="Duplicator.Tools.ConfirmScanValidator()">
			<?php esc_html_e("Run Scan Integrity Validation", "duplicator"); ?>
		</button>

		<script id="hb-template" type="text/x-handlebars-template">
			<b>Scan Path:</b> <?php echo esc_html(duplicator_get_abs_path()); ?> <br/>
			<b>Scan Results</b><br/>
			<table>
				<tr>
					<td><b>Files:</b></td>
					<td>{{payload.fileCount}} </td>
					<td> &nbsp; </td>
					<td><b>Dirs:</b></td>
					<td>{{payload.dirCount}} </td>
				</tr>
			</table>
			<br/>

			<b>Unreadable Dirs/Files:</b> <br/>
			{{#if payload.unreadable}}
				{{#each payload.unreadable}}
					&nbsp; &nbsp; {{@index}} : {{this}}<br/>
				{{/each}}
			{{else}}
				<i>No Unreadable items found</i> <br/>
			{{/if}}
			<br/>

			<b>Symbolic Links:</b> <br/>
			{{#if payload.symLinks}}
				{{#each payload.symLinks}}
					&nbsp; &nbsp; {{@index}} : {{this}}<br/>
				{{/each}}
			{{else}}
				<i>No Sym-links found</i> <br/>
				<small>	<?php esc_html_e("Note: Symlinks are not discoverable on Windows OS with PHP", "duplicator"); ?></small> <br/>
			{{/if}}
			<br/>

			<b>Directory Name Checks:</b> <br/>
			{{#if payload.nameTestDirs}}
				{{#each payload.nameTestDirs}}
					&nbsp; &nbsp; {{@index}} : {{this}}<br/>
				{{/each}}
			{{else}}
				<i>No name check warnings located for directory paths</i> <br/>
			{{/if}}
			<br/>

			<b>File Name Checks:</b> <br/>
			{{#if payload.nameTestFiles}}
				{{#each payload.nameTestFiles}}
					&nbsp; &nbsp; {{@index}} : {{this}}<br/>
				{{/each}}
			{{else}}
				<i>No name check warnings located for directory paths</i> <br/>
			{{/if}}

			<br/>
		</script>
		<div id="hb-result"></div>

	</div>
</div>
<br/>

<script>
jQuery(document).ready(function($)
{
	Duplicator.Tools.ConfirmScanValidator = function()
	{
		<?php $confirm1->showConfirm(); ?>
	}

	//Run request to: admin-ajax.php?action=DUP_CTRL_Tools_runScanValidator
	Duplicator.Tools.runScanValidator = function()
	{
		tb_remove();
		var data = {
		    action : 'DUP_CTRL_Tools_runScanValidator',
            nonce: '<?php echo esc_js($ajax_nonce); ?>',
            recursive_scan: 1
		};

		$('#hb-result').html('<?php esc_html_e("Scanning Environment... This may take a few minutes.", "duplicator"); ?>');
		$('#scan-run-btn').html('<i class="fas fa-circle-notch fa-spin fa-fw"></i> Running Please Wait...');

		$.ajax({
			type: "POST",
			dataType: "text",
			url: ajaxurl,
			data: data,
			success: function(respData) {
				try {
					var data = Duplicator.parseJSON(respData);
				} catch(err) {
					console.error(err);
					console.error('JSON parse failed for response data: ' + respData);
					console.log(respData);
					return false;
				}
				Duplicator.Tools.IntScanValidator(data);
			},
			error: function(data) {console.log(data)},
			done: function(data) {console.log(data)}
		});
	}

	//Process Ajax Template
	Duplicator.Tools.IntScanValidator= function(data)
	{
		var template = $('#hb-template').html();
		var templateScript = Handlebars.compile(template);
		var html = templateScript(data);
		$('#hb-result').html(html);
		$('#scan-run-btn').html('<?php esc_html_e("Run Scan Integrity Validation", "duplicator"); ?>');
	}
});
</script>

views/tools/index.php000064400000000016151336065400010661 0ustar00<?php
//silentviews/tools/recovery.php000064400000002037151336065400011415 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>

<style>
	div.panel {padding: 20px 5px 10px 10px; text-align: center; }
</style>


<div class="panel">
    <img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/logo-dpro-300x50.png"  />

    <div class="txt-call-action-title">
        <i class="fas fa-undo-alt"></i>
        <?php echo esc_html__('Recovery Points are available in Duplicator Pro.', 'duplicator'); ?>
    </div>

    <div class="txt-call-action-sub">
		<?php
            esc_html_e('Recovery Points allow you to quickly revert your website to a specific point in time.', 'duplicator');
            echo '<br/>';
            esc_html_e('Upgrade plugins or make risky site changes with confidence!', 'duplicator');
		?>
    </div>

    <a class="dup-btn-call-action" href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_tools_recovery_checkitout&utm_campaign=duplicator_pro" target="_blank">
        <?php esc_html_e('Check It Out!', 'duplicator') ?>
    </a>
</div>views/tools/controller.php000064400000003041151336065400011736 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
require_once(DUPLICATOR_PLUGIN_PATH . '/classes/ui/class.ui.dialog.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/assets/js/javascript.php');
require_once(DUPLICATOR_PLUGIN_PATH . '/views/inc.header.php');

global $wpdb;
global $wp_version;

DUP_Handler::init_error_handler();
DUP_Util::hasCapability('manage_options');
$current_tab = isset($_REQUEST['tab']) ? esc_html($_REQUEST['tab']) : 'diagnostics';
if ('d' == $current_tab) {
	$current_tab = 'diagnostics';
}
?>

<div class="wrap">	
    <?php duplicator_header(__("Tools", 'duplicator')) ?>

    <h2 class="nav-tab-wrapper">  
        <a href="?page=duplicator-tools&tab=diagnostics" class="nav-tab <?php echo ($current_tab == 'diagnostics') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('General', 'duplicator'); ?></a>
		<a href="?page=duplicator-tools&tab=templates" class="nav-tab <?php echo ($current_tab == 'templates') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Templates', 'duplicator'); ?></a>
        <a href="?page=duplicator-tools&tab=recovery" class="nav-tab <?php echo ($current_tab == 'recovery') ? 'nav-tab-active' : '' ?>"> <?php esc_html_e('Recovery', 'duplicator'); ?></a>
    </h2>

    <?php
		switch ($current_tab) {
			case 'diagnostics': include(DUPLICATOR_PLUGIN_PATH.'views/tools/diagnostics/main.php');
				break;
            case 'templates': include(DUPLICATOR_PLUGIN_PATH."views/tools/templates.php");
				break;
			case 'recovery': include(DUPLICATOR_PLUGIN_PATH."views/tools/recovery.php");
				break;
		}
	?>
</div>
views/tools/templates.php000064400000002133151336065400011552 0ustar00<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
?>
<style>
	div.panel {padding: 20px 5px 10px 10px; text-align: center; }
</style>

<div class="panel">
    <img src="<?php echo DUPLICATOR_PLUGIN_URL ?>assets/img/logo-dpro-300x50.png"  />

    <div class="txt-call-action-title">
        <i class="far fa-clone"></i>
        <?php echo esc_html__('Templates are available in Duplicator Pro.', 'duplicator');  ?>
    </div>
    <div class="txt-call-action-sub">
        <?php
            esc_html_e('Templates allow you to customize what you want to include in your site and store it as a re-usable profile.', 'duplicator');
            echo '<br/>';
            esc_html_e('Save time and create a template that can be applied to a schedule or a custom package setup.', 'duplicator');
        ?>
    </div>

    <a class="dup-btn-call-action" href="https://snapcreek.com/duplicator/?utm_source=duplicator_free&utm_medium=wordpress_plugin&utm_content=free_tools_templates_checkitout&utm_campaign=duplicator_pro" target="_blank">
        <?php esc_html_e('Check It Out!', 'duplicator') ?>
    </a>
</div>


uninstall.php000064400000010461151336065400007273 0ustar00<?php
/**
 * Fired when the plugin is uninstalled.
 */
// If uninstall not called from WordPress, then exit
if (!defined('WP_UNINSTALL_PLUGIN')) {
    exit;
}

// CHECK PHP VERSION
define('DUPLICATOR_LITE_PHP_MINIMUM_VERSION', '5.3.8');
define('DUPLICATOR_LITE_PHP_SUGGESTED_VERSION', '5.6.20');
require_once(dirname(__FILE__)."/tools/DuplicatorPhpVersionCheck.php");
if (DuplicatorPhpVersionCheck::check(DUPLICATOR_LITE_PHP_MINIMUM_VERSION, DUPLICATOR_LITE_PHP_SUGGESTED_VERSION) === false) {
    return;
}

require_once 'helper.php';
require_once 'define.php';
require_once 'lib/snaplib/snaplib.all.php';
require_once 'classes/class.settings.php';
require_once 'classes/utilities/class.u.php';
require_once 'classes/class.plugin.upgrade.php';

global $wpdb;
DUP_Settings::init();

$table_name = $wpdb->prefix."duplicator_packages";
$wpdb->query("DROP TABLE IF EXISTS `{$table_name}`");
$wpdb->query("DELETE FROM ".$wpdb->usermeta." WHERE meta_key='".DUPLICATOR_ADMIN_NOTICES_USER_META_KEY."'");

delete_option(DUP_LITE_Plugin_Upgrade::DUP_VERSION_OPT_KEY);
delete_option('duplicator_usage_id');

//Remove entire storage directory
if (DUP_Settings::Get('uninstall_files')) {
    $ssdir           = DUP_Settings::getSsdirPath();
    $ssdir_tmp       = DUP_Settings::getSsdirTmpPath();
    $ssdir_installer = DUP_Settings::getSsdirInstallerPath();

    //Sanity check for strange setup
    $check = glob("{$ssdir}/wp-config.php");
    if (count($check) == 0) {

        //PHP sanity check
        foreach (glob("{$ssdir}/*_database.sql") as $file) {
            if (strstr($file, '_database.sql'))
                @unlink("{$file}");
        }
        foreach (glob("{$ssdir}/*_installer.php") as $file) {
            if (strstr($file, '_installer.php'))
                @unlink("{$file}");
        }
        foreach (glob("{$ssdir}/*_archive.zip*") as $file) {
            if (strstr($file, '_archive.zip'))
                @unlink("{$file}");
        }
        foreach (glob("{$ssdir}/*_archive.daf") as $file) {
            if (strstr($file, '_archive.daf'))
                @unlink("{$file}");
        }
        foreach (glob("{$ssdir}/*_scan.json") as $file) {
            if (strstr($file, '_scan.json'))
                @unlink("{$file}");
        }
        foreach (glob("{$ssdir_tmp}/*_scan.json") as $file) {
            if (strstr($file, '_scan.json'))
                @unlink("{$file}");
        }
        // before 1.3.38 the [HASH]_wp-config.txt was present in main storage area
        foreach (glob("{$ssdir}/*_wp-config.txt") as $file) {
            if (strstr($file, '_wp-config.txt'))
                @unlink("{$file}");
        }
        foreach (glob("{$ssdir}/*.log") as $file) {
            if (strstr($file, '.log'))
                @unlink("{$file}");
        }
        foreach (glob("{$ssdir}/*.log1") as $file) {
            if (strstr($file, '.log1'))
                @unlink("{$file}");
        }

        //Check for core files and only continue removing data if the snapshots directory
        //has not been edited by 3rd party sources, this helps to keep the system stable
        $files = glob("{$ssdir}/*");
        if (is_array($files) && count($files) < 6) {
            $defaults = array("{$ssdir}/index.php", "{$ssdir}/robots.txt", "{$ssdir}/dtoken.php");
            $compare  = array_diff($defaults, $files);

            //There might be a .htaccess file or index.php/html etc.
            if (count($compare) < 3) {
                foreach ($defaults as $file) {
                    @unlink("{$file}");
                }
                @unlink("{$ssdir}/.htaccess");

                //installer log from previous install
                foreach (glob("{$ssdir_installer}/*.txt") as $file) {
                    if (strstr($file, '.txt'))
                        @unlink("{$file}");
                }

                @rmdir($ssdir_installer);
                @rmdir($ssdir_tmp);
                @rmdir($ssdir);
            }
        }
    }
}

//Remove all Settings
if (DUP_Settings::Get('uninstall_settings')) {
    DUP_Settings::Delete();
    delete_option('duplicator_ui_view_state');
    delete_option('duplicator_package_active');
    delete_option("duplicator_exe_safe_mode");
    delete_option('duplicator_lite_inst_hash_notice');
}

Youez - 2016 - github.com/yon3zu
LinuXploit