Your IP : 216.73.216.61


Current Path : /home/w/u/e/wuectly/www/03cbe/
Upload File :
Current File : /home/w/u/e/wuectly/www/03cbe/files.tar

file_fof40.xml000060400000011432152455310550007205 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<!--~
  ~ @package   FOF
  ~ @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<!--
A legitimate question among developers reading this file may be why we are using a "files" extension type instead of the
"library" type which, on the face of it, seems more appropriate.

We have not lost our mind. We are working around the adverse effects of the very different way Joomla treats "library"
packages than any other package type.

When applying an update to a library package Joomla! will uninstall it BEFORE it executes the installation script's
preflight event. This means that any checks made there to prevent the installation of the library in an incompatible
environment (e.g. wrong PHP or Joomla! version, or even preventing an accidental downgrade) results in the library files
being UNINSTALLED.

This is really bad for anyone who tries to install a library package on an unsupported environment. If the library
package runs no checks the installed library version causes the extensions that depend on it to crash, taking down the
site. If the library package runs checks in the earliest available point in time (preflight) you end up with the old
library files having been uninstalled which again causes the extensions that depend on it to crash, taking down the
site. No matter what you do, the very action of TRYING to install an unsupported library version KILLS THE SITE. This is
madness. Worse than that, this is a known issue in Joomla since ~2017 but nobody will fix it until a new major version.
Since this doesn't look likely in Joomla 4.0 we are talking about Joomla 5 which could be anywhere from two to ten years
into the future. Clearly this doesn't cut it for us: we don't want trying to install our software causing sites to stop
working!

The only thing we can do to prevent your sites from crashing to the ground if you try to install a version of our
software which does not support your PHP and/or Joomla! versions is to deliver our library as a *files* package. This
is nonsensical, it is 100% architecturally wrong BUT it is also the only way we can apply pre-installation checks which
fail gracefully instead of causing your site to crash and burn.
-->
<extension type="file" version="3.9" method="upgrade">
    <name>file_fof40</name>
	<description>
		<![CDATA[
		Framework-on-Framework (FOF) 4.x - The rapid application development framework for Joomla!.<br/>
		<b>WARNING</b>: This is NOT a duplicate of the FOF library already installed with Joomla! 3. It is a different version used by other extensions on your site. Do NOT uninstall either FOF package. If you do you will break your site.
		]]>
	</description>
	<creationDate>2022-10-24</creationDate>
	<author>Nicholas K. Dionysopoulos / Akeeba Ltd</author>
	<authorEmail>nicholas@akeeba.com</authorEmail>
	<authorUrl>https://www.akeeba.com</authorUrl>
	<copyright>Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd</copyright>
	<license>GNU GPL v3 or later</license>
	<version>4.1.4</version>
	<packager>Akeeba Ltd</packager>
	<packagerurl>https://www.akeeba.com/download.html</packagerurl>

	<fileset>
		<files folder="fof" target="libraries/fof40">
			<folder>Database</folder>
			<folder>Configuration</folder>
			<folder>Update</folder>
			<folder>InstallScript</folder>
			<folder>Input</folder>
			<folder>Layout</folder>
			<folder>Platform</folder>
			<folder>Date</folder>
			<folder>Timer</folder>
			<folder>Dispatcher</folder>
			<folder>ViewTemplates</folder>
			<folder>Toolbar</folder>
			<folder>Template</folder>
			<folder>Inflector</folder>
			<folder>Render</folder>
			<folder>Utils</folder>
			<folder>Html</folder>
			<folder>language</folder>
			<folder>Cli</folder>
			<folder>Controller</folder>
			<folder>Container</folder>
			<folder>Pimple</folder>
			<folder>Download</folder>
			<folder>Params</folder>
			<folder>Model</folder>
			<folder>View</folder>
			<folder>JoomlaAbstraction</folder>
			<folder>TransparentAuthentication</folder>
			<folder>IP</folder>
			<folder>Encrypt</folder>
			<folder>Event</folder>
			<folder>Factory</folder>
			<folder>Autoloader</folder>

			<file>LICENSE.txt</file>
			<file>include.php</file>
			<file>version.txt</file>
			<file>.htaccess</file>
			<file>web.config</file>
		</files>
		<files folder="fof/language/en-GB" target="language/en-GB">
			<file>en-GB.lib_fof40.ini</file>
		</files>
		<files folder="fof/language/en-GB" target="administrator/language/en-GB">
			<file>en-GB.lib_fof40.ini</file>
		</files>
	</fileset>

	<!-- Installation / uninstallation script file -->
	<scriptfile>script.fof.php</scriptfile>

    <updateservers>
        <server type="extension" priority="1" name="FOF 4.x">http://cdn.akeeba.com/updates/fof4_file.xml</server>
    </updateservers>
</extension>joomla.xml000060400000003354152455310550006555 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension version="3.6" type="file" method="upgrade">
	<name>files_joomla</name>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<copyright>(C) 2019 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<version>3.10.12</version>
	<creationDate>July 2023</creationDate>
	<description>FILES_JOOMLA_XML_DESCRIPTION</description>

	<scriptfile>administrator/components/com_admin/script.php</scriptfile>

	<update>
		<schemas>
			<schemapath type="mysql">administrator/components/com_admin/sql/updates/mysql</schemapath>
			<schemapath type="sqlsrv">administrator/components/com_admin/sql/updates/sqlazure</schemapath>
			<schemapath type="sqlazure">administrator/components/com_admin/sql/updates/sqlazure</schemapath>
			<schemapath type="postgresql">administrator/components/com_admin/sql/updates/postgresql</schemapath>
		</schemas>
	</update>

	<fileset>
		<files>
			<folder>administrator</folder>
			<folder>bin</folder>
			<folder>cache</folder>
			<folder>cli</folder>
			<folder>components</folder>
			<folder>images</folder>
			<folder>includes</folder>
			<folder>language</folder>
			<folder>layouts</folder>
			<folder>libraries</folder>
			<folder>media</folder>
			<folder>modules</folder>
			<folder>plugins</folder>
			<folder>templates</folder>
			<folder>tmp</folder>
			<file>htaccess.txt</file>
			<file>web.config.txt</file>
			<file>LICENSE.txt</file>
			<file>README.txt</file>
			<file>index.php</file>
		</files>
	</fileset>

	<updateservers>
		<server name="Joomla! Core" type="collection">https://update.joomla.org/core/list.xml</server>
	</updateservers>
</extension>
files_strapper.xml000060400000002121152455310550010305 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension type="file" version="2.5" method="upgrade">
    <!-- Generic Metadata -->
    <name>AkeebaStrapper</name>
    <author>Nicholas K. Dionysopoulos</author>
    <authorEmail>nicholas@dionysopoulos.me</authorEmail>
    <authorUrl>https://www.akeebabackup.com</authorUrl>
    <copyright>(C) 2012-2013 Akeeba Ltd.</copyright>
    <license>GNU GPL v2 or later</license>
    <version>revAA17947</version>
    <creationDate>2016-05-12</creationDate>
    <description>Namespaced jQuery, jQuery UI and Bootstrap for Akeeba products.</description>

    <!-- Fileset definition -->
    <fileset>
        <files folder="akeeba_strapper" target="media/akeeba_strapper">
            <folder>css</folder>
            <folder>img</folder>
            <folder>js</folder>
            <folder>less</folder>
            <filename>strapper.ini</filename>
            <filename>strapper.php</filename>
            <filename>version.php</filename>
        </files>
		<files target="media/akeeba_strapper">
			<filename>version.txt</filename>
		</files>
    </fileset>
</extension>jce-fr-FR.xml000060400000013656152455310550006755 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="file" version="2.5" method="upgrade">
	<name>JCE Language fr-FR</name>
	<version>2.9.99.2.1</version>
	<creationDate>27-04-2026</creationDate>
	<author>Sarki</author>
	<authorEmail>info@sarki.ch</authorEmail>
	<authorUrl>https://www.sarki.ch</authorUrl>
	<copyright>© 2025 Sarki</copyright>
	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
	<url>https://www.sarki.ch/jce</url>
	<description><![CDATA[
		<h3><img src="../media/mod_languages/images/fr.gif" style="padding: 0 5px 3px 0">Pack de fichiers langue FR pour JCE 2.9 et ses plugins complémentaires installé !</h3>
		<div style="font-weight:normal;"><p><strong>Note :</strong> ce pack de langue inclut le suivi de mise à jour en ligne.</p>
		<div>Traduction & réalisation par <a href="https://www.sarki.ch" target="_blank">Sarki</a>
		<br />Support francophone de JCE sur <a href="https://www.sarki.ch/jce" target="_blank">www.sarki.ch/jce</a></div></div>
		]]></description>
	<fileset>
		<files folder="administrator/language/fr-FR" target="administrator/language/fr-FR">
			<file>fr-FR.com_jce.ini</file>
			<file>fr-FR.com_jce.menu.ini</file>
			<file>fr-FR.com_jce.sys.ini</file>
			<file>fr-FR.com_jce_pro.sys.ini</file>
			<file>fr-FR.pkg_jce.sys.ini</file>
			<file>fr-FR.pkg_jce_pro.sys.ini</file>
			<file>fr-FR.plg_content_jce.ini</file>
			<file>fr-FR.plg_content_jce.sys.ini</file>
			<file>fr-FR.plg_editors_jce.ini</file>
			<file>fr-FR.plg_editors_jce.sys.ini</file>
			<file>fr-FR.plg_extension_jce.ini</file>
			<file>fr-FR.plg_extension_jce.sys.ini</file>
			<file>fr-FR.plg_fields_mediajce.ini</file>
			<file>fr-FR.plg_fields_mediajce.sys.ini</file>
			<file>fr-FR.plg_installer_jce.ini</file>
			<file>fr-FR.plg_installer_jce.sys.ini</file>
			<file>fr-FR.plg_jce_editor_aia.ini</file>
			<file>fr-FR.plg_jce_editor_aia.sys.ini</file>
			<file>fr-FR.plg_jce_editor_codesample.ini</file>
			<file>fr-FR.plg_jce_editor_codesample.sys.ini</file>
			<file>fr-FR.plg_jce_editor_fontawesome.ini</file>
			<file>fr-FR.plg_jce_editor_fontawesome.sys.ini</file>
			<file>fr-FR.plg_jce_editor_chatgpt.ini</file>
			<file>fr-FR.plg_jce_editor_chatgpt.sys.ini</file>
			<file>fr-FR.plg_jce_editor-ipa.ini</file>
			<file>fr-FR.plg_jce_editor-ipa.sys.ini</file>
			<file>fr-FR.plg_jce_editor-svg.ini</file>
			<file>fr-FR.plg_jce_editor-svg.sys.ini</file>
			<file>fr-FR.plg_jce_editor-toc.ini</file>
			<file>fr-FR.plg_jce_editor-toc.sys.ini</file>
			<file>fr-FR.plg_jce_filesystem-s3.ini</file>
			<file>fr-FR.plg_jce_filesystem-s3.sys.ini</file>
			<file>fr-FR.plg_jce_filesystem-server.ini</file>
			<file>fr-FR.plg_jce_filesystem-server.sys.ini</file>
			<file>fr-FR.plg_jce_popups-rokbox.ini</file>
			<file>fr-FR.plg_jce_popups-rokbox.sys.ini</file>
			<file>fr-FR.plg_jce_popups-widgetkit2.ini</file>
			<file>fr-FR.plg_jce_popups-widgetkit2.sys.ini</file>
			<file>fr-FR.plg_quickicon_jce.ini</file>
			<file>fr-FR.plg_quickicon_jce.sys.ini</file>
			<file>fr-FR.plg_system_jce.ini</file>
			<file>fr-FR.plg_system_jce.sys.ini</file>
			<file>plg_system_jcemediabox.ini</file>
			<file>plg_system_jcemediabox.sys.ini</file>
			<file>fr-FR.plg_system_wf_responsify.ini</file>
			<file>fr-FR.plg_system_wf_responsify.sys.ini</file>
			<file>plg_system_jcepro.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor_aia/language/fr-FR">
			<file>plg_jce_editor_aia.ini</file>
			<file>plg_jce_editor_aia.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor_chatgpt/language/fr-FR">
			<file>plg_jce_editor_chatgpt.ini</file>
			<file>plg_jce_editor_chatgpt.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor_codesample/language/fr-FR">
			<file>plg_jce_editor_codesample.ini</file>
			<file>plg_jce_editor_codesample.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor_fontawesome/language/fr-FR">
			<file>plg_jce_editor_fontawesome.ini</file>
			<file>plg_jce_editor_fontawesome.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor-ipa/language/fr-FR">
			<file>plg_jce_editor-ipa.ini</file>
			<file>plg_jce_editor-ipa.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor-svg/language/fr-FR">
			<file>plg_jce_editor-svg.ini</file>
			<file>plg_jce_editor-svg.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor-toc/language/fr-FR">
			<file>plg_jce_editor-toc.ini</file>
			<file>plg_jce_editor-toc.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/filesystem-s3/language/fr-FR">
			<file>plg_jce_filesystem-s3.ini</file>
			<file>plg_jce_filesystem-s3.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/filesystem-server/language/fr-FR">
			<file>plg_jce_filesystem-server.ini</file>
			<file>plg_jce_filesystem-server.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/popups-widgetkit2/language/fr-FR">
			<file>plg_jce_popups-widgetkit2.ini</file>
			<file>plg_jce_popups-widgetkit2.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/system/jcemediabox/language/fr-FR">
			<file>plg_system_jcemediabox.ini</file>
			<file>plg_system_jcemediabox.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/system/wf_responsify/language/fr-FR">
			<file>plg_system_wf_responsify.ini</file>
			<file>plg_system_wf_responsify.sys.ini</file>
		</files>
		<tinymce folder="components/com_jce/editor/tiny_mce">
			<file>themes/advanced/langs/fr.js</file>
		</tinymce>
		<files folder="language/fr-FR" target="language/fr-FR">
			<file>fr-FR.com_jce.ini</file>
			<file>fr-FR.com_jce_pro.ini</file>
		</files>
  	</fileset>

    <compatibility>
        <version>3</version>
        <version>4</version>
        <version>5</version>
    </compatibility>	
	
    <updateservers>
       <server type="extension" priority="1" name="JCE Language fr-FR">https://www.sarki.ch/jce/update/jce_language_fr.xml</server>
    </updateservers>
</extension>akeebabackup-fr-FR.xml000060400000002445152455310550010604 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="file" version="1.6" method="upgrade" client="site">
    <name><![CDATA[akeebabackup - fr-FR]]></name>
    <author><![CDATA[AkeebaBackup.com]]></author>
    <authorurl>http://www.akeebabackup.com</authorurl>
	<copyright>Copyright (C)2016 AkeebaBackup.com. All rights reserved.</copyright>
	<license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL</license>
    <version>/Users/nikosdion/Projects/akeeba/backup/build/..</version>
    <creationDate>23 May 2016</creationDate>
    <description><![CDATA[French (France) translation file for Akeeba Backup]]></description>
	<fileset>
		<files folder="backend" target="administrator/language/fr-FR">
			<filename>fr-FR.com_akeeba.ini</filename>
			<filename>fr-FR.com_akeeba.sys.ini</filename>
			<filename>fr-FR.plg_quickicon_akeebabackup.ini</filename>
			<filename>fr-FR.plg_quickicon_akeebabackup.sys.ini</filename>
			<filename>fr-FR.plg_system_akeebaupdatecheck.ini</filename>
			<filename>fr-FR.plg_system_akeebaupdatecheck.sys.ini</filename>
			<filename>fr-FR.plg_system_backuponupdate.ini</filename>
			<filename>fr-FR.plg_system_backuponupdate.sys.ini</filename>
		</files>
		<files folder="frontend" target="language/fr-FR">
			<filename>fr-FR.com_akeeba.ini</filename>
		</files>
	</fileset>
</extension>file_fef.xml000060400000002705152455310550007032 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<!--~
  ~ Akeeba Frontend Framework (FEF)
  ~
  ~ @package   fef
  ~ @copyright (c) 2017-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension type="file" version="3.3" method="upgrade">
    <!-- Generic Metadata -->
    <name>file_fef</name>
    <author>Nicholas K. Dionysopoulos</author>
    <authorEmail>nicholas@dionysopoulos.me</authorEmail>
    <authorUrl>https://www.akeeba.com</authorUrl>
    <copyright>(C) 2017-2021 Akeeba Ltd.</copyright>
    <license>GNU GPL v3 or later</license>
    <version>2.1.1</version>
    <creationDate>2022-10-24</creationDate>
    <description>Akeeba Frontend Framework - The CSS framework for Akeeba Ltd extensions.</description>

    <!-- Fileset definition -->
    <fileset>
        <files target="media/fef">
            <folder>css</folder>
            <folder>fonts</folder>
            <folder>images</folder>
            <folder>js</folder>
            <folder>php</folder>
            <filename>fef.php</filename>
            <filename>version.php</filename>
			<filename>version.txt</filename>
        </files>
    </fileset>

    <!-- Installation / uninstallation script file -->
    <scriptfile>script.fef.php</scriptfile>

    <!-- Update server -->
    <updateservers>
        <server type="extension" priority="1" name="Akeeba FEF">http://cdn.akeeba.com/updates/fef.xml</server>
    </updateservers>
</extension>
file_fof40/script.fof.php000060400000036466152455310550011267 0ustar00<?php
/**
 * @package   FOF
 * @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die;

use Joomla\CMS\Date\Date as JoomlaDate;
use Joomla\CMS\Factory as JoomlaFactory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Installer\Installer as JoomlaInstaller;
use Joomla\CMS\Installer\InstallerAdapter;
use Joomla\CMS\Log\Log;

if (class_exists('file_fof40InstallerScript', false))
{
	return;
}

/**
 * Class file_fof40InstallerScript
 *
 * @noinspection PhpIllegalPsrClassPathInspection
 */
class file_fof40InstallerScript
{
	public $removeFiles;
	/**
	 * The minimum PHP version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumPHPVersion = '7.2.0';

	/**
	 * The minimum Joomla! version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumJoomlaVersion = '3.9.0';

	/**
	 * The maximum Joomla! version this extension can be installed on
	 *
	 * @var   string
	 */
	protected $maximumJoomlaVersion = '4.999.999';

	/**
	 * The name of the subdirectory under JPATH_LIBRARIES where this version of FOF is installed.
	 *
	 * @var   string
	 */
	protected $libraryFolder = 'fof40';

	/**
	 * Obsolete files and folders to remove.
	 *
	 * This is used when we refactor code. Some files inevitably become obsolete and need to be removed.
	 *
	 * All files and folders are relative to the library's root (JPATH_LIBRARIES . '/' . $this->libraryFolder).
	 *
	 * @var   array
	 */
	protected $removeFilesAllVersions = [
		'files'   => [
		],
		'folders' => [
		],
	];

	/**
	 * Joomla! pre-flight event. This runs before Joomla! installs or updates the component. This is our last chance to
	 * tell Joomla! if it should abort the installation.
	 *
	 * @param   string           $type    Installation type (install, update, discover_install)
	 * @param   JoomlaInstaller  $parent  Parent object
	 *
	 * @return  boolean  True to let the installation proceed, false to halt the installation
	 */
	public function preflight($type, $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return true;
		}

		// Check the minimum PHP version
		if (!empty($this->minimumPHPVersion))
		{
			if (defined('PHP_VERSION'))
			{
				$version = PHP_VERSION;
			}
			elseif (function_exists('phpversion'))
			{
				$version = phpversion();
			}
			else
			{
				$version = '5.0.0'; // all bets are off!
			}

			if (!version_compare($version, $this->minimumPHPVersion, 'ge'))
			{
				$msg = "<p>You need PHP $this->minimumPHPVersion or later to install this package but you are currently using PHP  $version</p>";

				Log::add($msg, Log::WARNING, 'jerror');

				return false;
			}
		}

		// Check the minimum Joomla! version
		if (!empty($this->minimumJoomlaVersion) && !version_compare(JVERSION, $this->minimumJoomlaVersion, 'ge'))
		{
			$jVersion = JVERSION;
			$msg      = "<p>You need Joomla! $this->minimumJoomlaVersion or later to install this package but you only have $jVersion installed.</p>";

			Log::add($msg, Log::WARNING, 'jerror');

			return false;
		}

		// Check the maximum Joomla! version
		if (!empty($this->maximumJoomlaVersion) && !version_compare(JVERSION, $this->maximumJoomlaVersion, 'le'))
		{
			$jVersion = JVERSION;
			$msg = <<< HTML
<h3>FOF is no longer needed on Joomla 5</h3>
<p>
	<strong>Summary: FOF is no longer used on Joomla 5. Please uninstall it.</strong>
</p>
<hr/>
<p>
	FOF a.k.a. Framework-on-Framework was an extension development framework used by Akeeba Ltd (and some third party extensions developed by companies not affiliated with Akeeba Ltd) on Joomla 1.5 to 3.10.
</p>
<p>
	Akeeba Ltd has stopped using the FOF framework for developing extensions. All of our extensions have new, Joomla 4 and later native versions which use the Joomla Core MVC library, included in Joomla itself.
</p>
<p>
	You can no longer install or update FOF on Joomla 5.0 and later (you have {$jVersion}). In fact, you just need to uninstall it.
</p>
HTML;

			Log::add($msg, Log::WARNING, 'jerror');

			return false;
		}

		// In case of an update, discovery etc I need to check if I am an update
		if (($type != 'install') && !$this->amIAnUpdate($parent))
		{
			$msg = "<p>You have a newer version of FOF installed. If you want to downgrade please uninstall FOF and install the older version.</p>";

			if (defined('AKEEBA_PACKAGE_INSTALLING'))
			{
				$msg = "<p>Your site has a newer version of FOF 4 than the one bundled with this package. Please note that <strong>you can safely ignore the “Custom install routine failure” message</strong> below. It is not a real error; it is an expected message which is always printed by Joomla! in this case and which cannot be suppressed.</p>";
			}

			Log::add($msg, Log::WARNING, 'jerror');

			return false;
		}

		return true;
	}

	/**
	 * Runs after install, update or discover_update. In other words, it executes after Joomla! has finished installing
	 * or updating your component. This is the last chance you've got to perform any additional installations, clean-up,
	 * database updates and similar housekeeping functions.
	 *
	 * @param   string            $type    install, update or discover_update
	 * @param   InstallerAdapter  $parent  Parent object
	 *
	 * @throws  Exception
	 */
	public function postflight($type, $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return;
		}

		// Auto-uninstall this package when it is no longer needed.
		if (($type != 'install') && ($this->countHardcodedDependencies() === 0))
		{
			// $this->uninstallSelf($parent);

			return;
		}

		// Remove obsolete files and folders
		$this->removeFilesAndFolders($this->removeFiles);

		if ($type == 'update')
		{
			$this->bugfixFilesNotCopiedOnUpdate($parent);
		}

		$this->loadFOF40();

		if (!defined('FOF40_INCLUDED'))
		{
			return;
		}

		// Install or update database
		$db = JoomlaFactory::getDbo();

		/** @var JoomlaInstaller $grandpa */
		$grandpa   = $parent->getParent();
		$src       = $grandpa->getPath('source');
		$sqlSource = $src . '/fof/sql';

		// If we have an uppercase db prefix we can expect the database update to fail because we cannot detect reliably
		// the existence of database tables. See https://github.com/joomla/joomla-cms/issues/10928#issuecomment-228549658
		$prefix  = $db->getPrefix();
		$canFail = preg_match('/[A-Z]/', $prefix);

		try
		{
			$dbInstaller = new FOF40\Database\Installer($db, $sqlSource);
			$dbInstaller->updateSchema();
		}
		catch (\Exception $e)
		{
			if (!$canFail)
			{
				throw $e;
			}
		}

		// Since we're adding common table, I have to nuke the installer cache, otherwise checks on their existence would fail
		$dbInstaller->nukeCache();

		// Clear the FOF cache
		$fakeController = \FOF40\Container\Container::getInstance('com_FOOBAR');
		$fakeController->platform->clearCache();

		// Clear op-code caches
		$this->clearOpcodeCaches();
	}

	/**
	 * Runs on uninstallation
	 *
	 * @param   InstallerAdapter  $parent  The parent object
	 *
	 * @throws  RuntimeException  If the uninstallation is not allowed
	 */
	public function uninstall($parent)
	{
		 if (version_compare(JVERSION, '4.1.0', 'ge'))
		 {
		 	return;
		 }

		// Check dependencies on FOF
		$dependencyCount = $this->countHardcodedDependencies();

		if ($dependencyCount !== 0)
		{
			$msg = "<p>You have $dependencyCount extension(s) depending on this version of FOF. The package cannot be uninstalled unless these extensions are uninstalled first.</p>";

			Log::add($msg, Log::WARNING, 'jerror');

			throw new RuntimeException($msg, 500);
		}
	}

	/**
	 * Is this package an update to the currently installed FOF? If not (we're a downgrade) we will return false
	 * and prevent the installation from going on.
	 *
	 * @param   InstallerAdapter  $parent  The parent object
	 *
	 * @return  bool  The installation status
	 */
	protected function amIAnUpdate($parent): bool
	{
		/** @var JoomlaInstaller $grandpa */
		$grandpa = $parent->getParent();

		$source = $grandpa->getPath('source');

		$target = JPATH_LIBRARIES . '/fof40';

		// If FOF is not really installed (someone removed the directory instead of uninstalling?) I have to install it.
		if (!Folder::exists($target))
		{
			return true;
		}

		$fofVersion = [];

		if (File::exists($target . '/version.txt'))
		{
			$rawData                 = @file_get_contents($target . '/version.txt');
			$rawData                 = ($rawData === false) ? "0.0.0\n2011-01-01\n" : $rawData;
			$info                    = explode("\n", $rawData);
			$fofVersion['installed'] = [
				'version' => trim($info[0]),
				'date'    => new JoomlaDate(trim($info[1])),
			];
		}
		else
		{
			$fofVersion['installed'] = [
				'version' => '0.0',
				'date'    => new JoomlaDate('2011-01-01'),
			];
		}

		$rawData               = @file_get_contents($source . '/fof/version.txt');
		$rawData               = ($rawData === false) ? "0.0.0\n2011-01-01\n" : $rawData;
		$info                  = explode("\n", $rawData);
		$fofVersion['package'] = [
			'version' => trim($info[0]),
			'date'    => new JoomlaDate(trim($info[1])),
		];

		return $fofVersion['package']['date']->toUNIX() >= $fofVersion['installed']['date']->toUNIX();
	}

	/**
	 * Loads FOF 3.0 if it's not already loaded
	 */
	protected function loadFOF40()
	{
		// Load FOF if not already loaded
		if (!defined('FOF40_INCLUDED'))
		{
			$filePath = JPATH_LIBRARIES . '/fof40/include.php';

			if (defined('FOF40_INCLUDED'))
			{
				return;
			}

			if (!file_exists($filePath))
			{
				return;
			}

			@include_once $filePath;
		}
	}

	/**
	 * Fix for Joomla bug: sometimes files are not copied on update.
	 *
	 * We have observed that ever since Joomla! 1.5.5, when Joomla! is performing an extension update some files /
	 * folders are not copied properly. This seems to be a bit random and seems to be more likely to happen the more
	 * added / modified files and folders you have. We are trying to work around it by retrying the copy operation
	 * ourselves WITHOUT going through the manifest, based entirely on the conventions we follow.
	 *
	 * @param   InstallerAdapter  $parent
	 */
	protected function bugfixFilesNotCopiedOnUpdate($parent)
	{
		$source = $parent->getParent()->getPath('source') . '/fof';
		$target = JPATH_LIBRARIES . '/' . $this->libraryFolder;

		$this->recursiveConditionalCopy($source, $target);
	}

	/**
	 * Clear PHP opcode caches
	 *
	 * @return  void
	 */
	protected function clearOpcodeCaches()
	{
		// Always reset the OPcache if it's enabled. Otherwise there's a good chance the server will not know we are
		// replacing .php scripts. This is a major concern since PHP 5.5 included and enabled OPcache by default.
		if (function_exists('opcache_reset'))
		{
			opcache_reset();
		}
		// Also do that for APC cache
		elseif (function_exists('apc_clear_cache'))
		{
			@apc_clear_cache();
		}
	}

	/**
	 * Removes obsolete files and folders
	 *
	 * @param   array  $removeList  The files and directories to remove
	 */
	protected function removeFilesAndFolders($removeList)
	{
		// Remove files
		if (isset($removeList['files']) && !empty($removeList['files']))
		{
			foreach ($removeList['files'] as $file)
			{
				$f = sprintf("%s/%s/%s", JPATH_LIBRARIES, $this->libraryFolder, $file);

				if (!is_file($f))
				{
					continue;
				}

				File::delete($f);
			}
		}
		// Remove folders
		if (!isset($removeList['folders']))
		{
			return;
		}

		if (empty($removeList['folders']))
		{
			return;
		}

		foreach ($removeList['folders'] as $folder)
		{
			$f = sprintf("%s/%s/%s", JPATH_LIBRARIES, $this->libraryFolder, $folder);

			if (!@file_exists($f) || !is_dir($f) || is_link($f))
			{
				continue;
			}

			Folder::delete($f);
		}
	}

	/**
	 * Recursively copy a bunch of files, but only if the source and target file have a different size.
	 *
	 * @param   string  $source   Path to copy FROM
	 * @param   string  $dest     Path to copy TO
	 * @param   array   $ignored  List of entries to ignore (first level entries are taken into account)
	 *
	 * @return  void
	 */
	protected function recursiveConditionalCopy($source, $dest, $ignored = [])
	{
		// Make sure source and destination exist
		if (!@is_dir($source))
		{
			return;
		}

		if (!@is_dir($dest))
		{
			if (!@mkdir($dest, 0755))
			{
				Folder::create($dest, 0755);
			}
		}

		if (!@is_dir($dest))
		{
			// Cannot create folder $dest

			return;
		}

		// List the contents of the source folder
		try
		{
			$di = new DirectoryIterator($source);
		}
		catch (Exception $e)
		{
			return;
		}

		// Process each entry
		foreach ($di as $entry)
		{
			// Ignore dot dirs (. and ..)
			if ($entry->isDot())
			{
				continue;
			}

			$sourcePath = $entry->getPathname();
			$fileName   = $entry->getFilename();

			// Do not copy ignored files
			if (!empty($ignored) && in_array($fileName, $ignored))
			{
				continue;
			}

			// If it's a directory do a recursive copy
			if ($entry->isDir())
			{
				$this->recursiveConditionalCopy($sourcePath, $dest . DIRECTORY_SEPARATOR . $fileName);

				continue;
			}

			// If it's a file check if it's missing or identical
			$mustCopy   = false;
			$targetPath = $dest . DIRECTORY_SEPARATOR . $fileName;

			if (!@is_file($targetPath))
			{
				$mustCopy = true;
			}
			else
			{
				$sourceSize = @filesize($sourcePath);
				$targetSize = @filesize($targetPath);

				$mustCopy = $sourceSize != $targetSize;

				if ((substr($targetPath, -4) === '.php') && function_exists('opcache_invalidate'))
				{
					/** @noinspection PhpComposerExtensionStubsInspection */
					opcache_invalidate($targetPath);
				}
			}

			if (!$mustCopy)
			{
				continue;
			}

			if (!@copy($sourcePath, $targetPath))
			{
				File::copy($sourcePath, $targetPath);
			}
		}
	}

	/**
	 * Count the number of old FOF + FEF based extensions installed on this site
	 *
	 * @return  int
	 */
	private function countHardcodedDependencies()
	{
		// Look for fof.xml in the backend directories of the following components
		$hardcodedDependencies = [
			'com_admintools',
			'com_akeeba',
			'com_ars',
			'com_ats',
			'com_compatibility',
			'com_datacompliance',
			'com_contactus',
			'com_docimport',
			'com_loginguard',
		];

		$count = 0;

		foreach ($hardcodedDependencies as $component)
		{
			$filePath = JPATH_ADMINISTRATOR . '/components/' . $component . '/fof.xml';

			if (@file_exists($filePath))
			{
				$count++;
			}
		}

		return $count;
	}

	/**
	 * Uninstall this package.
	 *
	 * This runs on update when there are no more dependencies left.
	 *
	 * @param  \Joomla\CMS\Installer\Adapter\FileAdapter $adapter
	 *
	 * @return void
	 */
	private function uninstallSelf($adapter)
	{
		$parent = $adapter->getParent();

		if (empty($parent) || !property_exists($parent, 'extension'))
		{
			return;
		}

		if (version_compare(JVERSION, '4.0', 'lt'))
		{
			$db = \Joomla\CMS\Factory::getDbo();
		}
		else
		{
			$db = \Joomla\CMS\Factory::getContainer()->get('DatabaseDriver');
		}

		try
		{
			$query = $db->getQuery(true)
				->select($db->quoteName('extension_id'))
				->from($db->quoteName('#__extensions'))
				->where($db->quoteName('type') . ' = ' . $db->quote('file'))
				->where($db->quoteName('name') . ' = ' . $db->quote('file_fof40'));

			$id = $db->setQuery($query)->loadResult();
		}
		catch (Exception $e)
		{
			return;
		}

		if (empty($id))
		{
			return;
		}

		$msg = 'Automatically uninstalling FOF 4; this package is no longer required on your site.';
		Log::add($msg, Log::INFO, 'jerror');

		$parent->uninstall('file', $id);
	}
}
file_fef/script.fef.php000060400000033730152455310550011066 0ustar00<?php
/**
 * Akeeba Frontend Framework (FEF)
 *
 * @package   fef
 * @copyright (c) 2017-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') or die();

use Joomla\CMS\Date\Date as JDate;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Installer\Adapter\FileAdapter as JInstallerAdapterFile;
use Joomla\CMS\Installer\Installer as JInstaller;
use Joomla\CMS\Log\Log as JLog;

if (class_exists('file_fefInstallerScript'))
{
	// WTAF?!
	return;
}

/**
 * Akeeba FEF Installation Script
 *
 * @noinspection PhpUnused
 */
class file_fefInstallerScript
{
	/**
	 * The minimum PHP version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumPHPVersion = '7.2.0';

	/**
	 * The minimum Joomla! version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumJoomlaVersion = '3.9.0';

	/**
	 * The maximum Joomla! version this extension can be installed on
	 *
	 * @var   string
	 */
	protected $maximumJoomlaVersion = '4.999.999';

	/**
	 * Joomla! pre-flight event. This runs before Joomla! installs or updates the component. This is our last chance to
	 * tell Joomla! if it should abort the installation.
	 *
	 * @param   string                            $type    Installation type (install, update, discover_install)
	 * @param   JInstaller|JInstallerAdapterFile  $parent  Parent object
	 *
	 * @return  boolean  True to let the installation proceed, false to halt the installation
	 */
	public function preflight($type, $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return true;
		}

		// Check the minimum PHP version
		if (!empty($this->minimumPHPVersion))
		{
			if (defined('PHP_VERSION'))
			{
				$version = PHP_VERSION;
			}
			elseif (function_exists('phpversion'))
			{
				$version = phpversion();
			}
			else
			{
				$version = '5.0.0'; // all bets are off!
			}

			if (!version_compare($version, $this->minimumPHPVersion, 'ge'))
			{
				$msg = "<p>You need PHP $this->minimumPHPVersion or later to install this package but you are currently using PHP  $version</p>";

				JLog::add($msg, JLog::WARNING, 'jerror');

				return false;
			}
		}

		// Check the minimum Joomla! version
		if (!empty($this->minimumJoomlaVersion) && !version_compare(JVERSION, $this->minimumJoomlaVersion, 'ge'))
		{
			$jVersion = JVERSION;
			$msg      = "<p>You need Joomla! $this->minimumJoomlaVersion or later to install this package but you only have $jVersion installed.</p>";

			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// Check the maximum Joomla! version
		if (!empty($this->maximumJoomlaVersion) && !version_compare(JVERSION, $this->maximumJoomlaVersion, 'le'))
		{
			$jVersion = JVERSION;
			$msg = <<< HTML
<h3>FEF is no longer needed on Joomla 5</h3>
<p>
	<strong>Summary: FEF is no longer used on Joomla 5. Please uninstall it.</strong>
</p>
<hr/>
<p>
	Akeeba FEF a.k.a. the Akeeba Front-End Framework was a CSS and JavaScript framework used by Akeeba Ltd with the Joomla 3 versions of our software.
</p>
<p>
	Akeeba Ltd has stopped using the FEF framework for developing extensions. All of our extensions have new, Joomla 4 and later native versions which use the Bootstrap library, included in Joomla itself.
</p>
<p>
	You can no longer install or update FEF on Joomla 5.0 and later (you have {$jVersion}). In fact, you just need to uninstall it.
</p>
HTML;

			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// In case of an update, discovery etc I need to check if I am an update
		if (($type == 'update') && !$this->amIAnUpdate($parent))
		{
			$msg = "<p>You already have a newer version of Akeeba Frontend Framework installed. If you want to downgrade please uninstall Akeeba Frontend Framework and install the older version.</p><p>If you see this message during the installation or update of an Akeeba extension please ignore it <em>and</em> the immediately following “Files Install: Custom install routine failure” message. They are expected but Joomla! won't allow us to prevent them from showing up.</p>";

			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// Delete obsolete font files and folders
		if ($type == 'update')
		{
			// Use pathnames relative to your site's root
			$removeFiles = [
				'files'   => [
					// Non-WOFF fonts are not shipped as of 1.0.1 since all modern browsers we target use WOFF
					'media/fef/fonts/akeeba/Akeeba-Products.eot',
					'media/fef/fonts/akeeba/Akeeba-Products.svg',
					'media/fef/fonts/akeeba/Akeeba-Products.ttf',
					'media/fef/fonts/Ionicon/ionicons.eot',
					'media/fef/fonts/Ionicon/ionicons.svg',
					'media/fef/fonts/Ionicon/ionicons.ttf',
					// Files renamed in 1.0.8
					'css/reset.min.css',
					'css/style.min.css',
					// JavaScript: Irrelevant for Joomla
					'js/darkmode.js',
					'js/darkmode.min.js',
					'js/darkmode.map',
					'js/Darkmode.min.js',
					'js/Darkmode.map',
					'js/menu.js',
					'js/menu.min.js',
					'js/menu.map',
					'js/Menu.min.js',
					'js/Menu.map',
					// JavaScript: Uncompressed and map files
					'js/dropdown.js',
					'js/dropdown.map',
					'js/Dropdown.map',
					'js/loader.js',
					'js/loader.map',
					'js/Loader.map',
					'js/tabs.js',
					'js/tabs.map',
					'js/Tabs.map',
				],
				'folders' => [
				],
			];

			// Remove obsolete files and folders
			$this->removeFilesAndFolders($removeFiles);
		}

		return true;
	}

	/**
	 * Runs after install, update or discover_update. In other words, it executes after Joomla! has finished installing
	 * or updating your component. This is the last chance you've got to perform any additional installations, clean-up,
	 * database updates and similar housekeeping functions.
	 *
	 * @param   string                 $type    install, update or discover_update
	 * @param   JInstallerAdapterFile  $parent  Parent object
	 *
	 * @throws  Exception
	 *
	 * @noinspection PhpUnusedParameterInspection
	 */
	public function postflight($type, JInstallerAdapterFile $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return true;
		}

		// Auto-uninstall this package when it is no longer needed.
		if (($type != 'install') && ($this->countHardcodedDependencies() === 0))
		{
			$this->uninstallSelf($parent);

			return true;
		}

		$this->bugfixFilesNotCopiedOnUpdate($parent);

		return true;
	}

	/**
	 * Runs on uninstallation
	 *
	 * @param   JInstallerAdapterFile  $parent  The parent object
	 *
	 * @throws  RuntimeException  If the uninstallation is not allowed
	 *
	 * @noinspection PhpUnusedParameterInspection
	 */
	public function uninstall($parent)
	{
		if (version_compare(JVERSION, '4.1.0', 'ge'))
		{
			return false;
		}

		// Check dependencies on FEF
		$dependencyCount = $this->countHardcodedDependencies();

		if ($dependencyCount)
		{
			$msg = "<p>You have $dependencyCount extension(s) depending on Akeeba Frontend Framework. The package cannot be uninstalled unless these extensions are uninstalled first.</p>";

			JLog::add($msg, JLog::WARNING, 'jerror');

			throw new RuntimeException($msg, 500);
		}

		Folder::delete(JPATH_SITE . '/media/fef');

		return true;
	}

	/**
	 * Removes obsolete files and folders
	 *
	 * @param   array  $removeList  The files and directories to remove
	 */
	protected function removeFilesAndFolders($removeList)
	{
		// Remove files
		if (isset($removeList['files']) && !empty($removeList['files']))
		{
			foreach ($removeList['files'] as $file)
			{
				$f = JPATH_ROOT . '/' . $file;

				if (!is_file($f))
				{
					continue;
				}

				File::delete($f);
			}
		}

		// Remove folders
		if (isset($removeList['folders']) && !empty($removeList['folders']))
		{
			foreach ($removeList['folders'] as $folder)
			{
				$f = JPATH_ROOT . '/' . $folder;

				if (!is_dir($f))
				{
					continue;
				}

				Folder::delete($f);
			}
		}
	}

	/**
	 * Is this package an update to the currently installed FEF? If not (we're a downgrade) we will return false
	 * and prevent the installation from going on.
	 *
	 * @param   JInstallerAdapterFile  $parent  The parent object
	 *
	 * @return  bool  Am I an update to an existing version>
	 */
	protected function amIAnUpdate($parent)
	{
		$grandpa = $parent->getParent();
		$source  = $grandpa->getPath('source');
		$target  = JPATH_ROOT . '/media/fef';

		if (!Folder::exists($source))
		{
			// WTF? I can't find myself. I can't install anything.
			return false;
		}

		// If FEF is not really installed (someone removed the directory instead of uninstalling?) I have to install it.
		if (!Folder::exists($target))
		{
			return true;
		}

		$fefVersion = [];

		if (File::exists($target . '/version.txt'))
		{
			$rawData                 = @file_get_contents($target . '/version.txt');
			$rawData                 = ($rawData === false) ? "0.0.0\n2011-01-01\n" : $rawData;
			$info                    = explode("\n", $rawData);
			$fefVersion['installed'] = [
				'version' => trim($info[0]),
				'date'    => new JDate(trim($info[1])),
			];
		}
		else
		{
			$fefVersion['installed'] = [
				'version' => '0.0',
				'date'    => new JDate('2011-01-01'),
			];
		}

		$rawData               = @file_get_contents($source . '/version.txt');
		$rawData               = ($rawData === false) ? "0.0.0\n2011-01-01\n" : $rawData;
		$info                  = explode("\n", $rawData);
		$fefVersion['package'] = [
			'version' => trim($info[0]),
			'date'    => new JDate(trim($info[1])),
		];

		return $fefVersion['package']['date']->toUNIX() >= $fefVersion['installed']['date']->toUNIX();
	}

	/**
	 * Fix for Joomla bug: sometimes files are not copied on update.
	 *
	 * We have observed that ever since Joomla! 1.5.5, when Joomla! is performing an extension update some files /
	 * folders are not copied properly. This seems to be a bit random and seems to be more likely to happen the more
	 * added / modified files and folders you have. We are trying to work around it by retrying the copy operation
	 * ourselves WITHOUT going through the manifest, based entirely on the conventions we follow.
	 *
	 * @param   \Joomla\CMS\Installer\Adapter\FileAdapter  $parent
	 */
	protected function bugfixFilesNotCopiedOnUpdate($parent)
	{
		$source = $parent->getParent()->getPath('source');
		$target = JPATH_SITE . '/media/fef';

		$this->recursiveConditionalCopy($source, $target);
	}

	/**
	 * Recursively copy a bunch of files, but only if the source and target file have a different size.
	 *
	 * @param   string  $source   Path to copy FROM
	 * @param   string  $dest     Path to copy TO
	 * @param   array   $ignored  List of entries to ignore (first level entries are taken into account)
	 *
	 * @return  void
	 */
	protected function recursiveConditionalCopy($source, $dest, $ignored = [])
	{
		// Make sure source and destination exist
		if (!@is_dir($source))
		{
			return;
		}

		if (!@is_dir($dest))
		{
			if (!@mkdir($dest, 0755))
			{
				Folder::create($dest, 0755);
			}
		}

		if (!@is_dir($dest))
		{
			// Cannot create folder $dest

			return;
		}

		// List the contents of the source folder
		try
		{
			$di = new DirectoryIterator($source);
		}
		catch (Exception $e)
		{
			return;
		}

		// Process each entry
		foreach ($di as $entry)
		{
			// Ignore dot dirs (. and ..)
			if ($entry->isDot())
			{
				continue;
			}

			$sourcePath = $entry->getPathname();
			$fileName   = $entry->getFilename();

			// Do not copy ignored files
			if (!empty($ignored) && in_array($fileName, $ignored))
			{
				continue;
			}

			// If it's a directory do a recursive copy
			if ($entry->isDir())
			{
				$this->recursiveConditionalCopy($sourcePath, $dest . DIRECTORY_SEPARATOR . $fileName);

				continue;
			}

			// If it's a file check if it's missing or identical
			$mustCopy   = false;
			$targetPath = $dest . DIRECTORY_SEPARATOR . $fileName;

			if (!@is_file($targetPath))
			{
				$mustCopy = true;
			}
			else
			{
				$sourceSize = @filesize($sourcePath);
				$targetSize = @filesize($targetPath);

				$mustCopy = $sourceSize != $targetSize;

				if ((substr($targetPath, -4) === '.php') && function_exists('opcache_invalidate'))
				{
					opcache_invalidate($targetPath);
				}
			}

			if (!$mustCopy)
			{
				continue;
			}

			if (!@copy($sourcePath, $targetPath))
			{
				File::copy($sourcePath, $targetPath);
			}
		}
	}

	/**
	 * Count the number of old FOF + FEF based extensions installed on this site
	 *
	 * @return  int
	 */
	private function countHardcodedDependencies()
	{
		// Look for fof.xml in the backend directories of the following components
		$hardcodedDependencies = [
			'com_admintools',
			'com_akeeba',
			'com_ars',
			'com_ats',
			'com_compatibility',
			'com_datacompliance',
			'com_contactus',
			'com_docimport',
			'com_loginguard',
		];

		$count = 0;

		foreach ($hardcodedDependencies as $component)
		{
			$filePath = JPATH_ADMINISTRATOR . '/components/' . $component . '/fof.xml';

			if (@file_exists($filePath))
			{
				$count++;
			}
		}

		return $count;
	}

	/**
	 * Uninstall this package.
	 *
	 * This runs on update when there are no more dependencies left.
	 *
	 * @param  \Joomla\CMS\Installer\Adapter\FileAdapter $adapter
	 *
	 * @return void
	 */
	private function uninstallSelf($adapter)
	{
		$parent = $adapter->getParent();

		if (empty($parent) || !property_exists($parent, 'extension'))
		{
			return;
		}

		if (version_compare(JVERSION, '4.0', 'lt'))
		{
			$db = \Joomla\CMS\Factory::getDbo();
		}
		else
		{
			$db = \Joomla\CMS\Factory::getContainer()->get('DatabaseDriver');
		}

		try
		{
			$query = $db->getQuery(true)
				->select($db->quoteName('extension_id'))
				->from($db->quoteName('#__extensions'))
				->where($db->quoteName('type') . ' = ' . $db->quote('file'))
				->where($db->quoteName('name') . ' = ' . $db->quote('file_fef'));

			$id = $db->setQuery($query)->loadResult();
		}
		catch (Exception $e)
		{
			return;
		}

		if (empty($id))
		{
			return;
		}

		$msg = 'Automatically uninstalling FEF; this package is no longer required on your site.';
		\Joomla\CMS\Log\Log::add($msg, \Joomla\CMS\Log\Log::INFO, 'jerror');

		$parent->uninstall('file', $id);
	}
}
index.html000060400000000057152455712540006551 0ustar00<html>
<body bgcolor="#FFFFFF">
</body>
</html>